Как найти строку с максимальным количеством столбцов / символов в Vim/gVim?
В настоящее время я использую 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) Что означает второе число, когда я открываю файл и вижу следующую строку в нижней части экрана:
Я понимаю, что в этом файле содержится 14 871 строка, а по крайней мере одна строка содержит 916 657 столбцов. Я проверил, что файл имеет 14 871 строку, но я не смог понять цель второго (916 КБ).
6 ответов
Второе число - это общее количество символов во всем файле. Если вы делаете:
$ wc -l -c filename
Вы должны увидеть те же два числа (строки и общее количество символов). На самом деле, вы можете сделать:
:!wc -l -c %
Вот плагин с именем textfilter ( скачать), который включает функцию для поиска самой длинной строки.
Или вы можете использовать это, чтобы найти длину самой длинной строки:
:echo max(map(range(1, line('$')), "col([v:val, '$'])")) - 1
тогда вы можете использовать это число следующим образом:
/^.\{248\}$
Должен быть лучший способ, но подойдут и следующие:
%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!
Не могу ответить на первый вопрос, но второе число в сообщении о загрузке файла - это общее количество символов в файле.
Вот функция, которая делает это.
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 и похож на некоторые другие ответы, но, возможно, более интуитивно понятен для некоторых людей. Предполагается, что вы согласны с вызовом некоторых внешних программ из vim.
У меня есть следующее в файлеtest_file
:
hello world
helloooooooooooooo world !!!
yo, world!
helloooOoooOooooOo World ! !
Команда иногда имеет-L
опция, которая печатает размер самой длинной строки.28 test_file
это результат моего примера.
Вы можете напечатать эти 28 строк символов (и их номера строк) с помощьюgrep -nP ".{28}" test_file
.
2:helloooooooooooooo world !!!
4:helloooOoooOooooOo World ! !
Вы могли бы проанализироватьwc
вывод сcut
. Собрав все это вместе и вставив одну команду в другую, получится:
grep -nP ".{$(wc -L test_file | cut -f 1 -d ' ')}" test_file
Для всего файла:
max(map(getline(0, "$"), "len(v:val)"))
Для выбора:
max(map(getline("'<", "'>"), "len(v:val)"))
Если у вас многобайтовый файл, заменитеlen()
сstrchars()
,strwidth()
,strdisplaywidth()
или то, что соответствует потребностям.