【发布时间】:2018-01-03 09:43:07
【问题描述】:
我想包装一些代码:
myObj.text;
使用函数调用,其中代码作为参数传递。
console.log(myObj.text);
我曾想过使用环绕.vim 来做到这一点,但没能做到。
知道可能吗?我
【问题讨论】:
我想包装一些代码:
myObj.text;
使用函数调用,其中代码作为参数传递。
console.log(myObj.text);
我曾想过使用环绕.vim 来做到这一点,但没能做到。
知道可能吗?我
【问题讨论】:
我知道并使用两种不同的方法来实现这一点:
选择您想以可视模式换行的文本(点击v,然后进行适当的移动)。
c替换该文本,然后键入您的函数调用console.log()。 (旧文本并没有消失,它只是移动到一个寄存器中,在第 3 步中将立即从该寄存器中检索它。)当你在右括号后面时点击<esc>,这应该让你留在) 字符上。
点击P 将替换的文本粘贴到括号中(这会插入到您当前所在的字符之前,因此正好在( 和) 之间)。
整个序列是v<movement>c<functionName>()<esc>P。
除了退出插入模式并从正常模式粘贴之外,您也可以直接从插入模式粘贴,方法是点击<ctrl>R,然后点击"。
整个序列是v<movement>c<functionName>(<ctrl>R")<esc>。
【讨论】:
在正常模式下使用环绕声:
ysiwfconsole.log<CR>
在可视模式下使用环绕声:
Sfconsole.log<CR>
正常模式下无环绕声:
ciwconsole.log(<C-r>")<Esc>
视觉模式下没有环绕声:
cconsole.log(<C-r>")<Esc>
但这不是很可扩展。映射肯定会更有用,因为您几乎肯定需要经常这样做:
xnoremap <key> cconsole.log(<C-r>")<Esc>
nnoremap <key> ciwconsole.log(<C-r>")<Esc>
这让我们回到了 Surround,它已经非常优雅地做到了这一点,而且更加优雅。
【讨论】:
dsbds'等?
您可以结合视觉模式使用替换指令
将bar 更改为foo(bar):
按v 并选择你想要的文本(再加一个字符)用函数调用包围(^v$ 将选择当前行的整个文本,包括末尾的换行符)
输入:s/\%V.*\%V/foo\(&\)/<CR>
解释:
s/a/b/g 表示“将a 的第一个匹配项替换为当前行上的b”\%V.*\%V 匹配视觉选择没有最后一个字符
& 表示“匹配的文本”(在本例中为 bar)foo\(&\) 给出 '匹配的文本被 foo(...) 包围' <CR> 表示“按回车”注意事项
bar 之后的下一个字符(^v$ 还会选择末尾的换行符,所以没关系)'<,'> @ 987654338,但这不会干扰命令的其余部分(它甚至可以防止替换,当所选文本在当前行的某个位置时出现) - :'<,'>s/... 仍然有效【讨论】: