有没有办法将 vim 中的 :q 重新绑定到更复杂的命令,以防止意外退出 vim?
6 回答
你想要的是:close
. 它的作用类似于:q
但不会让您关闭最后一个窗口:
http://vimdoc.sourceforge.net/htmldoc/windows.html#:close
q
您可以为要映射到的命令设置别名close
:
cabbrev q <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'close' : 'q')<CR>
感谢@Paradoxial 这个 :cabrev 技巧。
我知道,我知道,这是一个非常古老的问题,但我今天有同样的问题,我首先找到了这篇文章。我开发了一个简短的脚本来放入 .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>
我希望这可以帮助别人。
你有什么好怕的?当您仍然有未保存的更改时, Vim 不会让您退出(!
无论如何都没有命令修饰符),因此您唯一可能丢失的是 GVIM 的窗口位置、大小和任务栏位置。
无论如何,要覆盖内置命令,例如:q
,您可以使用cmdalias 插件,如下所示:
:Alias q if\ winnr('$')>1||tabpagenr('$')>1||confirm('Really\ quit?',\ "&OK\\n&Cancel")==1|quit|endif
这将检查最后一个窗口(:q
不一定退出 Vim),并插入确认。
您可以使用这样的东西来删除:q
命令:
:cabbrev q <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'echo' : 'q')<CR>
这在命令模式下缩写q
为echo
,但如果q
不在第一列中,则不允许触发缩写。这样,edit q
就不会缩写为edit echo
.
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>
因为我只想要这个用于特定文件
使用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