Untabify и удалить конечные пробелы в Emacs - PullRequest
13 голосов
/ 14 сентября 2010

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

В настоящее время я включил:

(show-ws-toggle-show-trailing-whitespace)
(show-ws-toggle-show-tabs)

Проблема с этими параметрами: все файлы становятся желтыми или белыми, если владелец файла не исправил свои вкладки и конечные пробелы.

Было бы замечательно, если бы вы указали мне опции emacs, которые позволят мне "удалять пробелы и вкладки в строках, которые я редактирую" (не во всех файлах).

Ответы [ 5 ]

15 голосов
/ 14 сентября 2010

Это не ответ на ваш вопрос. Но я подозреваю, что вам будет интересно узнать об этом:

http://github.com/glasserc/ethan-wspace

Он отслеживает, является ли файл «чистым» (без запаздывающих пробелов и вкладок) при его открытии, и автоматически удаляет их при сохранении, если и только если он был чистым при запуске. Это означает, что он сохранит файл чистым, если он начался чистым, и оставит в покое любые файлы, которые были грязными (т.е. кто-то другой не следовал правилам).

8 голосов
/ 14 сентября 2010

Из моего старого файла .emacs:

(defun clean-whitespace-region (start end)
  "Untabifies, removes trailing whitespace, and re-indents the region"
  (interactive "r")
  (save-excursion
    (untabify start end)
    (c-indent-region start end)
    (replace-regexp "[  ]+$" "" nil start end))) ;// uses literal space and tab chars

Вызвать M-x clean-whitespace-region после выбора или маркировки региона.

untabify заменяет вкладки пробелами в зависимости от текущих настроек tab-width. Затем я использую c-indent-region, когда мне дают файлы со странными значениями tab-with (8, 4, 3 и 2 кажутся общими). ​​

To удалить конечные пробелы в emacs 21 + во всем буфере использовать delete-trailing-whitespace в противном случае regexp-replace работает как указано выше.

5 голосов
/ 14 сентября 2010

Я использовал пакет ws-trim.el с тех пор, как начал использовать Emacs. Отлично работает; настроить его и забыть.

;;;; ************************************************************************
;;;; *** strip trailing whitespace on write
;;;; ************************************************************************
;;;; ------------------------------------------------------------------------
;;;; --- ws-trim.el - [1.3] ftp://ftp.lysator.liu.se/pub/emacs/ws-trim.el
;;;; ------------------------------------------------------------------------
(require 'ws-trim)
(global-ws-trim-mode t)
(set-default 'ws-trim-level 2)
(setq ws-trim-global-modes '(guess (not message-mode eshell-mode)))
(add-hook 'ws-trim-method-hook 'joc-no-tabs-in-java-hook)

(defun joc-no-tabs-in-java-hook ()
  "WS-TRIM Hook to strip all tabs in Java mode only"
  (interactive)
  (if (string= major-mode "jde-mode")
      (ws-trim-tabs)))
2 голосов
/ 14 сентября 2010

Я использую это для удаления конечных пробелов из всего документа. Я написал это много лет назад ...

;;
;; RM-Trailing-Spaces
;;
(defun rm-trailing-spaces ()
  "Remove spaces at ends of all lines"
  (interactive)
  (save-excursion
    (let ((current (point)))
      (goto-char 0)
      (while (re-search-forward "[ \t]+$" nil t)
        (replace-match "" nil nil))
      (goto-char current))))
1 голос
/ 14 сентября 2010

Если вы хотите удалить конечные пробелы в текущей строке, используйте следующую команду:

(defun delete-trailing-whitespace-of-current-line ()
  "Delete all the trailing whitespace on the current line.
All whitespace after the last non-whitespace character in a line is deleted.
This respects narrowing, created by \\[narrow-to-region] and friends."
  (interactive "*")
  (save-match-data
    (save-excursion
      (move-to-column 0)
      (if (re-search-forward "\\s-$" nil t)
        (progn
          (skip-syntax-backward "-" (save-excursion (forward-line 0) (point)))
          (delete-region (point) (match-end 0)))))))

Свяжите его с тем ключом, который вы хотите.

...