Vim이 붙여넣은 코드를 잘못 들여쓰기하는 이유는 무엇인가요?

Vim이 붙여넣은 코드를 잘못 들여쓰기하는 이유는 무엇인가요?

Vim에 다음 스크립트를 붙여넣으면:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

다음과 같은 이상한 결과가 나타납니다.

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

파운드 기호(#)와 탭 문자가 있습니다. 왜?

답변1

두 가지 이유가 있습니다:

vim자동 들여쓰기를 활성화한 상태로 붙여넣으려면 다음으로 변경해야 합니다.붙여넣기 모드다음을 입력하여:

:set paste

그런 다음 삽입 모드로 변경하고 코드를 붙여 넣을 수 있습니다. 붙여넣기가 완료되면 다음을 입력합니다.

:set nopaste

붙여넣기 모드를 끕니다. 이는 일반적이고 빈번한 작업이므로 vim토글 붙여넣기 모드가 제공됩니다.

set pastetoggle=<F2>

F2원하는 키로 변경할 수 있으며 이제 붙여넣기를 쉽게 켜고 끌 수 있습니다.


댓글 자동 삽입을 끄려면 다음 줄을 추가하세요.vimrc:

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vim또한붙여넣기 레지스터시스템 클립보드의 텍스트를 붙여넣을 수 있습니다. 시스템에 따라 "*p또는 를 사용할 수 있습니다 . "+pOSX 또는 Windows와 같이 X11이 없는 시스템에서는 레지스터를 사용해야 합니다 *. X11 시스템(예: Linux)에서는 두 가지를 동시에 사용할 수 있습니다.

추가 읽기

답변2

vim을 사용하여 붙여넣으세요. 원하는 것은 클립보드 버퍼의 내용을 붙여넣는 것입니다. "+p

그러면 해당 항목이 선택되어 +붙여넣어집니다.

Linux를 사용하는 경우 *X/가운데 클릭 버퍼(마지막으로 선택한 텍스트)입니다.

그러면 vim은 이것이 페이스트라는 것을 알게 됩니다.

그렇지 않으면 vim은 붙여넣을 키를 입력했다고 생각하고 붙여넣기 끝까지 자체 자동 들여쓰기(복사된 들여쓰기 위에)를 수행합니다.

SSH를 통해 이 작업을 수행하려면 클립보드를 공유하는 옵션을 설정해야 합니다.-Y

man ssh자세한 내용은 참조하십시오 .

답변3

자동 들여쓰기가 켜져 있기 때문에 탭이 삽입되며, :set noai터미널에 붙여넣기 전에 자동 들여쓰기( )를 꺼서 해당 동작을 비활성화할 수 있습니다.

주석 줄은 자동 주석에 의해 생성되며 이를 꺼서 비활성화할 수 있습니다.

이 외에도 토글을 사용하여 원하는 동작을 얻고 :set paste, 형식화된 코드를 붙여넣고, :set nopaste정상적인 동작을 복원해야 합니다.

답변4

그 이유에 대해서는 다른 블로거들이 명확하게 설명했습니다. 여기서는 이러한 상황을 자동으로 처리할 수 있는 솔루션을 제공하고 싶습니다.

다음 콘텐츠에서~\.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

자동 들여쓰기 걱정 없이 자유롭게 붙여넣을 수 있습니다.

tmux에서 작업하는 경우 다음을 작성해야 합니다.

function! WrapForTmux(s)
  if !exists('$TMUX')
    return a:s
  endif

  let tmux_start = "\<Esc>Ptmux;"
  let tmux_end = "\<Esc>\\"

  return tmux_start . substitute(a:s, "\<Esc>", "\<Esc>\<Esc>", 'g') . tmux_end
endfunction

let &t_SI .= WrapForTmux("\<Esc>[?2004h")
let &t_EI .= WrapForTmux("\<Esc>[?2004l")

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

출처는코더 월더 많은 것을 읽고 싶다면.

동등한 개행 함수를 사용하는 경우 screen다음과 같습니다.

function! WrapForScreen(s)
  if exists('$TMUX') || match($TERM, "screen")==-1
    return a:s
  endif

  let screen_start = "\<Esc>P"
  let screen_end = "\<Esc>\\"

  return screen_start . a:s . screen_end
endfunction

발견 중스테이펠버그의 .vimrc.

관련 정보