带有时间戳的Vim verbosefile

时间:2011-08-17 10:20:22

标签: vim

我有许多非常复杂的Vim配置文件,但这些似乎导致了一些不可预测的性能下降。

是否有办法生成Vim内部活动的日志文件(格式为verbosefile),其中还包含每个函数调用的时间戳,以便我调试这些问题。或者,还有其他工具可以帮助我完成这项任务吗?

非常感谢。

3 个答案:

答案 0 :(得分:2)

您可以尝试的一件事是使用--startuptime some_file调用vim。这将转储启动期间执行的步骤以及时间戳。请尝试:help --startuptime获取更多信息。

不幸的是,这会显示文件的时间戳,而不是函数。如果要查看特定函数需要多长时间,可以在plugin目录下的文件中调用它,以便在引导时执行。这在所有情况下都是不可能的,它不会给你很多粒度,但它可能会帮助你缩小问题的范围。其他人可能有更好的想法,但我会先尝试这样的事情。

修改

我刚发现两件可能有助于解决这个问题的事情。其中一个是reltime()。以下是vim帮助的一个例子:

let start = reltime()
call MyFunction()
echo reltimestr(reltime(start))

它只是显示一个函数执行的时间。结合例如Decho,这可以提供所述函数的简单日志。

第二个应该是更多的powerfule,:profile命令。它允许您分析一段vimscript并将结果放在一个文件中。 :help profile应该告诉你所有你需要知道的事情。遗憾的是,它仅适用于+profile功能,该功能似乎仅在“巨大”功能集中启用。如果你的vim没有它,你需要重新编译。如果这是一个问题,或者你不想打扰,你可能只用reltime就能取得好成绩。

答案 1 :(得分:0)

如果--startuptime不符合您的需要,您可以使用以下命令:

vim --cmd 'profile start profile.log' \ 
    --cmd 'profile func *' \ 
    --cmd 'profile file *' \ 
    -c 'profile pause' \ 
    -c 'qa!'

(将--cmd替换为-c,如果在启动时没有出现问题,则添加-c 'Command that causes slowdown'。您将获得profile.log中的所有计时。具有功能计时的表将出现在文件的末尾,以获得每个脚本的计时,使用以下内容 脚本:

" Open profile.log file in vim first 
let timings=[] 
g/^SCRIPT/call add(timings, [getline('.')[len('SCRIPT  '):], matchstr(getline(line('.')+1), '^Sourced \zs\d\+')]+map(getline(line('.')+2, line('.')+3), 'matchstr(v:val, ''\d\+\.\d\+$'')')) 
enew 
call setline('.', ['count total (s)   self (s)  script']+map(copy(timings), 'printf("%5u %9s   %8s  %s", v:val[1], v:val[2], v:val[3], v:val[0])')) 

这将打开一个新文件,其中包含与profile.log末尾相同的表,但是1)用于脚本,而不是用于函数,2)未排序。

答案 2 :(得分:0)

迟到总比没有好?我正在搜索是否可以让vim在&verbosefile中包含一些时间戳,因为它会导致vim附加到文件中,而不会显示附加的开始时间。

我调整了ZyX's answer here的解决方案,在尝试了一些事情之后,发现一个简单的echo "foo\n"会追加foo和一个换行符&verbosefile

let s:VerboseLS = ' **** V'.'E'.'RB'.'OSE LO'.'GG'.'ING S'.'TA'.'RTED ****'
let s:VerboseLE = ' **** V'.'E'.'RB'.'OSE LO'.'GG'.'ING E'.'ND'.'ED ****'
function! ToggleVerbose()
    let l:timestamp = strftime("%c")
    if !&verbose
      let l:msg = "\n\n" . l:timestamp . s:VerboseLS . "\n\n"
      set verbosefile=~/.vim/log/verbose.log
      set verbose=100
      echo l:msg
    else
      let l:msg = "\n" . l:timestamp . s:VerboseLE . "\n"
      echo l:msg
      set verbose=0
      set verbosefile=
    endif
endfunction
nnoremap <silent> <Leader>vl :call ToggleVerbose()<CR>

现在我在日志中得到了很好的横幅:

Sun Feb 17 14:18:02 2013 **** VERBOSE LOGGING STARTED ****

...[snip]...

Sun Feb 17 14:18:08 2013 **** VERBOSE LOGGING ENDED ****

我按照我的方式定义了那些横幅,这样如果我在详细日志记录打开的时候获取该脚本文件,那么如果我在日志中搜索“VERBOSE LOGGING”或类似内容,我将无法匹配它们。

因此,如果您的vim reltime具有亚秒级精度,您可以调整此方法以使用has('reltime'),并且可以使call的计时包装器回显开始/结束时间函数调用(虽然在没有call命令的情况下调用内联函数时必须重构。)

哦,我刚才有一个想法...我想知道&verbosefile是否可以设置为一个命名管道,该管道转到带有时间戳的util ...让我们看看......