Programing

마지막 생크를 덮어 쓰지 않고 vim에서 삭제하는 방법은 무엇입니까?

lottogame 2020. 3. 31. 08:10
반응형

마지막 생크를 덮어 쓰지 않고 vim에서 삭제하는 방법은 무엇입니까? [복제]


이 질문에는 이미 답변이 있습니다.

나는 vim을 좋아하지만 한 가지 일반적인 문제는 다음과 같습니다.

  • 줄을 k 다
  • 붙여넣고 싶은 곳으로 이동
  • 거기에있는 것을 삭제
  • 방금 삭제 한 것을 붙여 넣기 만하면됩니다.

분명히 워크 플로가 먼저 삭제됩니다. 내가하지 않은 경우 그러나 그것은 reeeeeaaaaaalllly 좋은 것 가지고 에. 누구든지 이것에 대한 트릭이 있습니까? vim에 잘 작동하는 붙여 넣기 버퍼가 있습니까, 아니면 변경할 수있는 .vimrc 설정이 있습니까?


받는 패스 _레지스터, 블랙홀.

레지스터에 붙지 않고 줄을 삭제하려면 :

"_dd

도 참조하십시오 :help registers.

무언가를 반복해서 붙여 넣기를 원한다면 "이름이 지정된"레지스터에 넣는 것이 가장 안전 할 것입니다.

"aY

a레지스터 로 줄을 ks니다 . 로 붙여 넣기 "ap.


줄 바꿈 된 줄은 여전히 ​​레지스터 0에 있어야합니다.

"0p

선을 붙여 넣고 언제든지 삭제할 수 있습니다.


모든 yank 및 delete 작업은 기본적으로 명명되지 않은 레지스터에 씁니다. 그러나 가장 최근의 yank 및 가장 최근의 삭제는 항상 번호가 매겨진 레지스터에 (별도로) 저장됩니다. 레지스터 0는 가장 최근의 yank를 보유합니다 . 레지스터 1-9는 9 개의 가장 최근 삭제를 보유합니다 ( 1가장 최근 임).

다시 말해, 삭제는 명명되지 않은 레지스터에서 가장 최근의 yank를 덮어 쓰지만 여전히 0레지스터에 있습니다. "_dd다른 답변에서 언급 된 블랙홀 레지스터 트릭 ( )은 명명되지 않은 레지스터를 덮어 쓰지 못하기 때문에 작동하지만 필요하지는 않습니다.

큰 따옴표를 사용하여 레지스터를 참조하므로 가장 최근에 작성된 텍스트를 붙여 넣는 방법은 다음과 같습니다.

"0p

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


또 다른 가능성은 다음과 같습니다.

평소처럼 줄을 k 다

붙여 넣으려는 곳으로 이동하여 가시선 모드 ( V)로 들어갑니다.

바꿀 줄을 선택하십시오

p당신의 라인을 붙여 넣 습니다 .

이것은 또한 버퍼가 교체 된 내용으로 "스왑"된다는 추가 이점이 있습니다.


다음 매핑을 사용하여 블랙홀 레지스터를 약간 더 쉽게 삭제할 수 있습니다.

nnoremap R "_d

이 방법은 ddRdd$됩니다 R$. 참고 R일반적으로 대체 모드 입력 수밖에하지만, 그것은 "정말 제거"기능에 대한 키를 기억하기 easisest했다, 그래서 나는, 나는 그것을 사용하지 않는다는 것을 알 수있다.


" map paste, yank and delete to named register so the content
" will not be overwritten
nnoremap d "xd
vnoremap d "xd
nnoremap y "xy
vnoremap y "xy
nnoremap p "xp
vnoremap p "xp

이 문제를 해결하기 위해이 플러그인 (yankstack.vim)작성 했습니다 . 그것은 당신 에게 vim을위한 Emacs의 kill ring 과 같은 것을 제공합니다 . 여러 가지를 잡아 당기거나 삭제하고, 붙여 넣기를 한 다음, 잡아 당기거나 죽인 텍스트 기록을 앞뒤로 순환 할 수 있습니다. 내가 등록한 것을 등록한 것을 기억해야하는 것보다 쉽다는 것을 알게되었습니다.

