[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/beardbolt 3fe322e573 242/323: Merge branch 'improve-aut
From: |
ELPA Syncer |
Subject: |
[elpa] externals/beardbolt 3fe322e573 242/323: Merge branch 'improve-auto-compilation' into 'master' |
Date: |
Thu, 9 Mar 2023 10:58:35 -0500 (EST) |
branch: externals/beardbolt
commit 3fe322e5739e57cceea37c4104ac7bc5231555c3
Merge: de28f7903a 041234b499
Author: Jay Kamat <jaygkamat@gmail.com>
Commit: Jay Kamat <jaygkamat@gmail.com>
Merge branch 'improve-auto-compilation' into 'master'
Improve auto-compilation
See merge request jgkamat/rmsbolt!14
---
rmsbolt.el | 169 ++++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 105 insertions(+), 64 deletions(-)
diff --git a/rmsbolt.el b/rmsbolt.el
index 10d992eef3..ae6a7e1e35 100644
--- a/rmsbolt.el
+++ b/rmsbolt.el
@@ -100,11 +100,14 @@
:type 'integer
:group 'rmsbolt)
(defcustom rmsbolt-automatic-recompile t
- "Whether to automatically recompile on source buffer changes.
-Emacs-lisp does not support automatic-recompilation currently.
-This setting is automatically disabled on large buffers, use
-'force to force-enable it."
- :type 'boolean
+ "Whether to automatically save and recompile the source buffer.
+This setting is automatically disabled on large buffers, set
+'force to force-enable it.
+To only recompile when the buffer is manually saved, set 'on-save."
+ :type '(choice (const :tag "Off" nil)
+ (const :tag "On save" on-save)
+ (const :tag "On" t)
+ (const :tag "Always" force))
:group 'rmsbolt)
;;;;; Buffer Local Tweakables
@@ -224,7 +227,7 @@ may not be cleared to default as variables are usually."
(defvar rmsbolt-overlays nil
"List of overlays to use.")
-(defvar rmsbolt-compile-delay 1
+(defvar rmsbolt-compile-delay 0.4
"Time in seconds to delay before recompiling if there is a change.")
(defvar rmsbolt--automated-compile nil
"Whether this compile was automated or not.")
@@ -232,18 +235,16 @@ may not be cleared to default as variables are usually."
"Which shell to prefer if available.
Used to work around inconsistencies in alternative shells.")
-(defvar rmsbolt--idle-timer nil
- "Idle timer for rmsbolt overlays.")
-(defvar rmsbolt--compile-idle-timer nil
- "Idle timer for rmsbolt overlays.")
(defvar rmsbolt--temp-dir nil
"Temporary directory to use for compilation and other reasons.
-Please DO NOT modify this blindly, as this directory will get deleted on Emacs
exit.")
+Please DO NOT modify this blindly, as this directory will get
+deleted on Emacs exit.")
-(defvar rmsbolt-dir (when load-file-name
- (file-name-directory load-file-name))
+(defvar rmsbolt-dir nil
"The directory which rmsbolt is installed to.")
+(when load-file-name
+ (setq rmsbolt-dir (file-name-directory load-file-name)))
(defvar-local rmsbolt-src-buffer nil)
@@ -356,7 +357,8 @@ This function does NOT quote the return value for use in
inferior shells."
(demangler
nil
:type 'string
- :documentation "The command of the demangler to use for this source code.
If nil, don't demangle.")
+ :documentation "The command of the demangler to use for this source code.
+If nil, don't demangle.")
(disass-hidden-funcs
nil
:type 'string
@@ -1311,11 +1313,13 @@ Argument ASM-LINES input lines."
(nreverse result)))
;;;;; Handlers
-(cl-defun rmsbolt--handle-finish-compile (buffer str &key override-buffer)
+(cl-defun rmsbolt--handle-finish-compile (buffer str &key override-buffer
stopped)
"Finish hook for compilations.
Argument BUFFER compilation buffer.
Argument STR compilation finish status.
-Argument OVERRIDE-BUFFER use this buffer instead of reading from the output
filename."
+Argument OVERRIDE-BUFFER asm src buffer to use instead of reading
+ `rmsbolt-output-filename'.
+Argument STOPPED The compilation was stopped to start another compilation."
(when (not (buffer-live-p buffer))
(error "Dead buffer passed to compilation-finish-function! RMSBolt cannot
continue."))
(let ((compilation-fail
@@ -1326,7 +1330,8 @@ Argument OVERRIDE-BUFFER use this buffer instead of
reading from the output file
(with-current-buffer (get-buffer-create rmsbolt-output-buffer)
;; Store src buffer value for later linking
- (cond ((not compilation-fail)
+ (cond (stopped) ; Do nothing
+ ((not compilation-fail)
(if (and (not override-buffer)
(not (file-exists-p (rmsbolt-output-filename src-buffer
t))))
(message "Error reading from output file.")
@@ -1384,10 +1389,14 @@ Argument OVERRIDE-BUFFER use this buffer instead of
reading from the output file
(rmsbolt-mode 1)
(setq rmsbolt-src-buffer src-buffer)
(display-buffer (current-buffer))
- (run-at-time 0 nil (lambda () (rmsbolt-update-overlays))))))
- ((not rmsbolt--automated-compile)
- ;; Display compilation output
- (display-buffer buffer)
+ (run-at-time 0 nil #'rmsbolt-update-overlays))))
+ (t ; Compilation failed
+ ;; Display compilation buffer
+ (if rmsbolt--automated-compile
+ (display-buffer buffer)
+ ;; If the compilation was directly started by the user,
+ ;; select the compilation buffer.
+ (pop-to-buffer buffer))
;; TODO find a cleaner way to disable overlays.
(with-current-buffer src-buffer
(setq rmsbolt-line-mapping nil))
@@ -1443,7 +1452,8 @@ Are you running two compilations at the same time?"))
src-buffer))
(defun rmsbolt--demangle-command (existing-cmd lang src-buffer)
- "Append a demangler routine to EXISTING-CMD with LANG and SRC-BUFFER and
return it."
+ "Append a demangler routine to EXISTING-CMD with LANG and SRC-BUFFER
+and return it."
(if-let ((to-demangle (buffer-local-value 'rmsbolt-demangle src-buffer))
(demangler (rmsbolt-l-demangler lang))
(demangler-exists (executable-find demangler)))
@@ -1463,7 +1473,9 @@ Are you running two compilations at the same time?"))
(defun rmsbolt-compile ()
"Compile the current rmsbolt buffer."
(interactive)
- (save-some-buffers nil (lambda () rmsbolt-mode))
+ (when (and (buffer-modified-p)
+ (yes-or-no-p (format "Save buffer %s? " (buffer-name))))
+ (save-buffer))
(rmsbolt--gen-temp)
;; Current buffer = src-buffer at this point
(setq rmsbolt-src-buffer (current-buffer))
@@ -1477,6 +1489,7 @@ Are you running two compilations at the same time?"))
(rmsbolt-l-elisp-compile-override (rmsbolt--get-lang))
:src-buffer (current-buffer))))
(t
+ (rmsbolt--stop-running-compilation)
(rmsbolt--parse-options)
(let* ((src-buffer (current-buffer))
(lang (rmsbolt--get-lang))
@@ -1527,15 +1540,29 @@ Are you running two compilations at the same time?"))
(error "Objdumper not recognized"))))
;; Convert to demangle if we need to
(setq cmd (rmsbolt--demangle-command cmd lang src-buffer))
- (let ((shell-file-name (or (executable-find rmsbolt--shell)
- shell-file-name)))
- (with-current-buffer
+ (with-current-buffer ; With compilation buffer
+ (let ((shell-file-name (or (executable-find rmsbolt--shell)
+ shell-file-name))
+ (compilation-auto-jump-to-first-error t))
;; TODO should this be configurable?
(rmsbolt-with-display-buffer-no-window
- (compilation-start cmd nil (lambda (&rest _)
"*rmsbolt-compilation*")))
- (add-hook 'compilation-finish-functions
- #'rmsbolt--handle-finish-compile nil t)
- (setq rmsbolt-src-buffer src-buffer)))))))
+ (compilation-start cmd nil (lambda (&rest _)
"*rmsbolt-compilation*"))))
+ ;; Only jump to errors, skip over warnings
+ (setq-local compilation-skip-threshold 2)
+ (add-hook 'compilation-finish-functions
+ #'rmsbolt--handle-finish-compile nil t)
+ (setq rmsbolt-src-buffer src-buffer))))))
+
+(defun rmsbolt--stop-running-compilation ()
+ (when-let* ((compilation-buffer (get-buffer "*rmsbolt-compilation*"))
+ (proc (get-buffer-process compilation-buffer)))
+ (when (eq (process-status proc) 'run)
+ (set-process-sentinel proc nil)
+ (interrupt-process proc)
+ (rmsbolt--handle-finish-compile compilation-buffer nil :stopped t)
+ ;; Wait a short while for the process to exit cleanly
+ (sit-for 0.2)
+ (delete-process proc))))
;;;; Keymap
(defvar rmsbolt-mode-map
@@ -1721,32 +1748,43 @@ Are you running two compilations at the same time?"))
(eq (current-buffer) (buffer-local-value 'rmsbolt-src-buffer
output-buffer)))
(rmsbolt--remove-overlays))))
-(defun rmsbolt-hot-recompile ()
- "Recompile source buffer if we need to."
- (when-let ((should-hot-compile rmsbolt-mode)
- (should-hot-recompile rmsbolt-automatic-recompile)
- (output-buffer (get-buffer rmsbolt-output-buffer))
- (src-buffer (buffer-local-value 'rmsbolt-src-buffer
output-buffer))
- (src-buffer-live (buffer-live-p src-buffer))
- (is-not-elisp (not (eq 'emacs-lisp-mode
- (with-current-buffer src-buffer
- major-mode))))
- (is-not-large (or (< (with-current-buffer src-buffer
- (line-number-at-pos (point-max)))
- rmsbolt-large-buffer-size)
- (eq rmsbolt-automatic-recompile 'force)))
- (modified (buffer-modified-p src-buffer)))
- (with-current-buffer src-buffer
- ;; Clear `before-save-hook' to prevent things like whitespace cleanup or
- ;; aggressive indent from running (this is a hot recompile):
- ;;
https://github.com/syl20bnr/spacemacs/blob/c7a103a772d808101d7635ec10f292ab9202d9ee/layers/%2Bspacemacs/spacemacs-editing/local/spacemacs-whitespace-cleanup/spacemacs-whitespace-cleanup.el#L72
- ;; TODO does anyone want before-save-hook to run on a hot recompile?
- (let ((before-save-hook nil))
- ;; Write to disk
- (save-buffer))
- ;; Recompile
- (setq rmsbolt--automated-compile t)
- (rmsbolt-compile))))
+(defun rmsbolt--is-active-src-buffer ()
+ (when-let (output-buffer (get-buffer rmsbolt-output-buffer))
+ (eq (current-buffer) (buffer-local-value 'rmsbolt-src-buffer
output-buffer))))
+
+(defun rmsbolt--after-save ()
+ (when (and (rmsbolt--is-active-src-buffer)
+ rmsbolt-automatic-recompile)
+ (setq rmsbolt--automated-compile t)
+ (rmsbolt-compile)))
+
+;; Auto-save the src buffer after it has been unchanged for
`rmsbolt-compile-delay' seconds.
+;; The buffer is then automatically recompiled via `rmsbolt--after-save'.
+(defvar rmsbolt--change-timer nil)
+(defvar rmsbolt--buffer-to-auto-save nil)
+
+(defun rmsbolt--after-change (&rest _)
+ (when (and (rmsbolt--is-active-src-buffer)
+ rmsbolt-automatic-recompile
+ (not (eq rmsbolt-automatic-recompile 'on-save)))
+ (when rmsbolt--change-timer
+ (cancel-timer rmsbolt--change-timer))
+ (setq rmsbolt--buffer-to-auto-save (current-buffer)
+ rmsbolt--change-timer (run-with-timer rmsbolt-compile-delay nil
#'rmsbolt--on-change-timer))))
+
+(defun rmsbolt--on-change-timer ()
+ (setq rmsbolt--change-timer nil)
+ (when (buffer-live-p rmsbolt--buffer-to-auto-save)
+ (with-current-buffer rmsbolt--buffer-to-auto-save
+ (setq rmsbolt--buffer-to-auto-save nil)
+ (when (or (< (line-number-at-pos (point-max)) rmsbolt-large-buffer-size)
+ (eq rmsbolt-automatic-recompile 'force))
+ ;; Clear `before-save-hook' to prevent things like whitespace cleanup
+ ;; (e.g., set by spacemacs in `spacemacs-whitespace-cleanup.el`)
+ ;; and aggressive indenting from running (this is a hot recompile).
+ ;; TODO does anyone want before-save-hook to run on a hot recompile?
+ (let ((before-save-hook nil))
+ (save-buffer))))))
;;;; Mode Definition:
@@ -1766,17 +1804,20 @@ This mode is enabled in both src and assembly output
buffers."
(add-hook 'post-command-hook #'rmsbolt--post-command-hook nil t)
(add-hook 'kill-buffer-hook #'rmsbolt--on-kill-buffer nil t)
- ;; This idle timer always runs, even when we aren't in rmsbolt-mode
- ;; It won't do anything unless we are in rmsbolt-mode
- (unless (or rmsbolt--compile-idle-timer
- (not rmsbolt-automatic-recompile))
- (setq rmsbolt--compile-idle-timer (run-with-idle-timer
- rmsbolt-compile-delay t
- #'rmsbolt-hot-recompile)))
+ (when (and rmsbolt-automatic-recompile
+ ;; Only turn on auto-save in src buffers
+ (not (eq (current-buffer) (get-buffer rmsbolt-output-buffer))))
+ (add-hook 'after-save-hook #'rmsbolt--after-save nil t)
+ (when (eq rmsbolt-automatic-recompile t)
+ (add-hook 'after-change-functions #'rmsbolt--after-change nil t)))
+
(rmsbolt--gen-temp))
(t ;; Cleanup
(rmsbolt--remove-overlays)
- (remove-hook 'kill-buffer-hook #'rmsbolt--on-kill-buffer t))))
+ (remove-hook 'after-change-functions #'rmsbolt--after-change t)
+ (remove-hook 'after-save-hook #'rmsbolt--after-save t)
+ (remove-hook 'kill-buffer-hook #'rmsbolt--on-kill-buffer t)
+ (remove-hook 'post-command-hook #'rmsbolt--post-command-hook t))))
;;;###autoload
(defun rmsbolt ()
- [elpa] externals/beardbolt 644973d865 079/323: Fix improper building of rmsbolt-starter path, (continued)
- [elpa] externals/beardbolt 644973d865 079/323: Fix improper building of rmsbolt-starter path, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 21b29cdb72 081/323: Satisfy package-lint, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 8cf5134dbe 098/323: add pony lang support (WIP), ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 480e0371bf 094/323: Update documentation and add autoload, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt cd424d2556 087/323: Fix broken disassemble spelling, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 971d6cfeae 093/323: Various fixes and cleanups, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt a5614c56d7 113/323: Merge branch 'pony', ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt b348482d7f 091/323: Switch to imgur for image links, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt d187b8b189 125/323: Optimize guide display when many line blocks found, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt de28f7903a 232/323: Merge branch 'fix-kill-buffer-error' into 'master', ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 3fe322e573 242/323: Merge branch 'improve-auto-compilation' into 'master',
ELPA Syncer <=
- [elpa] externals/beardbolt 194e7ea9dc 253/323: Dumb rename rmsbolt->bearbold, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 3870c30bbd 257/323: Move test/*test.el to beardbolt-tests.el, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 98f766bdfc 270/323: Add a README.md, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 28fc329861 262/323: Rework bb-compile a bit, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt f491a6adb2 278/323: Rework to use write-region, use a little less memory, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 2633e20e66 274/323: * beardbolt.el (bb--reachable-p): Rework for small speed gain., ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 60fa7a3c05 280/323: Force asm output to be of a certain format, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt b2dc0eb81d 284/323: Make beardbolt-disassemble work again, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 730ea84796 290/323: bb-compile-delay can be nil, ELPA Syncer, 2023/03/09
- [elpa] externals/beardbolt 2c798336b8 292/323: Tweak README.md, ELPA Syncer, 2023/03/09