붙여 넣기 옵션을 설정하지만 한 번만 삽입하십시오.


16

Vim 'paste'옵션 을 설정하고 텍스트를 삽입하고 이전 값으로 되 돌리는 빠른 방법을 원합니다 'paste'.

일반적인 유스 케이스는 자동 들여 쓰기와 같이 활성화 될 수있는 삽입 모드 다시 쓰기와 상관없이 Vim 상태를 변경하지 않고 OS 클립 보드 컨텐츠를 문자 그대로 삽입합니다. 또 다른 유스 케이스는 OS 매크로 기능이 키 입력을 Vim에 삽입하고 리터럴 텍스트로 해석하도록하는 것입니다.

이것은 분명히 다른 옵션으로 일반화됩니다. 일반적인 아이디어는 일부 옵션을 설정하는 것이지만 삽입 모드를 통해 한 번의 트립 기간 동안 만 사용하는 것입니다.

기본적으로 키 시퀀스 (예 _i:)를이를 수행하는 매크로 에 바인딩하고 싶습니다.

:set paste
i…<Esc>
:set nopaste

여기서 i…<Esc>나는 i명령 으로 삽입 모드로 전환하고 명령 모드로 돌아갈 때 매크로를 다시 시작합니다. 단, 'paste'미리 활성화 된 경우 여전히 활성 상태 로 끝내고 싶습니다 . 어떻게해야합니까?

참고 : OS 클립 보드의 내용은 "*register에 매핑됩니다 . 작동하면 'paste'옵션이별로 유용하지 않습니다. 이 질문에 대한 동기 부여 시나리오는 "*레지스터 지원 조건 이 충족되지 않는 시간에 대한 것입니다. Vim이 +xterm_clipboard기능으로 컴파일되지 않았 거나 Screen과 같은 터미널에서 실행되거나 주변 X 서버와 분리되는 SSH를 통해 실행되는 경우입니다.


1
나는 당신의 질문을 좋아합니다. 그러나 +또는 *등록 에서 붙여 넣기가 쉽지 않습니까?
yo '

@yo ' 그들이 일할 때만 . Vim을 사용하는 경우에는 종종 그렇지 않습니다.
Gilles 'SO- 악마 그만해'

답변:


15

이것을 시도하십시오 :

function! Paste_Func()
    let s:inPaste = &paste
    if !s:inPaste
        set paste
    endif

    echom s:inPaste
    augroup paste_callback
        autocmd!
        autocmd InsertLeave <buffer> call Paste_End()
    augroup END

    startinsert
endfunction

function! Paste_End()
    augroup paste_callback
        autocmd!
    augroup END
    augroup! paste_callback

    if !s:inPaste
        set nopaste
    endif
endfunction

map _i :call Paste_Func()<cr>

현재 붙여 넣기 상태를 inPaste 변수에 저장하고 아직 설정하지 않은 경우 붙여 넣기를 설정합니다. 그런 다음 삽입 모드를 떠날 때 자동 실행을 설정 한 다음 삽입 모드로 전환합니다.

삽입 모드를 종료하면 autocmd가 실행되어 먼저 autocmd가 제거되며 (따라서 다른 방법으로 삽입 모드를 떠날 때 실행되지 않음) 마지막으로 붙여 넣기 모드가 아닌 경우에는 붙여 넣기를 설정하지 않습니다.

또한 터미널에서 vim 을 사용하는 경우 vim-bracketed-paste를 살펴보십시오. vim-bracketed-paste 는 여러 터미널 에뮬레이터에서 제공 하는 브래킷 붙여 넣기 모드 기능 을 사용하여 붙여 넣기 여부를 감지하고 자동으로 모드를 설정합니다.

편집 : 스크립트 수정


이것은 올바른 궤도에있는 것 같습니다 (특히, 일반적인 월드 커맨드로 삽입을 확장하는 방법을 전혀 몰랐습니다). 감사. 그러나 그것은 옳지 않으며 문제가 어디에 있는지 알지 못합니다 : after _i, paste옵션은 이전에 켜져 있어도 꺼져 있습니다.
Gilles 'SO- 악마 그만해'

당신이 맞아요! 나는 그것을 테스트했다고 확신하지만, 뭔가를 바꿔야합니다. 게시물에서 스크립트를 업데이트했습니다. 지금 작동하는지 확인하십시오.
차드

4

'paste'미리 활성화 된 경우 여전히 활성 상태 로 끝내고 싶습니다 .

'paste'가능한 짧은 시간 동안 활성화해야합니다. 붙여 넣는 텍스트를 잘못 해석하는 것을 피하는 것이 유일한 목적이기 때문에 많은 기능 (지도 포함)을 비활성화합니다. 따라서 인용 된 요구 사항이 실제로 필요하지 않아야한다고 생각합니다.

