VIM Smart退出宏

时间:2013-11-19 13:40:11

标签: vim vim-macros

从多年的“手指记忆”开始,我的双手就知道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

2 个答案:

答案 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:catchgetchar()完成所有这些事情(如果是这个,请不要确定它是否适用于像F3这样的特殊键和feedkeys()。有关这些内容,请参阅:help

但是,似乎有点多了。为什么不为:q!制作单独的映射?