web-dev-qa-db-ja.com

Mac OS Xでvimにターミナルウィンドウにコードを貼り付ける

Mac OS Xのターミナルウィンドウにコードをvimに貼り付けると、各行がインデントされます。行ごとにインデントが追加されるため、テキストは次のようになります...

"ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud        
   ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
        reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
             Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
                    deserunt mollit anim id est laborum."

私の現在の回避策は、正しい形式を保持するテキストメイトテキストエディターに最初にテキストを貼り付けることです。次に、そのファイルを保存し、vimで開きます。次に、vim yankを使用して貼り付けます。
。vimrcに、この動作を変更できる設定がありますか?または、これは端末の問題ですか?

67
eat_a_lemon

Vim内:

:set paste

Vimを貼り付けモードにします。これは、1つのウィンドウからテキストをカットまたはコピーしてVimに貼り付ける場合に便利です。これにより、予期しない影響が回避されます。

85
William Pursell

更新:Vim 8には、ブラケットペーストモードのネイティブサポートが含まれています。デフォルトで有効になっています。 Vimのxterm-bracketed-pasteヘルプトピック。ユーザーはこれをサポートするためにVimを設定するために何もする必要がなくなりました。

Mac OS X Lion 10.7以降、ターミナルは「ブラケットペーストモード」をサポートします。これにより、ターミナルエミュレーターは、ユーザーがテキストを貼り付けたときにttyに接続されているプログラムに通知できるため、プログラムは編集コマンドとして解釈しません。それをサポートするプログラムは、このモードを有効にするために端末にエスケープシーケンスを送信します。このモードでは、端末は貼り付けられたテキストを開始と終了を識別するエスケープシーケンスのペアで囲みます。

Vimでこれを有効にするには、〜/ .vimrcファイルに次のコードを追加します。

if &term =~ "xterm.*"
    let &t_ti = &t_ti . "\e[?2004h"
    let &t_te = "\e[?2004l" . &t_te
    function! XTermPasteBegin(ret)
        set pastetoggle=<Esc>[201~
        set paste
        return a:ret
    endfunction
    map <expr> <Esc>[200~ XTermPasteBegin("i")
    imap <expr> <Esc>[200~ XTermPasteBegin("")
    vmap <expr> <Esc>[200~ XTermPasteBegin("c")
    cmap <Esc>[200~ <nop>
    cmap <Esc>[201~ <nop>
endif

これにより、Vimが端末を代替画面†(t_ti、t_te)に切り替えたときに、ブラケット貼り付けモードを有効または無効にします(ESC [?2004 h、ESC [?2004 l)。貼り付けの開始を示すエスケープシーケンス(ESC [200〜)を受信すると、貼り付けモードを有効にし(貼り付けを設定)、必要に応じて挿入モードに切り替えます( "i")。一致する貼り付け終了マーカー(ESC [201〜)を受信すると、貼り付けモード(pastetoggle)を無効にし、挿入モードのままになります。 cmapコマンドは、エスケープシーケンスを無視し、貼り付けられたテキストをそのまま受け入れるようにVimコマンドラインを調整します。

これは、$ TERM値が「xterm…」で始まる場合にのみ、括弧付き貼り付けモードを有効にすることに注意してください。 $ TERMを別の値に設定している場合は、そのテストを修正して$ TERM値を含めることができます。または、厳密に必要ではないため、テストを完全に省略することもできます。他の端末タイプと互換性がない可能性のあることをしないように注意するだけです。

ターミナルでは、これはすべてのさまざまな貼り付けコマンドとドラッグアンドドロップで機能します。

†ターミナルには、メイン画面と「代替」画面があります。各画面には、独自のコンテンツと状態があります。代替画面のテキストは、スクロールバックログにスクロールアップしません。通常、画面全体の制御を引き継ぐプログラムで使用されるため、「フルスクリーン」プログラムと呼ばれます。これには、vim、emacs、less、topなどが含まれます。

105
Chris Page

他の回答に加えて、貼り付けモードをすばやく切り替える方法が必要な場合は、

set pastetoggle=<F2>

あなたの.vimrcに。 F2(または任意のキー)を押して、貼り付けモードを切り替えることができます。

9
dancavallaro

これを行う別の方法は、システムのクリップボードが適切に設定されていることを前提としています

"+p

これにより、システムのクリップボードから貼り付けられます。

6
Aaron Jensen

ヴィムで

:セットペースト

無効にしたいとき

:set nopaste

6
WenbinWu

ターミナル内で作業する場合、 vim-bracketed-paste vimプラグインは、ペーストの前後にキーストロークを必要とせずに、ペーストを自動的に処理します。

これは、Terminal、iTerm2、およびブラケットペーストモードをサポートする「最新の」x-term互換端末で動作します。追加のボーナスとして、tmuxセッションでも機能します。 Linuxサーバーに接続し、tmuxを使用するMac上のiTerm2で正常に使用しています。

プラグインは基本的に、@ Chris Pageが answer にリストした機能のパッケージバージョンです。

4
studgeek