如何在Vim中快速引用/取消引用单词并更改引用(例如从'
到"
)?我知道surround.vim插件,但我想只使用Vim。
答案 0 :(得分:216)
surround.vim将是您最简单的答案。如果你真的反对使用它,这里有一些你可以做的例子。不一定是效率最高的,但这就是为什么环绕着.vim的原因。
ciw'Ctrl+r"'
ciw
- 删除光标所在的单词,最后以插入模式结束。'
- 添加第一个引用。Ctrl+r"
- 插入"
注册表的内容,即最后一次抽奖/删除。'
- 添加结束语。
di'hPl2x
di'
- 删除单引号括起来的字词。hP
- 将光标向左移动一个位置(在开头引号的顶部)并将刚刚删除的文本放在引号之前。l
- 将光标向右移动一个位置(在开头引号的顶部)。2x
- 删除两个引号。
va':s/\%V'\%V/"/g
va'
- 直观地选择引用的字词和引号。:s/
- 开始替换。\%V'\%V
- 仅匹配视觉选定区域内的单引号。/"/g
- 用双引号替换所有内容。答案 1 :(得分:168)
引用一个单词,使用单引号
ciw'Ctrl+r"'
我这样做更容易
ciw '' Esc P
答案 2 :(得分:25)
以下是一些有用的映射:
:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P
如果您尚未更改mapleader变量,请使用\q"
\q'
或\qd
激活映射。他们在光标下的单词周围添加双引号,在光标下的单词周围单引号,分别删除光标下单词周围的任何引号。
答案 3 :(得分:24)
除了其他命令之外,这会将所有单词用双引号括起来(根据你的评论)
:s/\(\S\+\)/"\1"/
或者如果你想减少反斜杠的数量,你可以在模式的开头添加\v
(非常魔法)修饰符
:s/\v(\S+)/"\1"/
答案 4 :(得分:16)
用单引号(例如)ciw'<C-r>"'<esc>
包装有效,但重复不起作用。尝试:
ciw'<C-r><C-o>"'<esc>
这将默认寄存器的内容“字面上”。现在,您可以在任何单词上按.
将其包装在引号中。要了解详情,请参阅:h[elp] i_ctrl-r
以及:h text-objects
答案 5 :(得分:10)
宏方式
按 q 和 q 录制到q寄存器(我们使用“q”作为记住“引号”的快捷方式)。
< / LI>按 shift + b 将光标移动到当前单词的前面
按 i 输入'(单引号)
按 esc 然后按 e 移至单词结尾
按 a 然后再按'以用引号括住该字词。
最后按 q 将其录制到q
注册表中。
如何使用
你可以用你想要的任何东西改变step 4
{一行,一个字,直到找到一些角色,等等}。将其放入vim variables
和.vimrc
以重复您的快乐。
答案 6 :(得分:5)
我不知道任何内置的vim命令,但是使用r"f'r"
从'更改为'而r'f"r'
更改为从'更改为'如果你站在第一个'或' 。r'
命令用'替换光标下的任何字符,f"
将你移动到下一个字符。
答案 7 :(得分:5)
如果您使用vim插件https://github.com/tpope/vim-surround(或使用预先安装了vim-surround的VSCode Vim插件),则非常方便!
添加
ysiw' // surround in word `'`
放下
ds' // drop surround `'`
更改
cs'" // change surround from `'` to `"`
它甚至适用于html标签!
cst<em> // change surround from current tag to `<em>`
查看github上的自述文件以获得更好的示例
答案 8 :(得分:4)
添加引号
我开始在.vimrc
:
vnoremap q <esc>:call QuickWrap("'")<cr>
vnoremap Q <esc>:call QuickWrap('"')<cr>
function! QuickWrap(wrapper)
let l:w = a:wrapper
let l:inside_or_around = (&selection == 'exclusive') ? ('i') : ('a')
normal `>
execute "normal " . inside_or_around . escape(w, '\')
normal `<
execute "normal i" . escape(w, '\')
normal `<
endfunction
现在,我在视觉上选择我想要的任何内容(通常通过viw
- 在引号中选择 in words )并按 Q 获取双引号,或者按 q 获取单引号。
删除引号
vnoremap s <esc>:call StripWrap()<cr>
function! StripWrap()
normal `>x`<x
endfunction
我使用vim-textobj-quotes,以便vim将引号视为文本对象。这意味着我可以vaq
(在视觉上选择在引号周围。这会找到最近的引号并在视觉上选择它们。(这是可选的,您可以执行f"vww
之类的操作)然后我按s
来剥离选择中的引号。
更改报价
KISS。我删除引号然后添加引号。
例如,要用双引号替换单引号,我将执行以下步骤:
1.删除单引号:vaqs
,2。添加新引号:vwQ
。
答案 9 :(得分:4)
对于VSCodeVim的用户,您可以
table {
border-collapse: collapse;
font-size: 1.6em;
width: 1000px;
}
table tr td:first-child {
position: absolute;
width: 7em; /* match margin-left below */
left: 0;
top: auto;
background-color: yellow;
border-top-width: 1px;
}
td {
border-collapse: collapse;
border: 1px solid #ccc;
padding: 3px;
}
div {
width: 500px;
overflow-x: scroll;
margin-left: 12em; /* match width above */
overflow-y: visible;
padding: 0;
}
<div>
<table>
<tr>
<td>foofoofoofoofoo</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
</tr>
<tr>
<td>barbarbarbar</td>
<td>x</td>
<td></td>
<td>x</td>
<td>x</td>
<td>x</td>
<td></td>
<td>x</td>
<td>x</td>
<td></td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td></td>
<td>x</td>
<td>x</td>
<td></td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
</tr>
</table>
</div>
替换为您想要包装的内容。vwS"
替换为任何其他选择运算符答案 10 :(得分:2)
以下是一些简单的映射,可用于引用和取消引用单词:
" 'quote' a word
nnoremap qw :silent! normal mpea'<Esc>bi'<Esc>`pl
" double "quote" a word
nnoremap qd :silent! normal mpea"<Esc>bi"<Esc>`pl
" remove quotes from a word
nnoremap wq :silent! normal mpeld bhd `ph<CR>
答案 11 :(得分:1)
我正在使用 vim-surround
命令,本质上几乎是 vim。
Surround.vim 是关于“环绕”的:圆括号、方括号、引号、XML 标签等等。该插件提供映射以轻松删除、更改和添加此类环境。
Plugin 'tpope/vim-surround'
例如,要完全删除分隔符,请按 ds"
。
更多细节在这里:
https://github.com/tpope/vim-surround
答案 12 :(得分:1)
用引号包裹所有单词:
s/\(\w\+\)/"\1"/g
之前:
aaa,bbb,ccc
之后:
"aaa","bbb","ccc"
答案 13 :(得分:1)
VIM for vscode确实做到了。如果您不使用vscode,它基于一个vim-surround。
一些例子:
“测试”的光标位于引号内,类型为cs“”,以“测试”结尾
“ test”(光标位于引号内的类型为ds)以测试结束
“ test”(光标位于引号内,键入cs“ t并输入123>结束) 用<123> test
使用光标在单词测试类型ysaw上的测试)以(测试)结束
答案 14 :(得分:1)
我在.vimrc中使用nnoremap
单引号:
nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl
删除引号(也适用于双引号):
nnoremap qs :silent! normal mpeld bhd `ph<CR>
要记住的规则:'sq'=单引号。
答案 15 :(得分:0)
我写了一个脚本来做到这一点:
function! WrapSelect (front)
"puts characters around the selected text.
let l:front = a:front
if (a:front == '[')
let l:back = ']'
elseif (a:front == '(')
let l:back = ')'
elseif (a:front == '{')
let l:back = '}'
elseif (a:front == '<')
let l:back = '>'
elseif (a:front =~ " ")
let l:split = split(a:front)
let l:back = l:split[1]
let l:front = l:split[0]
else
let l:back = a:front
endif
"execute: concat all these strings. '.' means "concat without spaces"
"norm means "run in normal mode and also be able to use \<C-x> characters"
"gv means "get the previous visual selection back up"
"c means "cut visual selection and go to insert mode"
"\<C-R> means "insert the contents of a register. in this case, the
"default register"
execute 'norm! gvc' . l:front. "\<C-R>\"" . l:back
endfunction
vnoremap <C-l> :<C-u>call WrapSelect(input('Wrapping? Give both (space separated) or just the first one: '))<cr>
要使用,只需突出显示某些内容,按控制键l,然后键入一个字符即可。如果它是函数知道的字符之一,它将提供正确的终止字符。如果不是,它将在两侧插入相同的字符。
Surround.vim不仅可以执行此操作,但这还满足我的需求。
答案 16 :(得分:0)
:%s/\'/"/g
答案 17 :(得分:-1)
可视模式映射示例,用于在选定的文本块周围添加单引号:
:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>