朝寝して宵寝するまで昼寝して時々起きて居眠りをする
タイトルの通り、先頭にタブを入れたり先頭のタブを削除したりする 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))