vim으로 어떻게 붙여 넣기 (덮어 쓰기)를 할 수 있습니까?


31

vim내가 사용 yy하고 p모든 시간 꺼낼 라인을 붙여 넣습니다. 그러나 파일에서 한 줄을 여러 위치로 바꾸려면 클립 보드 / 레지스터의 줄을 삭제 하기 yy p dd p때문에 사용할 수 없습니다 dd. 레지스터를 더 잘 사용하는 방법을 알아야하지만 p현재 줄을 대체 하는 방법이 있다고 생각합니다.

답변:


27

붙여 넣기 명령은 기본적으로 "( "이름이없는") 레지스터를 사용 합니다. 실제로 레지스터에 쓰는 명령은 이름이없는 레지스터에도 쓰므로 ks 크, 삭제 및 변경이 모두 영향을 미칩니다. 그렇기 때문에 yank-delete-paste 시퀀스는 삭제 된 텍스트 대신 삭제 된 텍스트를 붙여 넣습니다.

0레지스터 가 여기에 도움 이 될 수 있습니다. 레지스터를 지정하지 않은 yank 명령은 yank 된 텍스트를 레지스터 0에 추가합니다 (이외에도 "). 삭제 또는 변경 조작의 영향을받지 않으므로 중간 삭제 또는 변경을 수행하더라도이를 사용하여 여러 줄을 붙여 넣을 수 있습니다.

  1. yy: 레지스터 0"둘 모두에 줄이 생겼습니다.
  2. 교체 할 줄로 이동하십시오.
  3. dd: 레지스터 "에 삭제 된 줄이 있지만 레지스터에 0여전히 줄이 있습니다.
    "0P: 레지스터에서 원래 줄 바꿈 행을 붙여 넣습니다 0.
  4. 바꿀 다음 줄로 이동하십시오.
  5. dd"0P (같은 상기와)

(버퍼의 마지막 라인을 교체 할 때 커서 위치 지정 방식으로 인해 "0p대신에 사용하려고합니다 "0P.)

이것은 처음에 king을 때 레지스터를 지정할 필요가 없다는 점을 제외하고 Bruce Ediger의 대답 과 매우 가깝습니다 . 하나를 사용하거나 필요한 경우 (예를 들어) 일부 라인을 대체하지만 더 이름이 레지스터는 매우 편리 할 수 AAA있지만, 다른 라인 BBB(넣어 AAA레지스터 aBBB레지스터 b(또는 레지스터 중 하나를 떠나 0), 그에 따라 붙여 넣습니다 ).

또한 0줄 단위 시각 모드 ( V) 에서 붙여 넣어 키 입력을 저장할 수 V"0p있습니다.

를 입력하지 않으려면 "0매핑이 더 편리 할 수 ​​있습니다.

noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p

다른 방법은 _( "블랙홀") 레지스터 를 삭제하는 것 입니다. 삭제하면 "레지스터가 영향을받지 않으므로 yank-delete-paste 시퀀스는 여전히 이름이 지정되지 않은 레지스터에서 yanked 텍스트를 붙여 넣을 수 있습니다.

  1. yy: 등록 0"둘 다 이제 줄이 생겼습니다.
  2. "_dd: 레지스터를 변경하지 않습니다.
    P: 등록 된 원본 텍스트를 붙여 넣습니다 ".

다시, 당신은 매핑이 더 편리하다는 것을 알 수 있습니다 :

noremap <Leader>d "_d

2
또는 tl; dr, yy(교체 할 줄로 이동)을 사용하십시오 S<C-r>0<Esc>. .명령 으로 반복 할 수 있다는 장점이 있습니다.
와일드 카드

11

Kevin이 꽤 좋은 대답을 한 것처럼 보이지만 삭제 한 각 줄에 눈을 대고 바꾸려면 약간 다른 해결책이 있습니다.

1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.

이러한 종류의 레시피를 사용하면 패턴 일치를 사용하여 삭제 및 교체 할 줄을 찾을 수 있으며 파일 시작 (1G)으로 돌아가서 원하는만큼 자주 검색 할 수 있습니다. 반복해서 모으고 배치 할 줄이 두 개 이상인 "ayy경우 첫 번째 줄, "byy두 번째 줄, 세 번째 줄 등에 사용 "cyy합니다. 나는 정신적 부담을 줄이기 위해 습관을 만들었다 (레시피의 일반성을 줄였다).


아주 좋아요 그래서 사용하는 경우 "ayy다음 dd, dd속에있는 것을 대체하지 않습니다 a,하지만 난 입력하면 p그냥 사용하여 삭제 된 것을 붙여 넣습니다 dd. 그리고 내가 "ayy무엇을 삭제하고있는 내용으로 바꾸고 싶었다면 사용할 것 "add입니다. 맞습니까?
cwd

"ayy는 행을 레지스터 'a'에 복사합니다."dd "는 행을 'a'가 아닌 기본 레지스터로 자릅니다. 'p'는 기본 레지스터를 붙여 넣습니다. 그리고 예,"add는 행을 레지스터 'a'에 자릅니다. "ayy 명령의 내용을 대체 할 것입니다.
Bruce Ediger

5

:s원하는 타이핑 양에 따라을 (를) 사용 하는 몇 가지 방법 이 있습니다. 가장 쉬운 방법은 간단한 검색 및 교체입니다.

:%s/find this line/replace with this/

%전체 파일을 검색하고 모든 항목을 대체합니다.

입력이 너무 많은 경우 대상 문자열 ( yy)을 잡아 당겨 "(기본) 레지스터를 사용하여 다음과 Ctrl+r "같이 삽입 할 수 있습니다 .

:%s/<ctrl+r><">/replacement/

당신은 대체 문자열의 복사본이있는 경우 또는, 당신이 별도의 레지스터로 두 가지를 꺼낼 수 "ayy"byy로 꺼낼 ab레지스터 각각 (당신은 당신의 레지스터에 대한 모든 문자를 사용 할 수 있습니다). 그런 다음 Ctrl+r aCtrl+r b을 사용 하여 검색 및 바꾸기 필드에 붙여 넣습니다.

Bruce를 한꺼번에하지 말고 교체하기 전에 줄을 확인하려면 c옵션을 추가하십시오 .

:%s/find this line/replace with this/c

2

당신은 사용할 수 있습니다 V당신은 비주얼 모드로 교체 할 선을 강조하고 공격 pp이 라인을 통해 붙여 넣습니다.

이것은 하나의 키 입력 만 추가하므로 꽤 좋은 해결책처럼 보입니다.


붙여 넣기 후에 클립 보드에V
daniel kullmann이

그냥 하나 p.
Aaron Thoma 2016 년

2

나는 c이런 종류의 일에 대해 정기적 인 검색과 함께 "change"명령을 자주 사용한다 . 관심있는 각 줄 / 텍스트의 파일을 검색 한 다음 연속 n.명령 을 사용 n하여 다음 .에 마지막 변경을 반복 할 수 있습니다.

/^hello-hello로 시작하는 줄을 찾으십시오.
c$goodbye-줄을 작별 인사로 변경하십시오.
n.-찾기 반복, 변경 반복

행을 파일에 이미있는 행으로 변경하려면 GUI를 허용한다고 가정하여 입력 버퍼에 복사 한 다음 붙여 넣기하여 첫 번째 변경 명령의 내용을 가져올 수 있습니다.

모든 일 vi와 마찬가지로, 어떤 종류의 편집을 원하는지에 따라 주머니에 많은 옵션을 갖는 것이 좋습니다.

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