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


1186

Vim을 배우려고 노력하고 있습니다.

클립 보드에서 문서에 코드를 붙여 넣을 때, 새로운 줄이 시작될 때마다 공백이 생깁니다.

line
  line
    line

자동 들여 쓰기를 끌 수는 있지만 다른 설정과 충돌하거나 무언가가 있기 때문에 작동하지 않을 수 있음을 알고 있습니다 (.vimrc에서는 꽤 분명해 보이지만 제거 할 때는 중요하지 않습니다).

코드를 붙여 넣을 때 자동 들여 쓰기를 끄려면 코드를 작성할 때 vim 자동 들여 쓰기가 어떻게됩니까? 내 .vimrc파일 은 다음과 같습니다 .

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

4
FWIW, vim 8.0.210 은 대괄호 붙여 넣기에 대한 기본 지원을 추가하므로 붙여 넣은 텍스트가 들여 쓰기되지 않습니다.
sh1

정력의 페이스트 바이올린을 켜는 것을 방지하기 위해 새로운 파일을 / 당신이 할 수있는 nopaste cat > mynewfile.txt를 눌러 입력 , 텍스트를 붙여 넣기를 눌러 입력 을 다시하고 클릭률 + D 저장합니다. 이제 파일이 작성되었으며을 사용하여 파일을 편집 할 수 있습니다 vim mynewfile.txt.
ccpizza

답변:


2065

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

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

유형

:set paste

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

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

:set nopaste

그러나 나는 항상 성가신 것을 발견했습니다. 텍스트를 편집하는 동안<F3> 붙여 넣기 모드와 붙여 넣기 모드 사이를 전환 할 수 있도록 매핑하는 이유입니다 ! 나는 이것을 추가.vimrc

set pastetoggle=<F3>

38
:set noai뒤에 오는 것보다 쉽지 않습니다 :set ai. 제안 :r! cat이 더 짧습니다.
Leopd

68
set paste확실히 더 쉽다고 생각 합니다. 그것은 훨씬 더 의미보다 noai, 심지어 noautoindent"붙여 넣기"당신은 터치 타이피스트 등 실력 부족이있을 때 동일한 시간 미미한 정도 걸릴 "noai"를 입력 때 더 중요하다.
Victor Zamanian

52
:set noai다른 들여 쓰기 관련 설정이 OP에 따라 구성되는 방식에 따라 항상 작동하지는 않습니다. :set paste한 번에 여러 설정의 약어 인 것 같습니다.
MarkHu

13
파티에 늦었지만 set copyindent이를 완벽하게 처리합니다.
매트 라이언

33
:set paste중괄호 완성과 같은 다른 기능도 비활성화합니다. 코드 붙여 넣기에는 원하지 않습니다.
Manuel Faux

263

붙여 넣을 때 원하지 않는 효과를 피하려면 다음과 같은 옵션을 설정해야합니다.

set paste

.vimrc에 유용한 명령 set pastetoggle=<F10>은 붙여 넣기와 붙여 넣기 사이를 쉽게 전환 할 수있는 다른 버튼이나 다른 버튼입니다.


13
드디어! 나는 : set paste / : set nopaste를 입력하는 것이 얼마나 어리석은가! 고마워.
imwilsonxu

4
실용적인 관점에서, 귀하의 답변은 허용 된 답변보다 더 유용합니다
Lynob

8
또 다른 옵션은 vimrc에 매크로를 추가하는 것입니다.nmap <silent> <leader>p :set paste<CR>"*p:set nopaste<CR>
Chris

멋진 제안 @Chris-들여 쓰기 문제없이 붙여 넣을 단일 키 시퀀스!
RichVel

붙여 넣기 모드를 사용하지 않으려면 어떻게해야합니까? 영구적으로 비활성화하는 방법이 있습니까?
maxwell

132

나는 보통 사용 :r! cat후 붙여 넣기 ( shift + insert )컨텐츠를하고 CTRL+D.

직접 사용을 활성화 및 비활성화 할 필요가 없습니다.


이 직접 사용 옵션이 마음에 듭니다. 그래도 여전히 웹 페이지에서 vim 구문을 읽는 방법을 배우고 있습니다. 당신의 단계는 무엇을 의미합니까? 특히, 시스템 클립 보드에 무언가가 있다고 가정하면 vim의 문서에 붙여 넣기 위해 무엇을 눌러야합니까?
jvriesem

9
이 답변은 이유와 :r! cat작동 방식 에 대한 정보를 제공하는 데 도움이됩니다 .
K Erlandsson

11
@KErlandsson :r은 파일의 내용을 현재 문서에 삽입합니다. !cat기본적으로 stdin (* nix shells)을 여는 cat을 실행 (shift + insert)하거나 일부 터미널의 경우 마우스 오른쪽 버튼을 클릭하면 클립 보드의 내용이 터미널 CTRL+D에 파일로 :r !cat붙여져 세션 이 닫힙니다 .
Daniel

이것이 '직접'입니까? paste이 목적으로 만 옵션을 설정하는 것보다 ? @jvriesem이 단어에 대한 당신의 이해가 정확하다고 가정한다면 이것은 '직접적인'옵션이 아닙니다.
0xc0de

