阻止任何支架类型的运动?

Gor*_*vic 8 vim

如果我想,比如说删除一个块,我可以使用文本对象运动。

即如果我的文字看起来像这样:

(let [a 1 b {:x 3  :y 4}]
      a)
Run Code Online (Sandbox Code Playgroud)

并且光标例如在字符上3

如果我输入diB然后:x 3 :y 4将被删除如果是daB然后块和周围的括号都被删除:{:x 3 :y 4}

所以,模式是:

operation inclusion block-motion
Run Code Online (Sandbox Code Playgroud)

操作可能是:

  • d - 删除

  • c - 改变

  • y - 复制 .​​..

包含是:

  • i - 内部(无括号)或

  • a - 全部

和块运动:

  • b,(或者)对于()父母

  • B{}用于{}花括号

  • []<>用于各自的括号等。

现在,问题是:最里面的块是否有任何这些类型的括号的块运动?

我希望能够做到da??被我找的议案。如果我上面例子中的光标在我{}说的范围内,3我只会删除,{}但如果我的光标在b我会删除[]块,等等。

Luc*_*tte 3

这就是为什么问题应该是这样的:需要非平凡的脚本......

\n\n
" Public Mappings {{{1\nonoremap <silent> i% :<c-u>call <sid>SelectFirstPair(1,0)<cr>\nxnoremap <silent> i% :<c-u>call <sid>SelectFirstPair(1,1)<cr><esc>gv\nonoremap <silent> a% :<c-u>call <sid>SelectFirstPair(0,0)<cr>\nxnoremap <silent> a% :<c-u>call <sid>SelectFirstPair(0,1)<cr><esc>gv\n" Public Mappings }}}1\n"------------------------------------------------------------------------\n" Private Functions {{{1\n" Note: most functions are best placed into\n" autoload/\xc2\xabyour-initials\xc2\xbb/\xc2\xabomap_any_bracket\xc2\xbb.vim\n" Keep here only the functions are are required when the plugin is loaded,\n" like functions that help building a vim-menu for this plugin.\nlet s:k_pairs = {\n      \\ \'(\': \')\',\n      \\ \'[\': \']\',\n      \\ \'{\': \'}\',\n      \\ \'<\': \'>\'\n      \\ }\n\nlet s:k_begin = \'[([{<]\'\nlet s:k_end   = \'[)\\]}>]\'\n\nfunction! s:SelectFirstPair(inner, visual)\n  " In case we already are in visual mode, we may have to extend the current\n  " zone if it selects a pair of brackets\n  if a:visual\n    let char_b = lh#position#char_at_mark("\'<")\n    if char_b =~ s:k_begin\n      \\ && s:k_pairs[char_b] == lh#position#char_at_mark("\'>")\n      call search(\'.\', \'bW\') " previous char\n    elseif a:inner\n      " handle case the case "vi%i%i%"\n      let current_pos = getpos(\'.\')\n      call setpos(\'.\', getpos("\'<"))\n      call search(\'.\', \'bW\') " previous char\n      let pos_b = getpos(\'.\')\n      call setpos(\'.\', getpos("\'>"))\n      call search(\'.\', \'W\') " next char\n      let pos_e = getpos(\'.\')\n      let char_b = lh#position#char_at_pos(pos_b)\n      let char_e = lh#position#char_at_pos(pos_e)\n      echomsg "chars = ".char_b.char_e\n      if char_b =~ s:k_begin\n        \\ && s:k_pairs[char_b] == char_e\n    call setpos(\'.\', pos_b) " restore start_pos\n    call search(\'.\', \'bW\') " previous char\n      else\n    call setpos(\'.\', current_pos) " restore init_pos\n      endif\n    endif\n  endif\n\n  " Searching the n outer blocks requested\n  let cnt = v:count <= 0 ? 1 : v:count\n  while cnt > 0\n    let cnt -= 1\n    let char_c = lh#position#char_at_pos(getpos(\'.\'))\n    let accept_at_current = char_c =~ s:k_begin ? \'c\' : \'\'\n\n    " Begin of the current outer block\n    if 0 ==searchpair(s:k_begin, \'\', s:k_end, \'bW\'.accept_at_current, \'lh#syntax#skip()\')\n      throw "No outer bloc"\n    endif\n    if cnt > 0\n      call search(\'.\', \'bW\') " previous char\n    endif\n  endwhile\n\n  let char_b = lh#position#char_at_pos(getpos(\'.\'))\n\n  normal! v\n\n  " End of the outer block\n  let pos_e = searchpair(s:k_begin, \'\', s:k_end, \'W\', \'lh#syntax#skip()\')\n  let char_e = lh#position#char_at_pos(getpos(\'.\'))\n  if pos_e == 0\n    throw "pos_e == 0"\n  elseif s:k_pairs[char_b] != char_e\n    echomsg "unbalanced blocks"\n  endif\n\n  " Adjusting the extremities\n  if a:inner\n    call search(\'.\', \'b\')\n    normal! o\n    call search(\'.\')\n    normal! o\n  endif\nendfunction\n" Private Functions }}}1\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:我已经重用了lh-vim-lib中的函数——顺便说一句,conf 版本中有一个小错误lh#position#char_at_pos()col()不能使用。

\n