Emacs: C Sharp Mode

C# 開発を真剣にやったるぜ、って気はワタシには当面のところはない。ただ pythonnet (のうち特に C# から Python を使う方)の紹介をしてきた都合、やっぱり装飾のないプレインテキストとして C# を読み書きするのは苦痛だ、と。

正直「本気で C# したるぜ」のなら素直に Visual Studio でやんなはれや、とは思う。ワタシは本業として一年くらいの C# 開発経験あるけれど、そのときも emacs も使ってたけど別に Visual Studio の IDE を敬遠してはいなかったし、便利に使ってた、と思う。Microsoft 製は性能にだけは強いこだわりを持って作られてるので、(少なくとも当時の)Eclipse なんかと違って「重過ぎる」ことを理由に敬遠することはなかった。だいいち #region の扱いだとかコメントの可視の切り替えなど、普段使いには存分に便利なはずだ。

「現在のワタシ」はというと、「C# をビルド出来る環境」は持っていても、Visual Studio の IDE は持ってない。BuildTools シリーズ(Build Tools for Visual Studio 2017 など)さえあれば、「人のものをビルドするだけなら」十分だから。(というのもあるし、自分のものを作る場合であっても剥き身のビルドツールセットだけでどうにかしちゃうから。)

ただ C# プログラマだった当時も「Visual Studio だけで」やってたわけではなくて、「ウザいと思ったら emacs で」なんてのは普通にやってた。今どうかはわからないんだけれど、少なくともワタシがやってた頃は Microsoft 製の IDE というのは「開発者は凝った IDE を嫌い、emacs などから編集したがるものである」ということを熟知したものになっていて、つまり「外部で編集されることを前提に」作られていた。これは(少なくとも当時の) Eclipse とは全然違っていた。Eclipse は(当時) emacs で外から編集しようものなら、即座に落っこちたりしていた。技術的には単に編集対象のファイルにバックグランドでの監視をしかけてちゃんと措置してるかどうか、だけの話だが、これをしてくれるのとしてくれないのとでは大違い。Eclipse ではとてもじゃないが「emacs も Eclipse も使う」なんてことをする気にはなれなかった。どうしても emacs で編集したければ、ワタシは毎度 Eclipse を閉じてた。バカとしか言いようがないよ、こんなん。起動に何十秒もかかるんだもの。今の Visual Studio の IDE がどんななのかはワタシにはわからないけれど、もし当時と同じなら、やはり「emacs の C# モード欲しい」であろう。

一応「Emacs Wiki」が存在してくれているおかげで、需要が多そうなものなら即座に見つかるはずで、そして多分そこにしか情報はないんだろう。これな:

さっそく「IMenu ってなんね?」なんてのが気になったりする。IMenu に限らず、どうもワタシが欲しい「Syntax Highlighting」以上の、「ちゃんとした IDE」を目指している節があるわね。「Syntax Highlighting だけでええんや」て向きにフィットするであろうかの?

前にほかの emacs major mode 紹介したときにもそうだったが、このパッケージも基本的にパッケージマネージャを前提としているようだ:

「パッケージマネージャ? なにそれ食べれんの?」というワタシのようなマゾ子ちゃんはどうすりゃいいかな? csharp-mode.el を単独で持ってきちゃダメ? ほかに置かれてるものでランタイムに必要そうなものは見当たらんもの、イケるんちゃうか。

てわけで単独でダウンロードしてコピー:

ロードの方法等は csharp-mode.el 自身にコメントで書かれてる:

 1 ;; Installation instructions
 2 ;; --------------------------------
 3 ;;
 4 ;; Put csharp-mode.el somewhere in your load path, optionally byte-compile
 5 ;; it, and add the following to your .emacs file:
 6 ;;
 7 ;;   (autoload 'csharp-mode "csharp-mode" "Major mode for editing C# code." t)
 8 ;;   (setq auto-mode-alist
 9 ;;      (append '(("\\.cs$" . csharp-mode)) auto-mode-alist))
10 ;;
11 ;;
12 ;; Optionally, define and register a mode-hook function.  To do so, use
13 ;; something like this in your .emacs file:
14 ;;
15 ;;   (defun my-csharp-mode-fn ()
16 ;;      "function that runs when csharp-mode is initialized for a buffer."
17 ;;      (turn-on-auto-revert-mode)
18 ;;      (setq indent-tabs-mode nil)
19 ;;      ...insert more code here...
20 ;;      ...including any custom key bindings you might want ...
21 ;;   )
22 ;;   (add-hook  'csharp-mode-hook 'my-csharp-mode-fn t)
23 ;;
24 ;;

Optionally はまぁ後でいいかな、てことでアタシの .emacs に以下追加:

1 ;; C# mode
2 (autoload 'csharp-mode "csharp-mode" "Major mode for editing C# code." t)
3 (setq auto-mode-alist
4    (append '(("\\.cs$" . csharp-mode)) auto-mode-alist))

emacs 再起動がダルい人と、「うまくいったかすぐに試したい」人は例によって eval しなはれや。一番手っ取り早いのがカーソルを末尾に持っていって「Ctrl-x-e」。

めでてぇなと思ったら、依存物があった。cl-lib が必要…。やっぱパッケージマネージャ入れた方が幸せだろうね。なんだろこれ、と思ったら、なんと、「Emacs Common Lisp」。なんに使ってんの? 古い cl をリプレイスするもの、とのことのようで、少なくとも「C# モードらしいこと」をするために必要としているんではないんだろうなぁ、と推測してみる。ここThere is no problem with using the cl package at compile time, with (eval-when-compile (require 'cl)). なんて記述(ランタイムでの警告メッセージの一部)もあることだから、ひょっとしたら「逆に古い emacs 使ってるワシらは (require 'cl) に書き換えちゃえばいいんじゃね?」と:

こうしてから改めて .emacs に追加した部分を eval してめでたく:

うん、よかよか。まぁ「ちゃんとしたいマジメさん」たちはご自分でちゃんとしなはれや。ワタシは不真面目なのでこれでいい、満足だ。

「IDE ぽいこと」(コンパイルとかその他もろもろ)が出来ると書いてあるので、そこまでやりたい人は自分で Emacs Wiki: C Sharp Mode を読んで頑張ってな。