VIM在X括号之间删除

时间:2013-03-28 22:17:10

标签: vim

我正在尝试在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%删除括号。

2 个答案:

答案 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 {}之间的所有文字。