如何防止意外戒掉病毒?

14 vim

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

Fab*_*ini 13

你想要的是什么:close.它的行为似乎:q但不会让你关闭最后一个窗口:

http://vimdoc.sourceforge.net/htmldoc/windows.html#:close

您可以为q要映射到的命令设置别名close:

cabbrev q <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'close' : 'q')<CR>
Run Code Online (Sandbox Code Playgroud)

感谢@Paradoxial:cabbrev trick.


小智 10

我知道,我知道,这是一个非常古老的问题,但我今天也有同样的问题,我先发现这个帖子.我开发了一个简短的脚本来放入.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>
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助别人.


Ing*_*kat 5

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

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

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

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

  • @Qix:但你通常需要Shift来获得`!`; 既不是`:q1`也不是`:Q!`任何伤害.如果你受到指法的折磨,无论如何你在Vim中都没有多少乐趣. (2认同)

小智 5

您可以使用类似这样的命令来删除该:q命令:

:cabbrev q <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'echo' : 'q')<CR>
Run Code Online (Sandbox Code Playgroud)

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