3

从多年的“手指记忆”中,我的手知道 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
4

2 回答 2

3

参考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>
于 2013-11-19T15:46:48.753 回答
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!呢?

于 2013-11-19T14:14:31.300 回答