Emacs24.3(for Mac OSX)でUnity用のC#を書くために

前提

  • auto-completeを導入. 以前の記事を参照
  • monoの最新版を導入

csharp-modeの導入

Emacs 24.3にはC#用のメジャーモードがデフォルトで用意されていないため、csharp-mode.elを入れる.

curl -O http://www.emacswiki.org/emacs/download/csharp-mode.el
mv csharp-mode.el ~/.emacs.d/site-lisp/

OmniSharpの導入

C#のコード補完を行うためにOmniSharpを導入する.

git clone git@github.com:nosami/Omnisharp.git
cd Omnisharp
git submodule update --init --recursive
cd server
xbuild /p:Platform="Any CPU"

これでOmniSharp/bin/Debugの中にOmniSharp.exeが生成される. 後で紹介するomnisharp-emacsが隠蔽してくれるのであまり使う事にはならないが使用方法を以下に示す.

mono OmniSharp/bin/Debug/OmniSharp.exe -s path/to/you/hoge.sln

omnisharp-emacsの導入

omnisharp-emacs*1はOmniSharpを起動しそれと通信を行う事でそのプロジェクト内にあるファイルの補完候補をEmacs上で提示してくれる.

cd clone git@github.com:sp3ctum/omnisharp-emacs.git
cp omnisharp-emacs/omnisharp.el ~/.emacs.d/site-lisp

設定

(autoload 'csharp-mode "csharp-mode" "Major mode for editing C# code." t)
(add-to-list 'auto-mode-alist '("\\.cs$" . csharp-mode))
(require 'omnisharp)
(setq omnisharp-server-executable-path (expand-file-name "/path/to/OmniSharp.exe"))
(add-hook 'csharp-mode-hook
            #'(lambda ()
                (omnisharp-mode)
                (ac-common-setup)))
(global-auto-complete-mode t)

とすれば動く……と思ったら動かない. byte compileでomnisharp-emacsがエラーを吐くので修正が必要

--- omnisharp.el
+++ omnisharp.el
@@ -563,7 +563,7 @@ solution."
                               ;; dll and csproj files
                               ))
          (tmp-params (omnisharp--get-common-params))
-         (params (add-to-list 'tmp-params
+         (params (add-to-list (omnisharp--get-common-params)
                               `(Reference . ,path-to-ref-file-to-add))))
     (omnisharp-add-reference-worker params)))
 
@@ -1694,7 +1694,7 @@ ido-completing-read. Returns the chosen element."
       (cdr (assoc 'QuickFixes quickfix-response)))
      other-window)))
 
-(defun omnisharp-navigate-to-solution-member-other-window
+(defun omnisharp-navigate-to-solution-member-other-window ()
   (omnisharp-navigate-to-solution-member t))
 
 (defun omnisharp-navigate-to-solution-file

こんな雰囲気のpatchをomnisharp.elにあててbyte compile.

使用方法

Unityでメニューの"Assets"から"Sync MonoDevelop Project"を選択してsln/projファイルを生成し、OmniSharpに解析対象のslnを渡す. omnisharp-emacsを使用する場合は以下のようになる.

(omnisharp-start-omnisharp-server (expand-file-name "/path/to/your_unity_project.sln"))

これでOmniSharpのサーバーが起動する. 面倒なのでinteractiveな函数を作る.

(defun my-omnisharp-start (sln)
  (interactive "fOpen sln: ")
  (omnisharp-start-omnisharp-server (expand-file-name sln)))

後は該当のC#コードを開き、`M-x my-omnisharp-start'で対象のソリューションファイルを指定する事で、補完が捗るようになる. 定義へジャンプも可能なようだ(まだ試していない)

*1:omnisharp-emacs(version: 2.0)は別途"json(1.2)", "dash(1.8.0)", "popup(0.5)", "auto-complete(1.4)", "flycheck(0.19)", "csharp-mode(0.8.6)"が必要なので, package-installなり手動なりでinstall.