在其他 SO-ers 的帮助下,我为 vim 整理了一个智能退出宏,询问您是否真的要退出包含更改的文件。 我把这个宏和 F3 绑定起来,因为我 30 年前在大型机上学会了编辑器,而 F3 对我来说是永远退出的。
当我使用标签并查看标签堆栈上的文件时,我经常通过按 F3 而不是 ctrl-T 来关闭该文件。 这将关闭所有未更改的文件标记文件或其他文件。
所以,我想改进我的智能退出宏,让它检测到当前文件在标签堆栈上,我的意思是:p op,而不是: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
这可以通过映射您用于跳转到标签的键来实现,以便在跳转到全局变量后保存文件名或缓冲区编号。然后,您可以根据 quit 函数上保存的值检查当前文件名/缓冲区编号。
这是可能的开始:
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 上包含一个映射以删除最后一个元素,然后您可以镜像标签堆栈的内容。
被要求从其发布位置@kazark将这个答案移到这里,这是原始问题的附录。
男孩,我错过了显而易见的。
在下面的解决方案中,我使用了与原始逻辑相反的方法。 也就是说,始终try
用 pop
关闭当前文件。 如果可行,我就完成了。 如果失败,我将生成一些错误,可能是 E555,我可以catch
。 但是,如果我发现任何错误,pop
失败,我知道try
关闭文件,然后按照原始脚本进行操作。 这是最终结果:
" Smart Quit Function ----------------------
function! QuitF3()
try
pop
catch
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
return 0
endtry
endtry
endfunction