Vim에서 레지스터에 텍스트를 넣지 않고 삭제할 수 있습니까?


470

Vim을 사용하여 종종 코드 블록을 방금 막힌 블록으로 교체하려고합니다.

그러나 교체 할 코드 블록을 삭제하면 해당 블록 자체가 레지스터로 이동하여 방금 막힌 블록을 지 웁니다. 그래서 나는 yanking, 삽입, 원하지 않는 것을 삭제하는 습관을 겪었지만 큰 코드 블록을 사용하면 삽입 된 블록과 블록을 별도로 삭제하려고하면 지저분 해집니다.

그렇다면 Vim에서 텍스트를 대체하는 가장 매끄럽고 빠른 방법은 무엇입니까?

  • 레지스터에 텍스트를 넣지 않고 텍스트를 삭제하는 방법이 있습니까?
  • 예를 들어 "다음 단어 바꾸기"또는 "다음 단락으로 바꾸기"라고 말하는 방법이 있습니까?
  • 또는 다중 등록 기능을 사용하는 가장 좋은 방법입니까?

1
VIM-easyclip ( github.com/svermeulen/vim-easyclip )이 정확한 문제를 해결하기 위해 설계되었습니다
스티브 Vermeulen에게

1
나는 당신의 실제 문제와 무의식적으로 (당시) 복제 질문을했지만 제목 질문은별로하지 않았습니다. TL; DR-당신이 사용 viwp했던 ( word)을 위해 k 거리는 것으로 대체하십시오 .
OJFord

답변:


429

레지스터에 저장하지 않고 무언가를 삭제하려면 "블랙홀 레지스터"를 사용할 수 있습니다.

"_d

물론 관심있는 것을 보유하지 않은 다른 레지스터를 사용할 수도 있습니다.


4
처음에는이 명령이 제대로 작동하지 않는다고 생각했습니다. 그런 다음 미국 키보드의 "데드 키"버전을 사용하고 있음을 깨달았습니다. 이 키보드 레이아웃을 사용하여 입력해야합니다 "<space>_d. 실제로 "."을 입력하려면 공간이 필요합니다.
Sebastián Grignoli

4
빈 줄에서만 선택적 으로이 작업을 수행하는 데 대한 아이디어가 있습니까? ( dd빈 줄에 있으면 블랙홀로 들어가고 그렇지 않으면 dd정상과 같습니다).
Jonathan Dumaine

6
한 캐릭터를 제거하려면 다음을 시도하십시오."_x
kenorb

54
이것은 표준 텍스트 편집기가이기는 영역입니다. 삭제 키를 누르면됩니다.
빈스 Panuccio

22
당신은 또한 뭔가 꺼낼 수 있습니다 yy또는 '3yy'(또는 무엇이든), 익명의 레지스터에 박았을뿐만 아니라 0에서 그런 다음에 붙여 넣기 유지할 수 있습니다 "0p사용하는 데에도 불구하고, d그 후.
Halfgaar

102

네. "오래된"텍스트를 먼저 삭제하는 것보다 약간 복잡합니다.

나는 시작합니다 ..

line1
line2
line3
line4

old1
old2
old3
old4

I shift+ vline1, line 2, 3 및 4를 선택하고 d명령으로 삭제하십시오.

그런 다음 이전 1-4 줄을 같은 방식으로 삭제합니다.

그런 다음

"2p

마지막 두 번째 줄을 붙여 넣습니다 (라인 1-4). "3p세 번째부터 끝까지 수행합니다.

그래서 나는 결국

line1
line2
line3
line4

참조 : 번호가 매겨진 레지스터의 Vim 문서


<Shift-v>로 줄을 선택하면 dd가 아닌 d 만 사용하여 줄을 삭제할 수 있습니다.
Heikki Naski

31
1에서 9까지는 삭제에 사용됩니다. 마지막으로 붙여 넣은 것을 붙여 넣으려면 ( 'y'로) "0p를 사용해야합니다. 다른 것을 바꾸려는 무언가를 먼저 잡아 당긴 다음 다른 것이 기본 붙여 넣기 레지스터를 덮어 쓰는 경우에 유용합니다.
Rafael de F. Ferreira


@ RafaeldeF.Ferreira : 귀하의 의견은이 질문에 대한 답변이 아니지만 실제로 OP가 처음에 질문을하게 한 실제 문제를 해결합니다. 저에게는 이것이 진짜 문제였습니다.
0xc0de

