Как найти строку с максимальным количеством столбцов / символов в Vim / gVim?

3705
drapkin11

В настоящее время я использую gVim в Windows XP, и у меня есть 2 продолжения моего основного вопроса:

Каков наилучший метод поиска строки с наибольшим количеством символов?

Мой текущий метод: я использую поиск по регулярному выражению :/^\(\p\)\{#number#,}$), и я продолжаю увеличивать целое число, #number#пока не получу только одно совпадение. В случае с моим файлом это строка длиной всего 81 КБ, а не 916 657, как я думал ранее. Я знаю это, потому что когда курсор находится на этой строке, я нажимаю g + Ctrl+gи получаю количество столбцов 81K.

Продолжение 1) Вопрос "What is the best method of finding the line with the most columns?"такой же, как № 2 выше?

Продолжение 2) Что означает второе число, когда я открываю файл и вижу следующую строку в нижней части экрана:

enter image description here

Я понимаю, что в этом файле содержится 14 871 строка, а по крайней мере одна строка содержит 916 657 столбцов. Я проверил, что файл имеет 14 871 строку, но я не смог понять цель второго (916 КБ).

2
Спасибо всем за ответы. Каждый атакует проблему под другим углом! Показывает универсальность Vim. drapkin11 13 лет назад 0
Для его простоты и элегантности я буду использовать [Денис Уильямсон] (http://superuser.com/questions/255368/how-to-find-the-line-with-the-maximum-number-of-columns-characters- in-vim-gvim / 255438 # 255438) подход. Из [Eelvex] (http://superuser.com/questions/255368/how-to-find-the-line-with-the-maximum-number-of-columns-characters-in-vim-gvim/255401#255401 ) я буду продолжать оттачивать свои команды vim и от [garyjohn] (http://superuser.com/questions/255368/how-to-find-the-line-with-the-maximum-number-of -columns-characters-in-vim-gvim / 255434 # 255434), мой сценарий vim. drapkin11 13 лет назад 1

4 ответа на вопрос

3
Eelvex

Должен быть лучший способ, но также подойдет следующее:

%s/./a/g "Replace everything with 'a's sort! "Sort by column length ggy$ "Go to first line (longest) and copy it u "Undo the sorting /<c-r>" "Search for the longest line mm "Mark it 'm' u "Undo the replace 'm "Go to the mark - there! 
[Garyjohn] (http://superuser.com/questions/255368/how-to-find-the-line-with-the-maximum-number-of-columns-characters-in-vim-gvim/255434#255434) это лучший способ :) Eelvex 13 лет назад 1
Благодарю. Между тем, [Деннис] (http://superuser.com/questions/255368/how-to-find-the-line-with-the-maximum-number-of-columns-characters-in-vim-gvim/255438# 255438) также подошел, и я думаю, что другие будут следовать :) Eelvex 13 лет назад 0
/«... что делает эта команда? Я посмотрел ее, и это означает« Повторить »? После нажатия Я вижу кавычки, затем, когда я нажимаю ", то, что я ранее скопировал, вставляется. Но я не уверен, что" на самом деле здесь делает. drapkin11 13 лет назад 0
@ drapkin11: см. справку для `i_CTRL-R` = режим вставки``. Он вставляет содержимое регистра. `" `- это регистр" последней копии или вырезки ". Eelvex 13 лет назад 1
3
Dennis Williamson

Второе число - это общее количество символов во всем файле. Если вы делаете:

$ wc -l -c filename 

Вы должны увидеть те же два числа (строки и общее количество символов). На самом деле, вы можете сделать:

:!wc -l -c % 

Вот плагин с именем textfilter ( скачать ), который включает функцию для поиска самой длинной строки.

Или вы можете использовать это, чтобы найти длину самой длинной строки:

:echo max(map(range(1, line('$')), "col([v:val, '$'])")) - 1 

тогда вы можете использовать это число следующим образом:

/^.\$ 
Я думаю, что вам нужно `col ()`, если число должно использоваться вместе с `/ ^. \ ` (`$` здесь необязательно) Eelvex 13 лет назад 0
@Eelvex: я сделал это исправление. Dennis Williamson 13 лет назад 1
очень интересно - я никогда не думал об использовании Vim вместо вашей строки 3 ": echo max (map (range ...") drapkin11 13 лет назад 0
@ drapkin11: Это из `: h virtcol ()` Dennis Williamson 13 лет назад 1
`:! wc%` покажет вам количество строк, слов и символов в * текущей сохраненной версии * текущего файла вместе с именем файла. (Если вам не нужны все три числа, используйте опции, чтобы указать те, которые вы хотите.) Чтобы получить числа (и), но не показывать имя файла, используйте `:! Wc <%`. Чтобы получить количество * для текста, находящегося в данный момент в буфере редактирования *, используйте `: w! Wc`. (Конечно, вы можете получить ту же информацию с помощью `g`, а затем` Ctrl + G`.) Scott 9 лет назад 0
1
geekosaur

Не могу ответить на первый вопрос, но второе число в сообщении о загрузке файла - это общее количество символов в файле.

1
garyjohn

Вот функция, которая делает это.

function MaxLine() let maxcol = 0 let lnum = 1 while lnum <= line("$") call cursor(lnum, 0) if col("$") > maxcol let maxcol = col("$") let maxline = lnum endif let lnum += 1 endwhile echo "Line" maxline "has" maxcol - 1 "characters" endfunction 

Вы можете выполнить это с

:call MaxLine() 

или определите команду или отображение для его вызова.

Обратите внимание, что поиск строки с наиболее актуальными столбцами такой же, как и строка с наибольшим количеством символов. Это может не совпадать со строкой с наибольшим количеством байтов. Если вы хотите найти строку с наибольшим количеством виртуальных столбцов, замените col("$")на virtcol("$").

это вдохновляет меня на изучение сценариев в Vim. Функция работает, но по какой-то причине мне нужно запустить ее дважды ... в первый раз ничего не возвращается, во второй раз она выдает "Line" maxline "имеет" maxcol - 1 "символов" ... Я думаю, это предназначено. drapkin11 13 лет назад 0
Нет, это должно работать одинаково каждый раз. Я могу воспроизвести это поведение на Vim 7.3.125 в системе Fedora Linux, но не могу объяснить это. Я установил «verbose» на 15 и сравнил первый и второй прогоны - без разницы в логах. Может быть ошибка в Vim; может быть ошибка в функции, которую я просто не вижу. garyjohn 13 лет назад 0
Хорошо, это должны быть мои настройки gVim. Я веду себя как «окна», что может объяснить поведение. В любом случае ваш ответ заставил меня попасть в справочники, и это хорошо. drapkin11 13 лет назад 0
О сценариях: как только вы освоите его, он станет действительно аккуратным. В Vim я могу многое сделать с помощью нескольких нажатий клавиш. Это похоже на сценарии оболочки: выполнив одно и то же задание несколько раз, вы понимаете, что делаете все это за один шаг, и вам не нужно каждый раз набирать параметры и имена файлов, используя всего несколько строк сценария оболочки или Vim. garyjohn 13 лет назад 0