余談。今回の試みは全てUbuntu 14.04でコードを書いて動かしている。何が楽しいって結局Emacsくらいしか真っ当なテキストエディタがないので、どんどんEmacsの使い勝手が向上する。勿論皮肉だ。sakuraエディタでのシフト+タブキーの動きを実現するコードまで書いちゃって楽しい楽しい。勿論皮肉。
(defun backtab ()
"delete indentation"
(interactive)
;; 入力値より小さい最大の値をリストから返す
(defun get-backtab-column (clm lst)
(interactive)
;; リストの先頭が入力値以上なら0
(if (<= clm (car lst))
0
;; リストの2番目が入力値以上なら先頭の値
(if (<= clm (car (cdr lst)))
(car lst)
;; リストの2番目が入力値より小さいなら先頭を削って再帰
(get-backtab-column clm (cdr lst))
)
)
)
(save-excursion
(let
(toclm)
; 非空白の先頭に移動
(back-to-indentation)
(setq toclm (get-backtab-column (current-column) tab-stop-list))
(while (> (current-column) toclm)
; なぜかdelete-forward-charでは動きがおかしい
;(delete-forward-char 1)
(delete-char -1)
)
)
)
)
Lispを書くのに慣れているわけでもないし、自分の読みやすさが第一なので、いわゆるLisp的なインデントなどではないのは容赦願う。このコードで一番気持ち悪く感じたのは、
(while (> (current-column) toclm)
の行。current-column関数が状況によって返す値が変化して、whileなんぞでループの終わり判定ができちゃうこと。なんだかHaskell的に考えるようになるとこういうところが気持ち悪く感じるようになる。俺がHaskellに汚染されてしまってる。行の様子をちゃんと判定してどれくらい文字を削除するか決定するのが本来だとは思うが、目的の値まで削除を繰り返すのも美しくはないがアリでしょう。Lispさんは俗世間の事情に詳しい大人ですから。
2014.07.22
OSTRACISM CO.
OSTRA / Takeshi Yoneki