如果我想,比如说删除一个块,我可以使用文本对象运动。
即如果我的文字看起来像这样:
(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
我会删除[]
块,等等。
这就是为什么问题应该是这样的:需要非平凡的脚本......
\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()
不能使用。