Преобразование этого untabify хука on-save для emacs для работы с режимом эспрессо (или всеми режимами) - PullRequest
2 голосов
/ 23 июля 2010

Я нашел этот фрагмент для добавления в мои .emacs, которые при сохранении удаляют вкладки и заменяют их пробелами (чтобы мои файлы хорошо играли со всеми в команде, использующей пробелы).

К сожалению, мои отбивные lisp и emacs не очень сильны.Кажется, что этот фрагмент будет работать только для основного режима Java - как я могу заставить его работать с режимом эспрессо?

(defun java-mode-untabify ()
    (save-excursion
      (goto-char (point-min))
      (while (re-search-forward "[ \t]+$" nil t)
        (delete-region (match-beginning 0) (match-end 0)))
      (goto-char (point-min))
      (if (search-forward "\t" nil t)
          (untabify (1- (point)) (point-max))))
    nil)

  (add-hook 'java-mode-hook 
            (lambda ()
               (add-hook 'write-contents-hooks 'java-mode-untabify nil 'local)))

Ответы [ 2 ]

4 голосов
/ 23 июля 2010

У меня есть следующий код в моем .emacs, который работает для меня:

;; untabify some modes
(setq alexott/untabify-modes '(haskell-mode emacs-lisp-mode lisp-mode scheme-mode
                                        erlang-mode clojure-mode))
(defun alexott/untabify-hook ()
  (when (member major-mode alexott/untabify-modes)
     (untabify (point-min) (point-max))))
(add-hook 'before-save-hook 'alexott/untabify-hook)

Вы можете добавить режим эспрессо в список режимов, для которых будет выполняться untabify, изменив список в переменной alexott / untabify-mode следующим образом:

(setq alexott/untabify-modes '(haskell-mode emacs-lisp-mode lisp-mode scheme-mode
                                        erlang-mode clojure-mode espresso-mode))
1 голос
/ 23 июля 2010

Фрагмент, который у вас есть, будет работать для любого текстового файла.В этом нет ничего специфического для Java, кроме того, что он называется java-mode-untabify.Единственное, что вам нужно сделать, это продублировать вызов add-hook и изменить имя перехвата на espresso-mode-hook, или любой другой правильный перехват для режима эспрессо.Хотя я мог бы предложить вам изменить имя функции на что-то, что отражает тот факт, что она не специфична для Java.Что-то вроде cleanup-whitespace-in-buffer или что угодно.

(defun cleanup-whitespace-in-buffer () ; <- more appropriate name
    (save-excursion
      (goto-char (point-min))
      (while (re-search-forward "[ \t]+$" nil t)
        (delete-region (match-beginning 0) (match-end 0)))
      (goto-char (point-min))
      (if (search-forward "\t" nil t)
          (untabify (1- (point)) (point-max))))
    nil)

(add-hook 'espresso-mode-hook ; <- you can actually add this to any hook
          (lambda ()
             (add-hook 'write-contents-hooks 'cleanup-whitespace-in-buffer nil 'local)))

CAVEAT:

Я только что изменил опубликованный вами фрагмент.Я сейчас не на машине с Emacs, так что я не проверял ничего из этого.

Функция cleanup-whitespace-in-buffer просто удаляет любые пробелы в каждой строке в файле, а затем преобразует непоследовательныевкладки в пробелы.Вызов add-hook создает анонимную функцию (лямбду), которая будет вызываться при каждом запуске ловушки.Эта анонимная функция обеспечивает запуск cleanup-whitespace-in-buffer в буфере до его сохранения.

Мне действительно нравится ответ Алекса Отта намного лучше, поскольку он намного более гибок.Он устанавливает функцию, которая запускается всякий раз, когда ЛЮБОЙ буфер сохраняется.Он проверяет, есть ли в сохраняемом буфере режим, который находится в списке указанных режимов, и, если это так, удаляет буфер из памяти перед сохранением.Он не удаляет конечные пробелы, но вы можете легко изменить вызов (untabify (point-min) (point-max)) на (cleanup-whitespace-in-buffer), если хотите такое поведение.Это позволяет вам легко добавлять другие режимы, которые будут предварительно обрабатывать свои файлы перед сохранением.Это даже работает, если по какой-то причине ваш режим не связан с ним.Его метод лучше, чем я предложил.Я просто опубликовал этот ответ, чтобы разъяснить, как работает ваш фрагмент, поскольку вы сказали, что чувствуете себя недолго в Emacs Lisp.

...