mirror of
https://github.com/vale981/apheleia
synced 2025-03-05 09:31:40 -05:00
Fix bug running Prettier on modified buffer
This commit is contained in:
parent
61f9335756
commit
26ddaf3597
2 changed files with 69 additions and 53 deletions
|
@ -3,6 +3,15 @@
|
|||
All notable changes to this project will be documented in this file.
|
||||
The format is based on [Keep a Changelog].
|
||||
|
||||
## Unreleased
|
||||
### Bugs fixed
|
||||
* Previously, weirdness could happen if manually running Prettier via
|
||||
`M-x apheleia-format-buffer` on a buffer which was modified from
|
||||
what was written to disk. Now we simply abort running a command that
|
||||
uses the `file` keyword if the buffer is modified, since it will not
|
||||
produce correct results. This should not affect normal usage of
|
||||
Apheleia.
|
||||
|
||||
## 1.0 (released 2019-09-20)
|
||||
### Added
|
||||
* Package `apheleia`
|
||||
|
|
113
apheleia.el
113
apheleia.el
|
@ -362,62 +362,69 @@ as its sole argument."
|
|||
"Run a code formatter on the current buffer.
|
||||
The formatter is specified by COMMAND, a list of strings or
|
||||
symbols (see `apheleia-format-buffer'). Invoke CALLBACK with one
|
||||
argument, a buffer containing the output of the formatter."
|
||||
(let ((input-fname nil)
|
||||
(output-fname nil)
|
||||
(npx nil))
|
||||
(when (memq 'npx command)
|
||||
(setq npx t)
|
||||
(setq command (remq 'npx command)))
|
||||
(unless (stringp (car command))
|
||||
(error "Command cannot start with %S" (car command)))
|
||||
(when npx
|
||||
(when-let ((project-dir
|
||||
(locate-dominating-file default-directory "node_modules")))
|
||||
(let ((binary
|
||||
(expand-file-name
|
||||
(car command)
|
||||
(expand-file-name
|
||||
".bin"
|
||||
argument, a buffer containing the output of the formatter.
|
||||
|
||||
If COMMAND uses the symbol `file' and the current buffer is
|
||||
modified from what is written to disk, then don't do anything."
|
||||
(cl-block nil
|
||||
(let ((input-fname nil)
|
||||
(output-fname nil)
|
||||
(npx nil))
|
||||
(when (memq 'npx command)
|
||||
(setq npx t)
|
||||
(setq command (remq 'npx command)))
|
||||
(unless (stringp (car command))
|
||||
(error "Command cannot start with %S" (car command)))
|
||||
(when npx
|
||||
(when-let ((project-dir
|
||||
(locate-dominating-file
|
||||
default-directory "node_modules")))
|
||||
(let ((binary
|
||||
(expand-file-name
|
||||
"node_modules"
|
||||
project-dir)))))
|
||||
(when (file-executable-p binary)
|
||||
(setcar command binary)))))
|
||||
(when (memq 'file command)
|
||||
(setq command (mapcar (lambda (arg)
|
||||
(if (eq arg 'file)
|
||||
buffer-file-name
|
||||
arg))
|
||||
command)))
|
||||
(when (memq 'input command)
|
||||
(let ((input-fname (make-temp-file
|
||||
"apheleia" nil
|
||||
(and buffer-file-name
|
||||
(file-name-extension
|
||||
buffer-file-name 'period)))))
|
||||
(apheleia--write-region-silently nil nil input-fname)
|
||||
(car command)
|
||||
(expand-file-name
|
||||
".bin"
|
||||
(expand-file-name
|
||||
"node_modules"
|
||||
project-dir)))))
|
||||
(when (file-executable-p binary)
|
||||
(setcar command binary)))))
|
||||
(when (memq 'file command)
|
||||
(setq command (mapcar (lambda (arg)
|
||||
(if (eq arg 'input)
|
||||
input-fname
|
||||
(if (eq arg 'file)
|
||||
(prog1 buffer-file-name
|
||||
(when (buffer-modified-p)
|
||||
(cl-return)))
|
||||
arg))
|
||||
command))))
|
||||
(when (memq 'output command)
|
||||
(setq output-fname (make-temp-file "apheleia"))
|
||||
(setq command (mapcar (lambda (arg)
|
||||
(if (eq arg 'output)
|
||||
output-fname
|
||||
arg))
|
||||
command)))
|
||||
(apheleia--make-process
|
||||
:command command
|
||||
:stdin (unless input-fname
|
||||
(current-buffer))
|
||||
:callback (lambda (stdout)
|
||||
(when output-fname
|
||||
(erase-buffer)
|
||||
(insert-file-contents-literally output-fname))
|
||||
(funcall callback stdout)))))
|
||||
command)))
|
||||
(when (memq 'input command)
|
||||
(let ((input-fname (make-temp-file
|
||||
"apheleia" nil
|
||||
(and buffer-file-name
|
||||
(file-name-extension
|
||||
buffer-file-name 'period)))))
|
||||
(apheleia--write-region-silently nil nil input-fname)
|
||||
(setq command (mapcar (lambda (arg)
|
||||
(if (eq arg 'input)
|
||||
input-fname
|
||||
arg))
|
||||
command))))
|
||||
(when (memq 'output command)
|
||||
(setq output-fname (make-temp-file "apheleia"))
|
||||
(setq command (mapcar (lambda (arg)
|
||||
(if (eq arg 'output)
|
||||
output-fname
|
||||
arg))
|
||||
command)))
|
||||
(apheleia--make-process
|
||||
:command command
|
||||
:stdin (unless input-fname
|
||||
(current-buffer))
|
||||
:callback (lambda (stdout)
|
||||
(when output-fname
|
||||
(erase-buffer)
|
||||
(insert-file-contents-literally output-fname))
|
||||
(funcall callback stdout))))))
|
||||
|
||||
(defcustom apheleia-formatters
|
||||
'((black . ("black" "-"))
|
||||
|
|
Loading…
Add table
Reference in a new issue