【问题标题】:emacs delete-trailing-whitespace except current line除当前行外的 emacs 删除尾随空白
【发布时间】:2016-03-04 03:40:00
【问题描述】:

我最近将 Emacs (delete-trailing-whitespace) 函数添加到我的 'before-save-hook 以用于某些编程模式,但我发现它会从我当前正在编辑的行中删除空格,这很令人沮丧。有关如何解决此问题的任何建议?

【问题讨论】:

  • 我必须说我不明白你为什么要在当前行保留尾随空格。
  • 理由:当我在编辑文件时,我会强制保存我的文档。如果我开始输入“print”,然后保存我的缓冲区,该行将缩小为“print”并且光标后退,迫使我输入另一个空格!

标签: emacs removing-whitespace


【解决方案1】:

由于delete-trailing-whitespace 考虑缩小,一种解决方案是将缓冲区缩小到当前行之前部分并调用它,然后缩小到当前行之后部分行并再次调用它:

(defun delete-trailing-whitespace-except-current-line ()
  (interactive)
  (let ((begin (line-beginning-position))
        (end (line-end-position)))
    (save-excursion
      (when (< (point-min) begin)
        (save-restriction
          (narrow-to-region (point-min) (1- begin))
          (delete-trailing-whitespace)))
      (when (> (point-max) end)
        (save-restriction
          (narrow-to-region (1+ end) (point-max))
          (delete-trailing-whitespace))))))

将此功能放在您的before-save-hook 上,而不是delete-trailing-whitespace

【讨论】:

    【解决方案2】:

    delete-trailing-whitespace 的这个包装器可以用来做你想做的事:

    (defun delete-trailing-whitespace-except-current-line ()
      "do delete-trailing-whitespace, except preserve whitespace of current line"
      (interactive)
      (let ((current-line (buffer-substring (line-beginning-position) (line-end-position)))
            (backward (- (line-end-position) (point))))
        (delete-trailing-whitespace)
        (when (not (string-equal (buffer-substring (line-beginning-position) (line-end-position))
                                 current-line))
          (delete-region (line-beginning-position) (line-end-position))
          (insert current-line)
          (backward-char backward))))
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,发现ws-butler 完美地解决了它。 有一个简单的示例配置代码:

      ;; autoload ws-butler on file open
      (add-hook 'find-file-hook #'ws-butler-global-mode)
      (setq require-final-newline t)
      

      【讨论】:

        【解决方案4】:

        我只是有一个包装器来两次调用 `delete-trailing-whitespace':

        (defun modi/delete-trailing-whitespace-buffer ()
          "Delete trailing whitespace in the whole buffer, except on the current line.
        The current line exception is because we do want to remove any whitespace
        on the current line on saving the file (`before-save-hook') while we are
        in-between typing something.
        
        Do not do anything if `do-not-delete-trailing-whitespace' is non-nil."
          (interactive)
          (when (not (bound-and-true-p do-not-delete-trailing-whitespace))
            (delete-trailing-whitespace (point-min) (line-beginning-position))
            (delete-trailing-whitespace (line-end-position) (point-max))))
        (add-hook 'before-save-hook #'modi/delete-trailing-whitespace-buffer)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-23
          • 2023-04-01
          • 1970-01-01
          • 2015-04-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多