줄을 세지 않고 큰 텍스트 블록을 어떻게 삭제합니까?


91

vim에서, 나는 종종 큰 텍스트 블록을 삭제하거나, k거나 입력해야합니다.

텍스트 줄 수를 세고 50dd50 줄을 삭제하는 것과 같은 것을 입력 할 수 있습니다 .

그러나 그것은 약간의 고통입니다. 어떻게 텍스트의 큰 블록을 삭제할 수 없이 사전에 삭제하는 방법을 많은 줄 알 필요가?


4
끝이 어디에 있는지 어떻게 알 수 있습니까? 끝을 설명 할 수 있으면 해당 지점까지 삭제할 수 있습니다. 당신 move이 끝까지 어떻게 할 수 있는지 설명 할 수 있다면 . 그런 다음 끝으로 삭제하는 것이 끝으로 이동하는 것과 다르지 않습니다.
Martin York

@Loki, 끝으로 이동하는 것은 일반적으로 페이지 다운과 화살표 키를 사용하여 도달 할 때까지입니다. 이 는, 제 또는 열 번째 빈 줄 수 있다 상기 제 개폐 보조기 될. 결론은 상당히 다릅니다.

2
또한이 답변을 확인하십시오. stackoverflow.com/a/16407391/164835
Kent

답변:


111

블록의 시작 줄로 이동하여 입력하십시오 ma( "a"로 표시하십시오. 물론 다른 문자를 사용할 수 있지만 다른 문자에 대해 여러 문자를 사용 하더라도 각 문자의 표시를 머리에 똑바로 유지할 수 있습니다) .

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

현재 행에서 표시된 행까지의 모든 행을 삭제 / 생성합니다 (포함).

그런 다음 p또는 과 같은 일반적인 붙여 넣기 명령을 사용하여 다른 곳에 붙여 넣을 수 있습니다 P.

또한 환경이 후자에게 축복받지 않을 가능성이 vi있을 때 와 호환됩니다 vim.


(a) 또한 호출하려는 함수의 정의를 복사하여 붙여 넣는 등의 다른 곳을 찾아야하는 경우이를 사용하여 파일에 내 장소를 저장합니다.

현재 줄을 같은 방식으로 표시 ma한 다음 원하는 것을 찾기 위해 방황합니다.

그런 다음, 그것을 찾아서 레지스터에 복사 한 후에는 'a미리 저장된 줄 "a"를 표시하기 위해 다시 들어가서 붙여 넣을 수 있습니다.


9
이를 위해 비주얼 모드를 사용할 수도 있습니다.
jmc

3
그것은 한 가지 방법입니다, jmc, 그러나 표준 vi에 시각적 모드가 있는지 확실하지 않습니다 .

5
약 1 년 전에 시각적 선택에서 표시 및 상대 라인 번호로 이동 한 후 vi 모션 명령이 시각적 선택보다 훨씬 빠르고 효율적이라는 것을 알았습니다. 나중에 키를 누를 때마다 나중에 더 쉬워 지 더라도 v실제로 필요하거나 더 나은 모션 방식이 있습니까?
Sukima

1
그래도 같은 방식으로 @Sukima는 GUI에서도 마우스를 적게 사용하는 것이 더 효율적이라고 생각합니다. 키보드를 사용할 수 있으면 더 빨라집니다.

3
정말 긴 줄로 무언가를 편집하는 경우,이 백틱 버전도 매우 유용 할 수 있습니다 (전체 줄이 아니라 줄 안의 위치를 ​​가리킴).
msouth

65

Vim에서 비주얼 라인 모드를 사용 하십시오 .

  1. 제거 할 텍스트 / 코드 블록의 맨 위 줄에 커서를 놓습니다.
  2. V(그 수도 'V': Shift+ v)를 누릅니다 .
  3. 텍스트 / 코드 블록의 맨 아래로 커서를 이동하여 제거
  4. 프레스 d

큰 텍스트 블록을 삭제하는 경우 커서가있는 열에 대해 걱정할 필요가 없으므로 단순 시각적 모드보다 선호됩니다.


3
3 단계에서 객체 동작을 사용하여 더 빠르게 이동할 수 있습니다. 예를 들어 }전체 단락 또는 )문장 을 선택 하는 데 사용할 수 있습니다 . 더 많은 :h object-motions
것들을

2
/something<CR>
mxlian

