哪些Vim命令可以用来引用/取消引用单词?

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

143158 次浏览

我不知道任何内置的vim命令,但使用r"f'r"从'到'和r'f"r'从'到'工作,如果你站在第一个'或'。命令r'将光标下的任何字符替换为',而f"将移动到下一个'。

这个怎么样?

 :%s/\'/"/g

环绕。Vim是最简单的答案。如果你真的反对使用它,这里有一些你可以做的例子。不一定是最有效的,但这就是为什么要环绕。Vim写完了。

    引用一个单词,使用单引号
    ciw'Ctrl+r"'
    • ciw -删除光标所在的单词,并以插入模式结束。
    • ' -添加第一个引用。
    • Ctrl+r" -插入"寄存器的内容,也就是最后的拉拔/删除。
    • ' -添加结束引号。

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

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

这里有一些地图可能会有所帮助:

: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'Ctrl+r"'

这样做对我来说比较容易

ciw '' Esc P

我在我的。vimrc中使用nnoremap

单引用一个词:

nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl

删除双引号(也适用于双引号):

nnoremap qs :silent! normal mpeld bhd `ph<CR>

记住规则:'sq' =单引号。

用单引号括起来(例如)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/

添加引用

我开始在.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 -可视地选择在词),并按表示双引号,或按表示单引号。

删除引号

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


function! StripWrap()
normal `>x`<x
endfunction

我使用vim-textobj-quotes,以便vim将引号视为文本对象。这意味着我可以执行vaq(可视地选择在报价。这将查找最近的引号并可视化地选择它们。(这是可选的,你可以做一些类似f"vww的事情)。然后我按s从选定的引号。

改变报价

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

这里有一些简单的映射,可以用来引用和取消引用一个单词:

" '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>

宏观的方式!

  1. 记录到q寄存器(我们使用"q"作为记住“语录”的捷径)。

  2. 转变 + b移动光标到当前单词前面

  3. press type (单引号)

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

  5. 一个,然后再按,用引号括起单词。

  6. esc进入正常模式。

  7. 最后按将其记录到q寄存器。

如何使用

  1. 移动光标到所需的单词。
  2. @将一个单词用引号括起来。
  3. 如果你想重复另一个单词,请按@@

你可以用任何你喜欢的东西改变step 4{一行,一个单词,直到找到某个字符,等等}。

使记录的宏持久

  1. 打开. vimrc
  2. 转到文件末尾
  3. 切换到插入模式。输入这个使它持久:
let @q='ctrl + r ctrl + r q'
  1. save and quit

  2. open your files, go to some words

  3. now press @q

if you do it correctly, magic things should appear in your words.

You can apply this to other macros you loved.

对于VSCodeVim、Neovim和Macvim的用户,可以这样做

vwS"

  • 你可以将"替换为你想要的任何内容。
  • 你可以用任何其他选择操作符替换w

vcode的VIM做得很棒。如果你不使用vscode,它是基于vim-surround的。

一些例子:

"test",光标在引号内,类型为cs"',以'test'结束

"test",光标在引号内,类型ds",以test结束

"test",光标在引号内,输入cs"t,并输入123>结束 & lt; 123 >测试< / p >

用光标在单词上测试测试类型锯)结束于(测试)

我写了一个这样的脚本:

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>

要使用,只需要突出显示一些东西,按ctrl l,然后键入一个字符。如果它是函数所知道的字符之一,它将提供正确的结束字符。如果不是,它将在两边插入相同的字符。

环绕。Vim可以做的不仅仅是这些,但是这已经足够满足我的需求了。

在选定的文本块周围添加单引号的可视化模式映射示例:

:vnoremap qq <Esc>`>a'<Esc>`<i'<Esc>

如果你使用vim插件https://github.com/tpope/vim-surround(或使用VSCode vim插件,它带有预安装的vim-surround),它非常方便!

添加

ysiw' // surround in word `'`

下降

ds' // drop surround `'`

改变

cs'" // change surround from `'` to `"`

它甚至适用于html标签!

cst<em> // change surround from current tag to `<em>`

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

用引号括住所有单词:

s/\(\w\+\)/"\1"/g

之前:

aaa,bbb,ccc

后:

"aaa","bbb","ccc"

我正在使用vim-surround命令,本质上几乎是vim。

环绕。vim都是关于“环绕”:圆括号、括号、引号、XML标签等等。该插件提供了映射,可以轻松地成对删除、更改和添加这样的环境。

Plugin 'tpope/vim-surround'

例如,要完全删除分隔符,请按ds"。 详情如下: https://github.com/tpope/vim-surround < / p >

添加报价周围的词: v i w S '

  • 视图:选择光标下的单词
  • S:添加周边
  • ':单引号

将“”改为“”;: c s ' "

  • c:改变环境
  • ':单引号
  • “;”改为双引号