76

VIM 문서 : 번호가 지정된 레지스터 0에는 명령이 [ "x]로 다른 레지스터를 지정하지 않은 한 가장 최근의 yank 명령의 텍스트가 포함됩니다.

예를 들어 "foo"를 잡아 당기고 "bar"를 삭제하십시오. 레지스트리 0에는 여전히 "foo"가 있습니다! 따라서 "foo"는 다음을 사용하여 붙여 넣을 수 있습니다."0p


53

현재 선택을 버퍼로 바꿀 수있는 쉬운 매핑을 사용하는 것이 편리합니다.

예를 들어 이것을 .vimrc에 넣을 때

vmap r "_dP       // it's a capital 'p' on the end

그런 다음 무언가를 레지스터 (예 : 'y')에 복사 한 후 바꿀 텍스트를 선택하고 키보드에서 'r'을 누르기 만하면됩니다. 선택은 현재 레지스터로 대체됩니다.

설명:

vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste

1
더 진보 된 버전 확인 : stackoverflow.com/questions/290465/...
루크 Hermitte

사용하고 싶습니다vmap <C-P> "_dP
Harry Lee

7
선택을 삭제하지 않고 텍스트를 넣을 수 있습니다. 예를 들어 Vp현재 줄을 즉시 줄 바꿈으로 바꿉니다.
Bobby Marinoff

이 솔루션은 d종종 삭제에 사용되는 문제를 해결하지 않습니다 .
빅터 Yarema

35

vimrc에 다음을 넣었습니다.

noremap  y "*y
noremap  Y "*Y
noremap  p "*p
noremap  P "*P
vnoremap y "*y
vnoremap Y "*Y
vnoremap p "*p
vnoremap P "*P

이제 클립 보드 레지스터를 잡아 당기고 기본 레지스터에서 발생하는 일을 신경 쓸 필요가 없습니다. 또 다른 이점은 최소한의 번거 로움으로 다른 앱에서 붙여 넣을 수 있다는 것입니다. 몇 가지 기능을 잃어 가고 있지만 어쨌든 둘 이상의 레지스터 / 클립 보드를 추적 할 수는 없습니다.


6
대신, 당신은 또한 할 수있는 모든 사람들 리맵의 set clipboard=unnamedset clipboard=unnamedplus에 기본 클립 보드를 변경하는, *또는 +각각.
Steve

5
@Steve 그렇게하면 d는 마지막 yank를 클립 보드 레지스터에도 덮어 씁니다. 이것은 질문이 피하려고하는 것입니다.
79E09796 10

1
@ 79E09796, 나는 그것이 그렇다는 것을 암시하는 것은 아닙니다. 나는 원래의 질문이 아니라이 답변에 대해 언급하고있었습니다.
Steve

1
나는 이것을 .vimrc에 넣었고 이제는 멍청이가 작동하지 않습니다. 왜 그런지 알아?
tba

2
@tba는 noremap을 nnoremap (2 n)으로 바꾸면 정상적으로 작동합니다.
meain

24

당신이 준 구체적인 예를 들어, 질문을 이해하면 다음과 같이 작동 할 수 있습니다.

*Highlight what you want to put somewhere else
*delete (d)
*Highlight the code that you want it to replace
*paste (p)

6
여러 선택 항목을 붙여 넣을 때를 제외하고는 잘 작동합니다.

23

모든 yank 및 delete 작업은 기본적으로 명명되지 않은 레지스터에 씁니다. 그러나 가장 최근의 yank 및 가장 최근의 삭제는 항상 번호가 매겨진 레지스터에 (별도로) 저장됩니다. 레지스터 0에는 가장 최근의 얀크가 있습니다. 레지스터 1-9는 9 개의 가장 최근의 삭제를 보유합니다 ( 1가장 최근 임).

다시 말해, 삭제는 명명되지 않은 레지스터에서 가장 최근의 yank를 덮어 쓰지만 여전히 0레지스터에 있습니다. "_dd다른 답변에서 언급 된 블랙홀 레지스터 트릭 ( )은 명명되지 않은 레지스터를 덮어 쓰지 못하기 때문에 작동하지만 필요하지는 않습니다.

큰 따옴표를 사용하여 레지스터를 참조하므로 가장 최근에 작성된 텍스트를 붙여 넣는 방법은 다음과 같습니다.

"0p

이것은 훌륭한 참고 자료입니다.


16

EBGreen이 말한 것을 강조하기 위해 :

텍스트를 선택하는 동안 붙여 넣으면 선택한 텍스트가 붙여 넣은 텍스트 로 바뀝니다 .

일부 텍스트를 복사 한 다음 여러 위치 "0p에 붙여 넣으려면 붙여 넣기를 사용하십시오 . 번호가 매겨진 레지스터 0에는 가장 최근의 yank 명령의 텍스트가 포함됩니다.


또한 모든 레지스터의 내용을 나열 할 수 있습니다.

:registers

이 명령을 사용하면 dbr의 answer 과 같은 작업을 수행 할 때 원하는 레지스터를 쉽게 파악할 수 있습니다 . /, %, # 레지스터도 볼 수 있습니다. (도 참조 :help registers)


그리고 마지막으로, 체크 아웃 cWcW후행 공백을 포함하여 포함하지 단어를 변경할 수 있습니다. 대문자를 사용하면 W구두점이 포함됩니다.


10

Vim을 사용하는 경우 시각적 모드가 선택과 비슷하지만 분리 모드를 사용하면 vi / vim의 기초가됩니다.

원하는 작업은 시각 모드를 사용하여 소스를 선택한 다음 k을 누른 다음 시각 모드를 다시 사용하여 대상 범위를 선택한 다음 기본 버퍼에서 텍스트에 붙여 넣는 것입니다.

예:

텍스트 파일에서 :

1 | 쿼터
2 | asdf
3 | zxcv
4 | 포우

다음과 같은 순서로 ggVjyGVkp끝납니다.

1 | 쿼터
2 | asdf
3 | 쿼
4 | asdf

설명 :

  • gg: 첫 줄로 이동
  • V: 전체 라인으로 시각 모드를 시작합니다
  • j: 한 줄 아래로 이동 (이전 줄에서 선택을 시작하면 선택이 한 줄 아래로 증가합니다)
  • y: 기본 버퍼로 이동합니다 (선택한 두 줄, 자동으로 시각적 모드를 종료합니다).
  • G: 마지막 줄로 이동
  • V: 시각 모드 시작 (이전과 동일)
  • k: 한 줄 위로 이동합니다 (이전과 같이 비주얼 모드를 활성화하면 선택이 한 줄 위로 증가합니다)
  • p: paste (마지막 두 줄에서 선택하면 버퍼에있는 줄로 대체됩니다-이 경우 첫 번째 줄 2 개)

이것은 버퍼에 마지막 블록을 넣는 불편 함이 거의 없으므로 동일한 것을 반복하여 붙여 넣기를 원치 않으므로 소스를 명명 된 버퍼에 다음과 같은 이름으로 저장하고 싶을 것입니다 "ay. ")를 사용하여 붙여 넣습니다 "ap(하지만 프로그래밍하는 경우 여러 번 붙여 넣기를 원하지 않고 함수를 만들어 호출하려고합니까? RIGHT ?).

