トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

Ruby

Table of Contents

標準関数の上書き

HATTORI Masashi さんの ruby-mode にいくらか手を入れて使わせていただいている。

とりあえず。

(in-package "editor")

 スクリプトを走らせる(半角スペースを含むパスに対応)

(defun ruby-run-script ()
  "スクリプトを走らせる"
  (interactive)
  (let (command
        (bufname "*Run Script*")
        (file (get-buffer-file-name)))
    (when file
      (when (setq command (read-string "Check: "
                                       :default (concat *ruby-prog* " \"" file "\"")))
        (ruby-error-popup-buffer bufname)
        (execute-shell-command command nil bufname)))))

 スクリプトのエラーチェック(半角スペースを含むパスに対応)

(defun ruby-syntax-check ()
  "スクリプトのエラーチェック"
  (interactive)
  (let (command
        (bufname "*Syntax Check*")
        (file (get-buffer-file-name)))
    (when file
      (when (setq command (read-string "Check: "
                                       :default (concat *ruby-prog* " -wc \"" file "\"")))
        (ruby-error-popup-buffer bufname)
        (execute-shell-command command nil bufname)))))

 インデントの改良

TT プログラマ記 さんの改良。do や end で始まる名前を持つ変数をインデントの対象外に。

(setq *ruby-block-beg-re*
      "\\(class\\|module\\|def\\|if\\|unless\\|case\\|while\\|until\\|for\\|begin\\|do\\)\\>\\($\\|[^_]\\)")

(setq *ruby-block-end-re* "end\\>\\($\\|[^_]\\)")

(defun calc-ruby-indent ()
  "インデントする数を数える"
  (let ((column 0) (curp (point)))
    (save-excursion
      ;前の行を調べる
      (when (ruby-previous-line)
        (goto-bol)
        (skip-chars-forward " \t")
        ; インデント数
        (setq column (current-column))
        ;(message-box (format nil "column1: ~D" column))
        (save-restriction
          (narrow-to-region (progn (goto-eol) (point))
                            (progn (goto-bol) (point)))
          (skip-chars-forward " \t")
          ; 開きものがあればインデント数を増やす
          (cond
           ((looking-at *ruby-block-beg-re*)
            (setq column (+ column *ruby-indent-column*)))
           ((looking-at *ruby-block-mid-re*)
            (setq column (+ column *ruby-indent-column*)))
           (;(scan-buffer "\\<do\\>" :regexp t)
            ;;↓↓ここを変更↓↓
            (scan-buffer "\\<do\\>\\($\\|[^_]\\)" :regexp t)
            ;;↑↑↑↑↑↑↑↑↑
            (setq column (+ column *ruby-indent-column*)))
           ((and (scan-buffer "\{" :regexp t) (not (scan-buffer "\}" :regexp t)))
            (setq column (+ column *ruby-indent-column*)))
           ((and (scan-buffer "\(" :regexp t) (not (scan-buffer "\)" :regexp t)))
            (setq column (+ column *ruby-indent-column*)))
          )
        )))
    ;(message-box (format nil "column2: ~D" column))
    ; 現在の行を調べる
    (save-excursion
      (save-restriction
        (narrow-to-region (progn (goto-eol) (point))
                          (progn (goto-bol) (point)))
        (goto-bol)
        (skip-chars-forward " \t")
        ; 閉じものがあればインデント数を減らす
        (cond
         ((looking-at "^=\\(begin\\|end\\)")
          (setq column 0))
         ((looking-at "\}")
          (setq column (- column *ruby-indent-column*)))
         ((looking-at "\)")
          (setq column (- column *ruby-indent-column*)))
         ((looking-at *ruby-block-end-re*)
          (setq column (- column *ruby-indent-column*)))
         ((looking-at *ruby-block-mid-re*)
          (setq column (- column *ruby-indent-column*)))
        )))
    column
  ))

おまけ

 HTML Help

(defvar *ruby-plus-html-help-path*
  (merge-pathnames "ruby-refm-1.8.6.chm" (merge-pathnames "etc" (si:system-root))))

(defun ruby-plus-show-html-help ()
  (interactive)
  (html-help *ruby-plus-html-help-path* (get-winhelp-topic)))

S-F1 キーで,HTML ヘルプを参照する。

(define-key *ruby-mode-map* #\S-F1 'ruby-plus-show-html-help)

 セレクションをまとめてインデント

(defun ruby-plus-indent-selection ()
  (interactive)
  (when (and (get-selection-type)
             (< (get-selection-type) 3))
    (indent-region (selection-mark) (selection-point))))

まとめ

上記のコードをまとめたもの(余計なコードを含んだ Exerb 操作用関数付)。

キーバンドが記憶できない人(私)向けメニューセット。

設定は,それぞれ以下の通り。

(require "ruby-plus")
(require "ruby-plus-menu")

最終更新時間:2008年01月08日 01時14分02秒 GMT