从多年的“手指记忆”中,我的手知道 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 提供的起始示例。在学习新的脚本语言时有一个例子总是好的。
这是我最终使用的宏。是的,它并不完全符合要求。我用 Yes|No|Write 选项替换了第二个 F3,感觉更好。我还必须添加一个 nr2char() 以便对字母进行测试。我还不得不从:map
.
更新请参阅此问题以获取使用此宏以及处理tagstack
文件的附加功能的解决方案。如果你quit
从 .vim 中的一个文件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