多年来,我的手“记住”了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` 的意义与宏的意义相反,即它提供“是,保留更改”,而宏提供“是,放弃更改”。 如果早些时候提出了 `confirm`,我就会满足。
实际操作 首先,感谢 @Jamie Schembri 提供的示例。在学习新的脚本语言时,始终需要一个示例。
这是我最终使用的宏。是的,它并不完全符合要求。我用一个 Yes|No|Write 选项替换了第二个 F3,这感觉更好。我还必须添加一个 nr2char(),以使字母的测试起作用。我还必须从
:map
中删除一个 CR。
更新请参阅此问题,以获取使用此宏的解决方案,添加了处理 tagstack
文件的附加功能。如果您从 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