[xyzzy:04703] VisualStudo ライクな TAB
- Subject: [xyzzy:04703] VisualStudo ライクな TAB
- From: "Kei Kawashima" <kei-kawashima@xxxxxxxxxxx>
- X-mailer: Microsoft Outlook Express 5.00.2615.200
はじめまして、川島と申します。
xyzzyは家でも職場でも愛用させてもらってます。
数行を選択してTABを押したとき選択行すべてに
インデントをかける操作がやりたくて、
標準の関数にないかと探したのですが
見つかりませんでした。
ちょうど、VisualStudioのエディタのような操作です。
そこで、自分で作ってみたのですが
LISPには不慣れなもんで長ったらしいコードに
なってしまいました。
もっと、スマートにできないものでしょうか?
後学のためご指摘ください。
-------------------------------
(以下コードです。長くてごめんなさい)
;; VisualStudioライクなTAB
(defun my-indent-tab ()
"選択行範囲をインデントする"
(interactive)
(if (pre-selection-p) ; 選択状態のとき
(selection-start-end (start end) ; 選択範囲に対して
; 選択状態のとき
(let ((sline
(progn (goto-char start) (current-line-number))) ; 選択開始行番号
(eline
(progn (goto-char end) (current-line-number))) ; 選択終了行
)
(do ((i (min sline eline) (1+ i))) ; 開始行から 終了行まで
((> i (max sline eline)))
(goto-line i)
(goto-bol) ; 行頭へ移動
(insert #\Tab) ; TAB挿入
)
; 選択範囲をもとに戻す
(goto-line (min sline eline))
(do ((i (min sline eline) (1+ i))) ; 開始行から 終了行まで
((>= i (max sline eline)))
(selection-next-line)
(selection-end-of-line)
)
)
)
; 選択状態でないとき
(self-insert-command)
)
)
(defun my-deindent-tab ()
"選択範囲のインデントを解除"
(interactive)
(if (pre-selection-p) ; 選択状態のとき
(selection-start-end (start end) ; 選択範囲に対して
; 選択状態のとき
(let ((sline
(progn (goto-char start) (current-line-number))) ; 選択開始行番号
(eline
(progn (goto-char end) (current-line-number))) ; 選択終了行
)
(do ((i (min sline eline) (1+ i))) ; 開始行から 終了行まで
((> i (max sline eline)))
(goto-line i)
(goto-bol) ; 行頭へ移動
(skip-chars-forward " \t") ; 行頭の空白をスキップ
(let ((column (- (current-column) *tab-columns*)))
(when (>= column 0)
(delete-horizontal-spaces)
(indent-to column)
)
)
)
; 選択範囲をもとに戻す
(goto-line (min sline eline))
(do ((i (min sline eline) (1+ i))) ; 開始行から 終了行まで
((>= i (max sline eline)))
(selection-next-line)
(selection-end-of-line)
)
)
)
; 選択状態でないとき 何もしない
)
)
(global-set-key #\tab 'my-indent-tab)
(set-extended-key-translate-table exkey-S-tab #\F20)
(global-set-key #\F20 'my-deindent-tab)