如何防止意外退出vim?

22

是否有一种方法可以将vim中的:q重新绑定为更复杂的命令,以防止意外退出vim?


10
“:q 不够复杂吗?我自己从未意外地按到过它…” - Eric J.
6
重点仍然很明显。如果你不小心按下了一个由三个键组成的组合键,那么在使用vim时,将会非常困难,因为大多数操作都是通过单个字母组合键完成的(如果算上<esc>键,则是两个键)。 - Rook
5
我试图输入":q"时经常误按其他按键,但从未按错过反向键。 - kenny
7
对于我而言,我在vi/vim中已经养成了20多年的习惯——编辑文件,在命令行执行某些操作。因此,:q是我的条件反射。我希望改掉这个习惯。当我打开了15个缓冲区时,要从中恢复出来是很痛苦的。 - Wayne Walker
4
我有一个习惯,当我只想使用 :w 保存文件时,会多按一个 q 键,结果就变成了 :wq。这是因为多年来,我一直将 vim 作为命令行配置文件编辑器而非完整的编辑器来使用。 - andho
显示剩余6条评论
6个回答

15
你需要的是:close命令,它类似于:q,但不会关闭最后一个窗口: http://vimdoc.sourceforge.net/htmldoc/windows.html#:close 你可以设置别名让q命令映射到close:
cabbrev q <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'close' : 'q')<CR>

感谢 @Paradoxial 提供的 :cabbrev 技巧。


添加了这个,然后用快捷键:wq关闭了vimrc。哎呀。 - mattalxndr
似乎nvim 0.6版本中存在一个bug,即在执行:q时关闭未保存的缓冲区。 我发现了这个问题,因为我有一个20年的习惯,在工作时自动按下:w。 在度过了一个充满毒品和放荡女人的夜晚后,我失去了左手小指,现在经常按下q而不是w。这是个悲惨的角落情况...但很有趣。 - venzen

11

我知道,我知道,这是一个非常老的问题,但今天我也有同样的问题,我首先找到了这篇文章。我编写了一个简短的脚本放在 .vimrc 中。

function! ConfirmQuit(writeFile)
    if (a:writeFile)
        if (expand('%:t')=="")
            echo "Can't save a file with no name."
            return
        endif
        :write
    endif

    if (winnr('$')==1 && tabpagenr('$')==1)
        if (confirm("Do you really want to quit?", "&Yes\n&No", 2)==1)
            :quit
        endif
    else
        :quit
    endif
endfu

cnoremap <silent> q<CR>  :call ConfirmQuit(0)<CR>
cnoremap <silent> x<CR>  :call ConfirmQuit(1)<CR>

我希望这对某些人有所帮助。

5
你害怕什么?Vim不会让你退出(没有!命令修饰符的情况下),当你还有未保存的更改时,所以你可能会失去的只是GVIM的窗口位置、大小和任务栏位置。
总之,要重写内置命令如:q,可以使用cmdalias插件,就像这样:
:Alias q if\ winnr('$')>1||tabpagenr('$')>1||confirm('Really\ quit?',\ "&OK\\n&Cancel")==1|quit|endif

这个命令检查最后一个窗口(:q 不一定会退出 Vim),并插入确认提示。


问题在于 q! 非常接近。 - Qix - MONICA WAS MISTREATED
2
@Qix:但通常需要按Shift键才能得到!;无论是:q1还是:Q!都不会有任何影响。如果你经常打错键,那么在Vim中也不会有太多乐趣。 - Ingo Karkat
我有点半开玩笑。这是我使用 Vim 几年来第一次误按 q!,哈哈。 - Qix - MONICA WAS MISTREATED

5
您可以使用以下内容来删除 :q 命令:
:cabbrev q <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'echo' : 'q')<CR>

在命令模式下,这将把q缩写成echo,但不允许在q不在第一列时触发缩写。这样,edit q不会被缩写成edit echo


很棒的解决方案!它迫使我在特定的vim中写入“:quit”,这个vim我打算保留几个月。对于短暂的vim会话(例如用于git提交消息的会话)在另一个shell中,“:q”仍然按预期工作。 - IllvilJa

3

ConfirmQuit.vim:当您尝试退出vim时提供确认对话框。

http://www.vim.org/scripts/script.php?script_id=1072

我通过使用此插件进行了修改。

autocmd bufenter c:/intranet/notes.txt cnoremap <silent> wq<cr> call ConfirmQuit(1)<cr>

我只想将这个应用于特定的文件


然而,任何使用普通vim并使用ConfirmQuit.vim的人都希望删除“if has(”gui_running“)”。 - Wayne Walker

0

使用coot/cmdalias_vim插件,我有效地禁用了短暂、冲动的退出命令:q:q!:wq。希望这能减缓我的速度,并让我考虑是否真的想使用:quit或者:bdelete。以下是我.vimrc文件中“autocmd部分”的精简版本:

if has("autocmd")
    augroup VIMRC_aliases
        au!
        au VimEnter * CmdAlias wqu\%[it] write|quit
        au VimEnter * CmdAlias q         echo\ "Use\ :qu[it]\ instead\ of\ :q"
        au VimEnter * CmdAlias q!        echo\ "Use\ :qu[it]!\ instead\ of\ :q!"
        au VimEnter * CmdAlias wq        echo\ "Use\ :wqu[it]\ instead\ of\ :wq"
    augroup END
endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接