#vim #syntax-highlighting #folding #logfiles
#vim #подсветка синтаксиса #сворачивание #файлы журналов
Вопрос:
У меня есть файл журнала многопоточного приложения. Каждая строка имеет хорошо известный формат (например, 3-е поле — идентификатор потока). при этом одно из полей является идентификатором потока. Я надеюсь, что я не пытаюсь изобретать велосипед 🙂
В любом случае, для облегчения чтения файла я подумал о двух вариантах, которые могли бы помочь:
-
Выделите все строки с тем же идентификатором потока, что и текущая строка.
-
При нажатии некоторой клавиши все строки с другим идентификатором потока сворачиваются, повторное нажатие клавиши разворачивает строки.
Каркас для обоих предметов приветствуется.
Комментарии:
1. Классная идея, но я вижу здесь только декларативные предложения. В чем ваш вопрос?
2. На самом деле я ищу способ реализовать оба описанных элемента, поскольку vim хорошо работает через удаленное соединение.
3. Является ли формат журнала удобным для grep?
4. Да, это так. Я могу написать регулярное выражение для идентификации всех строк, принадлежащих одному и тому же идентификатору потока
Ответ №1:
Выделение шаблоном
Вот функция для выделения (и другая для очистки) всех строк, содержащих данный шаблон, с выделением акцента на самом шаблоне. Регистр «последнего поиска» @/
также настроен на запрошенный шаблон, поэтому n
/ N
в обычном режиме выполняется переход вперед / назад по соответствующим строкам. <Leader>l
(эквивалент l
для большинства установок) — это ярлык для выделения строк, которые содержат WORD
под вашим курсором.
highlight def link xHiLine Special
highlight def link xHiPatt String
function! ClearHighlight()
syn clear xHiLine
syn clear xHiPatt
let @/ = ''
endfunction
function! HighlightPattern(patt)
call ClearHighlight()
if a:patt != ''
echo "Highlighting pattern: ".a:patt
exec "syn match xHiPatt "".a:patt."" contained"
exec "syn match xHiLine ".*".a:patt.".*" contains=xHiPatt"
let @/ = a:patt
endif
endfunction
map <Leader>l :call HighlightPattern(expand("<cWORD>"))<CR>
map <Leader>c :call ClearHighlight()<CR>
Сворачивание по шаблону
Для примера сворачивания на основе шаблонов ознакомьтесь с подключаемым модулем Vim для показа-скрытия. Он предоставляет две команды, SHOW
и HIDE
, и несколько карт быстрого доступа. Например, :SHOW thread=1234
все строки будут сворачиваться, кроме тех, которые содержат thread=1234
, в то время как zs
в обычном режиме под вашим курсором будут отображаться строки, содержащие word
. [Возможно, вы захотите создать альтернативную карту, например zS
, для использования <a rel="noreferrer noopener nofollow" href="https:///vimdoc.sourceforge.net/htmldoc/cmdline.html#:» rel=»nofollow»> <cWORD>
вместо <a rel="noreferrer noopener nofollow" href="https:///vimdoc.sourceforge.net/htmldoc/cmdline.html#:» rel=»nofollow»> <cword>
.]
Построение шаблонов
Если ни <cword>
ни <cWORD>
не удается извлечь достаточно уникальный шаблон фильтрации (или чтобы избежать перемещения курсора в нужное поле), создайте другую функцию, подобную приведенной ниже, и вызовите ее с карты.
function! GetField(num)
let toks = split(getline('.'))
if len(toks) >= a:num
return toks[a:num-1]
endif
return ''
endfunction
map <Leader>hl :call HighlightPattern(GetField(3))<CR>
map <Leader>fl :exec "SHOW ".GetField(3)<CR>
Ответ №2:
То, что вы в основном ищете, — это внешний механизм, который будет встроен поверх вашего файла журнала. Chainsaw делает именно это для журналов на основе log4j: http://logging.apache.org/chainsaw/index.html
Не уверен, какое у вас приложение для ведения журнала, но вам, вероятно, следует посмотреть в этом направлении.
Комментарии:
1. Выглядит интересно, однако он основан на графическом интерфейсе. Наша служба поддержки работает много раз при медленных удаленных подключениях, поэтому мне также интересно решение на основе консоли.