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

Eug*_*ash 184 vim quoting

如何快速报价/引文结束词和引述的变化(例如从'")在Vim中?我知道surround.vim插件,但我想只使用Vim.

jam*_*san 231

surround.vim将是你最简单的答案.如果你真的反对使用它,这里有一些你可以做的例子.不一定是效率最高的,但这就是为什么环绕着.vim写的原因.

  • 引用一个单词,使用单引号
    ciw'Ctrl+r"'
    • ciw - 删除光标所在的单词,最后进入插入模式.
    • ' - 添加第一个引用.
    • Ctrl+r"- 插入"寄存器的内容,即最后一个yank/delete.
    • ' - 添加结束报价.

  • 取消引用单引号括起来的单词
    di'hPl2x
    • di' - 删除单引号括起来的单词.
    • hP - 将光标向左移动一个位置(在开头引号的顶部)并将刚删除的文本放在引号之前.
    • l - 将光标向右移动一个位置(在开头引号的顶部).
    • 2x - 删除两个引号.

  • 将单引号更改为双引号
    va':s/\%V'\%V/"/g
    • va' - 直观地选择引用的单词和引号.
    • :s/ - 开始更换.
    • \%V'\%V - 仅匹配视觉选定区域内的单引号.
    • /"/g - 用双引号替换它们.

  • @Koveras`ciw`无论你的光标在哪里,都能正常工作.`cw`仅在光标位于单词的开头时才有效.见`:help iw`. (16认同)
  • 劫持最佳答案给出一个不错的小技巧:如果你有几个单词用双引号替换封闭的单引号,你可能会注意到@jamessan的第一个解决方案不适用于`.`命令.为了使它工作,使用`ciw'Ctrl + r Ctrl + p"`.然后`.`将按照你想要的方式表示下面的单词:它不会记住寄存器的内容,它会记住你想要的是什么现在注册(有点难以解释,但如果你尝试两者,它将变得显而易见:-)) (9认同)

ins*_*ero 176

引用一个单词,使用单引号

ciw'Ctrl+r"'

我这样做更容易

ciw '' Esc P
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这似乎并不允许.(重复). (6认同)
  • @wilmoore也没有接受的答案. (6认同)
  • @wilmoore将上面记录为宏,然后重播. (3认同)
  • 我喜欢这个,因为我可以在vim模式的终端/ repl上使用它,因为Ctrl + r通常已经用于反向历史搜索. (2认同)

Geo*_*edy 27

这是一些可能有用的映射:

:nnoremap <Leader>q" ciw""<Esc>P
:nnoremap <Leader>q' ciw''<Esc>P
:nnoremap <Leader>qd daW"=substitute(@@,"'\\\|\"","","g")<CR>P
Run Code Online (Sandbox Code Playgroud)

如果您尚未更改mapleader变量,请使用\q" \q'或激活映射\qd.它们在光标下的单词周围添加双引号,在光标下的单词周围单引号,分别删除光标下单词周围的任何引号.

  • 这也可以很容易地适应视觉模式,用引号包围选择,例如 `:vnoremap &lt;leader&gt;q c""&lt;esc&gt;P`。 (2认同)

Mat*_*iva 26

除了其他命令之外,这将用双引号将所有单词括起来(根据您的注释)

:s/\(\S\+\)/"\1"/
Run Code Online (Sandbox Code Playgroud)

或者如果你想减少反斜杠的数量,你可以\v在模式的开头放一个(非常神奇的)修饰符

:s/\v(\S+)/"\1"/
Run Code Online (Sandbox Code Playgroud)


Jam*_*ven 18

用单引号(例如)包装ciw'<C-r>"'<esc>起作用,但重复不起作用.尝试:

ciw'<C-r><C-o>"'<esc>
Run Code Online (Sandbox Code Playgroud)

这将默认寄存器的内容"按字面意思".现在,您可以按.任何单词将其包装在引号中.要了解更多:h[elp] i_ctrl-r有关文本对象的信息,请参阅:h text-objects

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

  • 优秀小费!如果有人想要制作一个映射,那么正确的表示法是`ciw'<CR> <CO>"'<Esc>`. (2认同)

Ula*_*ach 17

如果你使用vim插件https://github.com/tpope/vim-surround(或者使用VSCode Vim插件,预装了vim-surround),非常方便!

