这与以下事项相关/延续如何在 vim 中替换粘贴选中的文本而不选中已删除的行?
总之,vnoremap p "_dP
用于粘贴可视选择的文本,而不会"*
用替换的文本覆盖寄存器。这样,后续可视选择的粘贴将保持不变。
重新映射按预期工作除非字符视觉选择到达行尾。我正在尝试找出一种有条件地处理这个问题的方法,以便:
- 在那个特定情况下,
"_dp
- 否则,
"_dP
我正在考虑vnoremap p
一个 vimscript 函数来检查特定的情况,即“如果视觉选择是字符型的并且光标位于行尾”,并相应地执行。
元- 如果 vimscript 是答案,也许我应该发布到 StackOverflow?
更新
它适用于:
vnoremap <expr> p (getregtype() ==# 'v' && col(".") == col("$") - 1 ? '"_dp' : '"_dP')
答案1
对于条件重映射,您可以使用表达映射(:help map-expr
)。我不知道这是否对你有用,但它应该可以帮助你入门:
:vnoremap <expr> p (getregtype() ==# 'v' && col("'>") == col('$') ? '"_dp' : '"_dP')
答案2
使用黑洞寄存器可以解决两个问题:您希望保持编号寄存器仅包含明确提取的文本,或者您希望能够多次粘贴相同的文本。
对于第一个问题,使用"_d
而不是d
是正确的工具,因为您删除的任何内容都不会出现在任何寄存器中。
对于第二个问题,由于光标位置以及 和 的方向,组合 和 或 不可避免地会"_d
产生p
问题。P
p
P
Ingo 的回答似乎是一个完美的折衷方案。
但是如果您不关心编号寄存器的状态,另一种方法是使用"0
始终包含最新提取的文本并且不受c
或影响的寄存器d
?
测试猛拉:foo
,用 猛拉yiw
。
测试行:Lorem [i]psum dolor sit amet.
,将光标放在i
上ipsum
。
測試選擇:v$
。
"_dP
Loremfoo <-- trailing whitespace and mashed text, bad
"_dp
Lorem foo <-- good
"0p
Lorem foo <-- good
測試選擇:vee
。
"_dP
Lorem foo sit amet. <-- good
"_dp
Lorem foosit amet. <-- bad
"0p
Lorem foo sit amet. <-- good