다른 줄로 시작하는 시각적 블록을 붙여 넣는 방법


10

그것은 퍼팅 (붙여 넣기)하는 것이 뭔가 실현하기 위해 나에게 매우 오랜 시간이 걸렸 p또는 P시각적 블록 선택을 ctrl+v과 함께 (복사) 꼴 y, 방식을 보존, 그 전에, 그래서 복사 한 텍스트 라인의 중간에있는 때, 그것은 그런 다음 가능할 때마다 다른 텍스트 중간에 복사됩니다. 반대로 select-line with with V는 다른 텍스트에 복사 된 행을 붙여 넣지 않고 다른 행에서 시작합니다.

예를 들어, 지금까지 내가 가지고 있다고 가정하십시오.

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
12/15:
12/16:
12/17:

나는 절단하고자 할 때 AvocadoBeanCherry선택하여 (선택으로 표시 _)

12/12: ________ Apple.
12/13: ________ Banana.
12/14: ________ Citron.
12/15:
12/16:
12/17:

을 누르고 y커서를 다음 줄 (커서로 _표시됨)로 이동합니다.

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
_2/15:
12/16:
12/17:

를 누릅니다 P. 결과 :

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.12/15:
Bean.   12/16:
Cherry. 12/17:

그러나 내가 원하는 것은 다음과 같습니다.

12/12: Avocado. Apple.
12/13: Bean.    Banana.
12/14: Cherry.  Citron.
Avocado.
Bean.   
Cherry. 
12/15:
12/16:
12/17:

이것은 줄 중간에 복사되어 있기 때문에 줄 중간에 붙여 넣어 원래의 방식을 모방한다는 것을 깨달을 때마다 매번 혼란 스러웠습니다.

다른 줄에서 시작하여 무언가를 붙여 넣는 가장 좋은 방법은 커서를 시작으로 이동 0하고 3 줄 아래로 새 위치로 이동하는 것입니다. 를 사용하여 삽입 모드로 들어가고 3 번을 i누른 다음 <return>커서를 6 줄 뒤로, 오른쪽으로 원래 위치로 되돌립니다. 복사하고, 다시 한 번 새 장소로 이동하여 위에서와 같이 붙여 넣습니다.

몇 번의 스트로크 만 저장할 수 있습니까? 아니면 일반적으로 무엇을합니까?

(편집 : 위에서 말한 것은 내가 이것을 요청 한 순간 그것을 이해하는 방법이었습니다. 정확한 설명은 해당 답변을 참조하십시오 :)

답변:


11

일부 텍스트를 복사하면 레지스터로 이동합니다. 레지스터 안의 텍스트 유형은 characterwise, linewise또는 blockwise입니다.

이 유형은 텍스트를 넣을 방법을 결정합니다.

이 예에서는 비주얼 블록 모드에서 일부 텍스트를 복사했습니다. 따라서 텍스트는 유형을 blockwise가지며 명명되지 않은 register에 저장되었습니다 ".
이 유형으로 인해 버퍼에 다시 붙여 넣으면 블록으로 붙여 넣습니다.


블록 대신 일련의 행으로 붙여 넣으려면 세 가지 방법이 있습니다.

  1. 삽입 모드에서을 눌러 삽입 할 수 있습니다 C-r ".
    이름이없는 레지스터의 내용은 마치 그 유형이 줄 단위 인 것처럼 삽입해야합니다.

  1. 명령 행에서 명령을 사용할 수 있습니다 :put.
    :put원래 유형에 관계없이 텍스트가 마치 줄 형식 인 것처럼 레지스터 안에 텍스트를 붙여 넣어야합니다. 레지스터 이름을 인수로 전달하고 레지스터를 붙여 넣을 행 아래에 지정된 행 주소를 전달할 수 있습니다.

예를 들면 다음과 같습니다.

:42put a

... 레지스터의 내용을 th 행 a아래에 배치해야 42합니다.

레지스터 이름이 없으면 Vim은 이름이없는 레지스터 (또는 +조정 한 경우 레지스터)를 붙여 넣으려는 것으로 가정합니다 'clipboard'.
주소가 없으면 Vim은 현재 행 아래에 붙여 넣기를 원한다고 가정합니다.


  1. 명령 행에서 setreg()함수 를 사용하여 이름없는 레지스터의 유형을 변경할 수 있습니다 .

    :call setreg('"', '', 'al')

여기서 setreg()이름없는 레지스터에 빈 문자열을 추가하고 ( a세번째 인수로 전달 된 플래그 덕분 ) 해당 유형을 줄 단위 ( l플래그 덕분)로 변경해야합니다 .

그런 다음 일반 모드에서 p일반 명령을 사용하여 마치 형식이 선 모양 인 것처럼 레지스터를 붙여 넣을 수 있습니다 .


문제와 직접 연결되어 있지는 않지만 일부 텍스트를 복사하면 0레지스터 로 이동합니다 . 그리고 unnamedplus옵션 앞에 값 을 추가 'clipboard'하면 +레지스터 로 이동합니다 .

getregtype()함수를 사용하여 레지스터 유형을 확인할 수 있습니다 .

:echo getregtype('"')

소문자를 반환 v하면 유형이 문자 단위임을 의미합니다.
대문자를 반환 V하면 유형이 줄 단위임을 의미합니다.
이 값을 반환 ^V{some number}하면 유형이 블록 단위이고 블록의 너비가 {some number}입니다.


3

콘텐츠를 특정 (문자 / 행 / 블록) 모드로 등록하기 위해 자주 "캐스팅"해야했기 때문에 UnconditionalPaste 플러그인 을 작성했습니다. 그것은 제공 gcp, glp등의 대안 내장 (쉼표 나 쿼리 문자로 합류로 붙여 넣기처럼,이 주제에 지금은 몇 가지 더 변화에 의해) 특정 모드를 강제로 붙여 넣기 명령.

그것으로, 당신은 사용할 수 있습니다 glp/ glP에 관계없이 텍스트를 빠지게 한 방법, (새 선으로) 현재 행하기 전에 / 후 붙여 넣습니다.


나는 당신이 그런 QQ를 쓸 시간이 있다고 부러워하지만 나는 만족합니다 :put. (또한 upvoted)
Violapterin

@ Aminopterin : 나는 종종 첫 번째 단락에 대한 snipMate 스 니펫을 가지고 있다고 대답했습니다. 그래서 조금만 커스터마이징해야합니다. 내 답변과 찬성에 감사드립니다!
Ingo Karkat

오, 나는 당신이 한마디로 플러그인을 쓸 시간이 있다고 부러워했다. 마지막으로 끝난 것처럼 .... 지난 반년 만에 취미 학습 프로젝트로 c ++ 프로젝트를 작성하여 프로그래밍을 배우도록 강요했다. 와 ~~ 내가 정력을 사용하기 시작했다
Violapterin

2
@Aminopterin 아, 플러그인은 Vimtips에서 복사 한 작은 발췌 문장으로 시작하여 시간이 지남에 따라 천천히 커졌습니다. 그것이 나에게 매우 유용한 것으로 판명되면서, 나는 그것을 점차적으로 크게 향상시켰다. 많은 작은 단계가 큰 단일 노력보다 강력합니다!
Ingo Karkat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.