web-dev-qa-db-ja.com

常に:set pasteを使用してください、それは良いアイデアですか?

端末vimでは、クリップボードデータを貼り付けると、コードのインデントがめちゃくちゃになることがよくあります。 :set pasteインデントは壊れていません。ただし、データを貼り付けた後、:set nopasteもう一度?そうしないと、どのような問題が発生しますか?

19
Benjamin

他の人が書いたように、「貼り付け」を設定したままにしたくないでしょう。適切なターミナルエミュレータと適切にコンパイルおよび構成されたvimを使用すると、 '貼り付け'を変更する必要がないことを指摘したいと思います。 xtermやGNOMEターミナルなどの優れたターミナルエミュレーター、X11機能を含むvim、および「マウス」オプションを「a」に設定する必要があります。次に、vimは、マウスで貼り付けていることを「認識」し、「貼り付け」オプションを効果的に設定および設定解除します。

X11機能でvimを取得する1つの方法は、gvim-vオプションを指定して実行するか、エイリアスを作成することです。

alias vim='gvim -v'

次に置く

set mouse=a

〜/ .vimrc内。

5
garyjohn

この投稿には私のお気に入りの回答があります https://coderwall.com/p/if9mda/automatically-set-paste-mode-in-vim-when-pasting-in-insert-mode

基本的に、挿入モードで開始してCtrl + Shift + Vを使用するか、マウスで右クリックして貼り付けると、Vimはこれが端末からのものであることを検出し、自動的に貼り付けモードを設定します。 (生データを書き込むため、貼り付けモードでは機能しません)完了すると、「正常な」状態に戻ります。

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

Tmuxでvimを使用する場合(まだ.vimrcに入っています)

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()
8
dragon788

Romainlが示唆したように、ドキュメントでは'paste'オプションは、他のいくつかのオプションを無効にします。問題が発生するのは、後ではなく、早くなります。このため、'pastetoggle'オプション。見る:

:help 'paste'
:help 'pastetoggle'
3
Heptite

IIRCは、vimに貼り付けたときに、基本的にそれらすべての文字を自分で入力したと見なします。したがって、自動インデントがオンになっていると、自動的にインデントされますが、貼り付けたテキストには通常インデントが既に含まれているため、インデントは実際に「めちゃくちゃ」になります。貼り付けモードに切り替えると、自動インデントなどがオフになります。

入力時に自動インデントが必要な場合は、貼り付けが完了したら、nopasteに戻す必要があります。試してみて、貼り付けモードですべてのインデントを手動で行う必要があることに注意してください。

1
Sumudu Fernando

何かが存在する場合、それはその意味を持つ必要があります。非常に役立つvimのドキュメントをよく見る必要があります。

  :help 'paste'
  :help 'pastetoggle'

一度読んだら、次のようにすることができます。

" Toggle paste mode
"   (prefer this over 'pastetoggle' to echo current state)
nmap <leader>p :setlocal paste! paste?<cr>

この投稿がお役に立てば幸いです:)

1
Dzung Nguyen