etc./StackOverFlow

vim에 텍스트를 붙여넣을 때 자동 들여쓰기 끄기

청렴결백한 만능 재주꾼 2023. 4. 13. 10:23
반응형

질문자 :Rimian


Vim을 배우기 위해 노력하고 있습니다.

클립보드에서 내 문서에 코드를 붙여넣을 때 각 새 줄의 시작 부분에 추가 공백이 생깁니다.

 line line line

자동 들여쓰기를 끌 수 있다는 것을 알고 있지만 다른 설정이 충돌하거나 다른 설정이 있기 때문에 작동하지 않습니다(내 .vimrc에서 꽤 분명해 보이지만 꺼낼 때 중요하지 않은 것 같습니다).

코드를 붙여넣을 때 자동 들여쓰기를 끄려면 어떻게 하면 코드를 작성할 때 vim 자동 들여쓰기가 계속 유지됩니까? 여기 내 .vimrc 파일이 있습니다:

 set expandtab set tabstop=2 set shiftwidth=2 set autoindent set smartindent set bg=dark set nowrap


업데이트: 더 나은 답변: https://stackoverflow.com/a/38258720/62202

코드를 붙여넣을 때 자동 들여쓰기를 끄려면 특별한 "붙여넣기" 모드가 있습니다.

유형

 :set paste

그런 다음 코드를 붙여넣습니다. 이제 툴팁의 텍스트가 -- INSERT (paste) -- 됩니다.

코드를 붙여넣은 후 붙여넣기 모드를 끄면 입력할 때 자동 들여쓰기가 다시 올바르게 작동합니다.

 :set nopaste

그러나 나는 항상 그것이 번거롭다는 것을 알았다. 그래서 텍스트를 편집하는 동안 붙여넣기 모드와 붙여넣기 모드 <F3> .vimrc 추가합니다.

 set pastetoggle=<F3>

P Shved

붙여넣는 동안 원치 않는 효과를 방지하려면 다음과 같이 설정해야 하는 옵션이 있습니다.

 set paste

.vimrc에 포함할 수 있는 유용한 명령은 set pastetoggle=<F10> 또는 다른 버튼으로 설정하여 붙여넣기와 붙여넣기를 쉽게 전환할 수 있습니다.


Jacob Rask

나는 보통 사용합니다 :r! cat 그런 다음 내용을 붙여넣고 ( shift + insert ) CTRL+D .

활성화 및 비활성화할 필요가 없으며 직접 사용합니다.


thegeek

로컬에서 작업하는 경우 키 시퀀스를 사용하여 시스템 클립보드에서 붙여넣을 수 있습니다.

"+p

이것은 적절한 vim 명령이므로 삽입 모드로 들어가거나 먼저 자동 들여쓰기를 끄는 것에 대해 걱정할 필요가 없습니다.

물론 원격으로 작업하는 경우(예: SSH를 통한 콘솔) 이 방법은 작동하지 않으며 :set noai , 삽입 모드, 콘솔에 붙여넣기, insertmode 남겨두기, :set ai 경로로 이동해야 합니다.


thomasrutter

paste/nopaste/pastetoggle 로 붙여넣기 모드를 설정하는 것은 완벽하지만 붙여넣기 전에 수동으로 붙여넣기 모드를 활성화하고 붙여넣기 후에 붙여넣기 모드를 비활성화해야 합니다. 내가 게으른 사람이기 때문에 아래는 내가 지금까지 찾은 최고의 솔루션으로, 붙여넣을 때 자동으로 붙여넣기 모드를 전환합니다.

