Vim이 "작은 삭제"를 레지스터 "1에 저장할 수 있습니까?


14

최근에 매크로에서 일부 문제가 발생했기 때문에 YankRing 플러그인을 설치에서 부분적으로 제거했지만 Vim의 레지스터를 대신 사용하도록 훈련하는 것이 더 낫다는 결론을 내 렸습니다. 특히 삭제 된 텍스트가 레지스터에 초기에 저장되는 방식 "1다음 통해 이동 "2, "3등 상기 결실이 이루어로서 매우 유용하다.

그러나 삭제 / 변경으로 인해 한 줄 미만의 텍스트가 제거되면 "-작은 삭제 레지스터에 저장됩니다 (일부 이동 명령의 경우 제외). 후속 작은 삭제가 이루어지면 해당 텍스트 비트가 손실됩니다.

Vim이 모든 삭제를 레지스터 에 저장하도록 할 수 "1있습니까?

nnoremap d "1d 거의 작동하지만 레지스터 "1 의 텍스트로 끝납니다 "2.

작은 삭제 레지스터의 기능이 영향을 받는지 여부는 상관 없습니다. 명명 된 레지스터에 작은 삭제를 저장하기 위해 동작을 변경하도록 제안해도 도움이되지는 않습니다. 이것이 현재하고있는 일입니다.

답변:


10

이 때 나이 빔 7.3 버전에서 작업하는 데 사용 :set clipboard=unnamed합니다 ( 이 레딧 토론 버그의 결과로, 나는 여기에보고했습니다 .

이 스레드에는 'regone'옵션 을 소개하는 Aryeh Leib Taurog의 패치가 포함되어 있습니다. 이것은 (과도하게) 할 일 목록에 포함되었지만, 곧 통합되지는 않을 것입니다. 따라서 현재는 오래된 Vim으로 다운 그레이드하거나 해당 패치로 Vim을 직접 빌드 할 수있는 옵션 만 있습니다 ( vim_dev 메일 링리스트 에서 채택하도록 푸시 ).


1
흥미 롭습니다! (특히 임계 값에 대한 아이디어) 정보를 주셔서 감사합니다. Gonna는 누군가가 중간에 이것을하기 위해 미친 VimScript를 생각해 내도록 한동안 공감 / 수락을 보류합니다.
Rich

5

d모션 및 비주얼 모드로 명령에 작동하는 개념 증명 솔루션이 있습니다. 그것은 (예를 들어, 아직 완전히 강력한 해결책이 아니다 없습니다 d[count]d일을하지 않는 , 그리고 어느 쪽도 않습니다 [count]D)하지만, 매우 거의 모든 내 실제 사용 사례를 설명합니다.

다음과 같은 고객 운영자 기능을 설정하여 작동합니다.

  1. 레지스터 1-8의 내용을 사전에 저장합니다.
  2. 레지스터 1로 삭제를 수행합니다.
  3. 레지스터 2–9를 이전에 저장된 레지스터 1-8의 내용으로 설정합니다.

:help map-operator연산자 기능 작동 방식에 대한 설명을 참조하십시오 .

function! ShiftingDeleteOperator(type)
  let reg_dict = {}
  for k in range(1, 8)
    execute printf("let reg_dict[%d]=getreg('%d', 1)", k, k)
  endfor

  if a:type ==# 'v'
    execute 'normal! `<v`>d'
  elseif a:type ==# 'V'
    execute 'normal! `<V`>d'
  elseif a:type ==# "\<C-V>"
    execute "normal! `<\<C-V>`>d"
  elseif a:type ==# 'char'
    execute 'normal! `[v`]d'
  elseif a:type ==# 'line'
    execute "normal! '[V']d"
  else
    return
  endif

  let deleted = getreg('"', 1)
  call setreg(1, deleted)

  for [k, v] in items(reg_dict)
    execute printf("call setreg(%d, v)", k + 1)
  endfor
endfunction

" Call the function for d{motion} via operatorfunc
nnoremap <silent> d :set operatorfunc=ShiftingDeleteOperator<CR>g@
" Call the function when d or x are hit in visual mode
vnoremap d :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
vnoremap x :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
" Use the d{motion} as defined above to add limited support for `D` command
nmap D d$
" Use the standard dd command
nnoremap dd dd 

이전 답변에 대해 언급 해 주셔서 죄송합니다. 나는이 솔루션을 채택을 y하고 c있지만 대한 c나의 nvim이 작업 후 모드 삽입 입력하지 않습니다 ... 현재 내가가가 execute lstartinsert(같은 적절한 수정하지 않은 c$잘못된 위치에 커서를 둘 것입니다). 어떤 아이디어?
Sunny Pun

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.