题
如何快速引用/取消引用单词并更改引用(例如从 '
到 "
)在 Vim 中?我知道关于 环绕.vim 插件,但我想只使用 Vim。
解决方案
Surround.vim 将是您最简单的答案。如果您确实反对使用它,这里有一些您可以采取的措施的示例。不一定是最有效的,但这就是编写 around.vim 的原因。
- 引用一个单词,使用单引号
ciw'Ctrl+r"'
ciw
- 删除光标所在的单词,并最终进入插入模式。'
- 添加第一个报价。Ctrl+r"
- 插入内容"
注册,又称最后一次复制/删除。'
- 添加收盘价。
- 取消引用单引号引起来的单词
di'hPl2x
di'
- 删除单引号括起来的单词。hP
- 将光标向左移动一个位置(在开头引用的顶部)并将刚刚删除的文本放在引用之前。l
- 将光标向右移动一个位置(在开头引号的顶部)。2x
- 删除两个引号。
- 将单引号改为双引号
va':s/\%V'\%V/"/g
va'
- 直观地选择引用的单词和引号。:s/
- 开始更换。\%V'\%V
- 仅匹配视觉选择区域内的单引号。/"/g
- 将它们全部替换为双引号。
其他提示
报价一个字,使用单引号
ciw'Ctrl+r"'
这是我更容易做这样
ciw '' Esc P
下面是一些地图,可以帮助:
:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P
如果你没有改变的mapleader变量,则激活与\q"
\q'
或\qd
的映射。他们在光标下加双引号的字周围,光标下的单词围绕单引号,分别删除光标下的单词周围的任何报价。
在除了其他命令,这将在括在双引号的线的所有字(按您的评论)
:s/\(\S\+\)/"\1"/
或者,如果你想减少反斜杠号码,你可以把一个\v
(极魔法)改性剂在模式的开始
:s/\v(\S+)/"\1"/
要包装在单引号(例如)ciw'<C-r>"'<esc>
的作品,但是<强>重复强>将不起作用。尝试:
ciw'<C-r><C-o>"'<esc>
此放缺省寄存器的内容“的字面”。现在,你可以在任何单词按.
将其包装在引号。要了解更多信息请参见 :h[elp] i_ctrl-r
和的 :h text-objects
来源: http://vimcasts.org/episodes/pasting-from-insert -mode /
宏方法
按 q 和 q 用于记录到 q 寄存器(我们使用“q”作为记住“引号”的快捷方式)。
按 转移 + 乙 将光标移动到当前单词的前面
按 我 类型 ' (单引号)
按 Esc键 然后按 e 移至词尾
按 A 然后按 ' 再次用引号将该词引起来。
最后按 q 将其记录到
q
登记。
如何使用它 :
- 将光标移动到所需的单词。
- 按 @q 用引号引起来的单词。
- 按 @@ 如果你想用另一个词重复它。
你可以改变 step 4
任何你喜欢的东西{一行,一个单词,直到找到一些字符,等等}。把它放入 vim variables
和 .vimrc
重复你的幸福。
我不知道这方面的任何内置的Vim命令,但使用r"f'r"
从“到‘和r'f"r'
改变从’到”改变的作品,如果你站在第一“或”命令r'
替换掉性格你的光标”,并期待下一次f"
移动你。”
对于 VSCodeVim 的用户你可以这样做
vwS"
- 您可以更换
"
与任何你想包裹的东西。 - 您可以更换
w
与任何其他选择运算符
添加引号
我开始在我的应用程序中使用这个快速而肮脏的功能 .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
- 视觉选择 内幕词) 放在引号中并按 问 对于双引号,或按 q 对于单引号。
删除引号
vnoremap s <esc>:call StripWrap()<cr>
function! StripWrap()
normal `>x`<x
endfunction
我用 vim-textobj-引号 这样 vim 将引号视为文本对象。这意味着我可以做 vaq
(目视选择 围绕引号. 。这会找到最接近的报价并直观地选择它们。(这是可选的,你可以做类似的事情 f"vww
)。然后我按 s
到 条 所选内容中的报价。
改变行情
吻。我 删除引号 然后 添加引号。例如,要将单引号替换为双引号,我将执行以下步骤:1.删除单引号: vaqs
, 2.添加新报价: vwQ
.
- http://vim.wikia.com/wiki/Wrap_a_visual_selection_in_an_HTML_tag 这里的代码已被修改并用作我的答案的一部分
- https://github.com/beloglazov/vim-textobj-quotes vim-文本-obj-引号
下面是可用于引用和解除引用字一些简单的映射:
" '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>
我使用nnoremap在我的.vimrc
要单引号的单词:
nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl
要除去引号(作品上双引号以及):
nnoremap qs :silent! normal mpeld bhd `ph<CR>
规则要记住: '平方'=单引号
VIM为vscode 做它awsomely。它是基于一个 VIM环绕的,如果你不使用vscode。
一些示例:
“测试”与引号内键入光标CS“测试”直到结束‘’
“测试”与引号内型DS”光标与测试到结束
“测试”与引号内键入光标CS“t与输入123>到最终 与<123>测试
测试用光标在字测试类型ysaw)直到结束(测试)
这个怎么样?
:%s/\'/"/g
我写了一个脚本,做这样的:
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>
要使用时,只需突出的东西,命中控制升,然后键入一个字符。如果它的功能知道的人物之一,它会提供正确的终止符。如果它不是,它会使用相同的字符插入两侧。
Surround.vim可以做更多的不仅仅是这一点,但是这足以满足我的需求。
可视模式地图例如,要添加的单引号文本的选定块周围:
:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>