如何用其他缓冲区重写整个当前缓冲区?

时间:2021-02-18 01:32:24

标签: emacs elisp

我正在尝试编写我自己的 before-save-hook 绑定函数来格式化我的代码。我找到了命令行应用程序来格式化。

所以我想

  1. 将当前缓冲区复制到临时文件。
  2. 运行命令行应用程序来格式化临时文件。
  3. 将其复制回(覆盖)到当前缓冲区。

所以我写了这个函数但不知道如何将文件内容复制回当前缓冲区。

(defun my-format-before-save ()
  (interactive)
  (let* ((filename buffer-file-name)
         (tempfilename (concat filename ".tmp")))
    (unwind-protect
        (progn (write-region (point-min) (point-max) tempfilename)
               (shell-command-to-string (format "some-format %s" tempfilename))
               ;;(???) ;; how to copy and over write current buffer with tempfile?
               )
      (delete-file tempfilename))))

emacs 有这个功能可以完全重写当前缓冲区吗? 是否有另一种简洁/elisp 风格的方式来达到我的目标?

谢谢

1 个答案:

答案 0 :(得分:0)

我使用额外的步骤将文件读取到临时缓冲区并将缓冲区插入到当前缓冲区。

(defun my-format-before-save ()
  (interactive)
  (when (eq major-mode 'my-mode)
    (let* ((filename buffer-file-name)
           (tempfilename (concat filename ".tmp"))
           (formatted-buffer (get-buffer-create "*formatted-buffer*")))
      (unwind-protect
          (progn (write-region (point-min) (point-max) tempfilename)
                 (with-current-buffer formatted-buffer
                   (erase-buffer)
                   (insert (shell-command-to-string (format "some-format %s" tempfilename))))
                 (erase-buffer)
                 (insert-buffer formatted-buffer)
                 )
        (kill-buffer formatted-buffer)
        (delete-file tempfilename)
        ))))

看起来我已经完成了我的目标,除了在格式化后光标总是回到当前缓冲区的(point-min)。

相关问题