有没有办法在vim中将一些文本括在括号(或大括号)中?
换句话说,你会怎么做?
初始字符串:
It is sunny outside.
最终字符串:
It is (sunny) outside.
有趣的是,我只是点击:w
提交这个问题。
快乐 vi-ing,SOCommunity!
有没有办法在vim中将一些文本括在括号(或大括号)中?
换句话说,你会怎么做?
初始字符串:
It is sunny outside.
最终字符串:
It is (sunny) outside.
有趣的是,我只是点击:w
提交这个问题。
快乐 vi-ing,SOCommunity!
一句话,我一直在使用:
bcw()<Esc>P
也就是说,转到单词的开头,剪切单词并进入插入模式,键入括号,然后退出插入模式并重新粘贴单词。
请记住,这将覆盖您的 yank 寄存器。
当然,您可以将 bcw 替换为您需要的任何移动和选择类型,例如
5cc{<Enter>}<Esc>P
下面是使用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。
Surround.vim应该可以解决问题。如果您想用“.”重复这一点,请参见此处。
您可以为该排序定义一个简单的映射。这个应该可以的。在正常模式下,键入 z 以将单词括在括号中。
:nnoremap <leader>z viw<esc>a)<esc>hbi(<esc>lel
您可以使用以下命令:
cw(<C-r><C-o>")<ESC>
优点是您可以使用 dot 命令对不同的单词重复此操作。这也适用于自定义附件,例如:
更改前:
word
然后使用命令:
cw\enquote{<C-r><C-o>"}<ESC>
最后结果:
\enquote{word}
为什么不使用:s//
(搜索和替换)?
例如:
:s/sunny/(&)/
您可能还有其他想法,但我无法从您的问题中看出它是什么。
(&
是匹配文本的简写)
旁白:要自动执行此操作,您可以像这样记录宏:(光标位于开头sunny
):
qq
- 开始在寄存器中录制宏q
ye
- 拉到单词的末尾(sunny
在这种情况下) - could alsoyE
等。:s/
- 进入命令模式,并启动搜索和替换命令Ctrl+R, "
, 粘贴被抽出的文本/(&)/
- 完成命令,如上所述。命令行现在将读取:s/sunny/(&)/
enter
- 运行添加括号的命令。q
- 停止录制宏现在,如果您开始使用不同的单词,您可以键入@q
来运行宏。宏中没有任何东西是特定于单词的sunny
,所以它应该适用于任何东西。
你可以先做 , 或者这样来更新它以在单词中间工作b
。你明白了。您可能还想保存和恢复光标位置,这很容易添加(例如:mz
在开始处和 `z 在结束处)。
我不喜欢使用任何插件,并且希望将所有内容都限制在我的点文件中,以便于移植。我能想到的最简单的方法就是简单地记录并重播它。如果您打算在会话中更频繁地使用它,您也可以在 .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 的偏移量,因此我们不必因为插入左括号而将先前记录的位置增加 1)
我还没有在其他答案中看到的另一个有用的花絮:
在映射中,使用expand("<cword>")
(或任何其他类似<cWORD>
的<cexpr>
, 等)。这使您可以访问“光标下的单词”。
例如,要将“光标下的单词”当前行上的所有出现替换为带括号的版本:
nnoremap <leader>( :execute "s!" . expand("<cword>") . "!(&)!g"<CR>
有一些缺点:
<cword>
其中有感叹号,则中断(s///
当然,您可以选择其他字符)。/g
标志)。您甚至可以使用%s...
.查看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 |
对于这样的事情,使用范围和组可能比使用外部插件更好:
:%s~\v(\w{5}) ~(\1) ~g
上面搜索一个后跟一个空格的 5 个字母的单词,使用 () 对匹配进行分组,并将其替换为分组匹配周围的括号。