2010-03-31 10 views
16

클립 보드에서 항목을 붙여 넣을 때 일반적으로 (항상) 여러 줄로 표시됩니다.이 경우 (및 해당 경우에만) :set paste이 트리거되기를 바랍니다. 그렇지 않으면 각 줄마다 탭이 증가합니다 (모두 보셨습니다!).클립 보드에서 붙여 넣기 및 자동 토글 : 붙여 넣기 설정

:set paste의 문제점은 set smartindent과 잘 동작하지 않기 때문에 커서가 올바른 들여 쓰기가 아닌 새 줄의 시작으로 이동하게됩니다. 그래서 나는이 인스턴스에만 사용할 수있게하려고합니다.

저는 Mac을 사용하고 있습니다. vim을 사용하는 데비안 시스템으로 ssh하고 cmd-v를 사용하여 삽입 모드로 붙여 넣습니다.

건배.

+1

이 질문을 마이그레이션 할 이유가 없다고 생각합니다. vim 질문이 SO에 속하는 것으로 받아 들여질뿐만 아니라 (http://meta.stackexchange.com/questions/25925/vim-questions-so-or-su), 프로그래머의 텍스트 편집기에 관한 질문으로, 프로그래밍 할 때 공통적 인 작업을 수행하는 데 사용됩니다. – Cascabel

+1

@ Jefromi : 어떤 형태로든 텍스트 편집을 할 때 붙여 넣기가 일반적이지만 직접 관련된 프로그래밍이 아닌 경우에도 Vim/Emacs의 질문이 받아 들여질 수 있다고 인정할 것입니다. @Jonatan :''smartindent ''를 사용하지 말 것을 강력히 권합니다. 이유에 대한 설명은 http://vim.wikia.com/wiki/Restoring_indent_after_typing_hash#Using_filetype_indentation을 참조하십시오. – jamessan

+0

@jamessan : 요점은이 특정 서식 지정 문제를 붙여 넣는 것이 매우 일반적인 프로그래밍 작업이라는 것입니다. 다른 곳에서는 들여 쓰기가있는 텍스트 블록을 줄 간격으로 붙여 넣기하지 않습니다. – Cascabel

답변

7

저는 Mac을 사용하지 않지만 바로 여기에 접두사가 있다고 생각합니다 : <D-v>은 cmd-v를 의미해야합니다. 삽입 모드의 경우 :

:imap <D-v> ^O:set paste<Enter>^R+^O:set nopaste<Enter> 

또는 정말, 그냥 이렇게 :

:imap <D-V> ^O"+p 

^O 및^R 당신이^V로 입력 할 수있는 문자 제어-O 및 제어-R입니다^O (control-v control-o) 및^V^R (control-v control-r)을 사용합니다. 삽입 모드의 Control-O를 사용하면 하나의 명령을 실행 한 다음 삽입 모드로 돌아갈 수 있습니다. 여기에서 클립 보드 등록에서 가져올 수 있습니다.

다른 키에 매핑 된 키를 테스트했을 때 유용했기 때문에 모두 설정해야합니다.

삽입 모드가 아닌 경우 아무것도 매핑 할 필요가 없습니다. "+p을 사용해도됩니다.

+0

''+ p' ...에 대해서는 운영체제에 따라''* p' '로 변경해야 할 수도 있습니다. 내 컴퓨터 (osx)에서는 두 번째 버전을 사용해야했습니다. – agbodike

1

필요하면 'paste' 만 사용하도록 설정해야합니다. 들여 쓰기에 영향을 미치는 것 이상을 수행합니다. documentation에서 영향을 미치는 모든 것을 읽을 수 있습니다. 'paste'의 사용을 쉽게하는 데 유용한 관련 옵션은 'pastetoggle'입니다.

X- 전달 및 마우스 동작을 제대로 전달할 수있는 터미널을 사용하는 경우 'mouse' 옵션을 이용할 수도 있습니다. :set mouse=a으로, Vim은 마우스가 무엇을하고 있는지 알게되고 마우스 버튼을 중간 클릭하여 여러 줄 붙여 넣기를하면 자동 들여 쓰기를 수행하지 않습니다.

마우스 기능이 없어도 Vim은 클립 보드 나 선택 레지스터 ("+ 및)에서 수동으로 붙여 넣을 때 동일한 작업을 수행하기 때문에 X- 전달이 도움이 될 수 있습니다.

+0

감사합니다. X-forwarding 및 마우스를 가져 오는 데 도움을 요청했는데 작동하지 않으려면 어떻게해야합니까 (http://superuser.com/questions/98350/vim-and-mouse-with-ssh-from-mac-to-linux). 그러나 결코 해결되지 않았다. 나는 pastetoggle을 들여다보고 해결할 것이다. Vim의 문서 (및 기능 세트)는 정말 거대합니다. –

3

나는 나의의 .vimrc에 다음과 같습니다

inoremap <S-Insert> <ESC>:setl paste<CR>gi<C-R>+<ESC>:setl nopaste<CR>gi 

gi는 삽입 모드는 현재 버퍼에 마지막으로 중단 된 곳과 같은 위치에 삽입 모드를 시작하는 것입니다.

UPD는 :

Jefromi은 더 나은 솔루션을 기록했다. 나는 조금 땜질했다.

inoremap <S-Insert> <ESC>"+p`]a 

그것은 클립 보드 텍스트를 삽입하고 바로 뒤에 커서를 놓는다.

+0

좋습니다,하지만 Shift-Insert에서만 작동합니다. 맞습니까? 내가 실수하지 않는다면 그것은 내 Mac에서 작동하지 않을 것입니다. –

+0

원하는대로 쉽게 매핑 할 수 있습니다. 예 : . –

+0

@ Jonatan Littke : 제 답변은이를 이것을 명령 -v에 매핑하는 방법과 그것을보다 효율적으로 수행하는 방법을 보여줍니다. – Cascabel

0

이것은 vim 스크립트로 해결할 수 있습니다. (나는 vim 스크립팅이 싫기 때문에 직접 해결하도록하는 것이 훨씬 더 심각한 영향을 주어야한다.) 기본값은 iTerm2's "paste slowly" mode 일지라도, 기본값은 16 바이트 덩어리로 붙여 넣을 데이터를 끊고 0.125 초마다 하나씩 보내는 것이다. . 따라서 16 바이트짜리 "키 입력"을 프로그래밍 방식으로 감지하고 그에 대한 작업을 수행 할 수 있어야합니다.

if too_fast_too_be_human(): 
    set('pastemode', True) 
else 
    set('pastemode', False) 

# where either 
def too_fast_too_be_human 
    char_threshold = 16 
    return len(input_buffer) > char_threshold 

# or 
def too_fast_too_be_human 
    static byte_times = [] 
    char_threshold = 16 
    time_threshold = 0.125 
    byte_times.append(now()) 
    while(len(byte_times) > char_threshold): 
     byte_times.unshift() 
    return (byte_times[-1] - byte_times[0]) < time_threshold 

그에게 약점이있다, 그러나 대부분의 경우에 작동합니다 : 같을 것이다 의사에

.