vim-줄을 세지 않고 큰 텍스트 블록을 삭제하는 방법?


193

vim에서는 종종 큰 텍스트 블록을 삭제하거나 복사합니다. 예를 들어 텍스트 줄을 세어 50dd50 줄을 삭제할 수 있습니다.

그러나 삭제할 줄 수를 알지 않고도이 큰 텍스트 블록을 어떻게 삭제합니까?


1
창이 충분히 큰 경우 상대 라인 번호 매기기가 여기에 도움이됩니다. 커서를 창의 맨 위에 놓고 삭제할 마지막 줄의 상대 줄 번호 (예 : n)를 찾은 다음 하나를 추가 한 다음 해당 번호를 입력 한 다음 dd를 입력하십시오. 예를 들어, n = 50이면 51dd. 또는 모션 명령을 사용하십시오 –50d<down arrow>
BallpointBen

"상대 라인 번호 찾기"-또는 사용하면 :set rnuVim이 즉시이 작업을 수행합니다! 현재 줄은 여전히 ​​절대적으로 번호가 매겨 지지만 커서 위와 아래의 줄은 대칭 적으로 1, 2, ...로 번호가 매겨집니다 (커서 이동, 파일 수준 이벤트 등으로 업데이트)
John P

답변:


287

저는 vim 전문가는 아니지만이 상황에서 사용하는 것은 "시각 모드"입니다. 명령 모드에서 V(capital)을 입력하십시오 . 그런 다음 위 / 아래로 이동하여 삭제하려는 블록을 강조 표시합니다 (모든 일반적인 이동 명령이 작동 함). 그런 다음 x또는로 제거하십시오 d.


2
이상한. Linux (vim 7.3.50) 및 Windows의 gVim에서 작동합니다 (tm). 그리고 다른 대답으로 판단하면 다른 사람들을 위해 일합니다. 어쩌면 귀하의 일부 설정 .vimrc이 작동하고 있습니까?
Mat

좋아, 어떤 이유로 나는 당신이 Shift-를 사용하여 비주얼 라인 모드로 들어갈 수 있다는 것을 몰랐다 v. ... 나는 CTRL키 를 사용하려고했다 . 그래서 이것은 작동하며 아마도 가장 편리한 방법 일 것입니다.
저스틴에 티어

7
비주얼 라인 ( CTRL- v)과 비주얼 블록 ( Shift- v)의 두 가지 비주얼 모드가 있음을 명확히 할 수 있습니다 .
저스틴에 티어

2
나는 이것을 많이한다. 그러나 나는 항상 그것이 부정 행위와 바람직하지 않은 vim이라고 생각합니다.
Jim Mitchener

9
3 개 종류의 시각적 모드가 실제로있다 : 비주얼 모드 (문자 기반 {V}), 비주얼 라인 모드 (라인 {Sv의} 기준) 및 Visual 블록 모드 (수 있도록 블록의 선택 {이력서})
톰 레그 너

293

시작 줄로 이동하여 입력하십시오 ma( "a"표시). 그런 다음 마지막 줄로 이동하여 d'a"a"를 표시하려면 삭제 하십시오 .

현재에서 표시된 행까지의 모든 행이 삭제됩니다 (포함). 또한 환경이 후자에게 축복을받지 않을 가능성이 vi있을 때 와 호환됩니다 vim.


3
이 괴물 바위! 더 나은 솔루션을 찾기 전에 (계산 라인과 같은) 무언가를 얼마나 오래하는지 싫어합니다. 감사!
ryanjdillon

1
정말 대단해요 항상 블록을 삭제하기 위해 비주얼 모드를 사용하지만이 방법이 더 좋습니다 +1
hish

4
나는 500k + 라인을 삭제하는데 시각적 모드보다 더 유용한 것을 발견했다
Michael-Clay'r 's Where

