Не наносить вред и удалять задние пробелы в emacs

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

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

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

Проблема с этими параметрами делает все файлы желтыми или белыми, если владелец файла не зафиксировал свои вкладки и завершающие пробелы.

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

Ответы

Ответ 1

Я использовал пакет 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

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

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

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

Ответ 3

Из моего старого старого файла .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).

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

Ответ 4

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

;;
;; 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))))

Ответ 5

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

(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)))))))

Привяжите его к любому ключу, который вы хотите.