2013-12-06 2 views
2

Обрезка конечных пробелов отлично работает во всех файлах, отличных от JS. У меня есть эти строки в моем .emacs:Как обрезать пробелы в js2-режиме в 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. 

Но это еще не обрезать пробелы на сохранение! Что мне не хватает?

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

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

Я не уверен, как исследовать, как js2-режим перехватывает/препятствует срабатыванию переключателей before-save-hook.

+0

Не прямой ответ, но вы могли бы попробовать использовать либо [WS-Trim] (ftp://ftp.lysator.liu.se/pub/emacs/ws-trim.el) или [WS -butler] (https://github.com/lewang/ws-butler). Эти библиотеки умело убирают только те строки, которые вы на самом деле редактируете, что мешает вам делать ненужные изменения в других частях файла. (Если вы используете контроль версий, я бы счел это обязательным, чтобы не совершать нерелевантные изменения.) – phils

+0

Версия Emacs?Версия js2-mode? (из GNU ELPA? вы не указали). Я не могу реплицировать проблему на Emacs 24.3, используя «последний» js2-режим с http://elpa.gnu.org/packages/js2-mode.html – phils

+0

Я обновил Emacs 24.2 и последний режим js2, все еще происходит. Я думаю, что это не подходящий вопрос StackOverflow из-за необходимости вернуться назад, поэтому я отведу его в список рассылки. – kristina

ответ

4
  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.

Вы получаете идею: расследуйте.

+0

Спасибо за предложения, я попробовал их и разместил обновление в вопросе выше. – kristina

1

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

(add-hook 'js2-mode-hook (lambda() 
          (add-hook 'before-save-hook (lambda() (delete-trailing-whitespace))) 
Смежные вопросы