다음은 터미널의 대괄호 붙여넣기 모드를 사용하여 붙여넣을 때 Vim의 붙여넣기 모드를 자동으로 설정/해제하는 약간의 트릭입니다. .vimrc에 다음을 입력하십시오.

 let &t_SI .= "\<Esc>[?2004h" let &t_EI .= "\<Esc>[?2004l" inoremap <special> <expr> <Esc>[200~ XTermPasteBegin() function! XTermPasteBegin() set pastetoggle=<Esc>[201~ set paste return "" endfunction

이제 명시적으로 붙여넣기 모드를 켜고/끄지 않고도 붙여넣을 수 있습니다. 자동으로 처리됩니다.

출처: 코더월

참고: 이 솔루션은 WSL(Linux용 Windows 10 하위 시스템)에서 작동하지 않습니다. WSL에 대한 솔루션이 있는 사람이 있으면 이 답변을 업데이트하거나 의견에 추가하십시오.

Tmux tmux를 사용하는 경우 선언을 이중 이스케이프해야 합니다. 이에 대한 코드는 Coderwall에도 있습니다.


thdoan

Mac 사용자는 다음을 사용하여 대지에서 직접 읽어 자동 서식을 방지할 수 있습니다.

 :r !pbpaste

maniacalrobot

다음은 붙여넣기 이벤트를 다시 매핑하여 자동으로 붙여넣기 모드를 켰다가 다시 끄는 방법을 알아낸 사람의 게시물입니다. MacOSX의 tmux/iTerm에서 작동합니다.


Von

~/.vimrc 추가하면 붙여넣기 전후에 F2 만 누르면 됩니다.

 set pastetoggle=<F2>

anh_ng8

방금 .vimrc set clipboard=unnamed 를 넣었습니다. 그러면 기본 붙여넣기 버퍼가 X의 클립보드에 매핑됩니다.

따라서 터미널에서 약간의 텍스트를 표시하면 p 를 눌러 vim에 붙여넣을 수 있습니다. 마찬가지로 vim에서 물건을 잡아당길 수 있고(예: YY ) 아무 창에서나 마우스 가운데 버튼을 클릭하여 붙여넣을 수 있습니다.

모르겠어요. 나는 그것이 매우 편리하다고 생각합니다.


Soren

터미널 내부에서 작업할 때 vim-bracketed-paste vim 플러그인은 붙여넣기 전후에 키 입력 없이 자동으로 붙여넣기를 처리합니다.

iTerm2, gnome-terminal 및 libvte를 사용하는 기타 터미널과 같은 "현대적인" x-term 호환 터미널에서 보낸 이스케이프 시퀀스인 대괄호 붙여넣기 모드 를 감지하여 작동합니다. 추가 보너스로 tmux 세션에서도 작동합니다. Linux 서버에 연결하고 tmux를 사용하는 Mac에서 iTerm2와 함께 성공적으로 사용하고 있습니다.


studgeek

이것을 ~/.vimrc에 붙이고 행복하세요:

 " enables :Paste to just do what you want command Paste execute 'set noai | insert | set ai'

편집: 리플렉션에서 :r !cat 은 짧고 의미가 있으며 사용자 지정 vimrc가 필요하지 않기 때문에 훨씬 더 나은 접근 방식입니다. 대신 사용하십시오!


Dergachev

:pastetoggle 또는 :paste:nopaste 가 제대로 작동해야 하지만(구현된 경우 - 토론에서 볼 수 있는 것처럼 항상 그런 것은 아닙니다) 직접 접근 방식 "+p 또는 "*p "+r 읽는 것을 적극 권장합니다. 또는 "*r :

Vim은 10가지 유형의 레지스터( :help registers )에 quotestar 있으며 질문자는 섹션의 quoteplus

  1. 선택 및 드롭 레지스터 "* , "+ 및 "~

GUI에 대해 선택한 텍스트를 저장하고 검색하는 데 이 레지스터를 사용합니다. quotestarquoteplus 참조하십시오. 클립보드를 사용할 수 없거나 작동하지 않으면 이름이 지정되지 않은 레지스터가 대신 사용됩니다. Unix 시스템의 경우 클립보드는 +xterm_clipboard 기능이 있는 경우에만 사용할 수 있습니다. {바이에 없음}

X11 시스템의 경우 "*와 "+만 구별됩니다.

:help x11-selection *+ 의 차이점을 더욱 명확하게 합니다.

 quoteplus quote+

PRIMARY(Vim의 Visual 모드에서와 같이 현재 시각적 선택을 나타낼 것으로 예상됨), SECONDARY(잘못 정의됨) 및 CLIPBOARD(잘라내기, 복사 및 붙여넣기 작업에 사용될 것으로 예상됨)의 세 가지 문서화된 X 선택이 있습니다. ).

이 세 가지 중에서 Vim은 "* 레지스터를 읽고 쓸 때 PRIMARY를 사용하고(따라서 X11 선택을 사용할 수 있는 경우 Vim은 "autoselect"의 '클립보드'에 대한 기본값을 설정함) "+ 레지스터를 읽고 쓸 때 CLIPBOARD를 사용합니다. Vim은 SECONDARY 선택 항목에 액세스하지 않습니다.

예: (기본 옵션 값으로 가정)

  • Vim의 Visual 모드에서 URL을 선택하십시오. 브라우저로 이동하여 URL 텍스트 필드에서 마우스 가운데 버튼을 클릭합니다. 선택한 텍스트가 삽입됩니다. 참고: Firefox에서는 about:config에서 middlemouse.contentLoadURL 기본 설정을 true로 설정할 수 있습니다. 그러면 창의 대부분의 위치에서 가운데 마우스 버튼을 누를 때 선택한 URL이 사용됩니다.

  • 마우스로 드래그하여 브라우저에서 일부 텍스트를 선택하십시오. Vim으로 이동하여 마우스 가운데 버튼을 누릅니다. 선택한 텍스트가 삽입됩니다.

  • Vim에서 일부 텍스트를 선택하고 "+y"를 수행합니다. 브라우저로 이동하여 마우스로 드래그하여 텍스트 필드의 일부 텍스트를 선택합니다. 이제 마우스 오른쪽 버튼을 사용하고 팝업 메뉴에서 "붙여넣기"를 선택합니다. 선택한 텍스트는 다음으로 덮어씁니다. Vim의 텍스트. "+ 레지스터의 텍스트는 시각적 선택을 할 때 계속 사용할 수 있으므로 "* 레지스터에서 다른 텍스트를 사용할 수 있습니다. 그러면 선택한 텍스트를 덮어쓸 수 있습니다.

codingdave

붙여넣는 또 다른 방법 <Cr> 을 통해 레지스터(여기서는 전역 레지스터)의 내용을 삭제하는 것입니다. 참조: :h i_ctrl-rh i_CTRL-R_CTRL-O .

vim 도움말 문서에서:

레지스터의 내용을 문자 그대로 삽입하고 자동 들여쓰기를 하지 마십시오. 마우스로 붙여넣기와 동일합니다. 문자를 대체하지 않습니다! NS '.' 레지스터(마지막으로 삽입된 텍스트)는 여전히 입력한 대로 삽입됩니다.{Vi에서는 아님}

따라서 자동 들여쓰기 없이 vim에 내용을 붙여넣으려면 대부분의 유닉스 시스템에서 <Cr><Co>*

inoremap <Cr> <Cr><Co> 매핑을 추가 <Cr>* 을 사용하여 자동 들여쓰기 없이 정상적으로 * 레지스터의 내용을 붙여넣을 수 있습니다.

clipboard 로 컴파일된 경우에만 작동합니다.


TheChetan

이것은 나를 위해 작동합니다 ( + 레지스터의 경우, 내가 aps 간의 교환 버퍼와 같이 사용하는 것):

 imap <silent> <S-Insert> <CO>:set noai<CR><CR>+<CO>:set ai<CR>

Sergey Vakulenko

vim에서: ]p

