vim - 用函数调用包围文本
vim - surround text with function call
我想包装一些代码:
myObj.text;
使用代码作为参数传递的函数调用。
console.log(myObj.text);
我考虑过使用 surround.vim 来做到这一点,但没有成功。
知道是否可行吗?我
在正常模式下使用环绕声:
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,它已经非常优雅地做到了这一点,而且做得更多。
您可以使用替换指令结合视觉模式
要将 bar
更改为 foo(bar)
:
按 v
和 select 您想要的文本(再加一个字符)用函数调用包围(^v$
将 select 整个文本在当前行,包括末尾的换行符)
输入:s/\%V.*\%V/foo\(&\)/<CR>
解释:
s/a/b/g
表示'substitute first match of a
with b
on current line'
\%V.*\%V
匹配视觉 selection 没有最后一个字符
&
表示 'matched text'(在本例中为 bar
)
foo\(&\)
给出 'matched text surrounded with foo(...)
'
<CR>
表示 'press enter'
备注
- 为了这个工作你必须在视觉上 select 也是
bar
之后的下一个字符(^v$
selects 也是末尾的换行符,所以没关系)
- 可能是多线的问题selection,还没检查
- 当我在可视模式下按
:
时,它会将 '<,'>
放入命令行,但这不会干扰命令的其余部分(它甚至会阻止替换,当 selected 文本也出现在当前行的较早位置)- :'<,'>s/...
仍然有效
我知道并使用两种不同的方法来完成此任务:
变体 1:
Select 您想要在可视模式下换行的文本(点击 v
然后进行任何适当的移动)。
通过点击 c
替换 该文本,然后键入您的函数调用 console.log()
。 (旧文本并没有消失,它只是被移到了一个寄存器中,它会在第 3 步中从那里被迅速检索到。)当你在右括号后面时点击 <esc>
,这应该会让你进入 )
字符.
通过点击 P
将替换的文本粘贴到括号中(这会插入到您当前所在的字符之前,所以就在 (
和 [=14= 之间]).
整个序列是v<movement>c<functionName>()<esc>P
。
变体 2:
除了离开插入模式并从正常模式粘贴,您也可以直接从插入模式粘贴,方法是点击 <ctrl>R
,然后点击 "
。
整个序列是v<movement>c<functionName>(<ctrl>R")<esc>
。
我想包装一些代码:
myObj.text;
使用代码作为参数传递的函数调用。
console.log(myObj.text);
我考虑过使用 surround.vim 来做到这一点,但没有成功。
知道是否可行吗?我
在正常模式下使用环绕声:
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,它已经非常优雅地做到了这一点,而且做得更多。
您可以使用替换指令结合视觉模式
要将 bar
更改为 foo(bar)
:
按
v
和 select 您想要的文本(再加一个字符)用函数调用包围(^v$
将 select 整个文本在当前行,包括末尾的换行符)输入
:s/\%V.*\%V/foo\(&\)/<CR>
解释:
s/a/b/g
表示'substitute first match ofa
withb
on current line'\%V.*\%V
匹配视觉 selection 没有最后一个字符&
表示 'matched text'(在本例中为bar
)foo\(&\)
给出 'matched text surrounded withfoo(...)
'<CR>
表示 'press enter'
备注
- 为了这个工作你必须在视觉上 select 也是
bar
之后的下一个字符(^v$
selects 也是末尾的换行符,所以没关系) - 可能是多线的问题selection,还没检查
- 当我在可视模式下按
:
时,它会将'<,'>
放入命令行,但这不会干扰命令的其余部分(它甚至会阻止替换,当 selected 文本也出现在当前行的较早位置)-:'<,'>s/...
仍然有效
我知道并使用两种不同的方法来完成此任务:
变体 1:
Select 您想要在可视模式下换行的文本(点击
v
然后进行任何适当的移动)。通过点击
c
替换 该文本,然后键入您的函数调用console.log()
。 (旧文本并没有消失,它只是被移到了一个寄存器中,它会在第 3 步中从那里被迅速检索到。)当你在右括号后面时点击<esc>
,这应该会让你进入)
字符.通过点击
P
将替换的文本粘贴到括号中(这会插入到您当前所在的字符之前,所以就在(
和 [=14= 之间]).
整个序列是v<movement>c<functionName>()<esc>P
。
变体 2:
除了离开插入模式并从正常模式粘贴,您也可以直接从插入模式粘贴,方法是点击 <ctrl>R
,然后点击 "
。
整个序列是v<movement>c<functionName>(<ctrl>R")<esc>
。