有没有办法在vim中的括号(或大括号)中包含一些文本?
换句话说,您将如何做?
初始字符串:
It is sunny outside.
最终字符串:
It is (sunny) outside.
有趣的是,我只是:w
想提出这个问题。
祝您生日快乐,SOCommunity!
Answers:
Surround.vim应该可以解决问题。如果要用“。”重复,请参见此处。
一个词,我一直在使用:
bcw()<Esc>P
也就是说,转到单词的开头,剪切单词并进入插入模式,键入方括号,然后退出插入模式并将单词粘贴回。
请记住,这将覆盖您的猛拉寄存器。
当然,您可以将bcw替换为所需的任何移动和选择类型,例如
5cc{<Enter>}<Esc>P
qbcw()<Esc>Pq
然后@q
快速重做单词。
"0
下面是使用的例子surround.vim。在vim正常模式下,将光标置于所需单词上(在这种情况下为晴天),然后键入:
ysiw
然后输入 )
所以:
初始字符串:
It is sunny outside.
最终字符串:
It is (sunny) outside.
多余的空间:
使用开括号或括号,例如ysiw(
用括号包围,并在括号和单词的开头和结尾之间留一个空格)
在视觉模式下更容易
按进入视觉模式v
。现在,如果您输入S(
,则单词将被空格包围。但是,如果您使用闭包)
代替S)
,它将不会被空格包围。
这不仅适用于所有括号对的环境,而且还适用<> [] {} ()
于()
。的行为S<
是这样的,它期望使用标签封装,因此只能S>
将括起来 <>
。
更多:
键入,ysiw
然后}
对卷发进行相同的操作
还可以在此处添加更多示例:
键入cs('
到[C]焊割[S] urroundings从(为'
cs'(
从“”环境更改为()
ds(.
为[d] elete (
[S] urroundings共
更:
为什么不引用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
或将整个行用括号括起来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。
您可以为该排序事件定义一个简单的映射。这应该做到。在正常模式下,键入z可以用括号将单词括起来。
:nnoremap <leader>z viw<esc>a)<esc>hbi(<esc>lel
:nnoremap <leader>( bi(<esc>eli)<esc>
还是我错过了什么?顺便说一句很好的答案。
您可以使用以下命令:
cw(<C-r><C-o>")<ESC>
好处是您可以使用dot命令对不同的单词重复此操作。这也适用于自定义包围,例如:
更改之前:
word
然后使用以下命令:
cw\enquote{<C-r><C-o>"}<ESC>
最后结果:
\enquote{word}
v
然后c(<C-r><C-o>")<ESC>
明显地使用。将包含最后一个delete或yank(请参见:help i_^r
)文本的默认或未命名寄存器粘贴到游标(:help ^o
)的最后位置,并立即插入一个右括号非常方便。
我不想使用任何插件,并且希望将所有内容都限制在我的dotfile中,以便于移植。我能想到的最简单的方法是简单地记录并重放它。如果您打算在各个会话中更频繁地使用它,则也可以在.vimrc中映射该键,但是我不需要这样做(而且我真的很想找出要映射到哪个键)。
假设您对vim有一个新手级别的了解,假设我有一条(为简单起见)要用方括号括起来的直线。例如
hello world
进入普通模式。q1
开始录制。现在执行以下操作
ESC ^i[ ESC $a] ESC
这将保留当前行的括号。现在您可以选择任何行,然后按@1
以重复它。
例如,如果您希望将当前单词括起来,则只需记录并回放以下配方:
ESC bi[ ESC ea] ESC
您当然可以尝试针对击键进行优化,但这目前对我有用。
我知道这是一个古老的问题,但是此处尚未提及类似的复杂解决方案,并且我相信它可以帮助某人。在我的.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开始的偏移量,因此,由于插入了左括号,因此我们不必将以前记录的位置增加一个)
我还没有在其他答案中看到另一个有用的花絮:
在映射,使用expand("<cword>")
(或任何其它类似的<cWORD>
,<cexpr>
等)。这使您可以访问“光标下的单词”。
例如,用括号内的版本替换“光标下的单词”当前行上的所有出现:
nnoremap <leader>( :execute "s!" . expand("<cword>") . "!(&)!g"<CR>
有一些缺点:
<cword>
带有感叹号,则会中断(s///
当然,您可以选择其他字符)。/g
标志)。您甚至可以使用来处理文件中的所有事件%s...
。