有没有办法将`:w'`别名为`:w`,以避免创建名为''的文件?


9

有时,我的小指'在进入时会吃掉钥匙,结果是:w'<Enter>

我试过了:

cabbrev w' :w
cabbrev w\' :w
cabbrev "w'" :w

他们都不工作。有没有一种方法,以别名:w':w

我也使用cmdwin(:help cmdwin+ nnoremap : :<C-F>)而不是普通的命令行,因此如果它也可以使用,则可以加分。


3
哈 我与\同样的问题
马丁Tournoij

Answers:


8

正如Peter Rincker指出的那样,cmaps也可以在其他地方扩展,所以a cnoreabbrev会更好

cnoreabbrev w' w

或者,最安全的还是再次感谢Peter:

cnoreabbrev <expr> w' getcmdtype() == ":" && getcmdline() == "w'" ? "w" : "w'"

通过显式检查命令行是否仅包含w',可以避免情况下的不必要扩展。

您可以使用cmap

cmap w' w

您仍然需要按Enter,但是'现在应该忽略意外事件。

如果您使用cmdwin,则inoremapset by autocmd可能会有用:

autocmd CmdwinEnter * inoremap w' w
autocmd CmdwinLeave * iunmap w'

我跑步了:cmap w' w,但是行为没有改变。 :w'仍然导致写入名为的文件'"'" [New] 0L, 0C written
mwcz

@mwcz '按下后实际显示w吗?如果cmap成功创建,则不应该-RHS会自动填充一个cmap LHS,因此,如果按a ',它仍应仅显示w
muru

1
请注意裸露cmap的和cabbrev。它们将在其他模式和其他位置执行/扩展。例如:s/'follow'/foo/'follow'。请看下面的VIM的变化:X功能删除缓存,而不是保存并退出或使用cmdalias.vim
彼得Rincker

1
安全胜过遗憾:cnoreabbrev <expr> w' getcmdtype() == ":" && getcmdline() == "w'" ? "w" : "w'"
Peter Rincker

是的,'仍然显示出来,但我只是发现这是因为我使用cmdwin输入命令,而cmdwin只是一个常规缓冲区,所以cmap/cnoreabbrev不要在那里使用。使用noreabbrevcmdwin用户的选项更新答案。:) 谢谢!!!
mwcz

0

此方法对我有用:

:ca w' w

另外,您可以设置vim以在您按两次Esc键时保存当前缓冲区,例如

:map <Esc><Esc> :w<CR>

或使用以下映射通过Ctrl+ s或+ 保存文件F2

nmap <c-s> :w<CR>
vmap <c-s> <Esc><c-s>gv
imap <c-s> <Esc><c-s>

nmap <F2> :update<CR>
vmap <F2> <Esc><F2>gv
imap <F2> <c-o><F2>

注意:F2仅在必要时保存,并根据需要使用户返回插入模式(或恢复其视觉选择)。

来源:在Vim Wikia上保存文件

或使用以下替代方法:

  • :up:update)的:w
  • ZQ 对于 :q
  • ZZ:wq:x

请注意问题中的引号。 :w'不是:w。我希望使用时:w不会意外击中'该文件,然后写入该文件rm \'。好提示,但是。
mwcz

1
Ctrl-S不会发送sigstop-如果程序停止,则可能是因为缓冲区已满。见unix.stackexchange.com/questions/13629/... '
穆鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.