VIM 단어를 붙여 넣기 버퍼의 내용으로 바꾸시겠습니까?


110

파일에서 여러 단어 대체를 수행하고 .NET과 같은 EX 명령이 아닌 vi 명령으로 수행하고 싶습니다 :%s///g. 이것이 현재 커서 위치에서 단어를 대체하는 일반적인 방법이라는 것을 알고 있습니다. cw<text><esc>그러나 이름이 지정되지 않은 레지스터의 내용을 대체 텍스트로 사용하고 레지스터를 덮어 쓰지 않고이 작업을 수행하는 방법이 있습니까?


8
해결책 : 즉각적인 필요 를 위해 12yl12 개의 문자를 잡아 당기고 "_cw^r0단어를 대체했습니다. 그런 다음 .명령 을 사용 하여 파일 전체에서 교체를 반복 할 수있었습니다 .
plong

답변:


127

"붙여 넣기"란 이름이없는 (yank / put / change / delete / substitute) 레지스터를 의미한다고 생각합니다. 맞습니까? (변경 명령에 의해 덮어 쓰여지는 것이기 때문에.)

레지스터는 일반적으로 입력하여 지정 "처럼, 다음 레지스터의 이름 (단일 문자를) "ay다음 "ap레지스터에 꺼낼 a, 다음 레지스터의 내용을 넣어 a. 변경 명령도 마찬가지입니다. 당신이 변경 명령을 사용하여 제거 할 텍스트가 어디 가고 싶어하지 않는 경우이 경우, 당신은 블랙홀 레지스터를 사용할 수 있습니다 "_: "_cw. 그런 다음 삽입 모드에서 Ctrl-R을 누른 다음 해당 레지스터 "의 내용에 넣을 레지스터 (아마도 )를 누를 수 있습니다.

  • "* -선택 레지스터 (가운데 버튼 붙여 넣기)
  • "+ -클립 보드 레지스터 (아마도 터미널을 통해 ctrl-shift-v로 액세스 가능)
  • "" -vim의 기본 (이름 없음) yank / put / change / delete / substitute register.

짧은 답변: "_cw^R"

편집 : 다른 사람들이 제안한 것처럼 텍스트를 기본 레지스터에 넣은 yank (또는 기타)에 대해 다른 레지스터를 사용할 수 있습니다. 하지만 항상 그것을 먼저 생각하는 것은 아니기 때문에 그것을 날려 버리지 않고 단일 변경 명령을 수행하는 것이 좋습니다. 완전히 날아가지는 않지만. 번호가 매겨진 레지스터가 있습니다 "0통해 "9:

Vim은 이러한 레지스터를 yank 및 delete 명령의 텍스트로 채 웁니다.

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

