Vim에서는 레지스터에 텍스트를 넣지 않고 삭제하는 방법이 있나요?

StackOverflow https://stackoverflow.com/questions/54255

  •  09-06-2019
  •  | 
  •  

문제

Vim을 사용하면 코드 블록을 방금 잡아당긴 블록으로 바꾸고 싶을 때가 많습니다.

그러나 교체할 코드 블록을 삭제하면 해당 블록 자체가 방금 끌어온 블록을 지우는 레지스터로 들어갑니다.그래서 원하지 않는 것을 잡아당겨 삽입하고 삭제하는 습관이 생겼습니다. 그러나 코드 블록이 크면 삽입된 블록과 삭제할 블록을 별도로 유지하려고 하면 지저분해집니다.

그렇다면 Vim에서 텍스트를 바꾸는 가장 매끄럽고 빠른 방법은 무엇일까요?

  • 기록부에 넣지 않고 텍스트를 삭제하는 방법이 있습니까?
  • 예를 들어 다음과 같이 말할 수 있는 방법이 있나요?"다음 단어 바꾸기" 또는 "다음 문단까지 바꾸기"
  • 아니면 다중 레지스터 기능을 사용하는 가장 좋은 방법입니까?
도움이 되었습니까?

해결책

레지스터에 저장하지 않고 무언가를 삭제하려면 "블랙홀 레지스터"를 사용할 수 있습니다.

"_d

물론 관심 있는 내용이 들어 있지 않은 다른 레지스터를 사용할 수도 있습니다.

다른 팁

네."이전" 텍스트를 먼저 삭제하는 것보다 약간 더 복잡하지만 다음과 같습니다.

나는..

line1
line2
line3
line4

old1
old2
old3
old4

옮기다+V line1, line 2, 3, 4를 선택하고 명령

그런 다음 같은 방식으로 이전 1-4줄을 삭제합니다.

그런 다음

"2p

그러면 마지막에서 두 번째로 잡아당긴 줄(1-4줄)이 붙여넣어집니다. "3p 마지막에서 세 번째 등을 수행합니다.

그래서 나는 결국

line1
line2
line3
line4

참조: 번호가 매겨진 레지스터에 대한 Vim 문서

