常に:set pasteを使用します。良いアイデアですか?


19

端末vimでは、クリップボードのデータを貼り付けると、コードのインデントが台無しになることがよくあります。私:set pasteはインデントが壊れていないことを使用するかどうかを知っていました。ただし、データを貼り付けた後、:set nopaste再度行う必要がありますか?そうしないとどうなりますか?


自分で試してみてはどうですか?またはドキュメントを読む
ロメインル

1
「コードをターミナルウィンドウにvimに貼り付ける」stackoverflow.com/a/7053522/754997への回答の「括弧付き貼り付けモード」も参照してください。ターミナルエミュレータがサポートしている場合は、ターミナルにテキストを貼り付けるたびにVimに貼り付けモードを自動的に切り替えるように指示することができます。
クリスページ

1
@romainl私は、1)set paste(+-nopaste)を常に使用することの否定的な結果があるかどうかを確認しようとして待機し、2)rtfm-ing(OPのような低レベルまたは中レベルのユーザーとして) 、オプションの経験がある人に尋ねるよりも役に立たない。ここで尋ねることはより賢いアプローチのようであり、これを文書化することは他の人を助けるでしょう。
ベラク

回答:


5

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

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

alias vim='gvim -v'

それから

set mouse=a

〜/ .vimrcで。


mouse = aを設定すると、テキストをコピーできません。「コピー」は、右クリックメニューとアプリメニューでグレー表示されます。
リーダニエルクロッカー

@LeeDanielCrocker:Copyテキストが選択されていない限り、グレー表示されるか、まったく表示されません。コピーするテキストをどのように選択していますか?
ゲイリージョン

マウスで。参考までに、「y」は問題なく機能します。テキストをヤンクしてシステムキーボードにコピーします。機能しないのはメニューだけです。マウスが「r」に設定されている場合、メニューは機能しますが、マウスには行番号が含まれます。全体として、私はmouse = aで生きることができます。コピーの代わりにヤンクすることを忘れないでください。
リーダニエルクロッカー

7

この投稿には私のお気に入りの答えがあります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()

let &t_SI .= "\<Esc>[?xxxxx"行の1つがキーボードペーストのショートカットを検出していると思いますか?別のショートカットがあれば、これはMacでも動作しますか?
doub1ejack

@ doub1ejackこれらは、端末がXtermキーコードをサポートし、Vimに渡す限り、Macで正常に動作する限り、Xtermエスケープシーケンスを検出します。
dragon788

ああ、神様。あなたは私のヒーローです。私はそう入力しました:set nopaste何度もg'd回。
マックス

3

romainlが示唆したように、ドキュメントでは、'paste'オプションを設定すると他のいくつかのオプションが無効になると説明されています。このため、'pastetoggle'オプションがあります。見る:

:help 'paste'
:help 'pastetoggle'

1

何かが存在する場合、その意味を持たなければなりません。vimのドキュメントをよく見てください。これは非常に便利です。

  :help 'paste'
  :help 'pastetoggle'

読んだら、これが欲しいかもしれません:

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

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


1

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.