커서 위 / 아래의 행을 삭제하지만 현재 행은 삭제하는 방법은 무엇입니까?


11

현재 줄 위의 줄 (또는 n 줄)을 삭제하는 명령이 있습니까? 위 = 전류는 포함되지 않습니다.

즉, dk현재 줄을 삭제하지 않는 대안이 있습니까? o/ Op/ P작동 방식 과 유사 하지만 삭제됩니다.

현재 kdd커서를 한 줄 위로 이동하고 삭제하는을하고 있습니다. 내가 할 수 nnoremap <Leader>d kddnnoremap <Leader>D jdd-하지만 커서를 이동하지 않는 대안을 가진 것은 더 나은 옵션처럼 보인다. 그런가요?


문제는 당신의 매핑 커서를 이동한다는 것입니다 경우 당신은 왜하지 않는다 nnoremap <Leader>d kddj그리고 nnoremap <Leader>D jddk?
statox

사용하거나 kddj또는 jddk열 위치가 유지되지 않는다. 나는 그것이 큰 문제라고 말하지는 않지만 성가시다. 레코드의 경우 kddj커서를 원래 위치 아래로 한 줄 이동합니다. 그리고 jdd-더 나은 대안처럼 보인다 jddk적어도 내가 처음이 아닌 공백 문자로 돌아가는 거니까. 삭제하려는 줄 아래의 줄이 비어 있으면 줄의 시작 부분에 남아 있습니다.
Martin Tóth

지도에 makdd`a를 사용하는 것은 어떻습니까? 마크를 설정하고 나중에 마크로 되돌립니다 ... 덜 사용되는 문자로 변경하고 싶을 수도 있습니다.
PhilippFrank

@PhilippFrank 또는``를 사용하여 커서를 다시 가져 와서 레지스터를 차지하지 않을 수 있습니다 (나는 사용하지 않습니다 :)).
Martin Tóth

작동하지 않습니다 .k는 점프가 아니므로``를 사용하여 돌아갈 수 없습니다.
PhilippFrank

답변:


30
:-d

현재 줄 위의 줄을 잘라냅니다.


:-5d

현재 줄 위로 5 번째 줄을 잘라내지만 커서는 움직입니다.


:-5,-d

현재 줄 위로 5 줄을 잘라냅니다.


:+,+5d

현재 줄 아래 5 줄을 잘라냅니다.


2
그래도 여전히 커서가 움직입니다.
PhilippFrank

1
커서 이동을 피할 수 없습니다. 가장 좋은 방법은 커서 를 움직여서 다시 옮기는 것 입니다.
romainl

감사합니다! 이런 종류의 "vim way"는 내가 찾던 것입니다. 커서를 원래 위치로 되돌리기 위해 이것을``와 함께 사용하겠습니다.
Martin Tóth

6

작은 삭제 레지스터 "-를 사용하면 위의 n 줄을 삭제 한 후 커서 위치를 복원 할 수 있습니다.

예를 들어, d0dgk"-P한 줄 이상을 삭제하고 커서를 원래 위치로 되돌립니다.

  1. d0커서에서 행의 첫 번째 문자까지 문자를 삭제합니다. 0단독 동작 이므로 커서 아래의 문자는 삭제되지 않습니다. 그리고 삭제 된 문자는 작은 삭제 등록자 "-.

  2. dgk1 줄 이상을 삭제합니다. 이것은 줄 gk단위이며 배타적이지 않기 때문에 현재 줄을 떠납니다 .

  3. "-P 작은 삭제 레지스터 "-에서 텍스트를 넣습니다.

일종의 해킹입니다. 그러나 ex가 아닌 명령을 찾고 있다면 사용을 고려하십시오.


좋은 해결책! 당신이 원하지 "-P않는 것 같아요 "-p. 후자는 텍스트를 약간 엉망으로 만듭니다.
James

@DJMcMayhem 당신이 맞아요. 나는 대답을 수정했다. 지적 해 주셔서 감사합니다.
MS.Kim

5

편집 나는 그의 대답에서 @Romainl이 제안한 내장 기능을 알지 못했습니다. 물론 함수를 추가하는 것보다 훨씬 간단하기 때문에 -dand +d메소드를 선호해야합니다.vimrc

어쩌면 그런 것을 추가 .vimrc하면 원하는 것일 수 있습니다.

function! DeleteOver()
   let save_cursor = getpos(".")
   normal k
   normal dd
   call setpos(".", save_cursor)
   normal k
endfunction

function! DeleteUnder()
   let save_cursor = getpos(".")
   normal j
   normal dd
   call setpos(".", save_cursor)
endfunction

이 함수는 현재 행 아래의 행을 삭제하고 삭제 전 위치로 돌아갑니다.

이 기능 DeleteOver()을 사용하려면 normal k삭제 후 발생하지 않은 원래 줄의 번호가 변경되므로 삭제 후 한 줄 위로 올라 가야합니다.DeleteUnder()

당신은 또한 이것을 추가 할 수 있습니다 .vimrc

nnoremap <Leader>d :call DeleteOver()<CR>
nnoremap <Leader>D :call DeleteUnder()<CR>

함수를 호출하는 매핑을 만듭니다.


커서 위치를 저장 / 복원하는 대안은 nostartofline옵션 을 설정 해제 / 복원하는 것입니다.
Rich

2

아마도 두려워하지 않으면 작업 흐름을 개선 할 것입니다 ... 점프 :)

예:

This is where cursor initially is: _.

[Some other stuff you want to keep/skip ...]

I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.

작업 (일반 모드, 커서가 켜져 있음 _) : /I want Enter 5dd Ctrl-o. 그게 다야.

물론 전체 줄을 삭제하려는 경우 romainl 응답이 가장 좋으며 상대 행 번호를 사용하여 오프셋을 쉽게 계산할 수 있습니다. 위의 방법은 "행동"하는보다 일반적인 방법입니다. 점프로 간주되는 것을 사용하여 거기에 가십시오. 즉, 텍스트를 수정 한 후에는 항상 뒤로 건너 뛸 수 있습니다.

예를 들어, 절대 행 번호를 사용하는 경우 또는 /I want Enter같은 행 번호로 바꾸 78gg거나 78G해당 행 번호로 직접 이동할 수 있습니다.


0

ms-kim 솔루션을 기반으로 나는 col postion을 저장하는 약간 다른 변형을 개발했습니다.

function! DeleteLineAbove()
    if line('.') == 1
        echom "You are at the first line!"
        return
    endif
    let l:colsave = col(".")
    exec  "normal! kdd"
    call cursor(line("."), l:colsave)
endfunction
nnoremap <Leader>k :call DeleteLineAbove()<CR>

OBS : 이 게시물 도 참고로 사용 했습니다 .


@ MS.Kim보다는 @statox을 (를) 의미합니까?
Rich

-1

전체 파일에서 중복 행을 삭제하려면 다음을 수행하십시오.

:g/any part of the string/d

예:

명령 모드에서

:g/I want to delete/d

처음에 문자열 목록을 원할 경우 :

:g/I want to delete/p

3
이것이 어떻게 묻는 질문에 어떻게 대답하는지 확실하지 않습니까?
Martin Tournoij
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.