longest line in vim?

时光怂恿深爱的人放手 提交于 2019-11-29 09:19:51

Gnu's wc command has a -L --max-line-length option which prints out the max line length of the file. See the gnu man wc. The freebsd wc also has -L, but not --max-line-length, see freebsd man wc.

How to use these from vim? The command:

:%!wc -L

Will filter the open file through wc -L and make the file's contents the maximum line length.

To retain the file contents and put the maximum line length on the first line do:

:%yank
:%!wc -L
:put

Instead of using wc, Find length of longest line - awk bash describes how to use awk to find the length of the longest line.

Ok, now for a pure Vim solution. I'm somewhat new to scripting, but here goes. What follows is based on the FilterLongestLineLength function from textfilter.

function! PrependLongestLineLength ( )
  let maxlength   = 0
  let linenumber  = 1
  while linenumber <= line("$")
    exe ":".linenumber
    let linelength  = virtcol("$")
    if maxlength < linelength
      let maxlength = linelength
    endif
    let linenumber  = linenumber+1
  endwhile

  exe ':0'
  exe 'normal O'
  exe 'normal 0C'.maxlength
endfunction

command PrependLongestLineLength call PrependLongestLineLength()

Put this code in a .vim file (or your .vimrc) and :source the file. Then use the new command:

:PrependLongestLineLength

Thanks, figuring this out was fun.

If you work with tabulations expanded, a simple

:0put=max(map(getline(1,'$'), 'len(v:val)'))

is enough.

Otherwise, I guess we will need the following (that you could find as the last example in :h virtcol(), minus the -1):

0put=max(map(range(1, line('$')), "virtcol([v:val, '$'])-1"))

:!wc -L %
rather than
:%!wc -L

To append that length at the beginning of the file:
:0r !wc -L % | cut -d' ' -f1

Here is a simple, hence easily-remembered approach:

  • select all text: ggVG
  • substitute each character (.) with "a": :'<,'>s/./a/g
  • sort, unique: :'<,'>sort u
  • count the characters in the longest line (if too many characters to easily count, just look at the column position in the Vim status bar)

I applied this to examine Enzyme Commission (EC) numbers, prior to making a PostgreSQL table:

I copied the ec_numbers data to Calc, then took each column in Neovim, replaced each character with "a",

:'<,'>s/./a/g

and then sorted for unique lines

:'<,'>sort u

aaaaaaa
aaaaaaaa
aaaaaaaaa
aaaaaaaaaa
aaaaaaaaaaa

... so the longest EC number entry [x.x.x.x] is 11 char, VARCHAR(11).

Similarly applied to the Accepted Names, we get

aaaaa
aaaaaa
...
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

i.e. the longest name is 147 char: VARCHAR(200) should cover it!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!