Vim에서 " 내부 편집과 ( 편집 사이에 차이가 있는 이유는 무엇입니까?

Vim에서 " 내부 편집과 ( 편집 사이에 차이가 있는 이유는 무엇입니까?

명령을 실행할 때 ci"Vim은 커서가 인용 부호 밖에 있더라도 해당 줄에서 인용된 다음 문자열 안의 텍스트를 편집합니다. 그러나 ci(이를 수행할 때는 커서가 괄호 안에 있는 경우에만 작동합니다.

왜? as does ci(의 첫 번째 발생으로 점프하도록 만들 수 있습니까 ?(ci"

샘플 텍스트(Erlang 구문 사용) 내가 놀고 있는 곳은 다음과 같습니다.

    ?assertEqual({200, "OK"}, status(FirstResponse)),
%   ^
%   Here I'm expecting  ci(  to jump in to the parenthesis ( ci"  works)

답변1

문서 ( help v_aquote, )를 잠깐 살펴본 결과, 이는 의 결함이 아니라 의 help v_iquote버그라고 말하고 싶습니다 . 관찰된 동작은 및 와 일치합니다 .ci"ci(ci(ci{ci[

즉, ci(이 매핑을 사용하면 원하는 동작을 얻을 수 있습니다.

nnoremap ci( f(ci(

--- 편집하다 ---

--- (이 질문은 제가 회원이 아닌 슈퍼유저에게 이전되었습니다.)

다음 함수/매핑은 선행 항목이 감지되는지 여부에 따라 동작이 다릅니다 (. (a) (b)(댓글에서 지적했듯이) 원래 매핑의 문제를 해결합니다 . 아직은 완벽하지 않을 수도 있지만..

function New_cib()
    if search("(","bn") == line(".")
        sil exe "normal! f)ci("
        sil exe "normal! l"
        startinsert
    else
        sil exe "normal! f(ci("
        sil exe "normal! l"
        startinsert
    endif
endfunction

nnoremap ci( :call New_cib()<CR>
nnoremap cib :call New_cib()<CR>

답변2

그 이유는 중괄호, 꺾쇠괄호, 중괄호가 쌍을 이루기 때문입니다. 따라서 중첩할 수 있습니다.

작은따옴표와 큰따옴표는 일반적으로 중첩될 수 없습니다(구문이 있는 bash 스크립트 제외). "$("something")"따라서 외부 개체가 있을 수 없기 때문에 커서가 텍스트 개체 안에 없어도 텍스트 개체를 찾을 수 있습니다.

답변3

내 생각에는 "그런 식으로 작동하는 유일한 텍스트 개체, 즉 라인에서 다음으로 일치하는 패턴을 선택하는 것입니다.

도움말에서는 다음과 같은 이유를 설명할 수 있습니다.

a"                          *v_aquote* *aquote*
a'                          *v_a'* *a'*
a`                          *v_a`* *a`*
        "a quoted string".  Selects the text from the previous
        quote until the next quote.  The 'quoteescape' option
        is used to skip escaped quotes.
        Only works within one line.
        When the cursor starts on a quote, Vim will figure out
        which quote pairs form a string by searching from the
        start of the line.
        Any trailing white space is included, unless there is
        none, then leading white space is included.
        When used in Visual mode it is made characterwise.
        Repeating this object in Visual mode another string is
        included.  A count is currently not used.

분명히 Vim은 인용된 텍스트를 찾으려고 노력합니다.줄의 시작부터 검색. 따라서 당신이 라인에 어디에 있는지는 중요하지 않습니다. (단, 인용문 뒤에 커서가 있으면 작동하지 않는 것 같습니다.)

관련 정보