从多年的“手指记忆”开始,我的双手就知道F2是保存而F3是退出的(多年来IBM编辑的遗留物)。因此,我的第一个vim键映射是让F2和F3做他们应该做的事情。特别是对于F3:
:map <F3> :q<CR>
:map! <ESC>:q<CR>
如果我退出已编辑的文件,我仍会获得E37: No write since last change (add ! to override)
。我更喜欢的是一个会发出E37: No write since last change. Press F3 again to really quit.)
我该怎么编码?
更新了解决方案建议
有人向我指出,我本可以用confirm
来完成这项任务。我“知道”我以前见过一些内置的解决方案,但我记不得了。但是请注意,confirm
的感觉是从宏中反转,即它提供“是,保持更改”,而宏提供“是,放弃更改”。如果只是早些时候建议,我已经决定确认了。
我实际做了什么
首先,感谢@Jamie Schembri的首发示例。在学习新的脚本语言时,总是有一个例子。
这是我最终使用它的宏。是的,它与要求并不完全相同。我用“是|否|写”选择替换了第二个F3,感觉更好。我还必须添加一个nr2char(),这样字母的测试就可以了。我还必须从:map
中删除其中一个CR。
更新有关使用此宏添加处理tagstack
文件的功能的解决方案,请参阅this question。如果您quit
中的文件tagstack
,则vim将关闭您的所有文件。
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
call feedkeys('\<ESC>')
endif
endtry
endfunction
答案 0 :(得分:2)
参考pandubear的答案,我写了一个古怪的小功能,似乎做你想要的。
function! QuitF3()
try
quit
catch /E37:/
" Unwritten changes.
echo "E37: No write since last change. Press F3 again to really quit."
if getchar() == "\<F3>"
quit!
else
" Close prompt.
call feedkeys('\<ESC>')
endif
endtry
endfunction
map <F3> :call QuitF3()<CR><CR>
答案 1 :(得分:1)
我认为您可以将F3映射到执行此类操作的函数:(伪代码)
try:
quit
catch error 37:
intercept next keystroke
if it's F3:
force quit
else:
send key back to vim
我不知道所有细节,但我很确定你可以使用:try
,:catch
,getchar()
完成所有这些事情(如果是这个,请不要确定它是否适用于像F3这样的特殊键和feedkeys()
。有关这些内容,请参阅:help
。
:q!
制作单独的映射?