블록을 삭제하려면 텍스트 개체 작업을 사용할 수 있습니다.
즉, 내 텍스트가 다음과 같은 경우:
(let [a 1 b {:x 3 :y 4}]
a)
예를 들어 커서가 문자 위에 있습니다 3
.
를 입력하면 제거 diB
됩니다 :x 3 :y 4
. yes 를 입력하면 daB
블록과 주변 괄호가 모두 제거됩니다.{:x 3 :y 4}
따라서 패턴은 다음과 같습니다.
operation inclusion block-motion
작업은 다음과 같습니다.
d
- 삭제c
- 변화y
- 복사...
포함된 내용은 다음과 같습니다:
i
- 내부(괄호 없음) 또는a
- 모두
그리고 블록 모션:
b
또는 대괄호 의(
경우)
()
B
,{
또는 곱슬머리}
{}
[
또는]
및<
또는>
각각의 괄호 등을 나타냅니다.
이제 질문은 다음과 같습니다.가장 안쪽 블록에 이러한 유형의 브래킷을 사용하여 블록 이동이 있습니까?
내가 원하는 모션을 da?
얻을 수 있기를 바랍니다 . ?
위 예의 커서가 범위 내에 {}
있으면 3
삭제하고, {}
커서가 위에 있으면 블록 등을 b
삭제합니다 .[]
답변1
그렇기 때문에 질문은 다음과 같아야 합니다: 사소하지 않은 스크립트가 필요합니다...
" Public Mappings {{{1
onoremap <silent> i% :<c-u>call <sid>SelectFirstPair(1,0)<cr>
xnoremap <silent> i% :<c-u>call <sid>SelectFirstPair(1,1)<cr><esc>gv
onoremap <silent> a% :<c-u>call <sid>SelectFirstPair(0,0)<cr>
xnoremap <silent> a% :<c-u>call <sid>SelectFirstPair(0,1)<cr><esc>gv
" Public Mappings }}}1
"------------------------------------------------------------------------
" Private Functions {{{1
" Note: most functions are best placed into
" autoload/«your-initials»/«omap_any_bracket».vim
" Keep here only the functions are are required when the plugin is loaded,
" like functions that help building a vim-menu for this plugin.
let s:k_pairs = {
\ '(': ')',
\ '[': ']',
\ '{': '}',
\ '<': '>'
\ }
let s:k_begin = '[([{<]'
let s:k_end = '[)\]}>]'
function! s:SelectFirstPair(inner, visual)
" In case we already are in visual mode, we may have to extend the current
" zone if it selects a pair of brackets
if a:visual
let char_b = lh#position#char_at_mark("'<")
if char_b =~ s:k_begin
\ && s:k_pairs[char_b] == lh#position#char_at_mark("'>")
call search('.', 'bW') " previous char
elseif a:inner
" handle case the case "vi%i%i%"
let current_pos = getpos('.')
call setpos('.', getpos("'<"))
call search('.', 'bW') " previous char
let pos_b = getpos('.')
call setpos('.', getpos("'>"))
call search('.', 'W') " next char
let pos_e = getpos('.')
let char_b = lh#position#char_at_pos(pos_b)
let char_e = lh#position#char_at_pos(pos_e)
echomsg "chars = ".char_b.char_e
if char_b =~ s:k_begin
\ && s:k_pairs[char_b] == char_e
call setpos('.', pos_b) " restore start_pos
call search('.', 'bW') " previous char
else
call setpos('.', current_pos) " restore init_pos
endif
endif
endif
" Searching the n outer blocks requested
let cnt = v:count <= 0 ? 1 : v:count
while cnt > 0
let cnt -= 1
let char_c = lh#position#char_at_pos(getpos('.'))
let accept_at_current = char_c =~ s:k_begin ? 'c' : ''
" Begin of the current outer block
if 0 ==searchpair(s:k_begin, '', s:k_end, 'bW'.accept_at_current, 'lh#syntax#skip()')
throw "No outer bloc"
endif
if cnt > 0
call search('.', 'bW') " previous char
endif
endwhile
let char_b = lh#position#char_at_pos(getpos('.'))
normal! v
" End of the outer block
let pos_e = searchpair(s:k_begin, '', s:k_end, 'W', 'lh#syntax#skip()')
let char_e = lh#position#char_at_pos(getpos('.'))
if pos_e == 0
throw "pos_e == 0"
elseif s:k_pairs[char_b] != char_e
echomsg "unbalanced blocks"
endif
" Adjusting the extremities
if a:inner
call search('.', 'b')
normal! o
call search('.')
normal! o
endif
endfunction
" Private Functions }}}1
참고: 저는 다음의 코드를 재사용했습니다.lh-vim-lib-- 그런데 conf 버전에 작은 버그가 있어서 사용할 수 없습니다 lh#position#char_at_pos()
.col()
답변2
기본적으로는 그렇지 않지만 해당 기능을 추가하는 메커니즘이 있을 수 있습니다. Visual.txt에는 시각적 영역을 조작하는 부분에 대해 다음과 같은 내용이 있습니다.
The objects that can be used are:
aw a word (with white space) |v_aw|
iw inner word |v_iw|
aW a WORD (with white space) |v_aW|
iW inner WORD |v_iW|
as a sentence (with white space) |v_as|
is inner sentence |v_is|
ap a paragraph (with white space) |v_ap|
ip inner paragraph |v_ip|
ab a () block (with parenthesis) |v_ab|
ib inner () block |v_ib|
aB a {} block (with braces) |v_aB|
iB inner {} block |v_iB|
at a <tag> </tag> block (with tags) |v_at|
it inner <tag> </tag> block |v_it|
a< a <> block (with <>) |v_a<|
i< inner <> block |v_i<|
a[ a [] block (with []) |v_a[|
i[ inner [] block |v_i[|
a" a double quoted string (with quotes) |v_aquote|
a' a single quoted string (with quotes) |v_a'|
i' inner simple quoted string |v_i'|
a` a string in backticks (with backticks) |v_a`|
i` inner string in backticks |v_i`|
답변3
라는 vim 플러그인이 있습니다.텍스트 개체 사용자지원... 뭐, 그런 거요. 실제로 당신이 찾고 있는 것이 무엇인지 잘 모르겠지만, 플러그인의 목적은 당신이 원하는 것을 달성하기 위해 플러그인을 작성하는 것을 더 편리하게 만드는 것이라고 생각합니다.