我正在尝试创建一个映射,它会在行的末尾添加一个被拉动的文本,但如果行末尾的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(被拔出的文本)。但是这个映射只显示扩展状态行中的命令,而不是移动我到文件的末尾。
这种映射应该如何?
答案 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
)。