emacs - 如何用其他缓冲区重写整个当前缓冲区?
问题描述
我正在尝试编写自己的before-save-hook
绑定函数来格式化我的代码。我找到了用于格式化的命令行应用程序。
所以我试图
- 将当前缓冲区复制到临时文件。
- 运行命令行应用程序来格式化临时文件。
- 将其复制回(覆盖)到当前缓冲区。
所以我写了这个函数,但不知道如何将文件内容复制回当前缓冲区。
(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 有这个功能来完全重写当前缓冲区吗?是否有另一种简洁/简洁的方式来达到我的目标?
谢谢
解决方案
我使用额外的步骤将文件读取到临时缓冲区并将缓冲区插入到当前缓冲区。
(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)。