2012年2月19日日曜日

Macでzsh補完時の色設定

.zshrc等をMacに持ってきて、真っ先に怒られたのがlsの色。dircolorがない。…というか、そもそもGNUのlsじゃないからLS_COLORSを設定しても効かないし、lsに色を付けるオプションも異なる。調べてみると
  1. 環境変数LSCOLORSを設定
  2. GNUのCoreutilsを入れてしまう
という手があるようだが、せっかくなので郷に従い前者を選択。詳細はmanに譲って、とりあえず好みの設定をメモ。
export LSCOLORS=gxcxfxbxdxegedabagacad
さて、これで大体OKかと思いきや、zshの補完リストに色が付かない。が、それもそのはず。
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
とLS_COLORSを元に設定している。このまま無色なのは寂しいので、LSCOLORSからzsh式に変換するスクリプトを書いた。

#!/usr/bin/ruby
DefaultColors = 'exfxcxdxbxegedabagacad'
Attrs = %w(di ln so pi ex bd cd su sg tw ow)
lscolors = ENV['LSCOLORS'] || DefaultColors
codes = lscolors.scan(/../).map do |fb|
  cd = []
  cd << '01' if fb =~ /[A-H]/ # bold
  f, b = fb.downcase.scan(/./).map do |c|
    'abcdefgh'.index(c)
  end
  cd << '3%d' % f if f  # foreground
  cd << '4%d' % b if b  # background
  cd
end
zcolors = codes.zip(Attrs).map do |cd, at|
  "#{at}=#{cd.join(';')}" unless cd.empty?
end
print zcolors.compact.join(' '), "\n"
これをPATHの通った場所にzcolorという名前で置いて、
zstyle ':completion:*' list-colors $(zcolor)
と.zshrcあたりで実行しておけば、zshの補完リストにLSCOLORSと同じ色が付く。厳密にはboldの扱いがちょっと違うけど。

0 件のコメント:

コメントを投稿