정말 실용적인 답변입니다. 파일 /var/mail/username에서 서버의 메일 을 대량 으로 삭제 하고 마지막 메일을 그대로 유지하는 데 사용합니다. 그때 내가 예를 들어 입력, 표시를 할 50000다음에 gg그때 사이에있는 모든 행을 삭제, 라인 50.000로 이동합니다. 매력처럼 작동합니다!
otmezger

1
@horta, 아마도 vim기가 바이트 파일을 편집하기위한 도구 로 사용하지 않을 것입니다 -나는 텍스트 처리 도구 awk와 그 형제들과 같은 텍스트 처리 도구를 선택하는 경향이 있습니다 :-)
paxdiablo

46

당신은 (어떤 명령도 삭제 옵션을 사용할 수 있습니다) 또한 비주얼 모드를 사용할 수 있습니다 vip vap, 단락을 선택 v2ap두 단락의 선택 dap, 작품 d2ap도. [ ]같은 블록 내에서 삭제할 수 있습니다da[

참고로 : 객체 유형. vim 문서에서 : 섹션 4. http://vimdoc.sourceforge.net/htmldoc/visual.html

4. Operating on the Visual area             *visual-operators*

...    
The objects that can be used are:
aw  a word (with white space)           
iw  inner word                  
aW  a WORD (with white space)           
iW  inner WORD                  
as  a sentence (with white space)           
is  inner sentence                  
ap  a paragraph (with white space)          
ip  inner paragraph                 
ab  a () block (with parenthesis)           
ib  inner () block                  
aB  a {} block (with braces)            
iB  inner {} block                  
a<  a <> block (with <>)                
i<  inner <> block                  
a[  a [] block (with [])                
i[  inner [] block                  

1
da [, da {, da "모두 프로그래머에게 유용
Rene Wooller

1
감사! dap"문단 삭제"로 기억하기 매우 쉽습니다
Tropilio

38

여기에는 더 나은 답변이 많이 있지만 완전성을 위해 위에서 언급 한 위대한 답변 중 일부를 읽기 전에 사용했던 방법을 언급 할 것입니다.

24-39 행에서 삭제한다고 가정하십시오. ex 명령을 사용할 수 있습니다

:24,39d

당신은 또한 사용하여 라인을 k 수 있습니다

:24,39y

24-39 줄 이상을 찾아서 바꾸십시오.

:24,39s/find/replace/g

11

당신이를 통해 행 번호를 설정 한 경우 set number당신 간단하게 할 수 있습니다 dNNG현재 위치에서 NN을 줄을 삭제한다. 따라서 삭제하려는 줄의 시작으로 이동하고 삭제하려는 d50G마지막 줄이라고 가정하면됩니다.


10

그것은 큰 블록 이 무엇인지에 달려 있습니다. 어쩌면 당신은 단락을 삭제하는 것을 의미 dip할 것입니다.


팁 고마워. 불행히도 여기서 코드로 작업하고 있으며 일반적으로 그보다 세밀한 제어가 필요합니다.
저스틴에 티어

1
코드로 작업하고 있으며 논리 블록을 빈 줄로 구분합니다. 이 팁은 방금 제 하루를 보냈습니다. 세 번의 키 입력으로 큰 논리 블록을 삭제할 수 있습니다.
miniml

이 문맥에서 'd'는 삭제를 의미하고 'p'는 단락을 의미하기 때문에 작동합니다.
user98761

7

몇 가지 가능성이 있으며, 가장 좋은 것은 작업하는 텍스트에 따라 다릅니다.

두 가지 가능성이 떠 오릅니다.

  • 시각 모드 ( V,, S-V...)로 전환 하고 커서를 움직여 텍스트를 선택한 후d
  • 다음을 사용하여 전체 단락을 삭제하십시오. dap

나는 dap을 매우 자주 사용하므로 그것에 대해 알고 있고 그것을 찍고 딥하는 것을 선호하지만 항상 블록과 블록 뒤에 오는 빈 줄을 삭제하지만 블록과 빈 줄을 삭제하는 방법이었습니다. 그 전에 온다?
Funkodebat

단락이있는 텍스트의 중간에는 결과에 구문상의 차이가 없습니다. 나는 당신이 원하는 것을 예를 들어 새로운 질문에 쓸 것을 제안합니다.
Tom Regner

6

전체 블록이 화면에 표시되면 상대 숫자 설정을 사용할 수 있습니다. : help relativenumber를 참조하십시오. 7.3에서 사용 가능


나는 그것을 사용하기 시작할 때까지 : se rnu가 얼마나 유용한 지 몰랐다
rshdev

3

커서를 블록의 시작 또는 끝 부분에 놓고 시각적 모드 (shift-v)로 들어갈 수 있습니다. 그런 다음 원하는 블록이 강조 표시 될 때까지 위 또는 아래로 이동하십시오. 마지막으로 y를 눌러 텍스트를 복사하거나 d를 눌러 텍스트를 자릅니다.


어쩌면 이상하지만, 이것으로 줄에서 원하는 중간 지점에서 텍스트를 선택하고 같은 줄에서 각 줄의 끝까지 여러 줄을 선택하는 방법을 알아 냈습니다. 정확히 내가 찾던 것.
nanker

3

여기에 이미 언급 된 다른 동작과 함께 동작도 /{pattern}<CR>있으므로 foo가 포함 된 행으로 삭제하려는 경우을 수행 할 수 있습니다 dV/foo<CR>. V기본적 /으로 문자 방식 이므로 모션을 선 방향으로 강제하기 위해 여기에 있습니다 .


3

줄을 세는 것은 너무 지루하지만 '단락'을 세는 것은 그렇게 나쁘지 않습니다. '{'및 '}'은 커서를 커서 전후의 첫 번째 빈 줄로 각각 이동합니다. 커서 이동 작업은 삭제와 결합 할 수 있으며 다른 몇 가지 답변도 비슷한 접근 방식 (행은 dd, 문서 끝은 dG 등)을 사용했습니다.
예를 들면 다음과 같습니다.

/* Lorem ipsum dolor sit amet, consectetur adipiscing elit. */

Lorem *ipsum(void) {
  return dolor(sit, amet);
}

커서가 주석 블록 위에서 시작하면 'd}'는 주석 블록을 삭제하고 'd2}'는 주석 블록과 코드 블록을 모두 삭제합니다. 커서가 코드 블록 아래에서 시작되면 'd {'는 코드를 삭제하고 'd2 {'는 둘 다 삭제합니다. 물론 커서를 먼저 이동하여 하나의 블록을 건너 뛸 수 있습니다 : '{d {'또는 '} d}'.

공백과 일치하거나 단락을 한눈에 확인할 수 있으면 효과가 있습니다. Vim 도움말 파일에는 더 많은 커서 트릭이 있습니다.


1

매우 큰 숫자를 입력 한 다음 dd커서 아래의 모든 줄을 삭제하려면 을 누릅니다 .


을 사용하는 것이 더 쉬울 수 있습니다.이 경우 기본적으로 마지막 줄로 이동 dG하므로 문서 끝까지 삭제됩니다 G.
andyg0808

1

텍스트 블록 삭제

커서가 블록의 시작 부분에 있다고 가정합니다.

V/^$<CR>d (where <CR> is the enter/return key)

설명

  • "linewise-visual"모드로 들어가십시오 : V
  • 다음 빈 줄까지 강조 표시하십시오. /^$<CR>
  • 지우다: d

키 바인딩

보다 강력한 솔루션 :

:set nowrapscan
:nnoremap D V/^\s*$\\|\%$<CR>d

설명

  • 검색 줄 바꿈 비활성화 : :set nowrapscan
  • D키를 다음 명령으로 다시 맵핑하십시오 .:nnoremap D
  • "linewise-visual"모드로 들어가십시오 : V
  • 다음 빈 / 공백 줄 또는 EOF까지 강조 표시합니다. /^\s*$\\|\%$<CR>
  • 지우다: d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.