如何在Vim中快速引用/取消引用单词并更改引用(例如,从'
到"
)?我了解surround.vim插件,但我想用刚Vim的。
如何在Vim中快速引用/取消引用单词并更改引用(例如,从'
到"
)?我了解surround.vim插件,但我想用刚Vim的。
Answers:
Surround.vim将是您最简单的答案。如果您真的不喜欢使用它,那么这里有一些您可以做的例子。不一定是最高效的,但这就是为什么Surround.vim被编写的原因。
ciw'Ctrl+r"'
ciw
-删除光标所在的单词,并以插入模式结束。'
-添加第一个报价。Ctrl+r"
-插入"
寄存器的内容,也就是最后一次取消/删除。'
-添加结束语。
di'hPl2x
di'
-删除单引号引起的单词。hP
-将光标向左移动一个位置(在引号的顶部),然后将刚删除的文本放在引号之前。l
-将光标向右移动一个位置(在引号上方)。2x
-删除两个引号。
va':s/\%V'\%V/"/g
va'
-直观地选择带引号的单词和引号。:s/
-开始更换。\%V'\%V
-仅匹配视觉选择区域内的单引号。/"/g
-用双引号将它们全部替换。ciw
而不仅仅是cw
?我发现第一个令人困惑,第二个很好。
ciw
无论您的光标在单词中的哪个位置,@ Koveras都可以工作。 cw
仅在光标位于单词开头时才有效。请参阅:help iw
。
.
命令。要使其正常工作,请使用ciw' Ctrl+r Ctrl+p"
。然后.
将按照您希望的方式执行以下单词:与其记住寄存器的内容,不如记住寄存器现在要的内容(有点难以解释,但是如果您同时尝试,它将变得很明显) :
用单引号引用一个单词
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
。它们在光标下方的单词周围添加双引号,在光标下方的单词周围添加单引号,并分别删除光标下方的单词周围的所有引号。
map <Leader>' gewi'<Esc>A'<Esc>
到.vimrc
文件中,以从当前位置到行尾插入单引号注释;这在将一些MSDOS脚本转换为bash时帮助了我。
:vnoremap <leader>q c""<esc>P
。
除了其他命令之外,这还将所有单词用双引号引起来(根据您的注释)
:s/\(\S\+\)/"\1"/
或者如果您想减少反斜杠的数量,可以\v
在模式的开头放置一个(非常神奇的)修饰符
:s/\v(\S+)/"\1"/
:s/\v([a-Z]+)/"\1"/g
宏的方式!
按q和q记录到q寄存器中(我们使用“ q”作为记住“引号”的快捷方式)。
按shift+ b将光标移到当前单词的前面
按i类型'(单引号)
按esc然后按e移动到单词的末尾
按,a然后再按'一次,用引号将单词引起来。
按esc进入普通模式。
最后按q将其记录到q
寄存器中。
如何使用
你可以改变 step 4
用任何喜欢的内容 {一行,一个单词,直到找到某个字符,等等}。
使录制的宏持久化
让@ q =' ctrl+ r ctrl+ rq'
保存并退出
打开文件,输入一些单词
@q
如果操作正确,您的话中应该会出现神奇的事物。
您可以对自己喜欢的其他宏执行此步骤。
@q w
,然后可以n
使用with使用引号将后面的单词引起来n@j
。
以单引号引起来(例如)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/
ciw'<C-R><C-O>"'<Esc>
。
.
将重写最后一次实际调用的内容。
我不知道有任何内置的vim命令,但是如果您站在第一个'或'上,则可以使用r"f'r"
从'更改为'和从' r'f"r'
更改为'的方法。该命令r'
将光标下的任何字符替换为',然后f"
将您移至下一个“。
'r
和"r
),并转到下一个或上一个.
引号,因为它们分别沿相同方向或相反方向重复了最后一个搜索。;
,
f/F/t/T
添加报价
我开始在我的中使用此快速而肮脏的功能.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双引号,或者按q单引号。
删除引号
vnoremap s <esc>:call StripWrap()<cr>
function! StripWrap()
normal `>x`<x
endfunction
我使用vim-textobj-quotes,以便vim将引号视为文本对象。这意味着我可以做vaq
(直观地选择引号包围。这寻找最近的报价,并在视觉上选择它们。(这是可选的,你可以这样做f"vww
),然后我按s
到剥离从选择的报价。
更改报价
吻。我删除引号,然后添加引号。例如,要将单引号替换为双引号,我将执行以下步骤:1.删除单引号:vaqs
,2.添加新的引号:vwQ
。
如果您使用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上的自述文件以获得更好的示例
以下是一些简单的映射,可用于引用和取消引用单词:
" '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>
qw
qd
wq
VIM for vscode做到了这一点。如果您不使用vscode,它基于一个vim-surround。
一些例子:
“ test”(光标位于引号内,键入cs”)结尾为“ test”
“ test”(光标位于引号内,输入类型为ds)以测试结束
光标位于引号内的“测试”键入cs“ t并输入123>以<123> test结尾
用光标在单词测试类型ysaw上进行测试),最后得到(test)
我在我的.vimrc中使用nnoremap
单引号:
nnoremap sq :silent! normal mpea'<Esc>bi'<Esc>`pl
要删除引号(也可以在双引号上使用):
nnoremap qs :silent! normal mpeld bhd `ph<CR>
要记住的规则:“ sq” =单引号。
我写了一个脚本来做到这一点:
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不仅可以做到这一点,还可以满足我的需求。