즉, 설정하지 않아도 붙여 넣기가 실제로 쉽습니다 'paste'. gvim을 실행 중이거나 +xterm_clipboard콘솔 vim에 "+p있는 경우 OS 클립 보드에서 붙여 넣기 만하면됩니다 .

붙여 넣기 중 자동 들여 쓰기 문제는 실제로 두 가지 시나리오에서만 발생합니다. 삽입 모드 ( <C-r>+) 또는 마우스로 가운데 클릭 붙여 넣기 중에 레지스터 내용 삽입

삽입 모드에서 레지스터의 내용을 삽입하는 대신 일반 모드에서 레지스터에서 붙여 넣기하면 형식 재 지정 문제를 피할 수 있습니다.

마우스로 붙여 넣기를 마우스 가운데 클릭 'mouse'하려면 터미널 대신 Vim이 가운데 클릭을 처리 하도록하는 옵션을 사용 하십시오. 그런 다음 Vim은 들어오는 텍스트를 입력 된 것으로 해석하지 않고 그대로 내용을 삽입합니다.


2
이 중 어느 것도 내 질문에 대답하지 않습니다. 이유를 명시 적으로 요구합니다! 일반적 'paste'으로 실제로 사전에 활성화되어 있지 않지만 이에 대해 생각하고 싶지는 않습니다. Vim 빌드에 xterm_clipboard기능 이 없기 때문에 또는 X 클립 보드 나 마우스에 액세스 할 수없는 Vim에서 종종 작업 합니다. X 터미널.
Gilles 'SO- 악마 그만해'

@Gilles 그렇다면 붙여 넣는 방법을 설명해 주시겠습니까? 그것은 당신이하고 싶은 일로 그 행동을 감쌀 수있는 답변을 제공 할 수있는 관련 정보입니다.
jamessan

1
기본 사용 사례는 마우스 가운데 버튼 또는 Shift + 삽입으로 붙여 넣는 것입니다. 그러나 실제로는 관련이 없습니다. 질문의 핵심은 옵션을 설정하는 방법, 삽입 모드로 전환하는 방법 (와 함께 i매개 변수를 지정하는 방법을 묻지 않음) 및 삽입 모드에서 돌아올 때 옵션 값을 복원하는 방법입니다.
Gilles 'SO- 악마 그만해'

1
@Gilles이 의견에 언급 된 귀하의 질문의 핵심은 귀하의 원래 질문보다 훨씬 명확합니다. 감사.
jamessan

1
@Gilles 귀하 와 관련이 없지만 향후 방문자와 관련이있을 수 있습니다. 따라서 질문 자체에 넣을 수 있습니다 ( " 클립 보드에서 사용 "*p하거나 "+p붙여 넣기를 할 수 있지만 시스템의 붙여 넣기 기능을 사용하고 싶지 않습니다"). 그러면이 답변이 필요하지 않습니다. 또는 당신은하지 않으며, 나는이 대답이 여기에 있다고 생각합니다.
yo '

4

개인적으로, 나는 yoTim Pope의 뛰어난 vim-unimpaired 플러그인 의 키 바인딩 을 정확하게 사용합니다. 그의 문서에서 :

독창적 인 삽입을 감싸는 일반적인 사용 사례가 너무 낭비이기 때문에 '붙여 넣기'에 대한 토글이 제공되지 않았습니다. 두 번 토글하지만 한 번만 붙여 넣습니다 (YOPO). 대신 눌러 yo또는 yO호출 |o|또는 |O|으로 이미 설정 '붙여 넣기'. 삽입 모드를 나가면 '노스페이스 트'가 자동으로 설정됩니다.

귀하의 질문에 단순히 플러그인을 설치하는 것은 과잉 일 수 있지만, 다른 유용한 키 바인딩도 많이 제공 합니다 (README대한 자세한 정보 ).


1

Linux 또는 Mac에서 Vim 8+를 사용하면 터미널의 기본 붙여 넣기 (예 : 마우스 가운데 버튼, ctrl+shift+Vcmd+V 괄호 붙여 넣기를 지원하는 경우 Mac의 경우 Gnome의 를 . i삽입 모드 를 위해 누르지 마십시오 .

자동 들여 쓰기를 추가하지 않고 공백과 탭을 유지하면서 OS 클립 보드의 내용을 붙여 넣습니다. 그것은 이전에 해당하는이야 :set paste, i,ctrl+shift+V , esc, :set nopaste방법.

당신도 필요하지 않습니다 +clipboard또는 +xterm_clipboard정력은 더 이상 설치되어 있습니다. 이 기능을 "브래킷 붙여 넣기"라고합니다. 자세한 내용은 /programming/2514445/turning-off-auto-indent-when-pasting-text-into-vim/56781763#56781763을 참조 하십시오.

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