在其他 SO-ers 的帮助下,我整理了一个 smart quit macro对于 vim,它会询问您是否确实要退出包含更改的文件。我将这个宏与 F3 联系起来,因为 30 年前我在大型机上学习了编辑器,而 F3 对我来说就永远退出了。
当我使用标签并查看标签堆栈上的文件时,我经常通过按 F3 而不是 ctrl-T 来关闭该文件。这将关闭所有未更改的文件、标记文件或其他文件。
所以,我想改进我的智能退出宏,让它检测当前文件位于标记堆栈上,我的意思是:pop,而不是:quit。
有办法做到这一点吗?
" Smart Quit Function ----------------------
function! QuitF3()
try
quit
catch /E37:/
" Unwritten changes.
echo "E37: Discard changes? Y|y = Yes, N|n = No, W|w = Write"
let ans = nr2char( getchar() )
if ans == "y" || ans == "Y"
quit!
elseif ans == "w" || ans == "W"
write
else
" Close prompt.
call feedkeys('\<ESC>')
endif
endtry
endfunction
最佳答案
这可以通过映射用于跳转到标签的键来完成,以便在跳转到全局变量后保存文件名或缓冲区编号。然后您可以根据退出函数中保存的值检查当前文件名/缓冲区编号。
这里是尽可能的开始:
nnoremap <silent> <c-]> :call JumpTag()<CR>
let g:lastTagBuffer = -1
function! JumpTag()
let w = expand("<cword>") " get the word under cursor
if w =~ '\a' " if the word contains a letter
try
exe "tag " . w
let g:lastTagBuffer = bufnr("%")
catch
return
endtry
endif
endfunction
您可以在 :h CursorHold-example
上找到更多信息。
如果您愿意,可以使用列表而不是单个变量来保存所有标记跳转,并在 Ctrl+t 上包含一个映射以删除最后一个元素,然后您可以镜像标记堆栈的内容。
关于VIM:如何判断当前文件是否在tagstack上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20960298/