« 『アンビエント・ファインダビリティ』出版記念イベント | Main | The Non-Designer's Design Book »



Tue, 09 May 2006

範囲選択中にタブが押されたら冒頭にタブを挿入する on xyzzy

Posted at Tue, 09 May 2006 in computer::xyzzy

タイトルの通り、先頭にタブを入れたり先頭のタブを削除したりする Lisp です。
ずーっとほしいなぁ、と思っていたものの要望がたまたまあがっていたので適当に作ってみました。

Tab で先頭にタブを挿入、Shift + Tab で先頭のタブを1つ削除します。

;;;;;;;;;;;;;;;;;;
;; ■ 範囲選択中にタブが押されたら冒頭にタブを挿入
(in-package "editor")
(defun perform-replace-selection (pattern replacement query regexp interactive-p noerror)
  "選択範囲内を perform-replace"
  (interactive "*p")
  (let ((type (get-selection-type)))
    (selection-start-end (start end)
      (save-restriction
        (narrow-to-region start end) (goto-char (point-min))
        (perform-replace pattern replacement query regexp interactive-p noerror)
        (save-excursion
          (goto-char (point-min))
          (start-selection type t (point-max))
          (fix-selection-point)
          )))))
(defun tabshift-selection ()
  "冒頭にタブを挿入"
  (interactive "*p")
  (perform-replace-selection "^.+$" "\t\\0" nil t nil t))
(defun untabshift-selection ()
  "冒頭のタブを1つ削除(タブがなければ何もしない)"
  (interactive "*p")
  (perform-replace-selection "^\t" "" nil t nil t))
(in-package "user")

;;キーバインド
(setq-default ed::selection-keymap (make-sparse-keymap))
(define-key ed::selection-keymap #\TAB 'tabshift-selection)
(define-key ed::selection-keymap #\S-F15 'untabshift-selection)
(set-extended-key-translate-table exkey-S-tab #\S-F15)

ちなみにうちだとキーバインドの設定はこんなかんじです。Ctrl + c でコピーと共存バージョン。

;;; winkey.lからコピー
(defvar *default-selection-keymap*
  (let ((keymap (make-sparse-keymap)))
	(define-key keymap #\C-c 'copy-selection-to-clipboard)
	(define-key keymap #\C-x 'kill-selection-to-clipboard)
    (define-key keymap #\TAB 'tabshift-selection)
    (define-key keymap #\S-F15 'untabshift-selection)
    (set-extended-key-translate-table exkey-S-tab #\S-F15)
	keymap))

« 『アンビエント・ファインダビリティ』出版記念イベント | Main | The Non-Designer's Design Book »