레지스터를 덮어 쓰지 않고 붙여 넣는 방법


112

기본 레지스터에 선택 항목을 배치하지 않고 시각적으로 선택한 영역 위에 붙여 넣는 방법을 아는 사람이 있습니까?

항상 명시 적 레지스터에서 붙여 넣어 문제를 해결할 수 있다는 것을 알고 있습니다. 하지만 "xp그냥 입력하는 것이 아니라 목에 통증 이 있습니다.p

답변:


33

"{register}p설명대로 작동하지 않습니다. 선택 항목이 레지스터의 내용으로 대체됩니다. 대신 다음과 같은 작업을 수행해야합니다.

" I haven't found how to hide this function (yet)
function! RestoreRegister()
  let @" = s:restore_reg
  return ''
endfunction

function! s:Repl()
    let s:restore_reg = @"
    return "p@=RestoreRegister()\<cr>"
endfunction

" NB: this supports "rp that replaces the selection by the contents of @r
vnoremap <silent> <expr> p <sid>Repl()

p에 대한 non-nore vmap이있는 플러그인을 사용하지 않고 레지스터를 덮어 쓸 것으로 예상하는 한 괜찮습니다.

이 코드는 스크립트로 사용할 수 있습니다 . Ingo Karkat 은 동일한 문제를 해결 하는 플러그인 도 정의했습니다 .


실제로 사용한 레지스터를 가져 오는 깔끔한 방법이 있었지만 어떻게했는지 기억이 나지 않았습니다. 따라서 기능의 복잡성.
Luc Hermitte

1
나는 이것이 과잉이라고 생각하고 regtype(linewise?)를 기억하지 못할 것이며 p를 다시 매핑하는 pgvy것으로 충분합니다.
Benoit

2
과잉 일 수 있지만 부작용은 없습니다. A의 "xp이하지 덮어 쓰기 수행 @"과 내용을 @x달리pgvy
루크 Hermitte

1
그럼 :xnoremap p pgv@=v:register.'y'<cr>어때?
Benoit

1
나를 위해 작동하지 않습니다. 스크립트 다운로드도 시도했습니다. 내가 수행하는 명령 목록은 다음과 같습니다. 먼저 v를 누른 다음 e를 눌러 단어 끝까지 선택하고 y를 눌러 잡아 당깁니다. 그 후 바꾸고 싶은 다른 단어로 이동합니다. v, e, p를 차례로 눌러이를 대체합니다. 그런 다음 다시하는데 이번에는 다음 단어가 이전에 바꾼 단어로 바뀝니다.
Eddy

41

나는 삭제할 모든 텍스트 복사의 기본 정력 행동을 좋아하지 않아 d, D, c, 또는 C으로 기본 레지스터.

나는 , to 등 으로 매핑 d하여 주위를 둘러 보았습니다 ."_dc"_c

내 .vimrc에서 :

"These are to cancel the default behavior of d, D, c, C
"  to put the text they delete in the default register.
"  Note that this means e.g. "ad won't copy the text into
"  register a anymore.  You have to explicitly yank it.
nnoremap d "_d
vnoremap d "_d
nnoremap D "_D
vnoremap D "_D
nnoremap c "_c
vnoremap c "_c
nnoremap C "_C
vnoremap C "_C

이러한 매핑은 유용하지만 (나도 비슷한 작업을합니다) OP의 질문에 대답하지 않고 p는 선택한 콘텐츠에 붙여 넣은 내용을 여전히 덮어 씁니다.
Magnus

32

다음을 사용하십시오.

xnoremap p pgvy

그러면 시각적 모드에서 붙여 넣은 모든 텍스트를 다시 선택하고 다시 잡아 당깁니다.

편집 :이 작업을 수행하려면 다음을 수행 "xp할 수 있습니다.

xnoremap p pgv"@=v:register.'y'<cr>

v:register 일반 모드 명령에 사용 된 마지막 레지스터 이름으로 확장됩니다.


켜짐 "xp,이 방법은 덮어 쓰기 @"@x.
Luc Hermitte

3
귀하의 제안이 xnoremap p pgv"@=v:register.'y'<cr>저에게 효과적이지 않았습니다. 이 그러나 않습니다 :xnoremap <expr> p 'pgv"'.v:register.'y'
mrak

흥미로워 보입니다. 무엇을하는지 줄을 추가해 주 g시겠습니까? 전에 본 적이 없습니다.
LondonRob

