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


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.