[Vim]エスケープシーケンスを含む vimshell バッファで表示通りにヤンクする
vimshell は、エスケープシーケンスを解釈し、 vimshell バッファ上で色付けして表示することができます。
以下は vimshell で git log --color を実行した図です。コミットのハッシュ番号が黄色になっています。
問題
これをそのままヤンクするとエスケープシーケンス文字もそのままヤンクされ、このようになってしまいます。
^[[33m4391e8e^[[m Implement new cache method. ^[[33m947fb43^[[m - Changed default cache lines in nofile buffer. ^[[33m3232f40^[[m Merge pull request #250 from ujihisa/master ^[[33mec342f3^[[m better english ^[[33m407608b^[[m - Improved FAQ.
vimshell は vim が conceal に対応している場合は conceal 機能でエスケープシーケンス文字を隠していますが、conceal はバッファの実際の文字を変えるわけではないため、ヤンクしたときにエスケープシーケンス文字も一緒に付いてきてしまいます。
これは不便ですね。表示されているものがそのままヤンクされるようになってほしいです。
解決方法
conceal された文字を取得する方法は vim に用意されています。 synconcealed 関数です。この関数は現在のバッファの行番号、桁位置を引数に取り、Conceal 可能リージョンの中にいるかどうかの情報を返します。
この関数を使えば、表示されている文字列を取得できます。これを使ってプラグインを作りました。
設定
プラグインは GitHub - chikatoike/concealedyank.vim で公開しています。これを neobundle 等でインストールしてください。
このプラグインは
xmap Y(operator-concealedyank)
以上の設定をすることで、 vimshell バッファでビジュアルモードで範囲選択し、Yを押すとエスケープシーケンスを除いた、表示されているままの文字列をヤンクできます。