vim에서 현재 줄 아래의 줄을 삭제하는 방법은 무엇입니까?


79

현재 줄 바로 아래에있는 한 줄 (또는 여러 줄)을 삭제하는 명령이 있습니까? 현재 저는 jdd다음과 같이하고 있습니다. 그리고 .필요에 따라 반복합니다. 이 모든 것을 결합하는 명령이 있습니까?

업데이트 : 내가 그러한 명령을 갖고 싶은 이유는 현재 위치에서 멀어지고 싶지 않지만 아래 줄을 삭제할 수 있기 때문입니다.


나는 @ 피터 Rincker의 대답은 대답으로 표시해야한다고 생각
gixxer

완료 @gixxer, 최대 헤드 주셔서 감사합니다
발렌틴 바실리 예프

답변:


161

delete ex 명령은 잘 작동합니다.

:+,$d

현재 +1부터 끝 ($)까지 모든 줄이 삭제됩니다.

다음이 추적 범위가 작동 할 선, 삭제 +1,+2또는 속기+,+2

:+,+2d

@ib가 언급했듯이 :delete또는 :d명령은 커서를 삭제 된 텍스트 옆의 줄 시작 부분으로 이동합니다. ( nostartofline세트로도). 이를 극복하기 위해 ``정상 모드 명령을 실행할 수 있습니다 . ``마지막 점프 이전의 정확한 위치로 다시 점프합니다 :d. 이 경우에는 명령입니다. 우리의 명령은 지금

:+,+2denter``

또는 하나의 전 명령으로

:+,+2d|norm! ``

이 작업을 더 쉽게하기 위해이 모든 것을 명령으로 마무리합니다.

command! -count=1 -register D :+,+<count>d <reg><bar>norm! ``

이제 다음 3 줄을 삭제합니다.

:3D

이 명령은 또한 {reg}좋아요 :delete:yank할 수 있습니다. 따라서 다음 4 줄을 레지스터로 삭제하면 다음과 a같습니다.

:4D a

자세한 내용은

:h :d
:h :command
:h :command-register
:h :command-count
:h ``

3
이것은 "즉시"작동하고 다른 명령으로 일반화 할 수있는 매우 쉬운 솔루션입니다 (예를 들어 :+1,+5s!a!b!g커서 뒤의 4 줄에서 a를 b로 대체합니다). 더 많은 예제는 : help 명령 범위를 참조하십시오.
David Winslow

이 간단한 솔루션은 커서를 움직이지 않는 경우에 좋습니다. 적어도 명령은 다음과 같아야 :+,$d|norm!``합니다. 그건 그렇고, 질문에서 언급했듯이 질문의 작성자는 현재 파일 아래의 여러 줄을 삭제하려고하지만 반드시 파일 끝까지 내려갈 필요는 없습니다.
Igor Burago 2011 년

@ib : 범위에 대한보다 자세한 설명으로 답변이 개선 될까요? 어쩌면 set sol? `마크 는 어떻게 사용 하나요?
Peter Rincker 2011 년

@Peter : 아마도 그럴 것입니다. 그건 그렇고, 끄는 sol것만으로는 문제가 해결되지 않습니다. 예를 들어를 사용하여 세 줄을 삭제 :+,+3d하면 커서가 삭제 된 줄 다음 줄로 이동합니다.
이고르 Burago

@ib : 귀하의 제안을 제 답변에 통합했습니다. 의견을 보내 주셔서 감사합니다.
Peter Rincker 2011 년


29

현재 행 아래의 모든 행이 삭제됩니다.

jdG

불행히도 삭제 후 커서가 현재 줄의 시작 부분으로 이동합니다.


2
그리고 버퍼 끝까지 모든 줄을 삭제합니다.
Igor Burago

원래 질문을 잘못 읽었습니다. 죄송합니다. OP가 현재 행 아래의 모든 행을 삭제하려고한다고 생각했습니다. 내 게시물을 변경했습니다.
ClosedID

7

음, 간단하게 xxdd 명령을 사용할 수 있습니다. 대부분의 경우 편집중인 스크립트의 크기를 알고 있습니다 (적어도 아이디어는 있음). 따라서 아래와 같은 명령은 일반적으로 충분합니다.

  • 99dd
  • 999dd는 커서 위치에서 시작하는 999 줄을 제거합니다.
  • 9999dd
  • 매우 긴 스크립트의 경우 99999dd;)

4

다른 솔루션은 유익하지만 매크로를 사용하는 것이 더 간단하다고 생각합니다.

qq (녹음 시작)

jddk (아래로 내려 가서 줄을 삭제하고 위로 돌아가십시오. 즉, 원하는 작업)

q (녹음 종료)

이제 @q커서를 현재 위치에 유지하면서이 작업을 수행 할 수 있습니다 . 5@q커서 아래 5 줄을 삭제 하는 것과 같은 작업을 수행 할 수도 있습니다 .

마지막으로 작업을 두 번 이상 반복하는 @@경우 처음 실행 한 후에 입력 할 수 있습니다 @q(이 경우 마지막으로 사용 된 매크로가 반복됨 q).


2

이것은 마크를위한 일입니다!

시험 maj20dd`a

