読者です 読者をやめる 読者になる 読者になる

Emacs/mode-compile.el に ruby モードを付け足す

elispmode-compile.elEmacsの別ウィンドウにスクリプトの実行結果を出力//next-errorでエラー箇所にジャンプ できるのがとっても気に入っているんですが、Ruby用の設定が含まれていないようなので付け足してみました。next-errorにもいちおう対応しています。



赤文字の部分をmode-compile.elに追加していきます。
(順番に依存してないので、リストの中のどこにでも挿入してもいいんですが、Perlのそばに挿入しておきました :)

(defvar mode-compile-modes-alist
  '( (c-mode                . (cc-compile        kill-compilation))
    (c++-mode              . (c++-compile       kill-compilation))
    (ada-mode              . (ada-compile       kill-compilation))
    (fortran-mode          . (f77-compile       kill-compilation))
    (dired-mode            . (dired-compile     kill-compilation))
    (emacs-lisp-mode       . (elisp-compile     keyboard-quit)) 
    (lisp-interaction-mode . (elisp-compile     keyboard-quit)) 
    (makefile-mode         . (makefile-compile  kill-compilation))
    (sh-mode               . (sh-compile        kill-compilation))
    (csh-mode              . (csh-compile       kill-compilation))
    (zsh-mode              . (zsh-compile       kill-compilation))
    (perl-mode             . (perl-compile      kill-compilation))
    (ruby-mode             . (ruby-compile      kill-compilation))
    (fundamental-mode      . (guess-compile     nil)) ; bound dynamically
    (text-mode             . (guess-compile     nil)) ; itou
    (indented-text-mode    . (guess-compile     nil)) ; itou
    (compilation-mode      . (default-compile   kill-compilation)))

  ;;;コメント部分省略;;;

)
(defvar mode-compile-shell-alist
  '( ("sh"   .  sh-mode)
    ("csh"  .  csh-mode)
    ("zsh"  .  zsh-mode)
    ("ruby" .  ruby-mode)
    ("perl" .  perl-mode))

;;;コメント部分省略;;;;

")

以下は任意の場所に書いてもらって構いません。mode-compile.elをいじるのが嫌であれば、.emacs中に書いてもいいかもです。
(Perlだといつも-wオプションをつけて実行するけど、Rubyでもそうなんですかね?もしちがうなら ruby-dbg-flagsを書き換えてください...)

(defvar ruby-dbg-flags "-w"
  "*Flags to give to perl for debugging a Ruby script.")

(defvar ruby-compilation-error-regexp-alist
  '( ("^\\([^:]+rb\\):\\([0-9]+\\):.*" 1 2))
    "Alist that specifies how to match errors in Ruby output.
See variable compilation-error-regexp-alist for more details.")

(defun ruby-compile ()
  (mc--shell-compile "ruby" ruby-dbg-flags ruby-compilation-error-regexp-alist))

以上をソースに記載したら、rubyを書いて C-c C-c mode-compile // エラーが出たら next-error でエラー箇所にポインタを自動移動して修正 の繰り返し作業ができますです。

Meadowだと ruby-compilation-error-regexp-alist 中の正規表現を書き換えないとnext-errorがうまく動かない可能性あり。
*いちおうCarbon Emacs / Mac /usr/bin/emacs , Linux で試したんですけど、Rubyの出力如何ではうまくいかないかもしれまっせん。標準的なエラー出力にしか対応できない
基本的Perlの定義を借りてRubyのものにしている


追加設定

なおmode-compile.elはスクリプトコンパイル時に、バッファのセーブをするかどうかとスクリプトに引数を渡すかどうか を聞いてくるんですが、書きなぐりのスクリプトを書いている時にはこれにいちいち答えるのが面倒なので以下のような設定を施しました。これやると C-c C-c mode-compile のツーストロークで バッファのセーブ => スクリプトの実行 をやってくれるので速くて快適です。


設定ファイル中に

;;; in your config file
(setq mode-compile-always-save-buffer-p t)
(setq mode-compile-never-edit-command-p t)
(setq mode-compile-expert-p t)
(setq mode-compile-reading-time 0)

というのを付け加えて、mode-compile.el中の関数を書き換え(赤字コメントアウト)
(自分の設定ファイルの中に書いてオーバーライドしてもいいかも。)

(defun mc--shell-compile (shell dbgflags &optional errors-regexp-alist)
  ;; Run SHELL with debug flags DBGFLAGS on current-buffer
  (let* *1
;;                                              mc--shell-args)))))
    ;; Modify compilation-error-regexp-alist if needed
    (if errors-regexp-alist
        (progn
          ;; Set compilation-error-regexp-alist from compile
          (or (listp errors-regexp-alist)
              (error "Compilation abort: In mc--shell-compile errors-regexp-alist not a list."))
          ;; Add new regexp alist to compilation-error-regexp-alist
          (mapcar '(lambda(x)
                     (if (mc--member x compilation-error-regexp-alist) nil
                       (setq compilation-error-regexp-alist 
                             (append (list x)
                                     compilation-error-regexp-alist))))
                  errors-regexp-alist)))
    ;; Run compile with run-cmd
    (mc--compile run-cmd)))


予備:mode-compile設定例

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;MENU mode-compile.el
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(autoload 'mode-compile "mode-compile"
  "Command to compile current buffer file dependently of the major mode" t)
(global-set-key "\C-c\C-c" 'mode-compile)
(autoload 'mode-compile-kill "mode-compile"
  "Command to kill a compilation launched by `mode-compile'" t)
(global-set-key "\C-c\C-k" 'mode-compile-kill)

(setq mode-compile-always-save-buffer-p t)
(setq mode-compile-never-edit-command-p t)
(setq mode-compile-expert-p t)
(setq mode-compile-reading-time 0)

*1:shcmd (or (mc--which shell) (error "Compilation abort: command %s not found" shell))) (shfile (or (buffer-file-name) (error "Compilation abort: Buffer %s has no filename" (buffer-name)))) (run-cmd (concat shcmd " " dbgflags " " shfile " "))) ;;;カッコを足すこと ;; (setq mc--shell-args ;; (read-string (if mode-compile-expert-p ;; "Argv: " ;; (format "Arguments to %s %s script: " ;; shfile shell