따라서 일반적으로 새 텍스트를 붙여 넣은 오래된 텍스트를 덮어 쓰면서 한 지점에서 다른 지점으로 텍스트를 복사합니다.
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
(나는 또한 시도 x
나 c
:), 나는이 일을 결국 라인의 시작과 끝의 문제를 가지고 vnoremap p :<C-U>let @p = @+<CR>gvp:let @+ = @p<CR>
나는 (또한 작동하지 않던 기존 플러그인보다 간단 발견 set clipboard=unnamedplus
상자 밖으로). 그것이하는 일은 :
- 명령 모드로 전환
- 범위 제거 (
C-U
) - 백업
+
레지스터 (때문에 unnamedplus에, 대안은"
과*
구성에 따라)에p
- 선택을 복구하고 붙여 넣기
- 명령 모드로 다시 전환
- 레지스터를 복구