Ruby のコードを編集する上での設定をここには書いている。別の箇所で rspec-mode などの設定も書いているのでいつか記述場所を統合した方が良さそうな気もする
Ruby のバージョンを切り替えられる rbenv を使ってるので Emacs 上でもそれが使えるように rbenv.el を導入している。
インストールはいつも通り el-get でやっている
(el-get-bundle rbenv)
そして global に有効化している。というか global じゃない有効化ってあるのかなってのと、あるとしても意味があるのかな的な。
(global-rbenv-mode)
メジャーモードは enhanced-ruby-mode を利用している。が、最近は ruby-mode の方がやっぱり良いみたいな話もどこかで見た気がするので戻ってみるのも手かもしれないと思っている。
いつも通り el-get で入れている。
(el-get-bundle enh-ruby-mode)
enh-ruby-mode が読み込まれた後に setq で以下のように設定されている
(with-eval-after-load 'enh-ruby-mode
(setq enh-ruby-add-encoding-comment-on-save nil)
(setq enh-ruby-deep-indent-paren nil)
(setq enh-ruby-deep-indent-construct nil)
(setq enh-ruby-bounce-deep-indent nil))
enh-ruby-add-encoding-comment-on-save
を nil にすることで
encoding 設定のマジックコメントが入らないようにしている。
これは昔は有効にしておいた方が良かったけど最近の Ruby では設定しなくても UTF-8 が前提になるからむしろ無い方が良いというお話だったはず。
そういう状況に変わったのも大分前なので詳細は忘れた。
ただとりあえず 最新の enhanced-ruby-mode を見るとデフォルトが nil なのでわざわざ設定しなくて良さそう。
enh-ruby-deep-indent-paren
が t の場合
hoge = {
foo: 1
}
みたいな深いインデントになるけど
hoge = {
foo: 1
}
というようにしたいので nil に設定している。
インデントを深くしたくないといいつつ、全然それができないのも困りそうなので
enh-ruby-bounce-deep-indent
を t に設定してタブを押すごとに切り替わるようにしている。
ところでデフォルトで深い方になってるような気がするので今度設定の見直しした方が良さそう。
hook 用の関数で補完などの機能を有効にしている
(defun my/enh-ruby-mode-hook ()
(origami-mode 1)
(company-mode 1)
(subword-mode 1)
(which-function-mode 1)
(copilot-mode 1)
(lsp)
(lsp-ui-mode 1)
(add-hook 'before-save-hook #'lsp-format-buffer nil 'local)
(turn-on-smartparens-strict-mode)
(display-line-numbers-mode 1))
それらを設定する関数を enh-ruby-mode-hook に突っ込んでいる
(add-hook 'enh-ruby-mode-hook 'my/enh-ruby-mode-hook)
enh-ruby-mode
を context-skk-programming-mode
に追加することで
Ruby を使ってる時にコメント部分はクォートの外以外では自動的に日本語入力がオフになるようにしている
(add-to-list 'context-skk-programming-mode 'enh-ruby-mode)
キーバインドは覚えられないので major-mode-hydra でキーを定義している
(with-eval-after-load 'major-mode-hydra
(major-mode-hydra-define enh-ruby-mode (:separator "-" :quit-key "q" :title (concat (all-the-icons-alltheicon "ruby-alt") " Ruby commands"))
("Enh Ruby"
(("{" enh-ruby-toggle-block "Toggle block")
("e" enh-ruby-insert-end "Insert end"))
"LSP"
(("i" lsp-ui-imenu "Imenu")
("f" lsp-ui-flycheck-list "Flycheck list"))
"RSpec"
(("s" rspec-verify "Run associated spec")
("m" rspec-verify-method "Run method spec")
("r" rspec-rerun "Rerun")
("l" rspec-run-last-failed "Run last failed"))
"REPL"
(("I" inf-ruby "inf-ruby"))
"Other"
(("j" dumb-jump-go "Dumb Jump")
("o" origami-hydra/body "Origami")))))
Key | 効果 |
---|---|
{ | do 〜 end と { 〜 } を切り替える |
e | end を挿入する。使ったことない気がする |
i | lsp-ui-imenu の表示 |
f | Flycheck の通知されるエラーのリスト表示 |
s | 関連するテストまたは特定のテストの実行 |
m | カーソル位置のコードのテストを探して実行する |
r | 最後に実行したテストを再実行 |
l | 最後に失敗したテストの再実行 |
I | REPL バッファで Ruby を実行する |
j | dumb-jump で関数定義にジャンプ。dumb-jump 用の hydra があるから要らなさそう |