用Vim括在括号中

时间:2011-11-09 20:06:24

标签: vim parentheses

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

换句话说,你会怎么做?

初始字符串:

It is sunny outside.

最终字符串:

It is (sunny) outside.

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

快乐的viming,SOCommunity!

12 个答案:

答案 0 :(得分:62)

总之,我一直在使用:

bcw()<Esc>P

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

请记住,这会覆盖您的猛烈注册。

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

5cc{<Enter>}<Esc>P

答案 1 :(得分:34)

Surround.vim应该做到这一点。如果您想使用“。”重复此操作,请参阅here

答案 2 :(得分:30)

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

ysiw

然后输入)

所以:

初始字符串:

It is sunny outside.

最终字符串:

It is (sunny) outside.

额外空间 使用开头按钮或括号,如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!”把它改成

     

'Hello world!'

-

  

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

     

<q>Hello world!</q>

-

  

要完整循环,请按cst"以获取

     

"Hello world!"

-

  

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

     

Hello world!

-

  

现在光标位于“Hello”,按ysiw](iw是文本对象)。

     

[Hello] world!

     

让我们制作大括号并添加一些空间(使用}   而不是{for no space):cs]{

     

{ Hello } world!

-

  

现在使用yssbyss)将整行括在括号中。

     

({ Hello } world!)

-

  

还原为原始文字:ds{ds)

     

Hello world!

-

  

强调你好:ysiw<em>

     

<em>Hello</em> world!

-

  

最后,让我们尝试一下视觉模式。按一个大写V(对于linewise   视觉模式)然后是S<p class="important">

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

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

如果您安装repeat.vim.命令将与dscsyss一起使用。

答案 3 :(得分:6)

答案 4 :(得分:6)

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

:nnoremap <leader>z viw<esc>a)<esc>hbi(<esc>lel

答案 5 :(得分:3)

为什么不使用:s//search and replace)?

例如:

:s/sunny/(&)/

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

&是匹配文字的简写)

答案 6 :(得分:1)

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

假设你对vim有一个新手级别的理解,让我说我有一条线(为简单起见),我想用方括号括起来。 e.g。

hello world

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

ESC ^i[ ESC $a] ESC

这将使当前行以括号括起来。现在您可以选择任意一行,然后按@1重复该行。

例如,如果您希望将当前单词设为paranthesised,则只需记录并播放以下食谱:

ESC bi[ ESC ea] ESC

你可以尝试优化击键,但现在这对我有用。

答案 7 :(得分:1)

您可以使用以下命令:

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

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

更改前:

word

然后使用命令:

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

最终结果:

\enquote{word}

答案 8 :(得分: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)

答案 9 :(得分:0)

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

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

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

答案 10 :(得分:0)

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

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

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

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

有一些缺点:

  • 如果<cword>中带有感叹号,则会中断(当然,您可以选择其他s///字符)。
  • 您不能仅将 替换为光标下方的单个单词。您可以在一行中进行第一个操作(默认设置),也可以在一行中进行所有操作(如上所述,使用/g标志)。您甚至可以使用%s...在文件中进行所有匹配。

答案 11 :(得分:0)

查看vim-sandwich

如果您以前使用过 around.vim,you can even make vim-sandwich use surround.vim keymaps

Tbh 唯一让我从 around.vim 切换的是 vim-sandwich 具有“最接近的对”运算符。

<强>| - 光标

<头>
文字 普通模式下的用户输入
[ { ( | ) } ] dsb
[ { | } ] dsb
[ | ] dsb