syntax/eruby.vim

verilogを生成するのにerubyを使うことがあるので,vim標準で添付されているsyntax/eruby.vimを.vim/afterにコピーし,以下のように修正してみました.

--- /share/vim/vim73/syntax/eruby.vim     2013-05-07 08:41:24.214499103 +0900
+++ .vim/after/syntax/eruby.vim        2013-05-16 21:59:04.787502420 +0900
@@ -6,6 +6,13 @@
 " Anon CVS:            See above site
 " Release Coordinator: Doug Kearns <dougkearns@gmail.com>

+if exists("b:current_syntax") && b:current_syntax == 'eruby'
+  unlet b:current_syntax
+  if exists('b:eruby_subtype')
+    unlet b:eruby_subtype
+  endif
+endif
+
 if exists("b:current_syntax")
   finish
 endif
@@ -38,6 +45,8 @@
   elseif b:eruby_subtype == 'txt'
     " Conventional; not a real file type
     let b:eruby_subtype = 'text'
+  elseif b:eruby_subtype == 'v'
+    let b:eruby_subtype = 'verilog'
+  elseif b:eruby_subtype == 'gp'
+    let b:eruby_subtype = 'gnuplot'
+  elseif b:eruby_subtype == 'sp'
+    let b:eruby_subtype = 'spice'
   elseif b:eruby_subtype == ''
     let b:eruby_subtype = g:eruby_default_subtype
   endif

全半部分の修正は,after以下に置いたせいで追加されているだけで,本質は後半の6行だけです.
verilogの他にもspiceのネットリストやgnuplotのコードでも使いたいので,それ関係も追加してます.

verilogの部分と,erubyの部分でそれぞれ色が付いてくれて良いんですが,filetypeがerubyになってるためsyntax補完の候補rubyしか出てこないので,その部分は不便です.
erubyを開いたときは補完候補rubyと他の言語も出てくるようにすべきかもしれません.

雑記

半年くらい放置してしまいました….お久しぶりです.

いろいろと忙しかったような気がします.チップ作ったり論文書いたり発表したり論文書いたり,就活もあったり(就活終わりました).今年度に入ったとたん研究室の環境ががらりと変わってしまって炎上しそうです.ちょっと勘弁してください.

就活終わったので久しぶりに電子工作したいなって考えつつ,タイミング良くカメラのリモコンの調子が悪くなったので自分で作ってみようと思ってます.プログラム書きつつAVRに書き込もうとしたらいろいろと失敗してIC5個くらい昇天しました….ヒューズビット書いたりプログラム書き込むと,それ以降はICがライタに認識されない….ほかにもavr-gccで快適化オプションつけてコンパイルすると変数が最適化によって消える問題があって困ってます.コンパイル通ってもいざ書き込むとうまく動いてくれないので,あらかじめデバッグする必要がありそうですね.linuxmacデバッグするのが面倒なのでwindowsにAVR Studioをいれてデバッグしてます.とはいえできればlinuxでやりたいのでgdbデバッグする方法をあとでまとめてみようと思います.

Windows 8 購入

ボクの中で Windows がほぼ XP で止まってたので 8 を買ってみました.
正確に言うとちょこっと Vista を使った物のまったく使いこなせず Ubuntu に乗り換えたり,7 を使う機会があった物の使用目的の違いでdebianを使ってたりしました.

あまり Windows を使う機会はないですが,オシロスコープロジックアナライザ用のソフトウェアがどうしてもWindows でないと使えないですし,そのうち iModela 等も買ったらという事を考えると Windows が必要です.とはいえずっと XP を使うのもどうかと思ったので買いました.

MacBook Pro Retina "15 に Vmware Fusion を入れているので,その上に 64bit 版を インストールしました.仮想環境で使用する場合も DSP 版ライセンスで使える用で,1万円ちょっとで買えました(Pro じゃないです).


画面の右上にカーソルを持って行くとチャームバーというのが表示されるのですが,仮想環境だと右上で止まらないのでこのバーを出すのがちょっと大変です.
地味にイライラするので,仮想環境上で動かす場合はフルスクリーンで使用することをお勧めします.


せっかくなのでパフォーマンス評価をしてみました.

プロセッサは 2 個,メモリは 2GB 割り当ててます.3D アクセラレータはオンにしてますが,デスクトップグラフィックスのパフォーマンスが酷いですね.おそらく画面解像度を1680x1050にしてる(Macの設定に合わせている)ためでしょうか.

追記
グラフィックが低いのは,Intel HD Graphics 4000 が使われていたからという可能性が高かったので,再度パフォーマンス評価を行いました.

予想通りさっきのスコアは Intel HD Graphics が使われていたようで,NVIDIA GeForce GT 650M が使われれば全く問題ないスコアを出すようです.

Homebrew で gfortran 周りのエラーを解決