외부에서: "*]p 또는 "+]p


Bruno

Mac을 사용하는 경우 macvim은 붙여넣기를 토글하지 않고도 잘 처리하는 것 같습니다.

양조 설치 macvim --override-system-vim


Marcus Ericsson

지금까지 보지 못한 또 다른 답변:

 :se paste noai

sjas

저는 때때로 Vim에 복사하여 붙여넣는 Python 사용자입니다. (저는 Mac에서 Windows WSL로 전환했습니다) 이것은 저를 괴롭히는 결함 중 하나였습니다.

script.py 를 터치한 다음 vi script.py 를 터치하면 Vi는 이것이 Python 스크립트임을 감지하고 도움이 되도록 자동 들여쓰기, 추가 들여쓰기로 붙여넣기 등을 시도합니다. 이를 알리지 않으면 발생하지 않습니다. 파이썬 스크립트.

그러나 이미 그런 일이 발생하고 있다면 이미 완전히 들여쓴 코드를 붙여넣을 때 기본 자동 들여쓰기가 악몽이 될 수 있습니다(아래의 기울어진 사다리 모양 참조).

세 가지 옵션을 시도했고 결과는 다음과 같습니다.

 set paste # works perfect set noai # still introduced extra whitespace set noautoindent # still introduced extra whitespace

여기에 이미지 설명 입력 여기에 이미지 설명 입력


B.Mr.W.

이 문서를 읽으십시오: 코드 붙여넣기를 위한 자동 들여쓰기 전환

vimrc 에 대한 다음 대안으로 상태 표시줄에 표시되는 시각적 피드백을 좋아합니다.

 nnoremap <F2> :set invpaste paste?<CR> set pastetoggle=<F2> set showmode

d.danailov