내 .vimrc에는 다음과 같은 매핑이 있습니다.

nmap <M-p> <Plug>yankstack_substitute_older_paste
nmap <M-P> <Plug>yankstack_substitute_newer_paste

ALT-p 또는 ALT-SHIFT-p를 눌러 붙여 넣기 기록을 앞뒤로 순환 할 수 있습니다.


특정 질문에 대해 물었다으로 , 당신은 단지 마지막 2 단계의 순서를 바꿀 수 없었다?

  • 생크 라인 ( 동일 )
  • 새 위치로 이동 ( 같은 )
  • 붙임 선 붙여 넣기 ( 단계 4 )
  • 원하지 않는 줄 삭제 ( 3 단계 )

물론, 나는 보통 이런 종류의 일에 대해 명명 된 레지스터를 사용하지만 때로는 해결책이 처음에 떠오르는 것보다 더 간단합니다.


vim.org/scripts/에서 ReplaceWithRegister 스크립트를 사용해 볼 수도 있습니다.


이 모든 키 콤보가 번거 롭습니다. 대신, 삭제 작업에서 버퍼를 덮어 쓰는 vim의 "부작용"동작을 설정 및 해제하는 기능을 작성했습니다. 이렇게하면 해제하고 자유롭게 삭제 한 다음 완료되면 다시 켤 수 있습니다.

내 답변을 여기에서보십시오 : https : //.com/a/12649560/778118

그것을 사용하려면 그냥 .vimrc에 넣으십시오.


레지스터를 사용할 수 있습니다. "<register><command>

예 :

이렇게하면 행이 register로 들어가 a다른 행을 삭제 한 다음 레지스터를 붙여 넣습니다.a

"ayy` (move) `dd"aP

악의적 인 사용자라면 "_d와 같은 기능을 수행하기 위해 X를 다시 매핑하는 것을 고려할 수 있습니다. 그러나 구현을 완성하는 것은 약간 까다로운 작업이었습니다.

(define-key evil-normal-state-map "X" 'evil-destroy)
(define-key evil-visual-state-map "X" 'evil-destroy)

(evil-define-operator evil-destroy (beg end type register yank-handler)
  "delete without yanking text"
  (evil-delete beg end type 95 yank-handler)
)

아주 잘 통합됩니다. 예를 들어 XX를 입력하면 X $에서 d $, X0에서 d0 등과 같이 dd와 유사하게 작동합니다.

작동 방식에 대해 궁금한 경우 "95"는 "_ 레지스터를 나타내므로"_가 레지스터를 눌렀 던 것처럼 삭제하기 위해 호출을 다시 라우팅하기 만하면됩니다.


요령은 당신이 무언가를 잡고 움직이기를 원한다는 것을 알고 있으며 '게으른'첫 번째 레지스터 (방금 삭제 한 것으로 대체 됨)를 사용하고 있다는 것입니다.

vim에서 "잘라 내기"를 배워야합니다.

삭제하기 전에 다른 레지스터를 지정하십시오 ". 팁 : 등록을 확인하십시오:reg

이제 "명령 전에 를 눌러 새 레지스터를 선택하십시오 (명령 모드에서 분명히).

  1. "잘라 내고 싶은"선택 (2 단계에서 범위 지정)
  2. 변경 아무것도 (에 등록 1여기) 및 삭제 : "1d하거나 "1x또는"1c
  3. 새로운 장소로 이동하여 더 삭제
  4. 지금 당신은 당신이 잘라 레지스터 1에 저장 것을 붙여 넣을 준비 : "1p또는"1P

끝난. 이것은 또한 유스 케이스를 해결하는 이점이 있습니다. 한 곳에서 5 가지 항목을 삭제하고 각 조각은 다른 대상으로 이동합니다 ... 하나만 "1다른 곳에 삽입하십시오 "2... 각 대상으로 이동하여 붙여 넣습니다.

참고 URL : https://stackoverflow.com/questions/3638542/any-way-to-delete-in-vim-without-overwriting-your-last-yank

반응형