삭제 된 줄을 잡아 당기지 않고 vim에서 기울어 진 텍스트를 바꾸려면 어떻게해야합니까? 지점에서 다른 지점으로 텍스트를 복사합니다. blah1 newtext blah2 wrong1 blah3 wrong2 blah4 내가

따라서 일반적으로 새 텍스트를 붙여 넣은 오래된 텍스트를 덮어 쓰면서 한 지점에서 다른 지점으로 텍스트를 복사합니다.

blah1
newtext
blah2
wrong1
blah3
wrong2
blah4

내가 시각적으로 표시 newtext하고 고정 한다고 가정 y하십시오. 이제 wrong1(단지 단어가 아닌 모든 것이 될 수 있음)을 선택하고를 으 p십시오 newtext. 그러나 이제 내가 똑같이 wrong2하면 wrong1대신 대신 으로 대체됩니다 newtext.

그렇다면 버퍼에있는 텍스트가 현재 덮어 쓰고있는 텍스트와 바뀌지 않게하려면 어떻게해야합니까?

편집 1

나는 reigister 제안을 좋아하지만 ( :dis명령을 발견 했으므로 레지스터 사용을 더 시작할 것이라고 생각하지만 ) 스왑 모드를 사용하지 않기 때문에 jinfield 의 답변을 수정하려고 합니다.

vnoremap p "0p
vnoremap P "0P
vnoremap y "0y
vnoremap d "0d

트릭을 완벽하게 수행합니다.

편집 2

나는 너무 빨랐다. romainl 의 솔루션은 Edit 1 의 해킹없이 정확하게 내가 찾던 것입니다 .
실제로 vnoremap p "_dP는 충분합니다!
따라서 수락 된 답변을 변경하십시오.



답변

내 .vimrc에 이러한 매핑이 있습니다.

" delete without yanking
nnoremap <leader>d "_d
vnoremap <leader>d "_d

" replace currently selected text with default register
" without yanking it
vnoremap <leader>p "_dP

"_다음과 같이 “블랙홀 레지스터”입니다 :help "_.

“이 레지스터에 쓸 때 아무 일도 일어나지 않습니다. 일반 레지스터에 영향을주지 않고 텍스트를 삭제하는 데 사용할 수 있습니다.이 레지스터에서 읽을 때 아무 것도 반환되지 않습니다. {not in Vi}”


답변

표준 버퍼 외에도 텍스트를 명명 된 버퍼에 넣은 다음 명명 된 버퍼에서 넣을 수 있습니다. 사용할 수있는 명명 된 버퍼는 최대 26 개입니다 (각 문자 당 하나씩). 큰 따옴표와 문자를 사용하여 명명 된 버퍼에 액세스하십시오. 예 :

"dyy -완충액으로의 현재 전류 라인 d.
"a7yy-완충 선으로 다음 7 라인 얀크.
"dP-버퍼 d의 내용을 커서 앞에 놓습니다.
"ap-커서 뒤에 버퍼 내용을 넣습니다.

또 다른 멋진 점은 소문자 대신 대문자를 사용하는 경우입니다. 즉 "Dyy, 현재 줄은 바꾸지 않고 버퍼 d에 추가됩니다. O`Reilly 책에 대한 자세한 내용 : http://docstore.mik.ua/orelly/unix/vi/ch04_03.htm


답변

put비주얼 모드에서 사용 하는 경우 교체중인 텍스트 wrong1가 ‘무제한’레지스터의 내용으로 덮어 씁니다.

이것은 실제로 선택 후 레지스터를 ‘입력’한 다음 선택을 삭제하여 작동합니다. 문제는이 삭제가 이제 unnamed레지스터에 저장되어 다음 put조치에 사용된다는 것 입니다.

에 따르면 해결책 :h v_p은와 같은 명명 된 레지스터에 들어가서 필요한만큼 많은 시간 "0y을 붙여 넣는 "0p것입니다. 이름이 지정된 레지스터를 자주 사용하는 경우 매핑 <leader>y하고 <leader>p사용하는 것이 도움이 될 수 있습니다 .

:map <leader>y "0y
:map <leader>p "0p

자세한 내용은 다음을 참조하십시오.

:help v_p
:help map

답변

"0레지스터 에서 붙여 넣기 를 아는 것이 중요하지만 종종 여러 번 바꾸려고합니다. 반복 가능한 동작 .으로 만들면 garyjohn이 언급 한 것처럼 연산자를 사용할 수 있습니다 . 그것은 vim 위키에 설명 되어 있습니다 :

yiw     yank inner word (copy word under cursor, say "first". Same as above).
...     Move the cursor to another word (say "second").
ciw<C-r>0   select "second", then replace it with "first" If you are at the start of the word then cw<C-r>0 is sufficient.
...     Move the cursor to another word (say "third").
.   select "third", then replace it with "first".

답변

텍스트를 이름이없는 레지스터 *에 넣을 때 복사본도 레지스터 0에 저장됩니다. 선택한 텍스트를 바꿀 때마다 0 레지스터에서 붙여 넣기 만하면됩니다. 만나다

:help registers

또한 여러 단어를 같은 단어로 바꾸는 경우 바꿀 단어의 시작 부분으로 이동하여을 입력하면 .됩니다. 마지막 편집 작업이 반복됩니다. 만나다

:help single-repeat

* 꽉 잡고 저장 위치를 ​​레지스터라고합니다. 버퍼는 일반적으로 디스크에서 파일 사본을 편집하는 것입니다.


답변

나는 이것을 너무 자주 필요로하며, ReplaceWithRegister 플러그인을 작성했다 .

이 플러그인은 gr{motion}, 전체 라인 또는 현재 선택 항목이 포함 된 텍스트를 레지스터의 내용으로 바꾸는 투 인원 명령을 제공합니다. 오래된 텍스트는 블랙홀 레지스터로 삭제됩니다. 즉 사라졌습니다.


답변

같은으로 vnoremap p "_dP(나는 또한 시도 xc:), 나는이 일을 결국 라인의 시작과 끝의 문제를 가지고 vnoremap p :<C-U>let @p = @+<CR>gvp:let @+ = @p<CR>나는 (또한 작동하지 않던 기존 플러그인보다 간단 발견 set clipboard=unnamedplus상자 밖으로). 그것이하는 일은 :

  • 명령 모드로 전환
  • 범위 제거 ( C-U)
  • 백업 +레지스터 (때문에 unnamedplus에, 대안은 "*구성에 따라)에p
  • 선택을 복구하고 붙여 넣기
  • 명령 모드로 다시 전환
  • 레지스터를 복구