如何有条件地处理 vim 重映射?

如何有条件地处理 vim 重映射?

这与以下事项相关/延续如何在 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问题。PpP

Ingo 的回答似乎是一个完美的折衷方案。

但是如果您不关心编号寄存器的状态,另一种方法是使用"0始终包含最新提取的文本并且不受c或影响的寄存器d

测试猛拉:foo,用 猛拉yiw

测试行:Lorem [i]psum dolor sit amet.,将光标放在iipsum

測試選擇: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

相关内容