4
@LondonRob : g혼자서는 아무것도하지 않습니다. .NET과 같은 확장 된 다중 키 명령을 제공합니다 z. 예를 들어, go버퍼 내의 n 번째 바이트로 진행 gj하고 gk다음 및 이전 표시 라인 (다를가는 jk선이 감싸 때) ga, 커서가 문자에 대한 정보를 디스플레이 gJ공간이없이 선을 결합하고, 여기서 gv마지막 영상 선택을 복원한다. 사용할 수 있습니다 :help gv.
Benoit

6
@ 마크 :xnoremap <expr> p 'pgv"'.v:register.'y`>' , 나는 커서 위치 복원하려면``>```추가
ROX

19

당신의 .vimrc

xnoremap p "_dP

비슷한 스레드의 응답에서 이것을 찾았지만 원래 소스는 http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text 입니다. 몇 가지 단점을 언급하지만 잘 작동합니다.


2
이것은 가장 간단한 해결책처럼 보입니다.
rudolph9 2016

1
나를 위해 일했습니다. 그리고이 대답은 분명합니다. .vimrc.local역시 괜찮습니다.
BaiJiFeiLong

3
선택 항목이 줄의 끝까지 확장되면 작동하지 않습니다.
John Freeman

6

Luc Hermitte의 솔루션은 매력처럼 작동합니다. 약 1 주일 정도 사용했습니다. 그런 다음 YankRing이 플러그인 / 번들 라인업의 일부인 경우 잘 작동하는 Steve Losh의 .vimrc 솔루션을 발견했습니다 .

function! YRRunAfterMaps()                                                                                                      
    " From Steve Losh, Preserve the yank post selection/put.    
    vnoremap p :<c-u>YRPaste 'p', 'v'<cr>gv:YRYankRange 'v'<cr> 
endfunction  

6

이것을 시도하십시오 ~/.vimrc:

xnoremap <expr> p 'pgv"'.v:register.'y'
  • xnoremap이것은 Visual모드가 아닌 Visual + Select모드 전용임을 의미 합니다.

  • <expr>그 수단 {rhs}xnoremap {lhs} {rhs}설정 표현으로 평가된다.

  • 이 경우의 표현은 연결에 'pgv"'.v:register.'y'사용 .됩니다.

  • v:register 매핑을 수행하는 동안 사용되는 레지스터로 평가됩니다.

의 결과 "xp는로 평가되며 레지스터는 pgv"xy어디에 있습니까 x?

이 stackoverflow 질문에 대한 답변으로 도움을 받았습니다. Vim- 이 페이지에서 Benoit 의 답변 과 함께 선택적 레지스터 접두사사용한 매핑


4

Luc의 기능은 내가 클립 보드 = unnamed 세트가 있다는 사실을 지원하기 위해 변경 한 후에 잘 작동했습니다.

function! RestoreRegister()
    let @" = s:restore_reg
    if &clipboard == "unnamed"
        let @* = s:restore_reg
    endif
    return ''
endfunction

1
참고로 clipboard=unnamedplus이것을 사용 하는 @+대신 @*.
Sebastian Blask

2

Luc Hermitte가 트릭을했습니다! 정말 좋다. 여기에 그의 솔루션이 토글 기능에 포함되어 있으므로 정상적인 동작과 교체 불가 등록간에 전환 할 수 있습니다.

명령, u는 동작을 토글합니다.

let s:putSwap = 1 
function TogglePutSwap()
    if s:putSwap
        vnoremap <silent> <expr> p <sid>Repl()
        let s:putSwap = 0 
        echo 'noreplace put'
    else
        vnoremap <silent> <expr> p p 
        let s:putSwap = 1 
        echo 'replace put'
    endif
    return
endfunction
noremap ,p :call TogglePutSwap()<cr>

s : putSwap 값에 따라 "p @ = RestoreRegister () \ <cr>"대신 "p"를 반환하도록 s : Repl을 변경할 수도 있습니다.
Luc Hermitte

1
선호하는 silent! vunmap대신에vnoremap <silent> <expr> p p
루크 Hermitte

0

덕트 테이프 프로그래밍이지만 나를 위해 작동합니다.

nmap viwp viwpyiw
nmap vi'p vi'pyi'
nmap vi"p vi"pyi"
nmap vi(p vi(pyi(
nmap vi[p vi[pyi[
nmap vi<p vi<pyi<

-4

시도-

:set guioptions-=a
:set guioptions-=A

3
선택한 텍스트가 Vim의 내부 복사 레지스터가 아닌 윈도우 시스템의 클립 보드 (예 : X11 또는 Win32)에 추가되는지 여부를 제어합니다.
Rob Kennedy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.