1
이것이 내가 선호하는 방법입니다. 그러나 또는을 반복해서 눌러 j커서를 아래로 이동 하지 않아도 (3 단계) 행 번호를 입력 한 다음 G해당 행까지 선택할 수 있습니다. 예 :V150Gd
Ranhiru Jude Cooray


39

구조를 알고있는 큰 텍스트 블록을 쉽게 삭제할 수 있습니다.

단락이면 다음을 사용하십시오 d{(예 : 단락 수를 접두어로 붙일 수 있음)

괄호 안에 코드 블록이 있으면 다음을 사용하십시오. d%

파일이 끝날 때까지 텍스트가 나타나면 다음을 사용하십시오. dG

그것이 끝나는 방법을 안다면, 다음을 사용하십시오 : d/그리고 끝나는 텍스트를 입력하십시오 Enter(정규 표현식을 사용할 수도 있으므로 가능성은 무한합니다).

또는 시각 모드 ( V)를 사용하고 모션 키를 사용하여 텍스트를 빠르게 선택하고 (예 :) {제거하십시오 ( d).

또는 Lie Ryan이 제안한대로 d/search-string/e현재 커서에서 검색된 문자열로 텍스트를 삭제 하는 데 사용하십시오 .

참조 : :help d:help motion추가 정보를 원하시면.


2
또한 d/search-string/e검색 문자열 자체를 포함하여 현재 커서에서 검색 문자열 끝까지 c/search-query삭제하고 삭제 후 삽입 모드로 전환해야합니다. d/with를 사용 set incsearch하면 올바른 텍스트 범위에서 작업 중인지 여부를 대화식으로 파악하고 필요 이상으로 입력하지 않도록 검색 쿼리 입력을 중지 할시기를 알 수 있으므로 깔끔한 조합입니다.
Lie Ryan

4
또한 찾을 수 da(외부), 또는 i(내부) 및 객체 지정 매우 유용합니다. 같은 개체 w단어, p단락, (또는 b(...), [[...], {또는 B{...}시각적 사업자 문서 .
Shahbaz

22

모션 및 / 또는 텍스트 객체를 사용할 수 있습니다. 예를 들어을 사용하여 커서에서 다음 빈 줄까지 모든 것을 삭제할 수 있습니다 d}. 커서가 단락 안에 있으면 단락이 dip또는 로 삭제 될 수 있습니다 dap. 커서가 HTML 태그 내에 있으면 dit또는로 태그를 삭제할 수 있습니다 dat.

이에 대한 좋은 니모닉은 " d elete i nside "및 " d elete a round"(단락 / 태그 / 괄호)입니다.


11

나는 보통

:<start>,<end>d

제공된 시작 줄과 끝 줄 번호 사이의 모든 줄이 삭제됩니다 (주어진 줄 포함).

start및 둘다 end는 절대 위치 번호, 패턴 또는 다른 위치의 오프셋 일 수 있습니다.

Vim의 범위 문서를 보는 것에 대한 doubleDown의 의견을 참조하십시오 . 유용한 팁이 있습니다.

예:

다음 파일이 있다고 가정하십시오.

1. The quick brown
2. fox jumps
3. over the
4. lazy dog.

그런 다음 명령을 사용하여 :2,3d또는 :/fox/,/over/d또는 :/quick/+1,/lazy/-1또는 :+1,+2d당신이 첫 번째 줄에있어 경우 또는 :-1,.d세 번째 줄에 있다면, 당신은으로 끝날 :

1. The quick brown
4. lazy dog.

그러나 이것은 여전히 ​​줄을 세어야한다는 것을 의미합니까? 아니면 당신의 대답을 오해 했습니까?
Martin Tournoij

7
줄 수를 세울 필요는 없지만 줄 번호를 알아야합니다.
jmc 2019

첫째 않는 :set ruler, 다음 찾을 텍스트의 상하 이동 startend줄 번호, 다음을 수행:<start>,<end>d
roblogic

1
상대 라인 번호를 사용할 수도 있습니다:+12,+24d
rpattabi

2
사실, 당신을 위해 행 번호의 쌍, 패턴의 쌍, 또는 혼합 쌍을 사용 <start>하고 <end>이를 위해. 자세한 내용은을 참조하십시오 :h [range]. 따라서 실제로는 기존보다 훨씬 더 유연합니다.
doubleDown

5

처리하고있는 구분 된 블록 (예 : 코드 또는 XML / HTML 태그) 인 경우 블록 시작 부분에 커서를 놓고 시각적 모드를 사용하여 %전체 코드 블록을 빠르게 선택한 다음 d그들을 삭제합니다.


5
다른 방법으로는 사용할 수 dap, 단락을 삭제 da(, da{, da[, 괄호, 중괄호 또는 대괄호 delimeted 블록을 삭제합니다. HTML의 경우이 dat태그를 삭제하고있는 da'da"문자열을 삭제합니다. 또한이 dip, di(구분 기호 내부에 모든 것을 삭제할 수 있지만 그대로 구분 기호를 떠나, 등 변종. 또는 vap(resp vip)를 사용하여 모든 (resp inner) 단락을 선택할 수 있습니다 . (그래서이 va(vi(.) 또한 존재 capcip(또는 ca(ci() 삭제 및 삽입 모드로 이동 (즉, "변화"). 그리고 yap꺼낼
JMC

필자는 이전 주석에서 설명한 @jmc 바인딩 중 일부가 Tim Pope의 Surround.vim 플러그인에서 가져온 것 같습니다. 설치를 권장하는 훌륭한 플러그인이지만 이러한 바인딩이 기본 vim 설치의 일부가 아님을 의미합니다.
Haegin

5

다른 좋은 조언 외에도 현재 커서 위치에서 화면의 마지막 보이는 줄까지 모든 것을 삭제하기 위해 d+ Shift+ L를 추가 하고 있습니다. 명령을 반복하면 상대적으로 빠릅니다.


5

numbers.vim의 플러그인이 매우 유용합니다. 각 줄 앞에 줄 번호를 추가하는 향상된 방법입니다. 같이 'number'하고 'relativenumber', 모두 하나에 roled!

설치 후 기본적으로 활성화되어 set number있습니다. vimrc를 아직 가지고 있지 않은 경우 vimrc 에 추가 하려고합니다.

에서 일반 모드 는 비슷한 보인다 :set relativenumber:

  3 call plug#begin('~/.vim/plugged')
  2 
  1 Plug 'myusuf3/numbers.vim'
7   set number█
  1 
  2 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
  3 Plug 'Yggdroot/indentLine'

커서가있는 행을 제외하고 상대 행 번호를 표시합니다 (이 경우 7).

삽입 모드 로 전환하면 number항상 절대 줄 번호를 표시하여 설정된 것처럼 작동 합니다.

  4 call plug#begin('~/.vim/plugged')
  5 
  6 Plug 'myusuf3/numbers.vim'
  7 set number█
  8   
  9 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
 10 Plug 'Yggdroot/indentLine'

더 많은 옵션과 몇 가지 명령 (홈페이지 확인)이 있지만 기본값은 대부분의 사람들에게 적합합니다.


처음에 나는이 답변이 약간의 주제라고 생각했지만 플러그인을 설치했으며 그것이 게임 체인저라고 말해야합니다. 나는 수동으로 교체하는 데 사용했고 여분의 정신적 단계는 그 움직임을 사용하지 않기를 의미했습니다. 감사합니다!
Sukima 2019

1
이것은 하나의 InsertEnter / InsertLeave autocmd가 상대 행 번호 매기기를 토글 할 수있는 것처럼 들립니다. 뭔가 빠졌습니까?
Ben

나는 파티에 매우 늦었지만 @Ben이 옳다. 이것은 몇 가지 자동 명령 줄입니다. 예를 들어, 내의 vimrc에 내가 가지고 set number, set relativenumber다음 autocmd InsertEnter * :set norelativenumberautocmd InsertLeave * :set relativenumber
B 레이어

4

다른 방법은 특정 패턴을 삭제하려는 경우 간단히 입력하면됩니다 d/delimEnter.


2

d다른 답변에서 이미 설명한 것처럼 일반적인 입력 절차 와 동작을 사용할 수 있습니다 . EasyMotion 플러그인은 문제를 빠르고 쉽게 해결할 수있는 새로운 모션을 제공합니다.

현재 커서 위치에서 화면의 주어진 단어의 끝까지 삭제하려고한다면 동작 키는 <Leader><Leader>e(정상 e동작 과 유사 함 ) 것입니다. 그런 다음 해당 단어의 끝에 나타나는 강조 표시된 문자를 입력하십시오. 또한 라인 모션이 있으므로 현재 라인을 문제의 라인으로 삭제할 수 있습니다 <Leader><Leader>j.

나는이 <Leader>키를 설정 ,. 따라서 전체 명령은 d<Leader><Leader>e{강조 표시된 문자}입니다.

보낸 사람 :help easymotion:

EasyMotion은 vim에서 일부 모션을 사용하는 훨씬 간단한 방법을 제공합니다. 그것은 소요 <number><number>w 또는 <number>F를 {char}모든 가능한 선택을 강조 대상으로 직접 이동할 수있는 하나의 키를 누를 수 있도록하여.

사용 가능한 모션 중 하나가 트리거되면 커서 앞이나 뒤에 보이는 모든 텍스트가 희미 해지고 모션 대상이 강조 표시됩니다.

편집하다:

EasyMotion의 github 저장소https://github.com/Lokaltog/vim-easymotion에 있습니다.

easymotion을 사용하는 사람들에 대한레딧은 재미있을 것입니다.


1

문제를 해결할 수있는 간단한 해결책이 있습니다.

제거하려는 텍스트 블록의 시작 부분에 커서를 놓고 수행하십시오 d50gg.

현재 위치에서 텍스트의 50 번째 줄까지의 모든 행이 삭제됩니다.

EQ : 커서 라인에있는 경우 (46) , d50gg삭제 4 개 라인.


1
Gvi에서도 작동하기 때문에 gg 대신 사용 하는 것이 좋습니다. 물론 :set number행 번호를 찾는 데 항상 유용합니다.
Random832

이 질문의 요점은 몇 줄을 제거하고 싶은지 모른다는 것입니다.
200_success

200_success, 내가 게시 한 답변으로 몇 줄을 제거하고 싶을 필요가 없습니다. 당신이 알아야 할 것은 "어떤 라인을 제거 하시겠습니까?"
Geee

1

선 강조 표시와 함께 시각적 모드를 사용하십시오.

  1. 제거 할 텍스트 / 코드 블록의 맨 위 줄에 커서를 놓습니다.
  2. Shift+를 누르십시오v
  3. 텍스트 / 코드 블록의 맨 아래로 커서를 이동하여 제거
  4. 프레스 d

코드 블록을 삭제하는 데이 방법을 선호합니다. 시각적 모드를 사용하여 커서를 오른쪽 열에 커서를 놓아 원하는 것을 삭제해야하기 때문에 전체 행을 삭제하기 때문에 선호합니다.


3
본질적으로 @ 200_success로 답을 반복하십시오.
Martin Schröder

1

나는 relativenumber항상 마음에 들지 않기 때문에 비주얼 모드에있을 때만 Vim을 활성화하도록 구성했습니다.

" Entering Visual mode
nnoremap <silent>     v :set relativenumber cursorcolumn<CR>v
nnoremap <silent> <C-q> :set relativenumber cursorcolumn<CR><C-q>
nnoremap <silent>    gv :set relativenumber cursorcolumn<CR>gv
nnoremap <silent>     V :set relativenumber<CR>V

" When finished
augroup ClearCursorColumnAndLine
    autocmd!
    autocmd CursorHold * set norelativenumber nocursorcolumn nocursorline
augroup END

이렇게하면 작업이 쉬워집니다.

V49jd

타격 후 V목표 라인이 얼마나 멀리 있는지 볼 수 있기 때문 입니다.

이것은 장기적으로 성가신 것으로 판명 될 수 있지만 (상대 번호가 활성화 / 비활성화되면 텍스트가 오른쪽과 왼쪽으로 이동합니다), 지금까지 나는 그것을 즐기고 있습니다.


1
당신이 사용하는 것 같아요 v<Esc>d50j?
Martin Tournoij

고마워, 나는 그것을 잘못 썼다. 실제로 나는 V현명한 작업을 수행 할 것임을 알고 있다면 시작하여 d마지막까지 남을 수 있습니다 .
joeytwiddle

내 대답은 가난한 사람의 numbers.vim 플러그인 에 대한 근사치 인 것처럼 보입니다 . ;-)
joeytwiddle

1

나를 위해 잘 작동하는 것 vi:

  1. :set number 삭제하고 싶을 때까지 줄 번호를 봅니다.

    +1289 idle 
    +1289 idle 
    +1290 # <- I want to delete until here
    +1291 if [[ ! -z "$SFIN" ]]
    
  2. 삭제가 시작된 줄로 돌아갑니다.

  3. 일반 모드에서 현재 줄에서 사용한 삭제> d1290G
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.