나는 빨리 원샷 붙여 넣기위한 모드 삽입 붙여 넣기로 이동합니다 알고 있어요 가장 빠른 방법은 tpope의 인 손상되지 않은 기능, yoyO "열려"에 대한, 아마도 니모닉. 다음과 같이 vimdoc에만 문서화되어 있습니다.

'붙여넣기'에 대한 토글은 제공되지 않았습니다. 왜냐하면 단독 삽입을 래핑하는 일반적인 사용 사례가 너무 낭비이기 때문입니다. 두 번 토글하지만 한 번만 붙여넣습니다(YOPO). 대신 '붙여넣기'가 이미 설정된 상태에서 o 또는 O를 호출하려면 yo 또는 yO를 누르십시오. 삽입 모드를 종료하면 'nopaste'가 자동으로 설정됩니다.


Micah Elliott

기본 붙여넣기/괄호로 묶은 붙여넣기는 vim 8 (2016년 출시) 이후로 가장 간단하고 좋은 방법입니다. ssh에서도 작동합니다! (대괄호 붙여넣기는 Linux 및 Mac에서 작동하지만 Windows Git Bash에서는 작동하지 않음)

  1. vim 8 이상이 있는지 확인하십시오( +clipboard 또는 +xterm_clipboard 옵션이 필요하지 않음).

    vim --version | head -1

  2. 일반 모드에서 OS 기본 붙여넣기 명령(예: ctrl+shift+V 또는 cmd+V )을 사용하기만 하면 됩니다. 삽입 모드에서 i 를 누르지 마십시오.


시험

  1. 이 출력(탭 들여쓰기가 있는 2줄)을 시스템 클립보드에 복사( ctrl+shift+C 또는 cmd+C

    echo -e '\ta\n\tb'

  2. 자동 들여쓰기를 사용하여 깨끗한 vim 8+ 시작:

    vim -u NONE --noplugin -c 'set autoindent'

  3. 일반 모드에서 시스템 클립보드( ctrl+shift+V 또는 cmd+V 삽입 모드에서 i 를 누르지 마십시오. 및 a b 단일 탭 덴트와 정렬되어야한다. 원격 시스템에 ssh-ing하는 동안에도 이 작업을 수행할 수 있습니다(원격 시스템에는 vim 8 이상이 필요함).

  4. 이제 추가 탭이 있는 두 번째 줄을 자동 들여쓰는 이전 방식을 시도합니다. 삽입 모드에서 i ctrl+shift+V 또는 cmd+V 사용하여 붙여넣습니다. 와 a b 이제 잘못 정렬되어 있습니다.


빔 8 설치


wisbucky

이 문제는 이미 답변되었지만 내 솔루션을 추가할 수도 있습니다.

모든 파일 유형에 대해 시스템적으로 자동 들여쓰기를 비활성화하려는 경우(기본적으로 자동 들여쓰기 기능을 완전히 비활성화) 다음을 수행할 수 있습니다.

  1. indent.vim 파일 백업:
    sudo mv /usr/share/vim/vim81/indent.vim /usr/share/vim/vim81/indent.vim.orig
  2. indent.vim 파일을 새로 만듭니다.
    sudo touch /usr/share/vim/vim81/indent.vim

Gael

슬프게도 iTerm2 3.0.15에서 작동하지 않는 것으로 언급된 vim 플러그인을 찾았습니다.

명령-p를 매핑하여 붙여넣고 iTerm2 vim 키를 사용합니다. 분명히 이것은 iTerm2에서만 작동합니다.

작동 원리 나는 "jk"를 사용하여 탈출 모드로 들어가므로 다음이 필요합니다.

:inoremap jk

.vimrc에서.

그런 다음 P를 호출하여 붙여넣기 모드로 들어가고, "+p를 눌러 클립보드에서 붙여넣고 P를 호출하여 붙여넣기 모드를 비활성화합니다. hth.

여기에 이미지 설명 입력


Neil McGill

다음 vim 플러그인은 "Bracketed Paste" 모드를 통해 자동으로 처리합니다. https://github.com/wincent/terminus

"Bracketed Paste" 모드를 설정합니다. 즉, '붙여넣기' 옵션을 수동으로 설정하는 것을 잊고 아무 모드에서나 붙여넣기만 하면 됩니다.


thiagowfx

출처 : http:www.stackoverflow.com/questions/2514445/turning-off-auto-indent-when-pasting-text-into-vim

반응형