ci "가 인용 된 영역을 벗어나서 ci (괄호 안에서만 작동) 할 수있는 이유는 무엇입니까?


27

ci"커서를 사용할 때 큰 따옴표로 묶인 영역에있을 필요는 없습니다.

|String somestring = "some text";

파이프가 커서 위치라고 가정하면 ci"인용 된 영역으로 이동합니다.

반면에를 사용할 ci(때는 커서가 괄호 안에 있어야 작동하고 커서가 커서 안에 들어 가지 않습니다.

이러한 행동 차이가 발생하는 이유는 무엇입니까? 이 동작이 존재하도록 키를 매핑하는 방법이 있다고 가정합니다. 이 작업을 수행하는 데 단점이 있습니까?


답변:


25

여기서 가장 큰 차이점은으로 묶인 괄호 문은 ci(중첩 될 수 있고 따옴표로 묶인 문자열 ()은 중첩 될 ci"수 없다는 것입니다.

커서가 일부 괄호 안에있는 경우 여전히 다른 것 안에있을 수 있습니다. 예를 들어 ( *커서 위치를 표시합니다) :

$foo = array(
    'x' => ar*ray(1, 2, 3),
);

커서가있는 줄은를 포함 (1, 2, 3)하지만 커서는 더 큰 array(...)블록 안에 있습니다. 이 경우 더 큰 것이에 적합한 대상입니다 ci(.

커서가 따옴표로 묶인 문자열 외부에 있으면 중첩 될 수 없으므로 완벽하게 수행 할 수있는 일은 없습니다. 따라서 Vim은 이점을 활용하여 줄에서 처음 인용 된 문자열을 찾습니다.


10

텍스트 개체 (의 인용 가족은 i', i", a', 그리고 a") 그들은 단지 현재 행 볼 것을에서 텍스트 개체의 나머지 다릅니다. 이로 인해 커서를 따옴표 안에 넣지 않아도됩니다. 대신, Vim은 커서가 아직 문자열 안에 있지 않을 때 인용 된 문자열을 찾기 위해 행 안에서 검색합니다.

블록 기반 텍스트 객체에 대해서도 이러한 정방향 검색 동작을 구현할 수있는 일부 패치에 대한 논의 가 있습니다.


8

다른 답변은 이런 일이 발생 했는지 설명 했습니다. 이 문제를 해결하는 좋은 방법이 있습니다.

wellle / targets.vim . 최근 에이 플러그인을 찾았으며 과소 평가되었습니다. 이것은 새로운 텍스트 객체를 제공 din(니모닉 :. (d) elete (I) nside (N) EXT "("이것은 같은 다른 운영자와 여러 가지 목적, 호환 an(, in", il((마지막 괄호 안에)

또한 기본 동작을 무시하여 i(커서가 괄호 안에 있는지 확인한 다음 그렇지 않은 경우와 같은 방식으로 작동합니다 in(. 이 동작은 켜거나 끌 수 있습니다. 예를 들면 다음과 같습니다.

def foo(bar):
^cursor here

커서는 괄호 안에 없으므로 입력은와 ci(동일하게 작동합니다 cin(.

def foo( ):
        ^Cursor here, and in insert mode

카운트도 허용합니다.

def foo(bar):           #Define function foo(bar)
^cursor here

타이핑 c2in(:

def foo(bar):           #Define function foo( )
                                             ^cursor here

이것은 또한 "인수"라는 새로운 객체를 제공합니다. 예를 들어 dana"다음 인수 주위의 삭제"를 의미합니다. 이것은 또한 카운트를 받아들입니다. 예를 들면 다음과 같습니다.

def foo(arg1, arg2, BADarg3):
^ cursor here

타이핑 d3ana:

def foo(arg1, arg2):
                  ^ cursor here

있습니다 많은 이 플러그인을 가지고 다른 기능은 있지만 이러한 기본적인 것들입니다.


1
좋은! 이것은 좋은 추가입니다. 확인해야 할 수도 있습니다.
Reaver

훌륭한 답변 10/10이지만 예제는 파이썬이기 때문에 9/10을 주어야합니다
Downgoat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.