如何避免在Vim中丢失使用x键剪切的文本?
Vim剪切内容被覆盖的解决办法
默认解决方法(无需修改配置)
有几种原生操作可以解决你的问题:
- 利用删除历史寄存器:Vim的寄存器1到9会保存最近9次删除/剪切的内容,每次新的删除会把旧内容向后挤。你第一次剪切
Toast时,内容存在寄存器1;删除#后,#进入寄存器1,原来的Toast被移到寄存器2。此时直接输入"2p就能粘贴Toast。 - 指定寄存器剪切:选中
Toast后用"ax(a可以换成任意未占用的寄存器),把内容存到寄存器a里,之后不管删除什么,输入"ap就能粘贴Toast。 - 先复制再删除(优化操作):选中
Toast按y复制后,输入gv可以快速重新选中刚才的选区,接着按d删除,最后用"0p粘贴寄存器0的内容(寄存器0始终保存最后一次复制的内容,不受后续删除影响)。 - 撤销后调整顺序:如果已经删了
#,先按u撤销删除,然后先粘贴Toast,再删除#。
优化配置方案
如果不想每次都手动指定寄存器,推荐两种更流畅的配置:
- 让默认粘贴使用寄存器0:寄存器0只保存最后一次复制的内容,不会被删除操作覆盖。在
~/.vimrc中添加:
nnoremap p "0p vnoremap p "0p nnoremap P "0P vnoremap P "0P
这样按p/P默认粘贴最后一次复制的内容,而删除的内容可以通过"1p等访问。
2. 分离删除与剪切的寄存器:让普通删除(比如删单个字符)不覆盖默认寄存器,只把剪切(比如整词整行剪切)的内容存入默认寄存器。配置如下:
" 单个字符删除放到黑洞寄存器,不影响默认寄存器 nnoremap x "_x " 可视模式删除/剪切仍存入默认寄存器 vnoremap d "d vnoremap x "x
这样你用x删单个#时,内容不会进入默认寄存器,之前剪切的Toast 还在""里,直接p就能粘贴。
内容的提问来源于stack exchange,提问作者AGoodStudent
相关产品推荐
相关产品推荐