ma파일 별 마크 'a' j20dd를 설정하고 원하는 삭제 (이 경우 20 줄) `a를 수행하고 마크의 위치 (줄 및 열)로 복원합니다.

분명히이 패턴은 마크로 돌아 가기 전에 원하는 모든 작업을 수행하도록 확장 할 수 있습니다. 당신이 사용하는 경우 mA(또는 다른 대문자) 마크는 실제로 당신도 편집 다른 곳에서 반환하기 전에, 그래서 파일에서 고유해야합니다. 자주 사용하는 경우 위에서 제안한대로 매크로로 만들 수 있습니다.


1

삭제할 줄 수를 입력 할 수 j 20 dd k있습니다..


Final k은 커서를 초기 줄 위로 이동합니다. 또한 때문에 커서 열 위치가 손실됩니다 dd.
Igor Burago

@ib : 내 테스트에서는 그렇지 않습니다. 실제로 사용해 보셨습니까? 이니셜 j에 유의하십시오 .
Paul Ruane

죄송합니다. 첫 번째 요점이 잘못되었습니다 (명령을 시도했을 때 내가 지정한 개수 (예 : '20')가 끝까지 줄 수보다 큰 것을 알아 차리지 못했습니다. 완충기). 그러나 두 번째 것은 남아 있습니다 : 커서의 열 위치는 dd(삭제 된 줄 옆에있는 줄의 공백이 아닌 첫 번째 문자로) 변경됩니다.
Igor Burago

@ib : 예, 열 위치 변경에 동의합니다.
Paul Ruane

내가 찬성 할 수 있도록 귀하의 답변을 사소하게 수정 해주세요. 나는 당신의 대답이 결국 부정적인 순위를 가질 가치가 없다고 생각합니다.
Igor Burago

-1

재미를 위해 설명했던대로 정확히 수행하는 작은 함수를 정의 할 수 n 있습니다. 현재 줄 아래의 다음 줄을 삭제 하고 초기 커서 위치를 복원합니다.

function! DeleteNextLines(n, reg)
    let l = line('.')
    let m = min([a:n, line('$')-l])
    if m > 0
        let c = col('.')
        exe '+,+'.m 'd' a:reg
        call cursor(l, c)
    endif
endfunction

또한 삭제할 줄 수 (생략 된 경우 하나)를 허용하는 명령과 선택적 인수로 사용할 레지스터 이름 ( :delete명령 과 마찬가지로 )을 정의 할 수 있습니다.

:command! -range=1 -register -bar D call DeleteNextLines(<count>, <q-reg>)

또한 :D 필요한 경우 위 명령 을 트리거하기위한 매핑을 정의 할 수 있습니다 .


예를 들어, (@ib하여 상기 답변을 입력 한 후). 다음 행 삽입 콤마, D (d 다음 눌러 '')로 매핑하는 1 : let mapleader = ","2 :nmap <leader>d :D<CR>
케빈 리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.