最近 Mac の OS を入れ直すことがあって,Homebrew を入れ直したらいろいろと困ったことが起きたので解決策をメモっておきます.

問題点

brewoctave, Rなど(gfortran)が必要なソフトウェアが正常にインストールできない.


brew では gfortran が必要なプログラムをインストールする場合,gfortran は自動でインストールしてくれない仕様になっているようであらかじめインストールする必要があります.
しかしちゃんと gfortran をインストールしたにもかかわらず R などをインストールしようとすると gfortran が見つからなかったからインストールしろとのエラーが表示されました.

This formula requires a fortran compiler, but we could not find one by
looking at the FC environment variable or searching your PATH for `gfortran`.
Please take one of the following actions:
(略)

のようなエラーが表示されてしまいます.

環境

%brew -v -> Homebrew 0.9.3

解決方法

/usr/local/Library/Homebrew/superenv.rb の def setup_build_environment にある以下の部分を書き換える,

#ENV['PATH'] = determine_path
ENV['PATH'] = determine_path + ENV['PATH']

原因としては,ENV['PATH'] が PATH の情報をもってて,元々のソースでは PATH を全部書き換えてしまってるようです.
ひどいことにボクの環境では/usr/local/binすら削除されて gfortran がたどれなくなっていました(ちなみに brewfortran がインストールされてるかを調べるのに使っている ENV.fortran は `/usr/bin/which gfortran` が空になっていないかで判断していました.


とまぁこんな具合でした.ほかにも readline 周りでエラー吐いてるプログラムも何個かあったような気がしますが,こっちはよくわかってません.
余談ですが,brew 経由で octave を入れる場合は,octave を入れる前に gfortran と MacTex を入れましょう.MacTex は octavetex の何か(忘れました)が必要なのですが,brew では tex 入れられないので何かしらの方法で(本ブログでは MacTex を推しておきます,インストールが比較的簡単なので)インストールしておきましょう.なお MacTex は Homebrew をインストールしてから入れるように.

vi モードでの状態を表示

zshell を vi モードで使う場合に,今どのモードで作業してるか分からなくなるときがあります.
ノーマルモード (vicmd) にいるときに, RPROMPT になにやら表示するようにしてみました.

参考: oh-my-zsh/vi-mode.plugin.zsh at master · robbyrussell/oh-my-zsh · GitHub

function zle-line-init zle-keymap-select {
  zle reset-prompt
}

zle -N zle-line-init
zle -N zle-keymap-select

function vi_mode_prompt_info() {
  [[ $KEYMAP == 'vicmd' ]] && echo "%{e[33;1m%}NORMAL%{e[0m%} "
}

RPROMPT='$(vi_mode_prompt_info)'

参考とほぼ一緒です.表示される原理としては

  • 何からの方法で zle-line-init, zle-keymap-select が呼ばれる.
  • zle-line-init, zle-keymap-select から reset-prompt が呼ばれる(上の2行目).
  • reset-prompt により RPROMPT の再描画が起こる.
  • RPROMT の $(vi_mode_prompt_info) から vi_mode_prompt_info() が呼ばれる.
  • $KEYMAP が 'vicmd' なら 黄色字で NORMAL と表示される(上の9行目).

といった具合でしょうか.インサートモードやノーマルモードに変わったときは,おそらく zle-keymap-select が呼ばれるのでは無いかと思ってます.


ところで最近 zsh 5 がリリースされてましたね.何が変わったかよく分かってないですけどとりあえず入れてみました.便利な機能が追加されてると良いですね.

copy mode の挙動をよりvim っぽくする

emacs の用に vim だけで何でも完結させられないボクなので zsh や screen を酷使してます.
とはいえソフトウェア別に似たようなコマンドが全く異なるキーバインドにされるのは困ってしまうので,なるべく似たようなキーバインドに調整しています.
今回は screen の copy mode を vim の visual mode に近い挙動をするように調整してみました.

bind  ; eval colon 'bindkey -m y' 'bindkey -m V' 'bindkey -m ^v'

# y はデフォルトでは1行を自動で選択
# bind ^v eval 'bindkey -m -t y stuff Y' copy
# vim の矩形選択モード
# bindkey -m -t ^v eval 'stuff "c "'  'bindkey -m -t y stuff "C "'
# vim の行選択モード
# bindkey -m -t  V eval 'stuff "0 $"' 'bindkey -m -t y stuff "$ "'
bind ^v eval "bindkey -m -t y stuff Y" "bindkey -m -t ^v eval 'stuff \"c \"'  'bindkey -m -t y stuff \"C \"'" "bindkey -m -t  V eval 'stuff \"0 $\"' 'bindkey -m -t y stuff \"$ \"'" copy

追記
コマンドラインに入った後に ^V, V を再設定できていなかったので修正しました.すごく気持ち悪く….
追記おわり

ボクは screen のエスケープに ^G (と ssh 先の端末では ^T) を使用しています.vim では v, ^V, V で visual mode に入りますが,今回 screen では ^G ^v で copy mode に入るようにしています.一旦 ^G ^V で copy mode に入ってからさらに ^V をタイプすると矩形選択,V をタイプすると行選択になるようにしました.選択してからのコピーは y をタイプすれば各モードに応じたコピーの仕方をしてくれます.
ついでに copy mode に入った直後に y をタイプすると1行だけコピーするようになってます(これは yy を意識しました).

ポイントは bindkey の設定方法でしょうか. copy mode でのバインドを変更する場合は bindkey -m -t で設定するみたいです(-t がなんで必要なのかがちゃんと理解できてませんが).
ひとつのバインドに複数の挙動を割り当てるには eval でやります.screen ではよく使う手法ですかね.


まずは下の方から見ていきましょう.まず ^v の bind です.これで copy mode に入る事になりますが,先に y を Y にマップし直してます. Y は1行をコピー (vim では yy) するキーです.
次に bindkey でマップした ^v です.vim では矩形選択が始まりますが,screen では c で左端を決めて space でカーソル位置を選択開始という風になってます.ついでに y を右端を決める(C),選択範囲をコピー(space)とするようにマップし直します.
最後の V の bindkey も ^v と似た方法でやってます.V は vim では行単位で選択になってるので,screen では
0 で一番左端に移動,$ で一番右端に移動という風にやっています.

追記
というのを1行で書いてます.^G^V をタイプすると まず y, ^V, V の keybind をすべて登録し,その後に copy mode に入るようになってます.
追記おわり

これだけでとりあえずは copy mode は十分動いてくれるのですが, bindkey -m で設定すると "Edit mode key binding" として設定されるようです.副作用はコマンドライン入力中が Edit mode みたいなので,copy mode として bind したものが入力されてしまいます.これを解決するために,1行目の様な方法でコマンドラインに入った直後に bindkey を解除しています.


vim 見たいに cmap や vmap 等のように細かなモード別でマッピングできて欲しいですね.

ロケールの固定しない

今まで使用していた環境がすべてUTF-8だったので,zsh,screen,vimのすべてがそれに想定された設定にしていたため,全部適切に調整するのに大変苦労しました.
端末によっても様々なので,1つに固定しない様な設定にすることにしました.

vim

.vimrcに記述していた,'encoding'と'termencoding'をコメントアウト
'encoding'は特に指定しなければユーザのロケールの値が使われるのでむやみに設定しなくても良さそうでした(:help 'encoding').
'termencoding'は指定しなければ'encoding'と同じ値を使用するようですのでこちらも特に指定しない方がいいかもしれません.

screen

.screenrcに記述していたencoding, defencoding, defkanjiをコメントアウト
encoding, defencodingは特に指定しなければvim同様にユーザのロケールに合わせてくれます.
defkanji自体はmanに載ってないのですが,カーソル移動関係で問題を起こさないようにする物のようです.
http://www.gaku.net/uklog/a453.html

zsh

これはとても苦労しました.なんせ.zlogin, .zshrc, .zshenvの3種類に手を加えることになったので.一応おさらいしておくと通常は

  • /etc/zshenv
  • $ZDOTDIR/.zshenv
  • /etc/zprofile
  • $ZDOTDIR/.zprofile
  • /etc/zshrc
  • $ZDOTDIR/.zshrc
  • /etc/zlogin
  • $ZDOTDIR/.login

の順で読み込まれます($ZDOTDIRは特に指定しなければ$HOMEを読む).ただしログインシェルの場合zprofile,zloginは読まれず,zshrc以降は対話的に使用してる場合しか読み込まれません(man zshallのSTARTUP/SHUTDOWN FILESの項目).
(zshの本によれば,通常.zshenv, .zshrc, .zloginの3つを書けば良いとのこと)


読み込まれる場合とタイミングを注意すれば,ロケールの設定はzshenvにのみ書けばいいと思います.と言うことでなぜかzshrc, zloginに書いてたLANGの設定を削除しました.
zshenvは,ボクは各マシン固有で持たせてるのですが,研究室マシンではひな形が既に用意されてたので,それを編集しました.余談ですがざっと斜め読みしたら何点か突っ込みたい部分が見受けられました.
基本的には端末がデフォルトで指定してくれるはずなのでむやみに設定しない方がいいと思います.デフォルトで設定してくれない端末だけcase文で指定すれば良いと思います(そういうのがあるのかわかりませんが).
どのロケールでも使える端末ならUnicode(UTF-8)を指定するのが個人的にオススメです.今やeucオワコンだと勝手に思ってます(がこういうことがあるので何ともいえませんね).


これでとりあえずはロケールがおかしくならないようになりました.設定ファイルを様々な環境に持ち出す際はなるべく環境依存な設定を行わないようにするのが吉ですね.