我有多线程应用程序的日志文件。每行具有公知的格式(例如,第3个字段是线程ID)。而其中一个字段是线程ID。我希望我不是要重新发明轮子。)
任何方式,为了方便阅读文件,我想到了两个可能有用的选项:
突出显示与当前行具有相同线程ID的所有行。
如果按下某个击键,所有带有其他线程ID的线都会被折叠,再次按下按键会展开线条。
欢迎这两个项目的骨架。
答案 0 :(得分:4)
这是一个突出显示(和清除另一个)包含给定图案的所有线条的功能,在图案本身上加上突出显示。 “最后搜索”寄存器@/
也设置为请求的模式,因此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>
有关基于模式折叠的示例,请查看Show-Hide Vim plug-in。它提供了两个命令SHOW
和HIDE
,以及一些快捷方式映射。例如,:SHOW thread=1234
将折叠除包含thread=1234
的行以外的所有行,而正常模式下的zs
将在光标下显示包含word
的行。 [您可能希望创建替代地图,例如zS
,以使用<cWORD>
代替<cword>
。]
如果<cword>
和<cWORD>
都没有提取足够独特的滤镜模式(或者为了避免将光标移动到正确的字段),请创建另一个类似下面的函数并从地图中调用它。 / p>
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>
答案 1 :(得分:1)
您基本上要寻找的是在日志文件之上构建的外部机制。 Chainsaw正在为基于log4j的日志做到这一点: http://logging.apache.org/chainsaw/index.html
不确定您的日志记录应用程序是什么,但您应该探讨这个方向。