Как обрезать конечные пробелы в режиме js2 в emacs

Обрезка конечных пробелов отлично работает для всех файлов, отличных от JS. У меня есть эти строки в моем .emacs:

(add-hook 'before-save-hook 'delete-trailing-whitespace)
(add-hook 'before-save-hook 'whitespace-cleanup)

Я также использовал M-x customize-group <enter> js2-mode для установки:

Js2 Cleanup Whitespace: [Hide Value] [Toggle]  on (non-nil)
   [State]: SAVED and set.

Non-nil to invoke `delete-trailing-whitespace' before saves.

Но он по-прежнему не обрезает пробелы при сохранении! Что мне не хватает?

Отредактировано для добавления: в ответ на предложения Дрю,

  1. Запуск удаления пробелов вручную в файле действительно работает.
  2. Все еще не работает без очистки пробелов, что неудивительно, потому что...
  3. delete-trailing-whitespace, похоже, не вызывается при сохранении.
  4. Базовый буфер сохранения тоже не работает.

Я не уверен, как исследовать, как режим js2 перехватывает/предотвращает срабатывание перехватчиков перед сохранением.


person kristina    schedule 06.12.2013    source источник
comment
Не прямой ответ, но вы можете попробовать использовать либо ws-trim или ws-butler. Эти библиотеки могут аккуратно убирать только те строки, которые вы фактически редактируете, что предотвращает внесение ненужных изменений в другие части файла. (Если вы используете контроль версий, я бы посчитал это обязательным, чтобы избежать внесения нерелевантных изменений.)   -  person phils    schedule 06.12.2013
comment
Версия Emacs? Версия js2-режима? (из GNU ELPA? вы не указали). Я не могу воспроизвести проблему в Emacs 24.3, используя «последний» режим js2 из elpa .gnu.org/packages/js2-mode.html   -  person phils    schedule 06.12.2013
comment
Я обновился до Emacs 24.2 и последнего режима js2, все еще происходит. Я думаю, что это неподходящий вопрос StackOverflow из-за необходимости взад и вперед, поэтому я отправлю его в список рассылки.   -  person kristina    schedule 10.12.2013


Ответы (2)


  1. Проверьте, работает ли delete-trailing-whitespace с файлами JS при обычном вызове (вручную).

  2. Попробуйте без whitespace-cleanup на том же хуке - IOW, упростите, чтобы увидеть, в чем проблема.

  3. Загрузите исходный файл (simple.el), определяющий delete-trailing-whitespace. Затем M-x debug-on-entry delete-trailing-whitespace. Затем сохраните файл JS и посмотрите, вызывается ли вообще d-t-w. Если это так, выполните отладчик, чтобы узнать, удаляет ли он пробелы (и, возможно, пробелы возвращаются после этого), и если нет, то почему.

  4. Если она никогда не вызывается, загрузите файл (files.el), определяющий функцию (basic-save-buffer), которая вызывает buffer-save-hook. M-x cancel-debug-on-entry RET для отмены первого, затем M-x debug-on-entry basic-save-buffer. Аналогично посмотреть запускается ли хук, если нет, то почему, если да, то почему не DTRT и т.д.

  5. Обратите внимание, что basic-save-hook не выполняется до конца, если одна из функций ловушки вызывает ошибку. Посмотрите, какие функции задействованы и т. д. Определите, не мешает ли ошибка TRT.

Вы поняли: исследуйте.

person Drew    schedule 06.12.2013
comment
Спасибо за предложения, я попробовал их и разместил обновление в вопросе выше. - person kristina; 06.12.2013

Я заставил его работать, обернув delete-trailing-whitespace в лямбду вместо кавычек.

(add-hook 'js2-mode-hook (lambda () 
                           (add-hook 'before-save-hook (lambda () (delete-trailing-whitespace)))
person marneborn    schedule 26.09.2014