2012/03/11 現在 Emacs Tramp の設定方法

Emacs の Tramp でリモートのファイルを編集したいと思ったものの、
検索等で色々見つかる設定が古くなっていたりとどうにもうまくいきませんでした。
ですので 2012/03/11 現在での cygwin と Mac でうまく行った方法をメモしておきます。
少し長いです。。

前提

流れ

  1. ssh-agent の設定
  2. ssh-config の設定
  3. Emacs の起動方法
  4. tramp の設定
  5. cygwin との戦い
  6. Solaris との戦い

ポイントは cygwin の場合の Emacs の起動方法にありました。

ssh-agent の設定

Tramp でパスワードを要求されるとそのやり取りを解決できず、
そのまま固まってしまいますので ssh-agent を使ってパスフレーズ入力を解決します。
ノーパスの秘密鍵を作るよりは幾分か良いでしょうし、
セキュリティに問題ないと判断できれば Tramp を使わなくても利用すると便利です。


鍵認証で ssh 接続を試みるとパスフレーズを要求されますが、
1度登録しておくとその手間を省いてくれるものです。
ssh-add コマンドで認証鍵を指定すると
認証鍵のパスフレーズが要求されますので入力すると準備完了です。

% ssh-agent zsh(使っているshell)
% ssh-add hogehoge(秘密鍵を指定)

Enter passphrase for hogehoge : (パスフレーズを求められるので入力)
Identity added: hogehoge (完了)


ターミナルを再起動したりした後は ssh-agent が起動している必要がありますので、
zshbash ログイン時に1度だけ自動的に立ち上がるようにすると便利です。
詳細については
ssh-agentの使い方 - http://goo.gl/CtEQ1
などを参考にしてみてください。


必要に応じて秘密鍵を手動で登録するようにしていますので、上記から少し変えて

# ssh-agent 用
agentPID=`ps gxww|grep "ssh-agent]*$"|awk '{print $1}'`
agentSOCK=`/bin/ls -t /tmp/ssh*/agent*|head -1`
if [ "$agentPID" = "" -o "$agentSOCK" = "" ]; then
    unset SSH_AUTH_SOCK SSH_AGENT_PID
    eval `ssh-agent`
else
    export SSH_AGENT_PID=$agentPID
    export SSH_AUTH_SOCK=$agentSOCK
fi

としています。
これで ssh-agent が起動していなければ起動し、
起動していれば必要な情報を環境にセットします。

ssh-config の設定

必要なければ飛ばしても良いのですが便利なので設定しておきます。
当たり前な人には当たり前なので設定済みだと思いますし、読み飛ばしてください。。


例えば hogehoge.piyo.com に AAA ユーザで hoge 鍵を使ってログインするとします。
通常であれば長い ssh コマンドのオプションを使ってログインしますが、
~/.ssh/config に

Host hoge
     HostName hogehoge.piyo.com
     IdentityFile ~/.ssh/hoge
     User AAA

と書いておくことで

ssh hoge

とするだけでログインできるようになります。


tramp で接続する際にもこの設定で記述を少なくできますので楽ができます。

Emacs の起動方法

Windows で普段は runemacs.exe をダブルクリック実行して起動している人に必要なポイントです。
Emacs を起動する際は、cygwin で PATH を通して
cygwin 上で runemacs を実行して起動するようにしてください。
これによって Emacsssh-agent を利用できるようになります。


Mac の場合は ターミナルなどで ssh-agent を起動しておけば
後から起動した Emacsssh-agent 有効になっているようです。

tramp の設定

なにはともあれ最新版をダウンロードして .emacs.d の下などに配置します。