vi 만 사용하는 경우 시각적 모드 대신 보이지 않는 마크를 사용해야합니다. 이에 :he mark대한 자세한 내용은 죄송하지만이 보이지 않는 마크에 대해서는별로 좋지 않습니다. 비주얼 모드로 오염되어 있습니다.



9

게으른 사람들을위한 최소 침습적 솔루션 :

레지스터는 0항상 마지막 양크를 포함합니다 ( Rafael , alex2k8idbrii 는 이미 언급했듯이). 불행히도 0항상 레지스터를 선택 하면 상당히 성 가실 수 있으므로 기본적으로 p사용 하면 좋을 것 "0입니다. 다음과 같은 줄을 넣어서 얻을 수 있습니다 .vimrc.

noremap p "0p
noremap P "0P
for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
    execute 'noremap "'.s:i.'p "'.s:i.'p'
    execute 'noremap "'.s:i.'P "'.s:i.'P'
endfor

첫 번째 선은 각 p획을에 매핑 합니다 "0p. 그러나 이렇게하면 p다른 레지스터에 액세스 할 수 없습니다. 따라서 p명시 적으로 선택된 레지스터가있는 모든 스트로크는 for-loop 내의 해당 명령 줄 식에 매핑됩니다. 에 대해서도 마찬가지입니다 P.

