ScalaプログラミングはなんといってもEmacs+Ensimeですね!
先週サブノート目的でMacBook Air 11inchを入手したのですが、Emacs+Ensimeで満ち足りてしまって、まだEclipseは入れていない状況です。
Emacsのどこがよいかというと、まずテキストエディタとしての基本機能、シェルモードやディレクトリモードといったシェル機能が充実している点が挙げられますが、なんといってもelispで比較的簡単にカスタマイズができるのがよいですね。
カッコの捌き方
Scalaプログラミングをする時の生産性に影響があるのが「{」「}」の捌き方です。たとえば:
abc {といれると、自動的に括弧を開いてくれてカーソルを所定の位置に持って行ってくれると便利です。
abc {
←カーソル
}もちろん、これぐらいの自動化はどのエディタにもついていると思いますが、問題なのは「abc { }」と打った時に自動的・強制的に上の形になってしまうと、逆に「abc { x => x + 1 }」と書きたかった時に手戻りが発生してしまいます。
このような問題があるため、キーの入力で自動的に上記のような整形をする機能(Emacsのscala-modeではscala-mode-feature-electric)は案外使いづらく、ボクもたいてい切ってしまいます。
abc {
←カーソル
}にしたい時と
abc { x => x + 1 }にしたい時のどちらにも対応できる入力方法が欲しいところです。
カスタマイズ
この問題に対処するために、以下のelispの関数を作ってみました。
(defun my-scala-newline(arg)
(interactive "p")
(cond ((scala-in-multi-line-comment-p)
(scala-newline))
((char-equal ?\} (following-char))
(let (killed)
(newline-and-indent)
(newline-and-indent)
(forward-char)
(setq killed (not (my-end-of-line-p)))
(if killed (kill-line))
(previous-line)
(indent-for-tab-command)
(if killed (yank))))
(t
(newline-and-indent))))
.emacsまたはinit.elへの設定は以下になります。
(require 'scala-mode-feature-electric)
(setq scala-mode-feature:electric-expand-delimiters-list '(?\{))
(add-hook 'scala-mode-hook
(function (lambda ()
(scala-mode-feature-electric-mode)
(define-key scala-mode-map "\r" 'my-scala-newline)
まずscala-mode-feature:electric-expand-delimiters-listで「{」のみを有効にするように設定しています。こうすることによって:
abc {と打つと自動的に以下のようになります。
abc { }←カーソルここからの動きがポイントですが、先程のmy-scala-newline関数がReturnに設定されていると、この場所でReturnを押すことで、以下の形に整形されカーソルも所定の位置に移動します。
abc {
←カーソル
}カーソルの位置が他の場所の場合、通常の改行キーの動作をするので、不必要な整形が行われません。「abc { x => x + 1 }」と書きたい時はそのまま入力をしていけばよいわけですね。
括弧を追加する場合の捌き方
my-scala-newline関数は、よく出てくるコーディングパターンをサポートするためにもう一工夫しています。
以下のように一行に書いていた文を:
abc xyz
括弧を入れて複数行に分割したい時がよくあります。
abc {
xyz
}まず、最初の状態で「abc 」の場所で「{」を打つと以下のようになります。カーソルは「}」の上になります。
abc { }xyzここでReturnを押下すると、「}」の後ろのxyzが自動的に括弧内に移動し、カーソルも所定の位置に移動します。
abc {
xyz←カーソル
}簡単なカスタマイズですが、なかなか効果抜群です。

0 件のコメント:
コメントを投稿