85

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

换句话说,你会怎么做?

初始字符串:

It is sunny outside.

最终字符串:

It is (sunny) outside.

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

快乐 vi-ing,SOCommunity!

4

12 回答 12

100

一句话,我一直在使用:

bcw()<Esc>P

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

请记住,这将覆盖您的 yank 寄存器。

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

5cc{<Enter>}<Esc>P
于 2014-07-11T14:46:41.203 回答
59

下面是使用round.vim的示例。在 vim 正常模式下,将光标放在所需的单词上(在本例中为 sunny)并输入:

ysiw

然后输入)

所以:

初始字符串:

It is sunny outside.

最终字符串:

It is (sunny) outside.

额外空格: 使用左括号或括号,例如ysiw(用括号括起来,括号和单词开头+结尾之间有空格)

视觉模式更容易 按 进入视觉模式v。现在,如果您键入S(,该单词将被空格包围。但是,如果您使用结束)S),它将不会被空格包围。

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

更多的:

键入ysiw后跟}以对卷曲执行相同的操作

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

  • 键入cs('以 [c] 将 [s] 环境从 ( 更改为 '

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

  • ds(.[d](完全删除 [s] 环境

更:

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

//开始引用:

用例子来解释是最容易的。

cs"'里面

“你好世界!” 将其更改为

'Hello world!'

--

现在按cs'<q>将其更改为

<q>Hello world!</q>

--

要转一圈,请按cst"获取

"Hello world!"

--

要完全删除分隔符,请按ds".

Hello world!

--

现在将光标放在“Hello”上,按ysiw](iw 是一个文本对象)。

[Hello] world!

让我们制作大括号并添加一些空格(使用 } 而不是 { 表示没有空格):cs]{

{ Hello } world!

--

yssb现在用or将整行括在括号中yss)

({ Hello } world!)

--

还原为原文:ds{ds)

Hello world!

--

强调你好:ysiw<em>

<em>Hello</em> world!

--

最后,让我们试试视觉模式。按大写V字母(用于线性视觉模式),然后按S<p class="important">

<p class="important">
  <em>Hello</em> world!
</p>

这个插件对于 HTML 和 XML 编辑来说非常强大,目前在 Vim 领域似乎还没有填补这个利基市场。(与 HTML/XML 插入相反,有许多插件可供使用)。同时添加、更改和删除标签对是一件轻而易举的事。

.命令将与ds,一起使用cs,并且yss如果您安装了 repeat.vim

于 2014-08-28T17:49:18.200 回答
40

Surround.vim应该可以解决问题。如果您想用“.”重复这一点,请参见此处

于 2011-11-09T20:09:29.453 回答
9

您可以为该排序定义一个简单的映射。这个应该可以的。在正常模式下,键入 z 以将单词括在括号中。

:nnoremap <leader>z viw<esc>a)<esc>hbi(<esc>lel
于 2011-11-09T21:56:23.283 回答
6

您可以使用以下命令:

cw(<C-r><C-o>")<ESC>

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

更改前:

word

然后使用命令:

cw\enquote{<C-r><C-o>"}<ESC>

最后结果:

\enquote{word}
于 2018-08-13T04:05:35.810 回答
5

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

例如:

:s/sunny/(&)/

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

&是匹配文本的简写)


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

  • qq- 开始在寄存器中录制宏q
  • ye- 拉到单词的末尾(sunny在这种情况下) - could alsoyE等。
  • :s/- 进入命令模式,并启动搜索和替换命令
  • Ctrl+R, ", 粘贴被抽出的文本
  • /(&)/- 完成命令,如上所述。命令行现在将读取:s/sunny/(&)/
  • enter- 运行添加括号的命令。
  • q- 停止录制宏

现在,如果您开始使用不同的单词,您可以键入@q来运行宏。宏中没有任何东西是特定于单词的sunny,所以它应该适用于任何东西。

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

于 2011-11-09T20:10:01.980 回答
5

环绕声.vim

于 2011-11-09T20:10:28.603 回答
1

我不喜欢使用任何插件,并且希望将所有内容都限制在我的点文件中,以便于移植。我能想到的最简单的方法就是简单地记录并重播它。如果您打算在会话中更频繁地使用它,您也可以在 .vimrc 中映射键,但我不需要(而且我真的不知道映射到哪个键击)。

假设您对 vim 有一个新手级别的理解,假设我有一条线(为简单起见),我想用方括号括起来。例如

hello world

进入正常模式。q1开始录制。现在执行以下操作

ESC ^i[ ESC $a] ESC

这将使当前行带有括号。现在您可以选择任何一行并按@1重复它。

例如,如果您希望将当前单词放在括号中,则只需录制并播放以下配方:

ESC bi[ ESC ea] ESC

您当然可以尝试针对击键进行优化,但目前这对我有用。

于 2014-07-19T00:20:43.903 回答
1

我知道这是一个老问题,但是这里还没有提到像这样复杂的解决方案,我相信它可以帮助某人。在我的.vimrc文件中,我有这样一行:

xnoremap <silent> ( <ESC>:let p = &paste<CR>:set paste<CR>:let a = line2byte(line('.')) + col('.')<CR>gvc()<ESC>:if getregtype() ==# 'V'<CR>call setreg('"', substitute(@", '\n$', '', ''), 'c')<CR>endif<CR>P:exe "goto ".a<CR>:exe "let &paste=".p<CR>

在可视模式中选择一些文本并按 就足够了(此映射也适用于逐行和逐块视觉模式

它是如何工作的?

<ESC>将退出可视模式

:let p = &paste<CR>:set paste<CR>...:exe "let &paste=".p<CR>将确保宏将以粘贴模式执行(因为自动缩进和类似的改进可能包括一些我们不想要的额外空格),而宏之后的粘贴状态将与执行宏之前保持相同

:let a = line2byte(line('.')) + col('.')<CR>将找到当前字节偏移量(基于 1)

gv将重新选择之前选择的文本

c将删除选择并带我们进入插入模式以替换选择

()<ESC>将放入我们想要的括号并退出插入模式

:if getregtype()==#'V'<CR>call setreg('"',substitute(@",'\n$','',''),'c')<CR>endif<CR>\n将从未命名( )寄存器中删除尾随"并将其类型更改为字符,但前提是它之前是逐行的(以便可以从括号中的注册表粘贴)

P将在括号内粘贴先前替换的文本

:exe "goto ".a<CR>将光标带回上一个位置(goto使用基于 0 的偏移量,因此我们不必因为插入左括号而将先前记录的位置增加 1)

于 2018-09-11T18:46:01.807 回答
1

我还没有在其他答案中看到的另一个有用的花絮:

在映射中,使用expand("<cword>")(或任何其他类似<cWORD><cexpr>, 等)。这使您可以访问“光标下的单词”。

例如,要将“光标下的单词”当前行上的所有出现替换为带括号的版本:

nnoremap <leader>( :execute "s!" . expand("<cword>") . "!(&)!g"<CR>

有一些缺点:

  • 如果<cword>其中有感叹号,则中断(s///当然,您可以选择其他字符)。
  • 您不能替换光标下的单个单词。您可以在一行中执行第一个(默认设置),或者在一行中执行所有匹配项(如上,带有/g标志)。您甚至可以使用%s....
于 2020-07-25T17:16:02.120 回答
1

查看vim 三明治

如果你以前用过环绕.vim,你甚至可以让 vim-sandwich 使用环绕.vim 键盘映射

唯一让我从surround.vim 切换的原因是vim-sandwich 有“最近的对”运算符。

下面是随后在几个括号上写“dsb”的结果。当使用 vim-sandwich 和环绕.vim 键绑定时,“dsb”是默认的“删除最近的括号对”绑定。标准的 Sandwich.vim 键绑定虽然是 "sdb" ( s andwich d elete b racket)

X - 光标

文本 普通模式下的用户输入
[ { ( X ) } ] dsb
[ { X } ] dsb
[ X ] dsb
于 2021-06-09T20:32:02.660 回答
0

对于这样的事情,使用范围和组可能比使用外部插件更好:

:%s~\v(\w{5}) ~(\1) ~g

上面搜索一个后跟一个空格的 5 个字母的单词,使用 () 对匹配进行分组,并将其替换为分组匹配周围的括号。

于 2013-12-23T17:16:24.707 回答