현재 내부 블록의 오른쪽 끝까지 삭제


21

다음과 같은 코드가 있다고 가정 해 봅시다 ( |커서 위치를 나타냅니다 ).

func1(x|, func2(), y); 

나는 얻고 싶다 :

func1(x|);

커서의 위치에서 현재 내부 블록의 오른쪽 끝에있는 위치로 코드삭제 하는 방법이 있습니까?

나는 함께 갈 수 있다는 것을 알고 있지만 그것을 할 수 dt).있는 방법이 있는지 궁금합니다 di).


1
요청한대로 "내부 / 외부 블록의 왼쪽 / 오른쪽 절반을 삭제"하는 쉬운 방법이 있는지 알고 싶습니다. 그러나 부수적으로, 나는 C);이 특별한 경우에 아마 할 것입니다 .
Shahbaz

1
때로는 %모션이 원하는 것을 수행 할 수 있습니다 (예 :) d%.
alxndr

답변:


29

나는 사용할 것이다

d])

이는 d일치하지 않는 다음 ')'( ])) 에 대한 삭제 ( )를 의미 합니다.

참조하십시오 :help ]).


5

모션 갈 에만 텍스트 객체가 이동하면서 한 방향으로 두 방향으로.

즉, 후드 아래에서 해당 텍스트 객체를 사용하거나 동작을 모방하는 사용자 지정 연산자 보류 모션을 만들지 않으면 텍스트 객체의 절반을 가질 수 없습니다.

예를 들어, 해당 텍스트 i)는 시각화하기 매우 쉽습니다.

func1(x, func2(), y);
      ^^^^^^^^^^^^^

그러나 Vim에게 커서에서 해당 텍스트의 끝까지 어떻게 작동하도록 지시합니까? obi)and와 같은 사용자 정의 연산자 oei)(반 임의 예) 를 작성해야합니다 .

" ()
onoremap oei) :normal! vi)o``<CR>
onoremap obi) :normal! vi)``<CR>

" []
onoremap oei] :normal! vi]o``<CR>
onoremap obi] :normal! vi]``<CR>

" {}
onoremap oei} :normal! vi}o``<CR>
onoremap obi} :normal! vi}``<CR>

" ""
onoremap oei" :normal! vi"o``<CR>
onoremap obi" :normal! vi"``<CR>

" ''
onoremap oei" :normal! vi'o``<CR>
onoremap obi" :normal! vi'``<CR>

4
현재 커서 위치와 결합하여 이미 정의 된 모든 텍스트 객체를 재사용하는 일반적인 동작을 만드는 것이 흥미로울 것입니다. 예 대신에 대한 ib, imb오른쪽과 iMb왼쪽으로, 등 (자동)에.
VanLaser

3

이 특정한 경우에는 dfy

일반적인 경우 :

  • dT( 커서에서 블록 시작까지 삭제
  • vib 내부 블록의 나머지를 선택하십시오
  • p 내부 블록을 방금 삭제 한 것으로 교체

매핑으로 만들 수 있습니다.

 :map K dt(vibp

3

다른 기존 답변은 모두 vim의 정의 및 블록 탐지에 따라 다릅니다. 이러한 종류의 삭제에 대한 나의 전략은 c명령을 f모션 및 실제 캐릭터와 결합 하여 멈추는 것입니다. 그러면 실제로 정지 문자가 삭제되지만 마지막으로 누른 키이므로 두 번 반복하면 비용이 거의 들지 않으며 c삽입 모드로 변경 되므로 다시 삽입됩니다.


예를 들어 설명하면

func1(x|, func2(), y); 

명령 c2f))은 줄 것이다

func1(x)|;

처음에는 다른 답변보다 덜 우아해 보이지만이 전략은 보편적 이며 블록 정의에 의존하지 않습니다.


예를 들어

<div| class="some-class">text</div>

명령 cf>>은 줄 것이다

<div>|text</div>

또는 CSV 파일을 편집 할 때

2016-11-29,question,vi|.stackexchange.com,10435

명령 cf,,은 줄 것이다

2016-11-29,question,vi,|10435

종종 이것을 사용하여 나머지 문자열을 삭제합니다.

printf("Hello world| - a boring example\n");

printf("Hello world\|n");

cf\\

또는

print("Hello world| - a boring example");

print("Hello world"|);

cf"".


이렇게하면 현재 위치가 요청한 것과 약간 다른 위치로 변경되고 삽입 모드로 변경됩니다. 그러나 나머지 모든 것을 삭제하기위한 솔루션을 공유하고 싶었습니다.


1
cf해결책 의 문제점 은 삭제를 중지하려는 문자를 지정해야한다는 것입니다. 질문은 간단하게 할 수없는 경우 어떻게 할 것인지를 묻는 cf)또 다른이 있기 때문에 )전과 )실제로 (당신이 변화 할 때, 예를 들어 도달하고자 func(x|, g(x, x), x, x, g(x, x))하는 func(x)). 기본적으로, 나는 .후에 누르는 것을 피할 수 있는지 알고 싶었습니다 cf).
Mateusz Piotrowski

주어진 문자를 포함하지 않고 삭제 하는 t대신 사용할 수도 f있으므로 첫 번째 예 ( func1(x|, func2(), y);)에서는을 사용할 수 있습니다 d2t). @MateuszPiotrowski가 언급했듯이 일반적인 솔루션은 아니며 삭제할 문자를 알아야합니다. 주어진 언어에 대해 어떤 문자가 블록을 끝내는지를 일반적으로 알고 있듯이 그렇게 나쁘지는 않습니다.
Haegin

3

피트 정력 - 닌자 플러그인은 당신이 찾고있는 무슨 수 있습니다. 내가 이해 한 바에 따르면 d[, d]"커서에서 삭제하여 텍스트 개체의 시작 / 종료"로 들어가기 때문에 d]i)"주변 괄호 끝까지 삭제"이어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.