conf-emacs/elpa/nix-mode-1.5.0/nix-format.el

55 lines
1.7 KiB
EmacsLisp

;;; nix-format.el --- Nix formatter -*- lexical-binding: t -*-
;; This file is NOT part of GNU Emacs.
;; Homepage: https://github.com/NixOS/nix-mode
;; Package-Requires: ((emacs "24.1"))
;;; Commentary:
;;; Code:
(defcustom nix-nixfmt-bin "nixfmt"
"Path to nixfmt executable."
:group 'nix
:type 'string)
(if (fboundp 'replace-buffer-contents)
(defun nix--replace-buffer-contents (src dst)
(with-current-buffer dst (replace-buffer-contents src)))
(defun nix--replace-buffer-contents (src dst)
(if (not (string= (with-current-buffer src (buffer-string))
(with-current-buffer dst (buffer-string))))
(with-current-buffer src
(copy-to-buffer dst (point-min) (point-max))))))
(defun nix--format-call (buf nixfmt-bin)
"Format BUF using nixfmt."
(with-current-buffer (get-buffer-create "*nixfmt*")
(erase-buffer)
(insert-buffer-substring buf)
(if (zerop (call-process-region (point-min) (point-max) nixfmt-bin t t nil))
(nix--replace-buffer-contents (current-buffer) buf)
(error "Nixfmt failed, see *nixfmt* buffer for details"))))
(defun nix--find-nixfmt ()
"Find the nixfmt binary, or error if it's missing."
(let ((nixfmt-bin (executable-find nix-nixfmt-bin)))
(unless nixfmt-bin
(error "Could not locate executable %S" nix-nixfmt-bin))
nixfmt-bin))
(defun nix-format-buffer ()
"Format the current buffer using nixfmt."
(interactive)
(nix--format-call (current-buffer) (nix--find-nixfmt))
(message "Formatted buffer with nixfmt."))
;;;###autoload
(defun nix-format-before-save ()
"Add this to `before-save-hook' to run nixfmt when saving."
(when (derived-mode-p 'nix-mode)
(nix-format-buffer)))
(provide 'nix-format)
;;; nix-format.el ends here