使用vim键映射有条件地插入文本

时间:2013-11-16 17:42:41

标签: vim

我正在尝试创建一个映射,它会在行的末尾添加一个被拉动的文本,但如果行末尾的char不是空格,则在它前面加一个空格。

Base string: The quick brown fox 
                               ^no space, just fox$
Desired after pasting: The quick brown fox jumps over the lazy dog
Base string: The quick brown fox 
                                ^additional space, fox $
Desired after pasting: The quick brown fox jumps over the lazy dog

在vim中编写函数时,我不是很有经验。这是我带来的(不正常工作):

nmap \p :if getline(".")[col("$"-1)]==" " <CR> $p <CR> :else <CR> :execute "normal! A \<C-R>\"" <CR> :endif <CR>

我想检查行中的最后一个字符并粘贴被拉动的文本,或者附加一个空格并插入“register(被拔出的文本)。但是这个映射只显示扩展状态行中的命令,而不是移动我到文件的末尾。

这种映射应该如何?

2 个答案:

答案 0 :(得分:1)

我不知道那些花哨的:if命令,但为什么不呢

:s/[^ ]$/& /e<CR>$p

首先我们进行替换:

s/[^ ]$/& /e

这匹配行末([^ ])的非空格字符($),如果找到这样的字符,则将其替换为自身(&是在s///命令中匹配的字符串)后跟一个空格。如果没有匹配(该行不以非空格字符结尾),则s///是无操作。 /e标志防止“不匹配”条件成为错误,这将中止宏。

完成了困难的部分,我们只是到了行的末尾(正常模式$命令)并粘贴(正常模式p)。

答案 1 :(得分:0)

我可能会用这个:

:nnoremap <silent> \p :<C-u>execute 'normal! $"=(getline(".") =~# " $" ? "" : " ") . getreg(' . string(v:register) . ")\<lt>CR>p"<CR>

这并没有破坏最后的搜索模式(作为Wumpus Q. Wumbley的解决方案),你甚至可以在其前面添加一个不同的寄存器来粘贴("a\p)。