search
LoginSignup
12

More than 5 years have passed since last update.

posted at

updated at

vimのカラースキームをfishのカラースキームに変換するプラグイン

TL;DR

記事タイトルそのままですが,vimのカラースキームをfishのカラースキームに変換するプラグインを作りました.

ryotako/fish-vimcolor

vimcolor.mov.gif

はじめに

今回こういったプラグインを作ろうと思ったきっかけは,愛用しているvimのカラースキームicebergの作者cocoponさんが作ったvimのカラースキームギャラリー「colorswat.ch」でした.

このギャラリーそのものは先月あたりからあったのですが,最近新機能が追加されたと聞いてあらためてサイトを訪問1
ひとしきりカラースキームを眺めて満足した後,こういうカラースキーム,シェルにもほしいなぁ... との思いに耐えられなくなって作ってしまいました.

fishでもfish_configで色設定できるのですが,バリエーションが少なくてちょっと物足りない感じでした2

使い方

まず好みのプラグインマネージャでプラグインをインストールします.とくにキーバインドも初期設定もないので,どのプラグインマネージャでも同じように可能なはずです.

# fishermanの場合
fisher ryotako/fish-vimcolor

基本的にvimcolor vimのカラースキーム名でそのカラースキームをfishに反映できます.
候補の取得に少し時間がかかりますが,コマンドの引数には手元のvimで利用可能なカラースキーム名が補完されます.
(~/.vimrcを読んだ後にvimのカラースキーム一覧を取得しているため,vimプラグインとしてインストールしたカラースキームも検出されます)

# vimにプラグインcocopon/iceberg.vimを導入済みとする

vimcolor iceberg

ただ,こうして反映されたカラースキームはfishを再起動するとリセットされてしまいます.設定を永続化したい場合は-U(--universal)オプションを付けてください.

vimcolor -U iceberg

こうすると設定のためにユニバーサル変数が使用されるようになり,次回以降の起動時にも色が反映されます.

また,利用可能なvimカラースキームを-l(--list)オプションで確認できます.

vimcolor --list

vimとfishの色付けの対応関係

fishではfish_color_...という名前の変数を使って色の設定ができます.vimでのシンタックスハイライトのグループと,fishの変数との関係は以下のようにしています.

参考:
vimの日本語ドキュメント
fishの英語ドキュメント

fishの色設定 fishでの意味 vimのシンタックスor構文グループ vimでの意味
fish_color_normal デフォルトの色 Normal 通常のテキスト
fish_color_command 実行可能なコマンド Statement 命令文
fish_color_quote クォートされたブロック String 文字列定数
fish_color_redirection 入出力リダイレクト Directory ディレクトリ名
fish_color_end ;&のようなプロセス分割 Delimiter 注意が必要な文字
fish_color_error エラー Error エラーなど、なんらかの誤った構造
fish_color_param コマンドのパラメータ Identifier 変数名
fish_color_comment コメント Comment コメント
fish_color_match 対応する括弧 MatchParen カーソル下の文字に対応する括弧
fish_color_search_match 選択している補完候補 Search PmenuSel ポップアップメニューの選択されている項目
fish_color_operator *~のような展開される演算子 Operator sizeof, +, *, その他
fish_color_escape \nのようなエスケープされた文字 SpecialChar 特殊な文字定数
fish_color_autosuggestion オートサジェスト Comment コメント
fish_color_valid_path 実在するパス Underlined 目立つ文章
fish_color_history_current dirhコマンド出力中の現在のディレクトリ Directory ディレクトリ
fish_color_selection viモードでビジュアル選択された範囲 Visual ビジュアル選択された範囲
fish_pager_color_prefix 補完候補の一致部分 Title ":set all"、":autocmd" などによる出力のタイトル
fish_pager_color_completion 補完候補の色 Pmenu ポップアップメニューの通常の項目
fish_pager_color_description 補完候補の説明の色 SpecialComment コメント内の特記事項
fish_pager_color_progress 補完候補が多い時の...and X more linesの色 MoreMsg スクリーンがメッセージで埋め尽くされた時に表示される-- More --の色

本当はfish_color_userとか,fish_color_で始まる変数はもっとあります.
ただ,これはデフォルトのプロンプトを使用している場合にしか意味が無いのと,ユーザ名って構文要素でいうと何に相当するのか? が決められなかったので設定していません.

メリットとデメリット

このプラグインのメリットは手軽に,豊富なカラースキームを試せるところだと思うのですが,デメリット(というか未熟な部分)も結構あります.
まとめると以下のようになります.

メリット

  • vimの豊富なカラースキームが利用可能.
  • 環境設定を開かずにコマンド一発で気軽に色変更できる.
  • シェルが色付けするため,ターミナル.appiTerm.appといったソフトごとに設定をしなくてもよい.

デメリット

  • ターミナル全体の背景色は設定不可能.
  • 実行時にちらっとvimの画面が描画されることがある3
  • set_color redなどで指定されるredが実際には何色なのか? は変数fish_color_...で制御できないためターミナルの環境設定が必要.
  • fishが解釈できない色名がある(DarkGreyとか). → 対応しました
  • fishのシンタックスグループによって,指定不可能な設定がある.たとえばfish_color_search_match--backgroundオプションしか受け付けてくれず,前景色や太字指定ができない.
  • fishのシンタックスグループによって,背景色を指定したはずなのに太字にされる等の謎の挙動がある.

あと,これ個人利用なら問題ないと思いますけど,変換したカラースキームを公開したりするする場合には元のカラースキームのライセンスを確認する必要があるかもです.

おわりに

fishはもともとがカラフルなシェルですが,vimの力を借りて色々なカラースキームが使えるようになりました.
ターミナルでの作業がもっと楽しくなりそうですね!

追記

補完時の選択肢の色設定(fish_pager_color_...)に対応しました.また,それにともなって選択中の候補の色付けをvimのSearchからPmenuSelに変更しました.


  1. このカラースキームギャラリーは本当カッコイイのでぜひ一度訪問するのをおすすめしたいです. 

  2. ただ,これはむしろvimが凄すぎるんだと思います.歴史とかユーザ数とか. 

  3. これなんとかしたいと思ってvimをサイレントモードで起動(vim -es)してみたりしたのですが,どうせ描画されないからなのか,サイレントモードだとカラースキームの変更ができないっぽいのですよね... 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
12