번호가 매겨진 레지스터 1에는 명령이 다른 레지스터를 지정하거나 텍스트가 한 줄 미만인 경우 (작은 삭제 레지스터가 사용됨) 가장 최근의 삭제 또는 변경 명령에 의해 삭제 된 텍스트가 포함됩니다. 예외는 이러한 이동 명령 delete 연산자 위해 만들어 : %, (, ), `, /, ?, n,N , {}. 레지스터 "1은 항상 사용됩니다 (이것은 Vi 호환 가능). 삭제가 라인 내에있는 경우"-레지스터도 사용됩니다.

연속적으로 삭제 또는 변경 될 때마다 Vim은 레지스터 1의 이전 내용을 레지스터 2로, 2를 3으로 이동하여 레지스터 9의 이전 내용을 잃습니다.


1
좋아, 레지스터에 대한 문서를 아직 내 대답에 충분히 복사했다고 생각합니까? 모든 것이 아래에 :help registers있습니다.
Cascabel

48

이 게시물의 정보를 사용하여이 유용한 매핑을 구성했습니다. 나는 '붙여 넣기 변경'을 의미하기 때문에 'cp'를 선택했습니다.

nmap <silent> cp "_cw<C-R>"<Esc>

편집하다:

또한 나는 이것을 한 걸음 더 나아가 모든 동작을 지원했습니다.

위의 명령에 해당하는 것을 얻으려면 cpw"변경 붙여 넣기 단어"

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>g@
function! ChangePaste(type, ...)
    silent exe "normal! `[v`]\"_c"
    silent exe "normal! p"
endfunction

<사일런트>로 인해 작동하지 않습니다 ... 왜 그런지 알 수 있습니까? 나는 매핑 및 기능의 n00b입니다.
Hollister

유일한 문제는 붙여 넣을 레지스터를 선택할 수 없다는 것입니다 ...하지만이 경우에는 cw를 사용하고 CTRL + R을 사용할 수 있다고 가정합니다.
Steve Vermeulen

2
: 나를 위해 레지스터 이름하지만 다음 작품을 추가 할 수있는 더 좋은 방법이있을 수 있습니다 nmap <silent> cp :let g:currentRegister=v:register<cr>:set opfunc=ChangePaste<CR>g@ function! ChangePaste(type, ...) silent exe "normal! `[v`]\"_c".getreg(g:currentRegister) endfunction
스티브 Vermeulen에게

@eventualEntropy 이것은 줄을 바꾸는 데 잘 작동합니다. 줄 대신 단어에 대해 어떻게 작동시킬 수 있습니까? 여전히 vim을 배우고 있습니다. 도와 주셔서 감사합니다.
Xavitoj Cheema

@XavitojCheema 나는 그 코멘트를 만든 기억조차 없습니다, 하하. 하지만 실제로이 기능을 제공하는 플러그인을 작성했습니다 ( github.com/svermeulen/vim-easyclip )
Steve Vermeulen

27

이를 위해 vim의 시각적 모드를 사용할 수 있습니다. 예를 들어 단어를 복사 한 ye다음 복사 된 단어로 다른 단어 를 덮어 씁니다.vep


9
이것은 작동하지만 시각적 붙여 넣기가 새로 삭제 된 텍스트의 yank 버퍼를 덮어 씁니다.
ostler.c 2011 년

24

커서가 명명되지 않은 레지스터의 내용으로 바꾸려는 단어에 있으면 viwp. v비주얼 모드로 전환 iw하고 내부 단어를 선택하고p 하고 레지스터의 내용을 제자리에 놓습니다.

실제로 한 단어 (함수 이름 등)를 다른 단어로 바꿔야 할 때 대체로 사용할 yiw단어로 이동하고, 내부 단어를 이름없는 레지스터에 끌어다 놓은 다음 I '라는 단어로 이동합니다. m 교체 및 viwp교체합니다. 한 단어를 다른 단어로 대체하는 아주 빠른 방법입니다. /바꾸기 위해 바꾸려는 단어를 ( ) 검색 한 경우 , n을 눌러 바꾸어야 할 다음 항목으로 이동할 수 있습니다. 분명히를 사용하는 대신 사용할 수 :%s/find/replace/g는 없지만 몇 가지 빠른 대체를 위해 유용 할 수 있습니다. 특히 레지스터에 이미 새 단어가있는 경우 더욱 그렇습니다.


4
이것이 받아 들여지는 해결책이 아니라는 것에 놀랐습니다. 위의 모든 것들은 일부 엣지의 경우 에 더 유연하지만 단순히 '어딘가에 선택을 위해 현재 이름없는 레지스터를 스와핑'하기 위해 훨씬 더 장황합니다. asker가 여기에 왔습니다.
ELLIOTTCABLE

1
이것은 매우 유용하고 직관적입니다.
lacostenycoder

6

명명 된 레지스터를 사용하는 경우 (예 : 붙여 넣기 레지스터를 채우기 위해 "ay또는 "ad등을 사용 ) 다음과 같이 할 수 있습니다.

cw<CTRL-R>a<esc>

단어를 레지스터의 내용으로 대체합니다 a. 내가 말할 수있는 한, 기본 레지스터는 사용할 수 없습니다 cw. 그 명령에 의해 잘린 단어로 채워질 것이기 때문 입니다.


기본 레지스터를 사용할 수 있습니다! 내 대답을 확인하십시오.
Cascabel

2

시스템 붙여 넣기 버퍼 또는 vi 레지스터를 의미합니까?

당신이 다음 버퍼 붙여 넣기 시스템을 사용하고자하는 경우에 당신은 잘하고 할 수 dw"+P- "레지스터를 선택하고,"+ 시스템 붙여 넣기 버퍼입니다.

그렇지 않으면 레지스터 "ay에 복사하고 a무언가를 대체하기 위해 say 를 사용하여 기본이 아닌 레지스터 에 복사 하십시오.dw"aP


고마워, Hamish. 나는 그것을 시도했지만 dw"단어"를 고려한 후 후행 공백을 삭제 cw하고 단어 만 변경합니다. 그런 이유로 dw나를 위해 작동하지 않습니다.
plong

이 경우 de작동합니다.이 단어의 끝까지 dw삭제되고 다음 단어의 시작 부분까지 삭제됩니다.
Hamish Downer

1

을 (를) 사용 yw하여 단어를 잡아 당긴 다음, 잡아 당긴 단어를 사용 vipw하여 단어를 잡아 당기고 이전에 잡아 당긴 단어를 붙여 넣을 수 있습니다.


0

이를 위해 레지스터를 사용할 수 있습니다.

레지스터의 첫 번째 대체 텍스트 <mark some text>"ay

a레지스터 이름은 어디에 있습니까?

그런 다음 그 레지스터를 대신 사용할 수 있습니다.

ve"ap


안타깝게도를 통해 마지막 붙여 넣기 작업을 반복 할 수는 없었 .습니다. 그래도 고마워. 매우 감사.
plong

0

또는 Shift+ v- p(전체 라인을 선택하고 그 자리에 붙여 넣기) 할 수 있습니다.


1
또는 pdw ... vim을 좋아하지 않습니까? : P
elimirks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.