UnityのC#ファイルをEmacsで編集(Windows)

環境

EmacsMonoDevelopやVisualStudioと比較したあと、EmacsC#設定を示します。

MonoDevelop

f:id:itouhiro:20130921234827p:plain
Unity付属のテキストエディタMonoDevelopはインテリセンス的補完や動的補完(Emacsでいう dynamic abbribiation 略してdabbrevVimの入力補完)もできるしEmacsキーバインドにもできて なかなかよいのだが、問題もある。

  • 日本語入力中に文字が見えない。漢字変換し終わったら見えるが、ひらがな入力中・漢字変換中に見えないので困る。
  • なんか動作が遅い。もっとキビキビ動いてほしいなあ。


あとUnity本体にも問題がある。

  • C#ファイル」を新規作成すると「UTF-8 BOM無し」ファイルを作るのだが、これだとWindows版Unity4.1.5で日本語含むC#ファイルがコンパイルエラーを起こす(Mac版ではコンパイルエラーにならない)。「UTF-8 BOM有り」に変換するとWindowsでコンパイル通る。

VisualStudio 2010 Express

f:id:itouhiro:20130921234946p:plain

にも同じことが書いてある。そこではVisualStudioを使うとよい、と書かれているのでやってみた。しかし私の場合だめだった。

  • インテリセンス補完が効かない。

VisualStudioには動的補完がないようなので、インテリセンスで補完できないのは、ぜんぜん補完できないということだ。無料版のExpressなのが悪いのだろうか? 私の設定がまずいのか? いちおうUnityEditor.dll指定してるはずなのだが。

あと

  • 改行コードがLFとCRLFが混ざる。
  • TABと半角空白の区別が見た目でつかない。(設定でどうにかなる?)

という問題もある。


Emacs for gnupack

f:id:itouhiro:20130921235155p:plain
そこで使い慣れたEmacsです。

  • csharp-modeというのを導入すればインデントやキーワード色つけが可能だ。
  • インテリセンス補完はないが、dabbrevがあるので、すでにEmacsの読み込んだファイルのどこかに単語があれば補完できる。
  • 「*.cs」という拡張子のファイルを保存するとき、文字コードUTF-8 BOM有り」改行コード「LF」に自動変換できる。
  • 改行コードLFとCRLFが混ざったのも一目で見て分かる、修正できる。
  • TAB文字と半角空白の区別、trailing whitespaceも、設定次第でカラー表示できる。
  • 動作もキビキビ。起動だけは遅めだ(MonoDevelopやVisualStudioよりは早い)が、Unityと組み合わせるときの私の設定だと「Unityより前」に起動しておいて、ずーっと起動しっぱなしで使うので問題ない。


ただし csharp-mode を導入してもインデントが変だ。
http://www.emacswiki.org/emacs/CSharpMode の画像のインデント、奇妙でしょう。
f:id:itouhiro:20130921235452p:plain
関数のインデントはいいのだが、その中のifやforで {} が後ろに下がる。

  if (a == b)
      {
          Debug.Log("good");
      }

みたいになるのだ。

に修正方法が書いてあったが、そのとおりにしても、こちらの環境では直らない。

の設定ファイルは効果があった。
ただしインデントが半角空白x2だったので、半角空白x4になおしたのが以下。

csharp-setting.el: modify csharp-mode setting. copied alm ...

これで VisualStudio準拠のC#コーディング規則 http://msdn.microsoft.com/ja-jp/library/ff926074.aspxC#書ける。


Emacs自体の設定は

[SetEnv]
    _font_         = Ricty Discord
    HOME           = z:\home

[Emacs]
    geometry       = 100x60+0+0
    fontName       = %_font_%
    fontSize       = 12
    colorTheme     = simple-1
  • Z:\home\.emacs.d 配下に init.elやcsharp-mode.elを置く。
  • Windowsの環境変数設定で EMACS_SERVER_FILE=Z:\home\.emacs.d\server\server と指定。

f:id:itouhiro:20130922002710p:plain

  • Unityで [Edit - Preference - External - Editor] を開いてC:\home\bin\gnupack\app\emacs\emacs\bin\emacsclientw.exe と指定する。
  • Emacsをあらかじめ起動しておく。
  • UnityでC#ファイルをダブルクリックすると、Emacsで読み込まれる。
  • EmacsC#ファイルを閉じるのは通常の操作(私はC-x bでBufferList出してd x)ではだめで、C-x # とする。しかし多数のファイルを開いてしまっていてまとめて閉じたいときにそれは面倒なので、そんなときはEmacs自体を一度閉じてまた起動する。
  • なぜかUnityでC#ダブルクリックしてもEmacsが反応しなくなってしまったときはEmacsを再起動。


私のEmacs設定すべてについては
https://gist.github.com/itouhiro の init.el, emacs23.el, ntemacs23.el, ntemacs24.el にある。上に示したcsharp-sedtting.elというのは実際にはntemacs23.elに含んでいる。Emacs24.2の設定だがEmacs23でも使える。





Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)