我正在尝试在VIM中映射Ctrl-y以删除在光标下开始匹配的括号中找到的内容。它可以工作但它也会删除括号。这就是我目前使用的:
imap <c-y> <Esc><Right>d%<Insert>
这样可以正常工作,除非我说它也删除了光标下的内容(即匹配括号)。我确实找到了这个:
diX
X
是您正在寻找的支柱; [
,(
,'
等
i
命令的问题在于我不想定期为每个括号映射一个新键,我喜欢%
,因为它匹配任何一个在光标下是一个字母s
甚至。
任何方法都可以保留括号吗?
编辑:抱歉,举个例子。我有以下文本示例,(*代表游标):
(*text to be erased between brackets)
"*text to be erased between brackets"
'*text to be erased between brackets'
[*text to be erased between brackets]
{*text to be erased between brackets}
基本上在每个示例中,我希望我的光标位于相关括号的顶部,然后当我点击Ctrl-y
时,它从插入模式移动到正常模式,删除所有文本或光标下的括号之间的任何内容(在我移动到正常模式之后的那个点,然后是<Right>
)到同一括号中的下一个。
所以上述所有内容都会变成:
()
""
''
[]
{}
不移除周围的支架。使用d%
删除括号。
答案 0 :(得分:4)
不,%
仅匹配对中的另一半,而s
等字母字符不成对出现:您只能使用(){}[]''""<>
。< / p>
此外,编辑是在正常模式下完成的,而不是插入模式。
在正常模式下,一个可能的序列是v%holc
:
" []: normal mode cursor, |: insert mode cursor
[(]foo bar baz)
[(foo bar baz)]
[(foo bar baz])
([foo bar baz])
(|)
因此,以下映射应满足您的需求:
nnoremap <C-y> v%holc
扩展此映射以使其与任何字符一起使用将不那么重要。
我应该补充说ci(
和朋友并不像你想象的那样费力。
修改强> 的
以下功能(以及相关的正常模式映射)不是很聪明,但完全符合您的要求;随意修改它你想要的。它的工作原理如下:
如果您在<C-y>
上点击({[<
,则会删除当前字符与其兄弟(>]})
)之间的文字,并将您置于插入模式。
如果您点击<C-y>
超过任何其他字符,则会删除当前字符与该行中下一个字符之间的文字,并将您置于插入模式。
功能:
function! InPair()
let l:this_char = getline('.')[col('.')-1]
if this_char == '{' || this_char == '(' || this_char == '[' || this_char == '<'
execute "normal! di" . this_char
else
execute "normal! ldt" . this_char
endif
startinsert
endfunction
映射:
nnoremap <C-y> :call InPair()<CR>
这绝不是完美的,但它应该提供一个良好的起点。
答案 1 :(得分:0)
请参阅:help visual-operators 。即, v_iB 选择方括号{}之间的所有文字。因此 viBd 会删除2 {}之间的所有文字。