[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:04703] VisualStudo ライクな TAB



はじめまして、川島と申します。

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)

Index Home