用Vim括在括号中

eqb*_*eqb 58 vim parentheses

有没有办法在vim的括号(或大括号)中包含一些文本?

换句话说,你会怎么做?

初始字符串:

It is sunny outside.
Run Code Online (Sandbox Code Playgroud)

最终字符串:

It is (sunny) outside.
Run Code Online (Sandbox Code Playgroud)

有趣的是,我只是点击:w提交这个问题.

快乐的viming,SOCommunity!

小智 67

总之,我一直在使用:

bcw()<Esc>P
Run Code Online (Sandbox Code Playgroud)

也就是说,转到单词的开头,剪切单词并进入插入模式,键入括号,然后退出插入模式并将单词粘贴回来.

请记住,这将覆盖你的猛烈注册.

当然,您可以用您需要的任何移动和选择类型替换bcw,例如

5cc{<Enter>}<Esc>P
Run Code Online (Sandbox Code Playgroud)

  • 当我的猛拉被覆盖时,我讨厌它. (19认同)
  • @ d1str0你仍然可以在寄存器"0"中找到你的猛拉 (4认同)
  • 切线,但猛拉实际上应该被制成堆栈,就像撤消一样。 (3认同)

mwi*_*son 35

Surround.vim应该做的伎俩.如果你想用'.'重复一遍,请看这里.


Dan*_*nny 31

以下是使用surround.vim的示例.在vim普通模式下,将光标放在所需的单词上(在这种情况下是晴天)并键入:

ysiw
Run Code Online (Sandbox Code Playgroud)

然后输入 )

所以:

初始字符串:

It is sunny outside.
Run Code Online (Sandbox Code Playgroud)

最终字符串:

It is (sunny) outside.
Run Code Online (Sandbox Code Playgroud)

额外空间: 使用开口支架或支架,如ysiw(用parens包围,以及paren和word + end之间的空格)

可视模式更简单 按下进入视觉模式v.现在,如果您键入S(,该单词将被空格包围.不过,如果你使用闭幕),而不是S)它不会受到空间包围.

这适用于所有支架对周围环境<> [] {} (),而不仅仅适用于().它的行为S<是这样的,它需要一个标签外壳,所以只能S>包围 <>.

更多:

键入ysiw后跟}为curlies做同样的事情

不妨在这里添加更多示例:

  • 输入cs('到[c] hange [s] urroundings from(to'

  • cs'( 从'环境变为()

  • ds(.至[d] elete ([s] urroundings

更:

为什么不引用Tpope页面的其余部分来阻止我们点击链接?

//开始引用:

用例子解释是最容易的.

cs"'里面

"你好,世界!" 将其改为

'你好,世界!'

-

现在按'Hello world!'将其更改为

你好,世界!

-

要完整循环,按下cs'<q>即可获得

"你好,世界!"

-

要完全删除分隔符,请按 <q>Hello world!</q>

你好,世界!

-

现在将光标放在"Hello"上,按cst"(iw是文本对象).

[你好,世界!让我们做括号并添加一些空格(使用}而不是{for no space):"Hello world!"

{ 你好,世界!

-

现在用ds".或将整行用括号括起来Hello world!.

({ 你好,世界!)

-

恢复原文: ysiw]

你好,世界!

-

问候你好: [Hello] world!

你好世界!

-

最后,让我们尝试一下视觉模式.按一个大写cs]{(对于线性可视模式),然后按{ Hello } world!.

<p class="important">
  <em>Hello</em> world!
</p>
Run Code Online (Sandbox Code Playgroud)

这个插件非常适用于HTML和XML编辑,这个目前似乎在Vim土地上没有充足.(与HTML/XML插入相反,其中有许多插件可用).同时添加,更改和删除标签对是一件轻而易举的事.

yssb命令将工作yss),({ Hello } world!)以及ds{ds)如果你安装repeat.vim.

  • 为什么我们需要 ysiw 中的 y ? (2认同)

Roo*_*ook 6

您可以为该类别定义一个简单的映射.这应该做到这一点.在正常模式下,键入z以括住括号中的单词.

:nnoremap <leader>z viw<esc>a)<esc>hbi(<esc>lel
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以使用以下命令:

cw(<C-r><C-o>")<ESC>
Run Code Online (Sandbox Code Playgroud)

优点是您可以使用点命令对不同的单词重复此操作。这也适用于自定义封装,例如:

变更前:

word
Run Code Online (Sandbox Code Playgroud)

然后使用命令:

cw\enquote{<C-r><C-o>"}<ESC>
Run Code Online (Sandbox Code Playgroud)

最后结果:

\enquote{word}
Run Code Online (Sandbox Code Playgroud)


jwd*_*jwd 5

为什么不使用:s//搜索和替换)?

例如:

:s/sunny/(&)/
Run Code Online (Sandbox Code Playgroud)

您可能有其他想法,但我无法从您的问题中看出它是什么。

&是匹配文本的简写)


旁白:要自动执行此操作,您可以像这样录制宏:(光标位于 开头sunny):

  • qq - 开始在寄存器中录制宏 q
  • ye- 猛拉到单词的末尾(sunny在这种情况下为 ) - 也可以yE,等等。
  • : - 进入命令模式
  • Ctrl+R, ", 粘贴被拉取的文本
  • /(&)/- 完成命令,如上所述。命令行现在将读取:s/sunny/(&)/
  • enter - 运行添加括号的命令。
  • q - 停止录制宏

现在,如果你去开始一个不同的词,你可以输入@q来运行宏。宏中的任何内容都不是特定于单词的sunny,因此它应该适用于任何事情。

您可以通过首先执行b,或这样来更新它以在单词中间工作。你明白了。您可能还想保存和恢复光标位置,这很容易添加(例如:mz在开始和`z 在结束)。

  • 因为你最终会输入两次已经写好的单词,而你想要的是选择它并在周围加上括号。 (7认同)