Lispの素人がxyzzyをカスタマイズするよ

 xyzzyの最大の長所は自由自在なカスタマイズ性。
 しかし、それこそが初心者には中々手を出し辛い理由でもあります。

 でも折角だからカスタマイズしようぜ

 というわけで、Lispのことがよく分かっていない管理人が、xyzzyを便利に使うために作った関数群を晒すよ。
 関数+キーバインドを「.xyzzy」とかにコピペすれば「今日から使える」ように書いてある…つもりです。
インデント |  行頭挿入 |  日付と時刻 |  ローカルバッファのタブ幅指定
 あっと、ついでに諸般の事情で作ったH8マイコン用の簡易アセンブラmodeファイルも置いておきます。
 誰も使わないことうけあい → mode設定 : h8-mode.l キーワード : h8

インデント

 何はなくともインデント。というか、ここでは単にシフトのことです。
 xyzzyはスマートインデントとかは充実してるのですが、ぬるい作業に必要な「セレクションを連続シフト」とかがデフォルトでは出来ない…気がする。
 というわけで、作りました。

□ 連続インデント・アンインデント セレクション編

    ; 一括インデント(セレクション/保持) 2008/09/14
    (defun indent-selection-hold()
      (interactive "*")
      (save-excursion
        (if (pre-selection-p)
            (selection-start-end (start end)
              (shift-region start end 1)
              (start-selection 2 t)
              ))))
    ; 一括アンインデント(セレクション/保持) 2008/09/14
    (defun unindent-selection-hold()
      (interactive "*") 
      (save-excursion
        (if (pre-selection-p)
            (selection-start-end (start end)
              (unshift-region start end 1)
              (start-selection 2 t)
              ))))
 エラー処理とか全部システムが引き受けてくれるから楽でしょうがない。
 これを適当にキーマップに割り付ければ中々便利です。
 具体的にはこんな感じ。
    (global-set-key #\M-\.  'indent-selection-hold)
    (global-set-key #\M-\,  'unindent-selection-hold)
 結構長い間メモ帳代わりに「TeraPad」を使用していたのですが、そのプラグインで使えた一発インデント・アンインデントが恋しゅうて恋しゅうて……でもこれでおk!
 矩形選択とか全く使わないから対応してなくてごめんよ
 まあ1,2文足すだけなので使う人は適当にどうぞ

□ 連続インデント・アンインデント リージョン編

 リージョンでやりたいなっていう変態紳士には以下のコードをご用意しました。
    ; 一括インデント(リージョン/保持) 2008/09/14
    (defun indent-region-hold()
      (interactive "*") 
      (save-excursion
        (if (mark)
            (shift-region (region-beginning) (region-end) 1)
          )))
    ; 一括アンインデント(リージョン/保持) 2008/09/14
    (defun unindent-region-hold()
      (interactive "*") 
      (save-excursion
        (if (mark)
            (unshift-region (region-beginning) (region-end) 1)
          )))
    ; キーバインド
    (global-set-key #\C-M-\. 'indent-region-hold)
    (global-set-key #\C-M-\, 'unindent-region-hold)

行頭挿入

 セレクションの行頭に全角スペースを入れたい…任意の文字でコメントアウトしたい…そんな願いが、ここにはある。
 xyzzy-Lispはquote-regionという関数を用意してくれているので、それに飾りをつけてみました。
    ; セレクション行頭に指定文字挿入 2008/09/13
    (defun insert-string-bol-selection()
      (interactive "*")
      (setq insert-str (read-string "セレクション行頭に挿入 : "))
      (if (pre-selection-p)
          (insert-string-bol insert-str (selection-point) (selection-mark))
        (message "セレクションが存在しません")))
    ; リージョン行頭に指定文字挿入 2008/09/13
    (defun insert-string-bol-region()
      (interactive "*")
      (setq insert-str (read-string "リージョン行頭に挿入 : "))
      (if (mark)
          (insert-string-bol insert-str (region-beginning) (region-end))))
    ; 指定範囲に指定文字列を挿入 2008/09/14
    (defun insert-string-bol(insert-str from to)
      (let ((*quotation-prefix* insert-str))
        (quote-region from to)))
 上二つのどちらかを呼ぶと、以下のような動作をします。

 ミニバッファから挿入文字を聞かれ
  ↓
 入れたい文字を入力すると
  ↓
 その文字が指定範囲(セレクションかリージョン)の全行頭につく。

 見れば分かると思うけど一番下のがないと上二つは動作しない。
 キーバインドの例も一応。
    (global-set-key #\M-SPC 'insert-string-bol-selection)
    (global-set-key #\M-s   'insert-string-bol-region)
 この辺のキーバインドはかなり苦し紛れ…

日付と時刻の挿入

 ありがちな上に既出臭がすごいけど一応自分で書いたので載せておくよ。
    ; 日付出力関数 2008/09/12
    (defun write-date()
      (interactive "*")
      (insert (format-date-string "%Y/%m/%d")))
    ; 時刻出力関数 2008/09/12
    (defun write-time()
      (interactive "*")
      (insert (format-date-string "%H:%M")))
 キーバインドはこんな具合にしてるよ。
    (global-set-key #\M-d   'write-date)
    (global-set-key #\M-t   'write-time)

タブ幅指定

 インタラクティブにタブ幅指定したかったので作ったよ。
 つまりミニバッファから数値を入力してカレントバッファのタブ幅のみ一時的に変更しますよ。
 # インデント幅くらい統一しといて欲しいものですが、そうでないこともままあるので…。
    ; interactive set-tab-columns 2008/09/11
    (defun set-tab-columns-i ()
      (interactive)
      (set-tab-columns
       (read-integer "set tab columns to : ")
       (buffer-name (selected-buffer))))
    ; キーバインド
    (global-set-key #\C-t   'set-tab-columns-i)
 既存関数群が便利すぎて困る。

おしまい。

 以上、こんなどうしようもない関数群でも随分試行錯誤したんだぜのコーナーでした。
 少しでもどなたかのお役に立てれば幸いです。


2008/09/14 quels.