:r! cat그런 다음 CTRL+SHIFT+V터미널을 사용 하여 붙여 넣을 수도 있습니다 ( CTRL+D).
Paul Rougieux

86

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

"+p

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

물론 원격으로 작업하는 경우 (예 : SSH를 통한 콘솔) 작동하지 않으며 :set noai, 삽입 모드 로 이동하여 콘솔에 붙여 넣고 삽입 모드를 떠나고 :set ai다른 곳에서 설명한대로 라우팅해야합니다.


10
나는이 대답을 오래 전에 쓴다. 요즘 나는 더 오래 사용하기 때문에 기억하기가 더 쉬우 며 매번 찾아 볼 필요가 없기 때문에 사용 :set paste하고 :set nopaste있습니다!
thomasrutter

6
일부 임베디드 시스템 (주로 busybox 기반) :set paste은 구현되지 않으므로 :set noai대신 사용해야합니다.
jcarballo

큰 텍스트를 복사 할 때 + 레지스터를 사용하는 것이 더 빠르지 않습니까?
pedromanoel

1
@pedromanoel은 로컬에서 작업 할 때만 작동합니다. 예를 들어 로컬로 무언가를 복사하여 SSH 세션에있는 vim에 붙여 넣으려는 경우 SSH를 통해 vim에 액세스 할 수 없습니다.
thomasrutter

1
@thomasrutter 그러나 나는 이것을 <leader>p.. 매우 유용하게 매핑했습니다 !
Dane

51

붙여 넣기 모드를 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 에도 있습니다.


이것은 화려합니다. 그래도 한 가지 ... 모든 페이스트마다 모든 페이스트의 시작 부분에 "0"(영) 문자가 나옵니다. 그에 대한 팁?
Julius Š.

또한 주의 사용하는 경우에 TMUX 당신이 이중 이스케이프 할 필요가 다음. 이에 대한 코드는 Coderwall 링크에 있습니다
Daithí

1
더 코드가 크고 위의 코드를 .vimrc에 붙여 넣는 경우 XTermPasteBegin () 함수의 들여 쓰기를주의하십시오.
k1133

