development

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

big-blog 2020. 9. 27. 12:57
반응형

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


저는 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>

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

set paste

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


나는 일반적으로 내용을 사용 :r! cat하고 붙여 넣 ( shift + insert )습니다 CTRL+D.

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


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

"+p

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

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


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

:r !pbpaste

로 붙여 넣기 모드를 설정하는 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

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

출처 : Coderwall

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

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


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


이것을 추가하면 붙여 넣기 전과 후에 F2~/.vimrc 를 누르면됩니다 .

set pastetoggle=<F2>

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

따라서 터미널에 약간의 텍스트를 표시하면 간단히 눌러 pvim에 붙여 넣을 수 있습니다 . 비슷하게, vim에서 무언가 YY를 잡아 당기고 (예 들어 , 현재 줄을 버퍼에 잡아 당기기 위해) 아무 창에서나 가운데 클릭하여 붙여 넣을 수 있습니다.

Dunno. 나는 그것이 매우 편리하다고 생각합니다.


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

It works by detecting bracketed paste mode which is an escape sequence sent by "modern" x-term compatible terminals like iTerm2, gnome-terminal, and other terminals using libvte. As an added bonus it works also for tmux sessions. I am using it successfully with iTerm2 on a Mac connecting to a linux server and using tmux.


Stick this in your ~/.vimrc and be happy:

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

Edit: on reflection, :r !cat is a far better approach since it's short, semantic, and requires no custom vimrc. Use that instead!


This works for me ( case for + register, what i use like exchange buffer between aps ):

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

Although :pastetoggle or :paste and :nopaste should be working fine (if implemented - they are not always as we can see from the discussion) I highly recomment pasting using the direct approach "+p or "*p and reading with "+r or "*r:

Vim has acess to ten types of registers (:help registers) and the questioner is interested in quotestar and quoteplus from section

  1. Selection and drop registers "*, "+ and "~

Use these registers for storing and retrieving the selected text for the GUI. See quotestar and quoteplus. When the clipboard is not available or not working, the unnamed register is used instead. For Unix systems the clipboard is only available when the +xterm_clipboard feature is present. {not in Vi}

Note that there is only a distinction between "* and "+ for X11 systems.

:help x11-selection further clarifies the difference of * and +:

                                                  quoteplus quote+

There are three documented X selections: PRIMARY (which is expected to represent the current visual selection - as in Vim's Visual mode), SECONDARY (which is ill-defined) and CLIPBOARD (which is expected to be used for cut, copy and paste operations).

Of these three, Vim uses PRIMARY when reading and writing the "* register (hence when the X11 selections are available, Vim sets a default value for 'clipboard' of "autoselect"), and CLIPBOARD when reading and writing the "+ register. Vim does not access the SECONDARY selection.

Examples: (assuming the default option values)

  • Select an URL in Visual mode in Vim. Go to your browser and click the middle mouse button in the URL text field. The selected text will be inserted (hopefully!). Note: in Firefox you can set the middlemouse.contentLoadURL preference to true in about:config, then the selected URL will be used when pressing middle mouse button in most places in the window.

  • Select some text in your browser by dragging with the mouse. Go to Vim and press the middle mouse button: The selected text is inserted.

  • Select some text in Vim and do "+y. Go to your browser, select some text in a textfield by dragging with the mouse. Now use the right mouse button and select "Paste" from the popup menu. The selected text is overwritten by the text from Vim. Note that the text in the "+ register remains available when making a Visual selection, which makes other text available in the "* register. That allows overwriting selected text.

If you are on a mac, macvim seems to handle it well without having to toggle paste.

brew install macvim --override-system-vim


Native paste / bracketed paste is the best and simplest way since vim 8 (released in 2016). It even works over ssh! (Bracketed paste works on Linux and Mac, but not Windows Git Bash)

  1. Make sure you have vim 8+ (you don't need the +clipboard or +xterm_clipboard options).

    vim --version | head -1

  2. Simply use the OS native paste command (e.g. ctrl+shift+V or cmd+V) in Normal Mode. Do not press i for Insert Mode.


Test

  1. Copy (ctrl+shift+C or cmd+C) the output of this (2 lines with a tab indent) to the system clipboard:

    echo -e '\ta\n\tb'

  2. Launch a clean vim 8+ with autoindent:

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

  3. Paste from the system clipboard (ctrl+shift+V or cmd+V) in Normal Mode. Do not press i for Insert Mode. The a and b should be aligned with a single tab indent. You can even do this while ssh-ing to a remote machine (the remote machine will need vim 8+).

  4. Now try the old way, which will autoindent the second line with an extra tab: Press i for Insert Mode. Then paste using ctrl+shift+V or cmd+V. The a and b are misaligned now.


Installing Vim 8


Please read this article: Toggle auto-indenting for code paste

Some people like the visual feedback shown in the status line by the following alternative for your vimrc:

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

The fastest way I’m aware of to quickly go to paste-insert mode for a one-shot paste is tpope’s unimpaired, which features yo and yO, presumably mnemonics for “you open”. They’re only documented in his vimdoc, as:

A toggle has not been provided for 'paste' because the typical use case of wrapping of a solitary insertion is so wasteful: You toggle twice, but you only paste once (YOPO). Instead, press yo or yO to invoke o or O with 'paste' already set. Leaving insert mode sets 'nopaste' automatically.


From vim: ]p

From outside: "*]p or "+]p


Another way to paste is via <CR> and dropping the contents of the register (here the global register). See: :h i_ctrl-r and h i_CTRL-R_CTRL-O.

From the vim help documentation:
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}

So to paste contents into vim without auto indent, use <CR><CO>* in most unix systems.

Note: this only works if vim is compiled with clipboard.


Sadly I found the vim plugin mentioned not to be working with iTerm2 3.0.15 (to be fair I don't know if this broke on older versions) - but I found this hack instead.

Map command-p to do the paste and using iTerm2 vim keys. Obviously this only works for iTerm2.

How it works. I use "jk" to enter escape mode so you will also need:

:inoremap jk

in your .vimrc.

Then it just invokes P to enter paste mode, "+p to paste from the clipboard and then P to disable paste mode. hth.

enter image description here


Another answer I did not see until now:

:se paste noai

참고URL : https://stackoverflow.com/questions/2514445/turning-off-auto-indent-when-pasting-text-into-vim

반응형