问题描述
我正在尝试编写我自己的 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 有这个功能可以完全重写当前缓冲区吗? 是否有另一种简洁/elisp 风格的方式来达到我的目标?
谢谢
解决方法
我使用额外的步骤将文件读取到临时缓冲区并将缓冲区插入到当前缓冲区。
(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)。