20

有没有办法将 vim 中的 :q 重新绑定到更复杂的命令,以防止意外退出 vim?

4

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 这个 :cabrev 技巧。

于 2013-02-21T09:22:28.313 回答
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>

我希望这可以帮助别人。

于 2015-08-27T01:29:12.360 回答
5

你有什么好怕的?当您仍然有未保存的更改时, Vim 不会让您退出(!无论如何都没有命令修饰符),因此您唯一可能丢失的是 GVIM 的窗口位置、大小和任务栏位置。

无论如何,要覆盖内置命令,例如:q,您可以使用cmdalias 插件,如下所示:

:Alias q if\ winnr('$')>1||tabpagenr('$')>1||confirm('Really\ quit?',\ "&OK\\n&Cancel")==1|quit|endif

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

于 2012-09-24T07:49:08.120 回答
4

您可以使用这样的东西来删除:q命令:

:cabbrev q <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'echo' : 'q')<CR>

这在命令模式下缩写qecho,但如果q不在第一列中,则不允许触发缩写。这样,edit q就不会缩写为edit echo.

于 2012-12-22T00:36:00.573 回答
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>

因为我只想要这个用于特定文件

于 2013-08-19T10:47:42.713 回答
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
于 2019-11-19T17:44:23.993 回答