有没有办法在vim的括号(或大括号)中包含一些文本?
换句话说,你会怎么做?
初始字符串:
It is sunny outside.
最终字符串:
It is (sunny) outside.
有趣的是,我只是点击:w
提交了这个问题。
快乐的viming,SOCommunity!
答案 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!
-
现在使用
yssb
或yss)
将整行括在括号中。
({ 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,.
命令将与ds
,cs
和yss
一起使用。
答案 3 :(得分:6)
答案 4 :(得分:6)
您可以为该类别定义一个简单的映射。这应该做到这一点。在正常模式下,键入z以括住括号中的单词。
:nnoremap <leader>z viw<esc>a)<esc>hbi(<esc>lel
答案 5 :(得分:3)
答案 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)
如果您以前使用过 around.vim,you can even make vim-sandwich use surround.vim keymaps
Tbh 唯一让我从 around.vim 切换的是 vim-sandwich 具有“最接近的对”运算符。
<强>| - 光标
文字 | 普通模式下的用户输入 |
---|---|
[ { ( | ) } ] |
dsb |
[ { | } ] |
dsb |
[ | ] |
dsb |