Welcome to FutureAppLaboratory

v=(*^ワ^*)=v

Auto ‘Set Paste’ on Demand

| Comments

Insertモードで編集している間にソースコードを貼付けたい時に、毎回’set paste’と’set nopaste’をやらないといけない、ちょっと面倒くさいです。
更に、’set paste’抜きで貼付けた場合、内容の長さによりvimが一時的にフリーズしちゃいますので大変です。
コマンドマッピングを導入しても、結局自分でコマンドを入れないといけないですね。

なので今日は移動的に’set paste’と’set nopaste’をしてくれる便利なプラグインを紹介します。

Installation

リポはこちらです。https://github.com/ConradIrwin/vim-bracketed-paste
バンドル管理ツール経由でインストールします。私の環境では

1
Bundle 'ConradIrwin/vim-bracketed-paste'

Make a step deeper

基本的なアイディアはシステムのbracketed paste挙動を探知して、コマンドマッピングを自動で実行されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if &term =~ "xterm.*"
    let &t_ti = &t_ti . "\e[?2004h"                " alternate screenに入る時、bracketed pasteを有効にする( ESC[?2004h] )
    let &t_te = "\e[?2004l" . &t_te                " alternate screenから戻る時、bracketed pasteを無効にする( ESC[?2004l] )

    function XTermPasteBegin(ret)                  " mode change & set paste方法
        set pastetoggle=<Esc>[201~                 " bracketed pasteを終了識別子を検出する時、pasteモードをtoggle
        set paste                                  " mode changeする前に、set paste実行
        return a:ret                               " パラメータでどのモードに入るのをコントロールする
    endfunction
    map <expr> <Esc>[200~ XTermPasteBegin("i")     " normal modeでbracketed pasteの開始識別子(ESC[200~])を検出する時、insert modeになる
    imap <expr> <Esc>[200~ XTermPasteBegin("")     " insert modeならモードがそのまま
    cmap <Esc>[200~ <nop>                          " command modeなら以上のコードを使うとおかしくなるので、回避
    cmap <Esc>[201~ <nop>                          " 同じく回避
endif

Reference

以下はプラグインのソースから抜きました。

Comments