我有多线程应用程序的日志文件。每行都有一个众所周知的格式(例如,第三个字段是线程 ID)。而其中一个字段是线程ID。我希望我不是想重新发明轮子:)
无论如何,为了轻松阅读文件,我想到了两个可以提供帮助的选项:
突出显示与当前行具有相同线程 id 的所有行。
如果按下某个键,则所有具有其他线程 ID 的行都将折叠,再次按下该键会展开这些行。
欢迎使用这两种物品的骨架。
我有多线程应用程序的日志文件。每行都有一个众所周知的格式(例如,第三个字段是线程 ID)。而其中一个字段是线程ID。我希望我不是想重新发明轮子:)
无论如何,为了轻松阅读文件,我想到了两个可以提供帮助的选项:
突出显示与当前行具有相同线程 id 的所有行。
如果按下某个键,则所有具有其他线程 ID 的行都将折叠,再次按下该键会展开这些行。
欢迎使用这两种物品的骨架。
这是一个突出显示(以及另一个清除)包含给定模式的所有行的功能,并在模式本身上突出显示。“最后一次搜索”寄存器@/
也设置为请求的模式,因此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 插件。它提供了两个命令,SHOW
和HIDE
,以及一些快捷映射。例如,:SHOW thread=1234
将折叠除包含 的行之外的所有行thread=1234
,而zs
在正常模式下将显示包含word
光标下的行。[您可能想要创建一个备用地图,例如zS
,来<cWORD>
代替<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>
您基本上正在寻找的是建立在您的日志文件之上的外部机制。Chainsaw 正在为基于 log4j 的日志执行此操作:http: //logging.apache.org/chainsaw/index.html
不确定您的日志记录应用程序是什么,但您可能应该看看那个方向。