이렇게하면 기본적으로 레지스터 를 사용 하는 암시 적 pP획을 제외하고 표준 동작이 유지 0됩니다.

힌트 1 : 잘라 내기 명령은 이제 "0d그냥 대신에 있습니다 d. 그러나 게으 르기 때문에 너무 길다.) 따라서 다음 매핑을 사용하고 있습니다.

noremap <LEADER>d "0d
noremap <LEADER>D "0D

리더 키는 \쉽게 입력하여 텍스트를 절감 할 수 있도록 기본적으로 \d\D.

힌트 2 : 다중 키 매핑의 기본 시간 제한은 매우 짧습니다. 레지스터를 선택할 때 더 많은 시간을 갖도록 늘리기를 원할 수 있습니다. 자세한 내용은 다음 :help timeoutlen을 사용하고 있습니다.

set timeout timeoutlen=3000 ttimeoutlen=100

7

먼저이 명령을 수행하십시오.

:h d

그러면 특정 레지스터로 삭제할 수 있습니다. 그렇게하면 기본 레지스터에있는 내용을 변경하지 않습니다.


1
["x]d{motion} Delete text that {motion} moves over [into register x]-Vim:h d
Wes Turner

5

내 상황 : Normal모드에서 x키 누르기를 사용하여 문자를 삭제하면 해당 삭제가 최신 레지스터를 덮어 씁니다. 최근 레지스터에있는 것을 사용하여 문자를 삭제 x하고 붙여 넣기 를 원하는 편집 작업을 복잡하게 만듭니다 (예 : 동일한 텍스트를 2에서 붙여 넣거나 더 많은 장소).

수락 된 답변 ( "_d) 에서 제안을 시도했지만 작동하지 않았습니다.

그러나 /vi/122/performing-certain-operations-without-clearing-register 에서 허용 된 답변 / 의견에서 이것을 추가했습니다. ~/.vimrc(Vim을 다시 시작해야 할 수도 있습니다) ) :

nnoremap x "_x

즉, 이제 일반 yank ( y), delete ( d) 및 paste ( p) 명령을 수행 x할 수 있으며 더 이상 가장 최근의 레지스터를 채우지 않고 삭제 한 문자를 사용할 수 있습니다.


4

삽입 모드에서 삭제 된 텍스트는 기본 레지스터로 이동하지 않습니다.


2
하지만 기본 모드에서 텍스트의 상당한 금액을 삭제하면 SLOW입니다
해미 다우 너

3

올바른 상황에서 사용하는 두 가지 솔루션은 다음과 같습니다.

  • Vims VISUAL모드를 사용하여 바꿀 내용을 강조 표시 한 다음 레지스터를 붙여 넣습니다.

나는 두 번째 해결책을 훨씬 나중에 발견했기 때문에 이것을 습관적으로 사용합니다.

yiw   " yank the whole word
viwp  " replace any word with the default register
  • 양링 . 이 플러그인을 사용하면 키 바인딩 <ctrl>+<p>을 사용하여 이전에 번호가 매겨진 레지스터를 방금 붙여 넣은 레지스터로 바꿀 수 있습니다 .

기본적으로 당신은 당신이 원하는대로 붙여 넣기에 관한 것이지만, 당신이 기본 레지스터를 덮어 <C-P>썼다 는 것을 깨달았을 때 실제로 붙여 넣기를 원했던 것을 잃어 버렸다 면 YankRing 기록을 찾아 바꿀 수 있습니다 !

그중 하나는 플러그인이 있어야합니다 ...



2

Windows 버전 (아마도 Linux에서도)에서는 다음을 사용하여 시스템의 복사 / 붙여 넣기 버퍼로 들어갈 수 있습니다 "*y(예 : 큰 따옴표와 별표로 yank 명령 앞에).

그런 다음 교체 가능한 줄을 정상적으로 삭제하고을 사용하여 복사 한 텍스트를 붙여 넣을 수 있습니다 "*p.


2

'y'ank 다음' "_d '를 블랙홀에 넣은 다음'p'aste '명령을 따를 때 종종 실수를합니다.'y'ank를 선호합니다. 마지막으로 복사 된 텍스트가 푸시되는 0 레지스터


2

emacs-evil 사용자의 경우 (evil-paste-pop)붙여 넣기 후에 기능 을 트리거 할 수 있으며 킬 링의 이전 항목을 순환합니다. 당신이 그것을 묶었다고 가정하면 <C-p>(Spacemacs의 기본값) 필요에 p따라 적중 <C-p>합니다.


1

Dvorak 사용자의 경우, 매우 편리한 방법 중 하나는 불필요한 시프트 텍스트를 "_ 블랙홀 레지스터 대신"1 레지스터로 삭제하는 것입니다. 동일한 시프트 프레스로 "+ 1을 누를 수 있고 1은 Dvorak에서 "바로 위에있는 키 (PLUS d는 다른 한편으로는 전체 명령을 지옥처럼 빠르게 만듭니다).

물론, "1 레지스터는 편의성으로 인해 다른 용도로 사용될 수 있지만 텍스트를 바꾸는 것보다 더 일반적인 목적이 없다면 레지스터를 잘 사용한다고 말할 수 있습니다.


1

가상 선택 및 붙여 넣기를 통해 텍스트를 교체 할 때 이름없는 레지스터를 덮어 쓰지 않으려는 주된 사용자를 위해.

쉽고 편리하게 다음 솔루션을 사용할 수 있습니다.

xnoremap <expr> p 'pgv"'.v:register.'y'

여기에 답변 (및 의견)이 있습니다 : 레지스터를 덮어 쓰지 않고 붙여 넣는 방법

먼저 선택을 지난 다음 새 텍스트가있는 선택이 다시 선택됩니다 (gv). 이제 비주얼 모드에서 마지막으로 사용 된 레지스터 (일반적으로 이름이없는 레지스터이지만 붙여 넣기에 다른 레지스터를 사용하면 부작용이 발생하지 않습니다). 그런 다음 새 값을 레지스터에 다시 넣습니다.

추신 : intellj idea plugin vim-simulation과 함께 작동하는 더 간단한 변형이 필요한 경우이 것을 취할 수 있습니다 (단점 : 붙여 넣기 위해 다른 레지스터가 주어 졌더라도 명명되지 않은 레지스터를 덮어 씁니다).

vnoremap p pgvy



0

실용성보다 복잡성에 대한 Vim의 가끔 선호는 사용자가 레지스터를 복사 / 삭제 작업에 적용하는 데 부담을줍니다.

그러나 vim의 복잡한 레지스터와 싸우는 대신보다 편리하게 만드십시오. "기본"레지스터를 선택하여 최신 삭제를 저장하십시오. 예를 들어, d 레지스터에 삭제를 보냅니다 (ad-hoc 사용을 위해 ac를 열어두고 d는 니모닉입니다).

nnoremap d "dd           "send latest delete to d register
nnoremap D "dD           "send latest delete to d register 
nnoremap dd "ddd         "send latest delete to d register
nnoremap x "_x           "send char deletes to black hole, not worth saving
nnoremap <leader>p "dp   "paste what was deleted
nnoremap <leader>P "dP   "paste what was deleted

이 방법을 사용하면 삭제로 인해 버벅 거림이 생길 수 있습니다. 그러나 삭제를 등록하는 것을 잊어 버리지 않습니다. 삭제 된 내용을 블랙홀에서 잃지 않고 붙여 넣을 수 있습니다 (허용 된 답변에서와 같이). 위의 예에서이 리콜은 두 개의 지시선 p 매핑으로 수행됩니다. 이 접근 방식의 장점은 붙여 넣을 항목을 선택할 수 있다는 것입니다. (a) 방금 막힌 것 또는 (b) 방금 삭제 한 것.


0

등록 0 ~ 9는 최신 항목으로 yan거나 자르는 등의 이유로 삭제 된 항목 등을 포함하지 않습니다. 따라서 흠을 cut거나 자르면 등록 된 항목도 있습니다. 여전히 마지막으로 잡아 당기거나 자른 것입니다.

yiw # 기본 레지스터와 레지스터 0 모두로 이동

커서가있는 단어를 잡아 당깁니다.

삭제 된 항목 등은 기본 레지스터로 이동하지만 0을 등록하지 않습니다.

표준 모드에서 :

"0p # 레지스터 0의 내용을 입력하십시오

삽입 모드에서 :

ctrl-r 0 # 레지스터 0의 내용을 입력하십시오

나는 또한 x lol을 등록하기 위해 항상 k 거리거나 자른 친구를 가졌습니다.

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