ruby

概要

Ruby のコードを編集する上での設定をここには書いている。別の箇所で rspec-mode などの設定も書いているのでいつか記述場所を統合した方が良さそうな気もする

rbenv.el

Ruby のバージョンを切り替えられる rbenv を使ってるので Emacs 上でもそれが使えるように rbenv.el を導入している。

インストール

インストールはいつも通り el-get でやっている

(el-get-bundle rbenv)

有効化

そして global に有効化している。というか global じゃない有効化ってあるのかなってのと、あるとしても意味があるのかな的な。

(global-rbenv-mode)

enh-ruby-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))

encoding のマジックコメントが入らないようにする

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

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))
  • コード折り畳み用に origami を有効化
  • 補完用に company-mode を有効化
  • CamelCase の単語区切りを有効にするため subword-mode を有効化
  • 今いる関数名が mode-line に出てると便利げなので which-function-mode を有効化
  • solargraph を使ってるので lsp-mode を有効にしている
    • lsp-ui-mode も有効にして色々な情報を表示している
  • また lsp-mode の自動フォーマットを保存時に実行するようにしている
  • 開きカッコと閉じカッコの組み合わせがズレないように smartparens-strict-mode を有効にしている
  • 行番号も表示されている方が便利なので display-line-numbers-mode を有効にしている

それらを設定する関数を enh-ruby-mode-hook に突っ込んでいる

(add-hook 'enh-ruby-mode-hook 'my/enh-ruby-mode-hook)

SKK の調整

enh-ruby-modecontext-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 があるから要らなさそう