添加

ysiw' // surround in word `'`
Run Code Online (Sandbox Code Playgroud)

降低

ds' // drop surround `'`
Run Code Online (Sandbox Code Playgroud)

改变

cs'" // change surround from `'` to `"`
Run Code Online (Sandbox Code Playgroud)

它甚至适用于 html 标签!

cst<em> // change surround from current tag to `<em>`
Run Code Online (Sandbox Code Playgroud)

查看 github 上的自述文件以获得更好的示例

  • 伙计们,这就是正确的答案 (2认同)

小智 12

在单词周围添加引号:viw S '

  • viw:选择光标下的单词
  • S:添加周围
  • ':单引号

将周围环境从 ' 更改为 " : cs ' "

  • cs:改变周围环境
  • ':单引号
  • ": 改为双引号

  • “s”命令删除光标下的字符并进入插入模式,将光标置于已删除字符所在的位置。“S”命令删除整行并在行首进入插入模式。这是OP想要的吗? (2认同)

Bra*_*n90 10

宏的方式

  1. 按下qq记录到q寄存器(我们使用"q"作为记住"引号"的快捷方式).

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

  3. i类型'(单引号)

  4. 按,esc然后按e移动到单词结尾

  5. 按,a然后再按'一次用引号括起来.

  6. 最后按下q将其记录到q寄存器中.

如何使用它 :

  1. 将光标移动到所需的单词.
  2. @q括号括起一个单词.
  3. 新闻@@,如果你想重复它变成另一个字.

你可以改变step 4你喜欢的任何东西{一条线,一个字直到找到一些角色等}.把它放进@qq重复你的幸福.

  • 不得不说我喜欢这个解决方案。不需要Surround.vim,也可以轻松调用和创建宏。也可以轻松地用于您需要的其他任何内容(例如,对我来说,直到行尾都引用当前单词,非常适合ansible)。要显示该宏,请执行以下操作:“ qp。要保存该宏,请转到.vimrc并执行:let @q ='macro contents'(仅出于完整性考虑) (2认同)
  • 我非常喜欢这个。您也可以嵌套这些宏。因此,您可以在寄存器 j `@qw` 中记录,然后您可以使用 `n@j` 将接下来的 `n` 个单词用引号括起来。 (2认同)
  • 我添加了一些步骤来使宏持久化。 (2认同)

Jan*_*ena 7

对于VSCodeVim的用户,您可以

vwS"

  • 您可以"用任何您想包装的东西代替。
  • 您可以w用任何其他选择运算符替换

  • 这在MacVIM上对我也很有效,但是我不得不使用`viwS'将单词用单引号引起来。到目前为止最简单的。 (2认同)
  • 仅当您位于单词的开头时,这才有效。如果您想在单词中的任何位置执行此操作,您可以执行:`viwS"` (2认同)

Jam*_*son 6

添加报价

我开始在我的.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
Run Code Online (Sandbox Code Playgroud)

所以现在,我在引号中直观地选择我想要的任何内容(通常通过viw-在 word 中直观地选择)并按Q双引号,或按q单引号。

删除报价

vnoremap s <esc>:call StripWrap()<cr>

function! StripWrap()
  normal `>x`<x
endfunction
Run Code Online (Sandbox Code Playgroud)

我使用vim-textobj-quotes以便 vim 将引号视为文本对象。这意味着我可以做vaq(直观地选择引号包围。这寻找最近的报价,并在视觉上选择它们。(这是可选的,你可以这样做f"vww),然后我按s剥离从选择的报价。

更改报价

吻。我删除引号然后添加引号。例如,要用双引号替换单引号,我将执行以下步骤: 1. 删除单引号:vaqs, 2. 添加新引号:vwQ



Håv*_*d S 5

我不知道任何内置的vim命令,但是如果你站在第一个'或r"f'r"' ,则使用从'更改为'并r'f"r'从更改为'到'工作.该命令r'用' 代替光标下的任何字符',然后f"让你前进到下一个".

  • 对我来说最直观的“手动”解决方案。您可以直接输入“.”,而不是第二个替换命令(“r”和“"r”),如果您想更改更多引号,“;”和“,”会将您带到下一个或上一个它们分别以相同方向或相反方向重复最后一个“f/F/t/T”搜索。 (2认同)