나는 이것이 어떻게 작동하는지 궁금해서, 내가 브라케팅 붙여 넣기를 검색하고 찾을 수 있도록 gitlab.com/gnachman/iterm2/-/wikis/Paste-Bracketing 한다고 설명 t_SIt_EI변수 다단계하고 비활성화 붙여 넣기를 가능하게됩니다. 붙여 넣기 괄호가 켜져 있으면 붙여 넣은 텍스트 앞에 접두사가 붙고 esc[200~그 뒤에옵니다 esc[201~.
PatS

37

Mac 사용자는 다음을 사용하여 보드에서 직접 읽음으로써 자동 서식을 피할 수 있습니다.

:r !pbpaste

3
이것은 굉장한 응답입니다. 그러나이 작업을 수행하면 문서가 숨겨져 있지만 명령 줄로 돌아온 것처럼 보이지만 클립 보드에 텍스트가 있습니다. Enter 키를 누르라는 메시지가 표시되므로 변경하지 않고 문서로 돌아갑니다. 무슨 일이 있었는지 어떻게 말합니까?
jvriesem

방금 입력 :.!pbpaste하면 현재 행을 붙여 넣기 버퍼의 출력으로 바꿔야합니다. 일반적으로 vim을 사용하면 현재 파일에있는 데이터를 다른 프로그램으로 파이프하고 명령의 출력으로 텍스트를 바꿀 수 있습니다. 따라서 :1,3!pbpaste파일의 처음 세 줄을 붙여 넣기 버퍼로 바꿉니다. 내가 사용하는 :.!ppjson매우 긴 (포맷되지 않은 JSON 문자열)를 타고 포맷과 형식 동등한 긴 문자열을 바꿀 수 있습니다. ppjson은 실행되는 bash 스크립트 일뿐입니다 python -m json.tool.
PatS

19

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


1
팁 고마워. 나는 또한 사람이 비슷한 기능을 번들 한 플러그인을 아래로 추적 - stackoverflow.com/a/36512548/255961을 .
studgeek

클립 보드에서 텍스트를 삽입 할 때 'eeeeeeee'문자열이 발생하는 것 같습니다.
John Jiang

16

이것을 당신에 추가하면 붙여 넣기 전후에 F2 키~/.vimrc 를 눌러야합니다 .

set pastetoggle=<F2>

12

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

따라서 터미널에 약간의 텍스트를 표시하면 간단히 눌러 pvim에 붙여 넣을 수 있습니다 . 마찬가지로, vim에서 물건 YY을 잡아 당기고 (예 : 현재 줄을 버퍼에 잡아 당기려면) 창에서 가운데 ​​클릭하여 붙여 넣을 수 있습니다.

던노 나는 그것이 매우 편리하다는 것을 알았습니다.


IMHO, 이것이 가장 좋은 대답이며 F11으로 전환 할 필요가 없습니다 (vim에서 기본적으로 사전 구성되어 있음). 이것은 맥 OSX 시스템에서 작동하지만 다른 것에 대해서는 모른다.
라이트 맨

9

터미널 내부에서 작업 할 때 vim-bracketed-paste vim 플러그인은 붙여 넣기 전후에 키를 누르지 않아도 붙여 넣기를 자동으로 처리합니다.

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


추가 참고 사항에 유의하십시오. 불행히도, 이는 터미널에 붙여 넣는 내용에 줄 바꿈이 있으면 입력 버퍼의 내용도 실행한다는 것을 의미합니다.
0xc0de

1
@ 0xc0de, 그 인용문은 여기에 관련이 없습니다. 그것은 괄호 붙여 넣기 모드를 지원 하지 않을 이 무엇을 할 것인지에 대한 이야기 입니다. 이것이 브라켓 붙여 넣기 모드의 요점입니다.
sh1

이것은 다른 솔루션보다 훨씬 나에게 효과적이었습니다. 감사.
jjj

8

~ / .vimrc에 이것을 붙이고 행복하십시오 :

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

편집 : 반영시, :r !cat짧고 의미 론적이며 사용자 정의 vimrc가 필요하지 않기 때문에 훨씬 나은 접근 방식입니다. 대신 사용하십시오!


5

하지만 :pastetoggle:paste하고 :nopaste잘 작동해야한다 (구현하는 경우 - 우리가 토론에서 볼 수 있듯이 그들은 항상 아니다) 내가보기 엔 recomment 붙여 넣기 직접 접근 방식을 사용 "+p또는 "*p과 함께 읽기 "+r"*r:

빔 레지스터의 열 유형 ACESS이있다 ( :help registers)와 질문자가 관심 quotestarquoteplus섹션

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

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

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

:help x11-selection상기의 관계를 설명 차이 *+:

                                                  quoteplus quote+

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

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

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

  • Vim에서 시각 모드로 URL을 선택하십시오. 브라우저로 이동하여 URL 텍스트 필드에서 마우스 가운데 버튼을 클릭하십시오. 선택된 텍스트가 삽입 될 것입니다. 참고 : Firefox에서는 about : config에서 middlemouse.contentLoadURL 환경 설정을 true로 설정할 수 있으며, 창의 대부분의 위치에서 마우스 가운데 버튼을 누르면 선택한 URL이 사용됩니다.

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

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

vim에서 중간 클릭을 사용하는 것이 들여 쓰기를 엉망으로 만드는 것으로 보이지 않으므로 아이디어가 될 수 있습니다.
Fuseteam

4

이것은 나를 위해 작동합니다 (+ 레지스터의 경우 aps 간의 교환 버퍼와 같은 것을 사용하십시오).

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>

2

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

brew install macvim-재정의 시스템 -vim


.vimrc파일 에 OP의 지시문을 포함시키는 경우 입니까?
Drew Noakes

2

네이티브 페이스트 / 괄호 페이스트는 vim 82016 년에 출시 된 이래 가장 좋고 간단한 방법 입니다. 심지어 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. 이 결과 (탭 들여 쓰기가있는 두 줄)를 시스템 클립 보드에 복사 ( 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지금 잘못 정렬되어 있습니다.


Vim 8 설치


1
가장 간단한 방법! 또한 Google은 Featured snippet검색에 '컨텐츠 없음 탭 vim 붙여 넣기'를 제안했습니다 . 아마도 '답변'키워드를 사용했기 때문에이 답변에서만 언급 된 것입니다.)
David


1

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

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


1

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

vim 도움말 문서에서 :
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

따라서 자동 들여 쓰기없이 vim에 내용을 붙여 넣으려면 <CR><CO>*대부분의 유닉스 시스템에서 사용하십시오 .

참고 : 이것은 vim이로 컴파일 된 경우에만 작동합니다 clipboard.



1

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

:se paste noai

0

슬프게도 vim 플러그인이 iTerm2 3.0.15와 함께 작동하지 않는다고 언급했습니다 (이전 버전에서이 문제가 발생했는지 알 수 없음)-대신이 핵을 찾았습니다.

붙여 넣기를 수행하고 iTerm2 vim 키를 사용하려면 command-p를 매핑하십시오. 분명히 이것은 iTerm2에서만 작동합니다.

작동 방식 "jk"를 사용하여 이스케이프 모드에 들어가므로 다음이 필요합니다.

: inoremap jk

.vimrc에.

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

여기에 이미지 설명을 입력하십시오


1
잠깐만 요, 당신은 이것을 위해 'jk'를 사용합니까?
0xc0de

그래, 나는 그것을 언급하는 것을 잊었다. ": inoremap jk <esc>"를 .vimrc에 추가하십시오. 내가 jk를 사용 하는 이유 와 관련하여 Apple에 물어보고 그들이 물리적 인 탈출 키를 제거하고 제거해야 할 필요성을 느낀 이유는 무엇입니까? 8 (
Neil McGill

BTW 약간의 훈련이 필요하지만 잠시 후 jk가 더 빨리 느끼고 탈출을 선호한다고 생각합니다.
Neil McGill

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