(add-to-list 'load-path "~/.emacs.d/elisp/tramp-2.2.4/lisp/")
(require 'tramp)

ここでは ホームディレクトリの .emacs.d/elisp 以下に展開しました。


基本的にはこれだけで使えるようになります。
C-x C-f などしてから

Find file or URL: /ssh:AAA@hoge:/

すればOK・・・ですが

cygwin との戦い

昔はcygwin を使っている環境で tramp を使おうとすると上記のままでは失敗していたようです。
これを解決するための様々な情報がネットや本で見つかります。
putty の plink を使う方法などがそうです。
これは cygwin に含まれていた openssh のバージョンが古いために起きる問題を回避する方法でした。
現在は cygwin の ssh で問題なく動作します。


ただし、下記の tramp の設定を追加してください。

(setq-default tramp-default-method "sshx")

これで plink など必要とせず、ssh-config の設定を引き継いで tramp が使えます。
C-x C-f して

Find file or URL: /sshx:AAA@hoge:/

すれば tramp できます。
ssh ではなく sshx とするところに注意してくださいね。


ちなみに Mac でも sshx で動きますので環境による切り分けは不要でした。

Solaris との戦い

さあこれでつながる・・・と tramp を使用していると、
さっきはつながっていたサーバーに

Couldn't find exit status of `test -d "trampしようとしたパス" unset'

とエラーが出て、2度目以降繋がらなくなりました。
なんてこった・・・。


これはSolaris など一部のサーバーで発生しました。
tramp はデフォルトでは .emacs.d の下に tramp ファイルを作成し、
再接続時などの情報を保存するようです。
どうもこれが悪さをして繋がらなくなるようなので、

(setq-default tramp-persistency-file-name nil)

とすることで回避可能です。


これでようやく一通りすっきりと tramp が使えるようになりました。

終わりに

最終的に tramp 自体の設定は

(add-to-list 'load-path "~/.emacs.d/elisp/tramp-2.2.4/lisp/")
(require 'tramp)
(setq-default tramp-default-method "sshx")
(setq-default tramp-persistency-file-name nil)

とすっきりしたものとなっています。
多段用の設定は別にしていますが、
多段の場合も中継サーバーの ssh の config をうまく設定することで便利に接続できるはずです。


古い Tramp や plink の話、Meadow 用の設定など入り交じって訳がわからなくなりつつありますが、
現在は ssh-agent を利用して sshx を指定すれば特に問題なく利用できるようです。
環境に影響を受けやすいため設定も面倒な事が多いですが、
その分便利なことも多いですから試してみる価値はあると思います!!

zsh のプロンプトで顔文字

現実逃避活動の一環として zsh のプロンプトを久しぶりに変更。
直前のコマンドが成功しているかで、
顔文字と色が変わるようにしてみた。
辛さアップ。。

PROMPT='%F{green}%n%f/%m%B%(?.%F{blue}%(!.#. :))%f.%F{red}%(!.#. :()%f)%b '

成功時
f:id:nishikawasasaki:20120308022010p:image

残念、失敗
f:id:nishikawasasaki:20120308022011p:image


ステータスを取得するには

%(?.ステータス0の時.0以外の時)

と書けばいいので、この中で顔文字を変えています。

Mac の Skype のチャット画面表示を変える

テンプレが公式で公開されています。


Skype for Mac competition | Getting started with the competition』- http://goo.gl/YfzKZ


デフォルトで使っているものは

/Applications/Skype.app/Contents/Resources/ChatStyles

にあります。
コピーして拡張子を一度削除すると中身を編集できるようになるので、
html や css などを編集します。


編集が終わったら、削除した拡張子を再度つけてやります。
名前も変更して "hogehoge.SkypeChatStyle" のようにします。
このオリジナルテーマファイルを

~/Library/Application Support/Skype/ChatStyles

に置いて Skype を再起動すると、
Skype の設定 >> チャット >> 形式
に自分の編集した hogehoge が出てきますので選択します。
後は再起動するなりするとテーマが反映されます。


結構自由に編集できるみたいですので、
標準に飽きた人はフォントや色合いなどから編集してみてはいかがでしょうか?

mintty の表示色を設定する

cygwin などを使っていると、他のターミナルソフトの例にもれず
mintty でも表示色(特に青)が変更したくなります。
ググってもあまりまとまって情報がなかったため備忘録です。


1度でも mintty を起動していると出来ている ~/.minttyrc に下記を追加。

Black=0,0,0
Red=255,100,0
Green=183,234,17
Yellow=234,206,28
Blue=107,155,219
Magenta=237,157,185
Cyan=0,191,191
White=255,255,255
BoldBlack=64,64,64
BoldRed=255,100,0
BoldGreen=183,234,17
BoldYellow=234,206,28
BoldBlue=107,155,219
BoldMagenta=237,157,185
BoldCyan=64,255,255
BoldWhite=255,255,25


RGB 指定すれば希望の色で表示されます。
上記例は nishikawasasaki 好み色なのでお好きに変更してくださいね。

cygwin や Mac で byobu を動かそうと思って

screen を使おうと思ったら最近では byobu というのが流行ってるようなので byobu にしてみた。
会社では Win(cygwin) を、自宅では Mac を使っているので設定を共通化出来ないか色々試してみた。

cygwin でのインストールと起動

screen は apt-cyg や install.exe からインストール可能なので問題無しです。
byobu はソースをダウンロードすれば cygwin 上で make install 可能です。

./configure --prefix="$HOME/byobu"  # ホームディレクトリへインストールする場合
make
make install


.screenrc があると screen の設定も読み込んでしまうので、

mv ~/.screenrc ~/.screenrcBK

として退避しました。


byobu を起動します。

export PATH=$PATH:~/byobu/bin  # PATH に追加 → 必要なら zshbash へ設定
byobu  # 起動

cygwin で発生する問題

  • byobu-config

cygwin では newt と python-snack 連携が出来ていないため、
byobu-config が動きません。
F9 してもなにもおこらないのです。
ビルドするなど色々試みましたが結局上手に動かせず諦めてしまいました。
設定は別の非 Win マシンで行うことにしました。

  • ターミナル

cygwin というよりは mintty の問題ですが、F1 から F4 が動作しませんでした。
これでは刺客びょぶ を入れたのにファンクションキーが使えません。。
この問題はターミナルタイプによって送信するキーのコードが違うからです。
byobu の設定で対処可能ですので下記のように ~/.byobu/keybindings を編集します。

# 環境変数 $TERM が xterm-color の場合
termcapinfo xterm-color 'k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS'

御自分のターミナルタイプに応じて設定して下さい。
ちなみに teraterm を使った場合は上記設定なしでF1からF4まで動かすことが出来ました。

Mac にも byobu を入れてみる

brew を使っていますのでインストールは

brew install byobu

で完了します。

Mac でも問題が起こった

  • byobu-config ふたたび

Mac でも byobu-config で newt(snack) の問題が発生します。
port を使っている人は port から newt をインストール可能なようですが brew にはありません。
brew を設定して入れても良いのですが今回は newt をソースからインストールしてしまいました。

  • status

どうも CPU やメモリの情報等が権限の問題なのか表示出来ません。
負けた黄もいますが起動できないほどの問題ではないのでひとまず置いています。

便利に使う

  • 設定

cygwin では byobu-config できなかったので、
Mac 側で設定を行なって cygwin で利用しています。

  • Mac トラックパッド

BetterTouchTool などを使って
F3 や F4 をトラックパッド操作できるようにすると byobu から離れられなくなります!!!

設定して使ってみて

ステータスに情報もあまり表示しませんし screen と大差ない使い方をしています。。
ファンクションキー連携で便利になった点は良いですね。
screen から乗り換えるコストに見合うかは・・・です。

Emacs 終了時のフレームサイズと位置を復元する elisp を書いてみた

Vim-users.jp - Hack #120: gVim でウィンドウの位置とサイズを記憶する』- http://goo.gl/bb2JH
みたいに、
Emacs 起動時に、前回終了時のフレームサイズと位置で起動してほしかったので elisp にしてみた。


車輪の再開発した気がしてならない・・・。
もう別に同じのあった場合辛い気持ちになるので教えてください。。


『nishikawasasaki/save-frame-posize.el - GitHub』- http://goo.gl/FG9tS

dired の RET を同じバッファでディレクトリを開くように変更する

tabbar.el を使うと dired バッファでディレクトリを開くと
dired バッファがタブに増えて困るので何とかした。


dired で RET はもともと dired-find-file にマップされていて、
ディレクトリを開くと新しいバッファが開きます。
一方 a で開くと dired-find-alternate-file がマップされているため
ディレクトリを開いたバッファに開いた先のディレクトリが表示されます。


dired 時に RET で開くように使っていると、
この RET と a の挙動を入れ替えたいので下のように設定したらいい感じになりました。

;; dired-find-alternate-file の有効化
(put 'dired-find-alternate-file 'disabled nil)
;; RET 標準の dired-find-file では dired バッファが複数作られるので
;; dired-find-alternate-file を代わりに使う
(define-key dired-mode-map (kbd "RET") 'dired-find-alternate-file)
(define-key dired-mode-map (kbd "a") 'dired-find-file)


ただこうするとファイルを開いた場合もバッファを上書きして
dired バッファが消滅してしまいます。
ですのでファイルなら新しいバッファで、
ディレクトリなら同じバッファで開くように切り分けます。

;; ファイルなら別バッファで、ディレクトリなら同じバッファで開く
(defun dired-open-in-accordance-with-situation ()
  (interactive)
  (let ((file (dired-get-filename)))
    (if (file-directory-p file)
        (dired-find-alternate-file)
      (dired-find-file))))


これを使うと

;; dired-find-alternate-file の有効化
(put 'dired-find-alternate-file 'disabled nil)
;; RET 標準の dired-find-file では dired バッファが複数作られるので
;; dired-find-alternate-file を代わりに使う
(define-key dired-mode-map (kbd "RET") 'dired-open-in-accordance-with-situation)
(define-key dired-mode-map (kbd "a") 'dired-find-file)

のようにできていい感じになりました。


ついでに dired の移動のキーを足して
カーソルキーだけで行き来できるようにしています。

;; ディレクトリの移動キーを追加(wdired 中は無効)
(define-key dired-mode-map (kbd "<left>") 'dired-up-directory)
(define-key dired-mode-map (kbd "<right>") 'dired-open-in-accordance-with-situation)


これで tabbar.el を使っていても
タブバーが dired のバッファ名で埋め尽くされることはなさそうです。


ちなみに、初めて dired-find-alternate-file を使うと、
「今後も使いますか?」と聞かれます。
y すると init.el などに

(put 'dired-find-alternate-file 'disabled nil)

が自動追加されるので使ったことがある人はどこかに設定されているかもしれません。

emacs の elisp 達を el-get で管理する

他にも el-get を扱った記事はあるので今更感もあります。
しかし Vim の bundle/neobundle に比べて
「これを使えば間違いない」といったものが無いので、
自分の使い方に一番あっている el-get を今一度紹介してみたいと思います。


参考

Vim の bundle の良いところはなんといっても
「設定ファイルの内容から必要なプラグインを自動的にインストールする」ところだと思っています。
必要な拡張をまとめて記述しておくことで
* github などから最新の状態(指定のリビジョン)のソースを取得することが可能
* コマンドによってそれらの最新化(git pull)も可能
これにより複数の環境で共通のエディタ環境を構築することが容易になります。
メリットとしてコマンド一発インストールできる点もありますが、
このメリットはプラグインを試すときなどに限定された副次的なものでしょう。


さて、Vim の neobundle では以下のように設定ファイルへ記述しておきます。

NeoBundle 'git://github.com/Shougo/neobundle.vim.git'
NeoBundle 'git://github.com/Shougo/neocomplcache.git', 'ver.7'

シンプルですね。
github 上のリポジトリをしているするだけです。
カンマ区切りでブランチの指定も可能です。
こういったプラグイン管理のプラグインが使いやすく充実していることは
VimEmacs に対する大きなアドバンテージでしょう。


一方で Emacs の現状はどうでしょう。
個人的には、と付け加えておくと、
最新かわからないソースの置かれた Emacs Wiki からインストールする気は起こらず、
インストールされた elisp の更新や管理はほぼ不可能です。
また、elisp に頼らず git submodule を使って各リポジトリを取り込んで管理するのは面倒です。


この問題を Vim の bundle に近い形で解決してくれるのが el-get です。
必要な elisp の記述方法は簡単な場合、

  (setq el-get-sources
        '(
          (:name anything
           :after (lambda ()
                          (define-key global-map (kbd "C-;") 'anything)
                          以下設定 ))))

となります。
あらかじめレシピとして各 elisp に対応したリポジトリの情報が記録されているため、
必要な elisp の名前と読み込み後の設定を after 以後に書くだけで使えるようになります。


また、レシピに存在しない elisp を使いたい場合は、

          (:name auto-complete
           :url "http://cx4a.org/repo/auto-complete.git"
           :after (lambda () 以下設定 ))

のように名前と URL を指定します。
簡単ですね。


el-get 自体のインストールは

  ;; el-get インストール後のロードパスの用意
  (add-to-list 'load-path "~/.emacs.d/el-get/el-get")
  ;; もし el-get がなければインストールを行う
  (unless (require 'el-get nil t)
    (url-retrieve
     "https://github.com/dimitri/el-get/raw/master/el-get-install.el"
     (lambda (s)
       (let (el-get-master-branch)
         (end-of-buffer)
         (eval-print-last-sexp)))))
  (require 'el-get)

などのようにしておくと気持ち悪いくらい勝手にインストールしてくれます。


el-get がインストールされると、
次回起動時や el-get-install などのコマンドを実行すると
非同期に git pull などが行われていきます。
つまり init.el などに el-get 自体の設定と必要な elisp の情報を記載しておけば、
まっさらな状態から初回起動時に el-get がインストールされ、
面倒な場合さらに Emacs を再起動すると elisp のインストールも行われます。
elisp の更新も el-get-update-all で一発です。
複数のマシンや環境で Emacs を使っているのなら便利でしょう。


もし時間と elisp 記述力が許せば

(bundle hogehoge)

のように記述可能な elisp 管理プラグインを作りたいところですが、
現状は上記のような理由で el-get で満足しています。


el-get の設定方法と言うよりは、
何が便利なのか、に焦点を当てて記事を書きましたが
elisp の管理でしっくりこない方は試されてはいかがでしょうか?

*1

*1:それにしても Vim の記事の次が Emacs とは節操ない

Vim と ctags で Scala の関数一覧を tagbar を使って表示する

ctags を使ってタグファイルを作成すると、
定義<->利用箇所とジャンプできて便利ですよね。
↓こんなことがやりたい。
f:id:nishikawasasaki:20111226143817p:image:w360
これを ScalaVim で書いている状況でやりたいと思います。

まずは ctags の設定

ctags そのままでは Scala の書き方がわかりませんので、

~/.ctags

に正規表現で Scala の表記パターンを追加します。
もし上記ファイルがない場合はファイルを作成して内容を追加してください。
この方の gist で内容はほぼ OK なはずです。

ctags file ― Gist : https://gist.github.com/1277336

Scala の場合、定義パターンの前に lazy など色々つくので上の gist では用意してありますが
不要なものもありますので気になる方は修正してください。


なお、 ctags は新しいもの(-R の使えるもの・Exuberant Ctags)を使ってくださいね。
特に Mac に最初から入っている ctags は古いので注意です。


これで ctags が Scala 用のタグファイルを作ってくれるようになりましたので、
試しに scalaz のタグを作ってみましょう。

cd hogehoge/scalaz/
ctags -R .

きちんとタグファイルができた場合、
コマンドを実行したディレクトリに tags という名前のファイルができています。

tagbar

以上の作業で Vim を利用して Scala のソースを開くとタグジャンプなどの機能を使えますが、
どうせならタグ(パッケージやクラス、メソッド)の一覧を表示したいものです。
Scala 以外にもタグ一覧表示に taglist.vim を少しいじって使っていましたが、
tagbar に入れなおしてみました。

majutsushi/tagbar - GitHub : https://github.com/majutsushi/tagbar

f:id:nishikawasasaki:20111226143817p:image:w360
タグの種類に応じて折りたたみが可能でキレイです。


tagbar 標準では Scala のタグに対応していませんので Scala 用の設定を追加します。
こちらの説明にあるように、

Support for additional filetypes - GitHub :
https://github.com/majutsushi/tagbar/wiki/Support-for-additional-filetypes

.vimrc へ Scala 用の設定を追加します。


ctags の場所を明示的に指定するには

let g:tagbar_ctags_bin = '/usr/local/bin/ctags'

としてやります。
Mac と Win で ctags の場所が異なる場合、

if has("mac")
	let g:tagbar_ctags_bin = '/hogehoge/ctags'
endif
if has("win32")
	let g:tagbar_ctags_bin = 'C:\hogehoge\ctags.exe'
endif

のように切り分けると良いでしょうか。

完成

以上で完成です。
unite-outline を に当てているため似たようなキーとして

nnoremap <silent> <leader>o :TagbarToggle<CR>

を設定しています。
一方 unite-outline は

nnoremap <silent> <C-o> :<C-u>Unite -auto-preview outline<CR>

としてプレビュー表示もしているのでなんとなく気分で使い分けています。
f:id:nishikawasasaki:20111226145906p:image:w360

Vim の Color Scheme を自作するためのあれこれ

Vim Advent Calendar 2011 : ATND 22日目です。

担当は、
2011 My Best Life Changing 賞が
vim-arpeggio を使った

"jk同時押しでEsc
call arpeggio#load()
Arpeggionmap jk <Esc>
Arpeggioimap jk <Esc>
Arpeggiocmap jk <Esc>
Arpeggiovmap jk <Esc>
Arpeggionmap fj <Esc>
Arpeggioimap fj <Esc>
Arpeggiocmap fj <Esc>
Arpeggiovmap fj <Esc>

を今更選ぶ nishikawasasaki です。



設定やプラグインのお話が多そうなので、気分を変えて Vim の見た目の話です。
Vim の Color Scheme について軽く触れてみたいと思います。
なんだかんだで世の中見た目が9割9分、自分好みの色設定を作れば Vim で作業してるだけでハッピーですね!
特に最近の gVim を対象にしています。

colorscheme コマンド

まずは基本ですね。
カラースキームを確認/適用するためのコマンドです。

:colorscheme
:colo

で実行できます。
引数なしで現在のカラースキーム名を表示します。
引数としてカラースキームの名前を与えると、その名前のカラースキームを適用します。
カラースキーム定義ファイルは runtimepath に設置してある必要がありますので、

~/.vim/colors

などに格納しておきましょう。
環境によっては上記に定義ファイルを置いてもうまく読み込まない時があります。
そんな時は自分の設定ファイル置き場ではなく、
Vim 本体のファイル類がある runtime 以下のそれらしいところに定義ファイルを置くと
無理矢理ですが読み込んで動いたりします。

最初のおまじない

さてカラースキームの定義ファイルでだいたい最初に書いてある部分を見ていきます。

set background=dark

背景色の設定を行います。
Vim はあらかじめ明るい背景(白)にあった色のセットと、
反対に暗い背景(黒)にあった色のセットを持っています。
明るい場合は light を指定し、暗い場合は dark を指定します。
イメージする Vim の見た目に応じて light か dark を設定してくださいね。


次に

hi clear
if exists("syntax_on")
  syntax reset
endif

の部分ではシンタックスハイライトの設定を一度全てデフォルトに戻しています。
これから設定する色の定義と今の色の定義が混ざらないようにする為ですね。

let colors_name = "hogehoge"

ここではカラースキームの名前を設定しています。
上の例では hogehoge カラースキームということになります。
ファイル名も hogehoge.vim とすることが多いようです。

設定 highlight コマンド

さて本題の色を設定する部分 highlight コマンドです。

:highlight
:hi

で実行できます。
基本的な文法は

:hi 色の設定を行う属性名 見た目の設定をするグループ名

のようになります。
「属性」と「グループ」の例を挙げると

hi Normal guifg=#000000

の場合「Normal」グループに対して #000000 の色を「guifg」属性へ設定する、となります。
Normal はハイライトされない部分、つまり普通の文字すべてに影響します。
guifg は gui あり(gVim)で使った場合のフォントカラーに影響します。
まとめると「通常部分の文字色を黒(#000000)に設定する」となります。


属性の代表的なものは

属性名 設定箇所 引数
guifg gVimの文字の色 色コード#6桁 or 定義済み色名
guibg gVimの文字の背景色 色コード#6桁 or 定義済み色名
gui gVimの文字の属性(太字など) bold(太字)、underline(下線)などなど
ctermfg ターミナルで起動したVimの文字色 色コード#6桁 or 定義済み色名 or ターミナルの色番号
ctermbg ターミナルで起動したVimの文字背景色 色コード#6桁 or 定義済み色名 or ターミナルの色番号
cterm ターミナルで起動したVimの文字の属性 bold(太字)、underline(下線)などなど

のように GUI 用とターミナル用の設定項目があります。

2011/12/23追記
コメントで指摘頂きました。
ターミナルでは6桁色コードでの指定はできませんでした。
また色コード指定可能部分は3桁の色コードでもOKです。
thincaさんありがとうございます。



グループは構文(シンタックス)を似たもの同士でまとめたものであって、
そのシンタックスに色の設定(ハイライト)をすることで Vim 上で色の表現が行われます。
色や効果を設定できるグループにはあらかじめ設定されているものがあり、
代表的なものには

属性名 設定箇所
Cursor カーソル位置
CursorIM カーソル位置(IMEオンの時)
Normal 通常時のテキスト
Search 検索文字
Visual 選択箇所
StatusLine ステータスライン

などがあります。
他にもシンタックスハイライトとして自分でも定義できます。
プログラミング言語用のプラグインを導入すると
その言語の構文に応じて色を表現してくれると思いますが、
この自由に定義できる機能を利用しています。
全て挙げているとキリがありませんので Vim の highlight ヘルプを御覧ください。
他にも Vim 付属の Color Scheme を見てみるとなんとなく名前から想像が付くと思います。

応用編

上記の方法で好きなグループに好きな色を設定していくと、自分好みの色設定を作ることが可能です。
しかし全体のバランスを考えると同じ色を複数箇所で使ったりするなど
色の設定もシステマチックに設定したくなります。
そんな時に使えるのが

link

です。

hi link グループA グループB

と記述することでAの設定をそのままBに適用することができます。
同じ色番号を複数箇所に嫌になるほど書くのを軽減できると思います。

もっと応用編

いきなりですが下のリンク先をご覧ください。

colors/Tomorrow-Night-Bright.vim
GitHub : https://github.com/ChrisKempson/Vim-Tomorrow-Theme/blob/master/colors/Tomorrow-Night-Bright.vim

見た目がこれまで考えてきたものと違いますね。
Color SchemeVIm の設定ですので、この Color Scheme ではプログラム的に色の設定を行なっています。

let s:foreground = "eaeaea"

変数 foreground に "eaeaea" をいう文字列をセットしているように、
色コードを変数にセットして複数箇所で使い回しできるように工夫しています。
そして highlight 自体も直接呼び出すのではなく、

fun <SID>X(group, fg, bg, attr)
		if a:fg != ""
			exec "hi " . a:group . " guifg=#" . a:fg . " ctermfg=" . <SID>rgb(a:fg)
		endif
		if a:bg != ""
			exec "hi " . a:group . " guibg=#" . a:bg . " ctermbg=" . <SID>rgb(a:bg)
		endif
		if a:attr != ""
			exec "hi " . a:group . " gui=" . a:attr . " cterm=" . a:attr
		endif
	endfun

の部分のように
引数で与えたグループ、文字色、背景色、属性から highlight を組み立てる関数を作成しています。
こうしておくことで

call <SID>X("Visual", "", s:selection, "")

のように Visual グループへ変数 selection 、つまり"424242"の色を設定することができています。

終わりに

どうでしょう、自分好みの Color Scheme を作れそうでしょうか?
といっても実際に Color Scheme を作る際は、上のような仕組みを意識することはなく
ひたすら色コードを設定しては悩み、設定しては悩みを繰り返す作業がメインだと思います・・・。


上に挙げた Tomorrow-Night-Bright.vim はとても良いですね!
また

Vim color scheme: Wombat « Lars H. Nielsen’s Blog :
http://dengmao.wordpress.com/2007/01/22/vim-color-scheme-wombat/

も良い感じです。


さてキレイに作られたものをそのまま使っても良いのですが、
そのままでは色がつかなかった部分、自分の好みではない色の部分などちょこちょこ修正しながら、
世界に1つだけの自分好みの Vim を作り上げてみてください!
超カッコイイ!超かわいい!超スイーツ()!超目に優しい!いろんな自分好みがあると思います。
きっとエディタを立ち上げて文字を表示・入力しているだけで楽しくなれるはずです!!


さて駆け足な上に長くなってしまいましたがココらへんで22日目を終わります。
明日 2011/12/23 は @LeafCage さんです。