среда, 22 апреля 2015 г.

Emacs backspace like sublime

В sublime есть одна вещь, которой мне очень не хватало в emacs, при выравнивании текста пробелами, клавиша <backspace> удаляла не один пробел, а сразу столько, сколько входило в один "tab". Это легче показать:
backspace.gif


Emacs из коробки так к сожалению не умеет, но как всегда исправить это совсем не сложно…


Пишем вот такую небольшую функцию:
(defun cfg:backward-delete-tab-whitespace ()
  (interactive)
  (let ((p (point)))
    (if (and (eq indent-tabs-mode nil)
             (>= p tab-width)
             (eq (% (current-column) tab-width) 0)
             (string-match "^\\s-+$" (buffer-substring-no-properties (- p tab-width) p)))
        (delete-backward-char tab-width)
      (delete-backward-char 1))))
и вешаем ее на <backspace> (про продвинутое использование горячих клавиш, я рассказывал в предыдущей статье):
(global-set-key (kbd "<backspace>") 'cfg:backward-delete-tab-whitespace)
Это вполне очевидно, но все же уточню когда backspace будет удалять пробелы "пачками":
  • Должно быть отключено выравнивание табами "indent-tabs-mode == nil"
  • Курсор должен быть на столбце кратном ширине таба (tab-width) от начала строки
  • Ну и конечно перед курсором должно быть пробелов не меньше чем (tab-width)
Вот и все, еще один шаг на пути к идеальному редактору сделан.

Комментариев нет:

Отправить комментарий