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


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

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

Мой текущий метод: Я использую поиск регулярных выражений :/^\(\p\)\{#number#,}$), и я продолжаю увеличивать целое число #number# пока я не получу только один матч. В случае с моим файлом это строка из 81K символов, а не 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 строку, но я не смог понять цель второго (916K).


2
2018-03-09 18:54


происхождения


Спасибо всем за ответы. Каждый атакует проблему под другим углом! Показывает универсальность Vim. - drapkin11
За свою простоту и элегантность я буду использовать Деннис Уильямсонподход. Из EelvexЯ продолжу оттачивать свои команды vim, и из garyjohn, мой скрипт vim. - drapkin11


ответы:


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

$ wc -l -c filename

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

:!wc -l -c %

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

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

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

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

/^.\{248\}$

3
2018-03-09 20:41



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


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

%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!

3
2018-03-09 19:46



garyjohnэто лучший способ :) - Eelvex
Благодарю. В то же время, Деннистоже придумали, и я полагаю, что другие последуют :) - Eelvex
/ <c-r> "... что делает эта команда? Я просмотрел ее, и это означает« Повторить »? После того, как я нажимаю <c-r>, я вижу кавычки, а затем, когда я нажимаю", то, что я ранее скопировал, вставляется. Но я не уверен, что «на самом деле здесь. - drapkin11
@ drapkin11: см. справку для i_CTRL-R = режим вставки <C-R>, Он вставляет содержимое регистра. " является регистром «последний экземпляр или разрез». - Eelvex


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


1
2018-03-09 19:13





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

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("$"),


1
2018-03-09 20:30



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