VIM 문서: 번호가 매겨진 레지스터 0에는 명령이 [ "x]에 다른 레지스터를 지정하지 않는 한 가장 최근 Yank 명령의 텍스트가 포함됩니다.

예:"foo"를 잡아당겨 "bar"를 삭제합니다. 레지스트리 0에는 여전히 "foo"가 포함되어 있습니다!따라서 "foo"는 다음을 사용하여 붙여넣을 수 있습니다. "0p

현재 선택을 버퍼로 대체할 수 있는 쉬운 매핑이 있으면 편리합니다.

예를 들어 이것을 .vimrc에 넣으면

vmap r "_dP       // it's a capital 'p' on the end

그런 다음 무언가를 레지스터에 복사한 후(예:'y'를 사용하는 경우) 바꾸려는 텍스트를 선택하고 키보드에서 'r'을 누르기만 하면 됩니다.선택 항목이 현재 레지스터로 대체됩니다.

설명:

vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste

내 vimrc에 다음을 넣었습니다.

noremap  y "*y
noremap  Y "*Y
noremap  p "*p
noremap  P "*P
vnoremap y "*y
vnoremap Y "*Y
vnoremap p "*p
vnoremap P "*P

이제 클립보드 레지스터를 끌어서 넣기 때문에 기본 레지스터에 무슨 일이 일어나는지 신경 쓸 필요가 없습니다.추가적인 이점은 번거로움을 최소화하면서 다른 앱에서 붙여넣을 수 있다는 것입니다.일부 기능이 손실되고 있다는 것을 알고 있지만 어쨌든 둘 이상의 레지스터/클립보드를 추적할 수는 없습니다.

귀하가 제공한 특정 예의 경우 질문을 이해하면 다음과 같이 작동할 수 있습니다.

*Highlight what you want to put somewhere else
*delete (d)
*Highlight the code that you want it to replace
*paste (p)

모든 끌어오기 및 삭제 작업은 기본적으로 이름이 지정되지 않은 레지스터에 기록됩니다.그러나 가장 최근의 확인과 가장 최근의 삭제는 항상 번호가 매겨진 레지스터에 (별도로) 저장됩니다.레지스터 0 가장 최근의 양킹을 보유하고 있습니다.레지스터 1-9 최근 삭제된 항목 9개를 보관합니다( 1 가장 최근의 것입니다).

다시 말해서, 삭제는 이름이 지정되지 않은 레지스터에서 가장 최근에 가져온 항목을 덮어쓰지만 여전히 해당 레지스터에 남아 있습니다. 0 등록하다. 블랙홀 등록 트릭("_dd) 다른 답변에서 언급한 이름이 지정되지 않은 레지스터를 덮어쓰는 것을 방지하기 때문에 작동하지만 반드시 필요한 것은 아닙니다.

큰따옴표를 사용하여 레지스터를 참조하므로 가장 최근에 가져온 텍스트를 붙여넣는 작업은 다음과 같이 수행할 수 있습니다.

"0p

이것은 훌륭한 참고 자료입니다.

무엇을 강조하기 위해 EB그린이 말했다.:

텍스트를 선택하면서 붙여넣으면 선택한 텍스트가 교체됨 붙여넣은 텍스트로

일부 텍스트를 복사한 다음 여러 위치에 붙여넣으려면 다음을 사용하세요. "0p 붙여 넣기.번호가 매겨진 레지스터 0에는 가장 최근의 yank 명령의 텍스트가 포함되어 있습니다.


또한 모든 레지스터의 내용을 나열할 수 있습니다.

:registers

이 명령을 사용하면 다음과 같은 작업을 수행할 때 원하는 레지스터를 더 쉽게 파악할 수 있습니다. dbr의 답변./,%,# 레지스터도 표시됩니다.(또한보십시오 :help registers)


그리고 마지막으로 확인해 보세요. cW 그리고 cW 후행 공백을 포함하거나 포함하지 않는 단어를 변경합니다.(자본을 사용하여 W 구두점을 포함합니다.)

Vim을 사용한다면 선택과 유사한 시각적 모드가 있지만 vi/vim의 기본인 분리 모드가 있습니다.

원하는 작업은 시각적 모드를 사용하여 소스를 선택한 다음 잡아당긴 다음 다시 시각적 모드를 사용하여 대상 범위를 선택한 다음 기본 버퍼의 텍스트에 붙여넣는 것입니다.

예:

다음을 포함하는 텍스트 파일:

1| qwer
2| asdf
3| zxcv
4| poiu

다음 순서로: ggVjyGVkp 당신은 다음과 같이 끝날 것입니다 :

1| qwer
2| asdf
3| qewr
4| asdf

설명:

  • gg:첫 줄로 가다
  • V:전체 줄로 시각적 모드 시작
  • j:한 줄 아래로 이동(이전 줄에서 선택이 시작된 경우 선택 항목이 한 줄 아래로 늘어남)
  • y:기본 버퍼로 이동합니다(선택한 두 줄, 자동으로 시각적 모드에서 종료됨).
  • G:마지막 줄로 가다
  • V:비주얼 모드 시작 (이전과 동일)
  • k:한 줄 위로 이동(이전과 마찬가지로 시각적 모드를 활성화하면 선택 항목이 한 줄 위로 늘어납니다)
  • p:붙여넣기(마지막 두 줄을 선택하면 해당 줄이 버퍼에 있는 내용으로 대체됩니다. 이 경우 첫 번째 두 줄)

이것은 마지막 블록을 버퍼에 두는 약간 불편한 점이 있기 때문에 같은 것을 반복해서 붙여넣는 데는 바람직하지 않으므로 다음과 같은 이름을 가진 버퍼에 소스를 저장하는 것이 좋습니다. "ay ("a"라는 버퍼에) 다음과 같이 붙여 넣습니다. "ap (그런데 프로그래밍을 한다면 아마 여러 번 붙여넣기보다는 함수를 만들어서 호출하고 싶겠죠? 오른쪽?).

vi만 사용하는 경우 시각적 모드 대신 보이지 않는 표시를 사용해야 합니다. :he mark 이에 대해 더 자세히 말씀드리자면, 죄송합니다. 하지만 저는 이 보이지 않는 표시를 잘 다루지 못합니다. 저는 시각 모드에 꽤 오염되어 있습니다.

'단어 바꾸기'의 경우 다음을 시도하십시오. cw 일반 모드에서.

'단락 바꾸기'의 경우 다음을 시도하십시오. cap 일반 모드에서.

게으른 사람들을 위한 최소한의 침해 솔루션:

등록하다 0 항상 마지막 잡아당기기를 포함합니다(예: 라파엘, 알렉스2k8 그리고 이드브리 이미 언급했습니다).아쉽게도 등록을 선택했습니다. 0 항상 짜증날 수 있으니, 그렇다면 좋을 것 같아요. p 용도 "0 기본적으로.이는 다음 줄을 .vimrc:

noremap p "0p
noremap P "0P
for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
    execute 'noremap "'.s:i.'p "'.s:i.'p'
    execute 'noremap "'.s:i.'P "'.s:i.'P'
endfor

첫 번째 줄은 각각을 매핑합니다. p 뇌졸중 "0p.그러나 이는 p 다른 레지스터에 액세스하지 못하도록 합니다.그러므로 모두 p 명시적으로 선택된 레지스터가 있는 스트로크는 for 루프 내의 동등한 명령줄 표현식에 매핑됩니다.동일한 작업이 수행됩니다. P.

이 방법을 사용하면 암시적인 경우를 제외하고 표준 동작이 유지됩니다. p 그리고 P 이제 레지스터를 사용하는 스트로크 0 기본적으로.

힌트 1: 이제 잘라내기 명령은 다음과 같습니다. "0d 그냥 대신에 d.하지만 게으르기 때문에 이것은 나에게 너무 깁니다.) 따라서 다음 매핑을 사용하고 있습니다.

noremap <LEADER>d "0d
noremap <LEADER>D "0D

리더 키는 \ 기본적으로 입력하여 텍스트를 쉽게 잘라낼 수 있습니다. \d 또는 \D.

힌트 2: 다중 키 매핑의 기본 시간 초과는 매우 짧습니다.레지스터를 선택할 때 더 많은 시간을 확보하기 위해 이 값을 늘리는 것이 좋습니다.보다 :help timeoutlen 자세한 내용은 다음을 사용하고 있습니다.

set timeout timeoutlen=3000 ttimeoutlen=100

우선 다음 명령을 수행하세요.

:h d

그러면 특정 레지스터를 삭제할 수 있다는 것을 알게 될 것입니다.이렇게 하면 기본 레지스터에 있는 내용이 변경되지 않습니다.

삽입 모드에 있는 동안 삭제된 텍스트는 기본 레지스터에 들어 가지 않습니다.

제가 올바른 상황에서 사용하는 두 가지 솔루션은 다음과 같습니다.

  • Vims를 사용하여 대체하고 싶은 것을 강조하세요 VISUAL 모드를 선택한 다음 레지스터를 붙여넣습니다.

나는 훨씬 나중에 두 번째 해결책을 찾았기 때문에 주로 습관적으로 이것을 사용합니다.

yiw   " yank the whole word
viwp  " replace any word with the default register
  • 양크링.이 플러그인을 사용하면 키 바인딩을 사용할 수 있습니다 <ctrl>+<p> 이전에 번호가 매겨진 레지스터를 방금 붙여넣은 레지스터로 바꾸려면

기본적으로 원하는 대로 붙여넣기를 진행하지만 이후 기본 레지스터를 덮어써서 실제로 붙여넣고 싶었던 내용을 잃어버렸다는 것을 알게 되면 다음을 수행할 수 있습니다. <C-P> YankRing 기록에서 찾아 교체하세요!

그 중 하나에는 플러그인이 있어야합니다 ...

귀하의 목적에 매우 유용한 매핑을 찾았습니다.

xnoremap p "_dP

삭제된 텍스트는 "블랙홀 레지스터"에 들어가고, 끌어낸 텍스트는 남습니다.

원천: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text

Windows 버전(Linux에서도 가능)에서는 다음을 사용하여 시스템의 복사/붙여넣기 버퍼를 가져올 수 있습니다. "*y (즉.yank 명령 앞에는 큰따옴표와 별표를 사용하세요).

그런 다음 교체 가능한 줄을 정상적으로 삭제하고 다음을 사용하여 복사한 텍스트를 붙여넣을 수 있습니다. "*p.

나는 'y'ank, '"_d'elete를 블랙홀에 넣은 다음 'p'aste'라는 명령을 따를 때 종종 실수를 합니다.나는 'y'를 선택하고 원하는 대로 삭제한 다음 마지막으로 복사된 텍스트가 푸시되는 0 레지스터의 '0p'를 선호합니다.

내 상황:~에 Normal 모드를 사용하여 문자를 삭제할 때 x 키를 누르면 해당 삭제 항목이 최신 레지스터를 덮어씁니다. 다음을 사용하여 문자를 삭제하려는 편집이 복잡해집니다. x 가장 최근 등록부에 있는 내용을 붙여넣으세요(예:동일한 텍스트를 두 곳 이상의 위치에 붙여넣기).

나는 허용된 답변에서 제안을 시도했습니다("_d), 그러나 작동하지 않았습니다.

그러나 허용된 답변/댓글에서 https://vi.stackexchange.com/questions/122/performing-certain-Operations-without-clearing-register, 내 항목에 이 항목을 추가했습니다. ~/.vimrc, 작동합니다(Vim을 다시 시작해야 할 수도 있습니다):

nnoremap x "_x

즉, 이제 정상적인 양크(y), 삭제 (d), 붙여넣기(p) 명령 - 다음을 사용하여 삭제하는 문자 및 문자 x 더 이상 최신 레지스터를 채우지 않습니다.

Dvorak 사용자의 경우 매우 편리한 방법 중 하나는 "_ 블랙홀 레지스터 대신 "1 레지스터에서 불필요한 텍스트를 삭제하는 것입니다. 왜냐하면 동일한 Shift 키와 빠른 새끼손가락 동작으로 " + 1을 누를 수 있기 때문입니다. Dvorak의 " 바로 위에 있는 키(반면에 PLUS d는 전체 명령을 지옥처럼 빠르게 만듭니다).

그렇다면 물론 "1 레지스터는 편의성 때문에 다른 용도로 사용될 수 있지만, 텍스트를 바꾸는 것보다 더 일반적인 목적이 없다면 레지스터를 꽤 잘 활용한다고 말하고 싶습니다.

가상 선택 및 붙여넣기를 통해 텍스트를 바꿀 때 이름 없는 레지스터를 덮어쓰지 않으려는 사용자를 위한 것입니다.

나에게 가장 쉽고 효과적인 다음 솔루션을 사용할 수 있습니다.

xnoremap <expr> p 'pgv"'.v:register.'y'

여기에 대한 답변 (및 의견)이 있습니다.레지스터를 덮어쓰지 않고 붙여넣는 방법

먼저 선택 항목을 지나간 다음 새 텍스트가 포함된 선택 항목이 다시 선택됩니다(gv).이제 시각적 모드에서 마지막으로 사용된 레지스터입니다(일반적으로 이름이 지정되지 않은 레지스터이지만 붙여넣기 위해 다른 레지스터를 사용하는 경우 부작용 없이 작동합니다).그런 다음 새 값을 레지스터에 다시 가져옵니다.

추신:intellj idea 플러그인 vim-simulation에서도 작동하는 더 간단한 변형이 필요한 경우 이 변형을 사용할 수 있습니다(단점:붙여넣기 위해 다른 레지스터가 제공된 경우에도 이름 없는 레지스터를 덮어씁니다.

vnoremap p pgvy

emacs-evil 사용자의 경우 다음 기능은 (evil-paste-pop) 붙여넣은 후에 트리거될 수 있으며 킬 링의 이전 항목을 순환합니다.당신이 그것을 바인딩했다고 가정 <C-p> (Spacemacs의 기본값), 당신은 p 그 다음에는 많은 <C-p> 필요에 따라.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top