什么Vim命令可用于引用/取消引用单词?

时间:2010-01-27 15:01:23

标签: vim quoting

如何在Vim中快速引用/取消引用单词并更改引用(例如从'")?我知道surround.vim插件,但我想只使用Vim。

18 个答案:

答案 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

上有关文字对象的更多信息

来源:http://vimcasts.org/episodes/pasting-from-insert-mode/

答案 5 :(得分:10)

宏方式

  1. q q 录制到q寄存器(我们使用“q”作为记住“引号”的快捷方式)。

    < / LI>
  2. shift + b 将光标移动到当前单词的前面

  3. i 输入'(单引号)

  4. esc 然后按 e 移至单词结尾

  5. a 然后再按'以用引号括住该字词。

  6. 最后按 q 将其录制到q注册表中。

  7. 如何使用

    1. 将光标移动到所需的单词。
    2. @ q 用引号括住一个单词。
    3. 如果您想将其重复为另一个单词,请按 @ @
    4. 你可以用你想要的任何东西改变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>