やりたいこと
普段AndroidStudioを使っていて便利だなあと思うのが、コードのインデントに合わせて最適なbackspaceをしてくれることなのですが、それをEmacsで実現できないかなと思っていました。Hungry deleteというパッケージがよさそうだと思って試したのですが、ほんとに全部のホワイトスペースを削除してしまいやりすぎ。
EmacsLispを勉強したのでせっかくだし書いてみることにしました。
できた
(defun smart-backspace ()
(interactive)
(let* ((current (save-excursion
(point)))
(beginning (save-excursion
(beginning-of-line)
(point))))
(if (string-match "^[ \t]*$" (buffer-substring beginning current))
(progn
(kill-line 0)
(delete-backward-char 1)
(indent-for-tab-command))
(delete-backward-char 1))))
おもいのほか簡単にかけました。使い方は下のように好きなキーにキーバインドをあてるだけ。
(global-set-key (kbd "backspace") 'smart-backspace)
自分はC-hにもbackspaceをあてたかったので
(global-set-key (kbd "C-h") 'smart-backspace)
としてみたのですが、これでは補完の際にhelpがでてしまいうまく行きませんでした。
仕方がないのでbackspaceにキーバインドを当ててkey-translation-map
でC-hにも同じキーバインドを適用することにして一件落着となりました。
最終的な使い方はこんな感じです。
(global-set-key [?\C-?] 'smart-backspace)
(define-key key-translation-map [?\C-h] [?\C-?])
まだElisp初心者なので修正点などあればぜひ教えてください。
2017/10/14 追記
パッケージ化してmelpaに登録しました。-> https://github.com/itome/smart-backspace