15

我想包装一些代码:

myObj.text;

使用函数调用,其中代码作为参数传递。

console.log(myObj.text);

我曾考虑过使用环绕.vim 来做到这一点,但没能做到。

知道是否可能吗?一世

4

3 回答 3

16

在正常模式下使用环绕声:

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,它已经非常优雅地做到了这一点——而且还做得更多。

于 2017-07-27T15:14:20.497 回答
5

我知道并使用两种不同的方法来实现这一点:


变体 1:

  1. 选择要在视觉模式下换行的文本(点击v后跟随任何适当的动作)。

  2. 通过点击替换该文本c,然后键入您的函数调用console.log()。(旧文本并没有消失,它只是移动到一个寄存器中,在第 3 步中将立即从该寄存器中检索它。)<esc>当你在右括号后面时点击,这应该让你留在)角色上。

  3. 通过点击将替换的文本粘贴到括号中P(这会插入到您当前所在的字符之前,因此就在(和之间))。

整个序列是v<movement>c<functionName>()<esc>P


变体 2:

除了离开插入模式并从正常模式粘贴外,您也可以直接从插入模式粘贴,<ctrl>R然后按".

整个序列是v<movement>c<functionName>(<ctrl>R")<esc>

于 2017-07-27T19:54:04.167 回答
1

您可以将替换指令与视觉模式结合使用

更改barfoo(bar)

  1. 按下v并选择要使用函数调用包围的文本(再加一个字符)(^v$将选择当前行的整个文本,包括末尾的换行符)

  2. 类型:s/\%V.*\%V/foo\(&\)/<CR>

解释:

  • s/a/b/ga表示“用b当前行替换第一个匹配项”
  • \%V.*\%V匹配没有最后一个字符的视觉选择
  • &表示“匹配的文本”(bar在这种情况下)
  • foo\(&\)foo(...)给出'用'包围的匹配文本
  • <CR>意思是“按回车”

笔记

  • 为此,您还必须在视觉上选择下一个字符bar^v$最后还选择换行符,所以很好)
  • 多行选择可能有一些问题,尚未检查
  • when I press :in visual mode, it puts '<,'>in command line, but that doesn't interfere with rest of the command (it even prevents substitution, when selected text appears also somewhere earlier on current line) - :'<,'>s/...still works
于 2017-07-27T19:39:57.707 回答