самая длинная строка в vim? - PullRequest
14 голосов
/ 16 января 2010

Есть ли команда для определения длины самой длинной строки в vim? И добавить эту длину в начало файла?

Ответы [ 4 ]

19 голосов
/ 16 января 2010

Команда Gnu wc имеет опцию -L --max-line-length, которая печатает максимальную длину строки файла. См. GNU Man WC . У freebsd wc также есть -L, но не --max-line-length, см. freebsd man wc .

Как использовать их из vim? Команда:

:%!wc -L

Отфильтрует открытый файл через wc -L и сделает содержимое файла максимальной длиной строки.

Чтобы сохранить содержимое файла и поместить максимальную длину строки в первую строку, выполните:

:%yank
:%!wc -L
:put

Вместо использования wc, Найти длину самой длинной строки - awk bash описывает, как использовать awk, чтобы найти длину самой длинной строки.

Хорошо, теперь для чистого решения Vim. Я немного новичок в написании сценариев, но здесь идет. Дальнейшее основано на функции FilterLongestLineLength из 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()

Поместите этот код в файл .vim (или в ваш .vimrc) и: укажите исходный файл. Затем используйте новую команду:

:PrependLongestLineLength

Спасибо, понять это было весело.

5 голосов
/ 06 июня 2010

Если вы работаете с развернутыми таблицами, просто

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

достаточно.

В противном случае, я думаю, нам понадобится следующее (которое вы можете найти в последнем примере в :h virtcol(), минус -1):

0put=max(map(range(1, line('$')), "virtcol([v:val, '$'])-1"))
2 голосов
/ 17 сентября 2014

:! wc -L%
а не
:%! wc -L

Чтобы добавить эту длину в начало файла:
: 0r! Wc -L% | cut -d '' -f1

0 голосов
/ 06 июня 2018

Вот простой, поэтому легко запоминающийся подход:

  • выделить весь текст: ggVG
  • заменить каждый символ (.) На "a": :'<,'>s/./a/g
  • сортировка, уникальная: :'<,'>sort u
  • подсчитать символы в самой длинной строке (если слишком много символов для простого подсчета, просто посмотрите на положение столбца в строке состояния Vim)

Я применил это для проверки чисел ферментных комиссий (EC) до создания таблицы PostgreSQL:

Я скопировал данные ec_numbers в Calc, затем взял каждый столбец в Neovim, заменил каждый символ на «a»,

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

и затем сортируется по уникальным строкам

:'<,'>sort u

aaaaaaa
aaaaaaaa
aaaaaaaaa
aaaaaaaaaa
aaaaaaaaaaa

... поэтому самая длинная запись номера EC [x.x.x.x] - 11 символов, VARCHAR (11).

Аналогичным образом, применительно к принятым именам, мы получаем

aaaaa
aaaaaa
...
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

т.е. самое длинное имя - 147 символов: VARCHAR (200) должен покрывать его!

line_length_count

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...