| @@ -150,6 +150,7 @@ found, otherwise returns nil." | |||||
| ;;window-organizer | ;;window-organizer | ||||
| ilookup | ilookup | ||||
| pasteboard | pasteboard | ||||
| awk-preview | |||||
| )) | )) | ||||
| @@ -1800,294 +1801,6 @@ This mode is a simplified version of `adoc-mode'." | |||||
| '("\\.adoc\\'" . adoc-simple-mode))) | '("\\.adoc\\'" . adoc-simple-mode))) | ||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |||||
| ;; awk-preview | |||||
| (defgroup awk-preview nil | |||||
| "Awk previewer." | |||||
| :tag "Awk Preview" | |||||
| :prefix "awk-preview-" | |||||
| :group 'tools) | |||||
| (defcustom awk-preview-program | |||||
| (or (executable-find "gawk") | |||||
| (executable-find "awk") | |||||
| "awk") | |||||
| "Awk program to execute." | |||||
| :type 'string | |||||
| :group 'awk-preview) | |||||
| (defcustom awk-preview-switches | |||||
| ;; '("--sandbox") | |||||
| nil | |||||
| "String of awk options appended when running awk preview." | |||||
| :type '(repeat string) | |||||
| :group 'awk-preview) | |||||
| (defcustom awk-preview-default-program | |||||
| "# C-c C-l: Update preview C-c C-c: Commit and exit | |||||
| # C-c C-r: Resest to original C-c C-k: Abort | |||||
| { | |||||
| print NR, $0 | |||||
| } | |||||
| " | |||||
| "Default awk command." | |||||
| :type 'string | |||||
| :group 'awk-preview) | |||||
| (defcustom awk-preview-kill-orphan-program-buffer | |||||
| 'ask | |||||
| "This variable decides whether program buffers which do not visit any files | |||||
| will be killed when exiting awk-preview sessions. | |||||
| When set to nil, do not kill program buffers. | |||||
| When set to `ask', ask user whether to kill them. | |||||
| For other values always kill them silently. | |||||
| When a program buffer is visiting a file, the buffer will not be killed for any | |||||
| cases regardless of this variable." | |||||
| :type '(choice (const t) | |||||
| (const nil) | |||||
| (const ask)) | |||||
| :group 'awk-preview) | |||||
| (cl-defstruct awk-preview--env | |||||
| ;; Whether awk-preview is currently running | |||||
| (running-p nil) | |||||
| ;; Point of beg in source buffer | |||||
| (point-beg nil) | |||||
| ;; Point of end in source buffer | |||||
| (point-end nil) | |||||
| ;; Point of beginning | |||||
| ;; Used by preview buffer and always same as point-beg | |||||
| (preview-point-beg nil) | |||||
| ;; Point of beginning | |||||
| ;; Used by preview buffer and may defferent from point-end | |||||
| (preview-point-end nil) | |||||
| ;; Awk preview program temporary file name | |||||
| (program-filename nil) | |||||
| ;; Source buffer | |||||
| (source-buffer nil) | |||||
| ;; Preview buffer | |||||
| (preview-buffer nil) | |||||
| ;; Program buffer | |||||
| (program-buffer nil) | |||||
| ;; Window configuration when entering awk-review | |||||
| (window-configuration nil) | |||||
| ) | |||||
| (defvar-local awk-preview--env nil | |||||
| "`awk-preview--env' struct object of currently running.") | |||||
| (put 'awk-preview--env | |||||
| 'permanent-local | |||||
| t) | |||||
| (defun awk-preview--invoke-awk (buf beg end progfile output &optional delete display) | |||||
| "Execute PROGFILE awk process with BEG and END input and output to OUTPUT buffer. | |||||
| When OUTPUT is t the result will be output to BUF. | |||||
| Delete the text between BEG and END when DELETE is non-nil. | |||||
| DISPLAY non-nil means redisplay buffer as output is inserted." | |||||
| (with-current-buffer buf | |||||
| (let ((status (apply 'call-process-region | |||||
| beg | |||||
| end | |||||
| awk-preview-program | |||||
| delete | |||||
| output | |||||
| display | |||||
| `(,@awk-preview-switches "-f" ,progfile)))) | |||||
| (unless (eq status | |||||
| 0) | |||||
| (error "awk-preview: Awk program exited abnormally.")) | |||||
| output))) | |||||
| (defvar awk-preview-program-buffer-name | |||||
| "*AWK Preview Program<%s>*" | |||||
| "Buffer name of awk preview program.") | |||||
| (defvar awk-preview-preview-buffer-name | |||||
| "*AWK Preview<%s>*" | |||||
| "Buffer name of awk preview.") | |||||
| (defun awk-preview--create-program-buffer (e) | |||||
| "Create new program buffer for `awk-preview--env' object E." | |||||
| (let ((source-name (buffer-name (awk-preview--env-source-buffer e)))) | |||||
| (with-current-buffer (generate-new-buffer (format awk-preview-program-buffer-name | |||||
| source-name)) | |||||
| (erase-buffer) | |||||
| (insert awk-preview-default-program) | |||||
| (awk-mode) | |||||
| (current-buffer)))) | |||||
| (defun awk-preview--setup-program-buffer (e buf) | |||||
| "Setup awk-preview program buffer for E with BUF." | |||||
| (with-current-buffer buf | |||||
| (awk-preview-program-mode 1) | |||||
| (setq awk-preview--env e)) | |||||
| (setf (awk-preview--env-program-buffer e) buf) | |||||
| (setf (awk-preview--env-program-filename e) (make-temp-file "awk-preview-" | |||||
| nil | |||||
| ".awk")) | |||||
| buf) | |||||
| (defun awk-preview--create-setup-preview-buffer (e) | |||||
| "Create and setup preview buffer for `awk-preview--env' object E." | |||||
| (with-current-buffer (awk-preview--env-source-buffer e) | |||||
| (let ((beg (awk-preview--env-point-beg e)) | |||||
| (end (awk-preview--env-point-end e)) | |||||
| (buf (let ((orig buffer-file-name)) | |||||
| (unwind-protect | |||||
| (progn | |||||
| (setq buffer-file-name nil) | |||||
| (clone-buffer (format awk-preview-preview-buffer-name | |||||
| (buffer-name)))) | |||||
| (setq buffer-file-name orig))))) | |||||
| (with-current-buffer buf | |||||
| (awk-preview-program-mode 1) | |||||
| (goto-char end) | |||||
| (setq buffer-read-only t) | |||||
| (setq awk-preview--env e)) | |||||
| (setf (awk-preview--env-preview-point-beg e) beg) | |||||
| (setf (awk-preview--env-preview-point-end e) end) | |||||
| (setf (awk-preview--env-preview-buffer e) buf) | |||||
| buf))) | |||||
| (defun awk-preview (beg end &optional program-buffer) | |||||
| "Run awk and preview result." | |||||
| (interactive (if (use-region-p) | |||||
| (list (region-beginning) | |||||
| (region-end)) | |||||
| (list (point-min) | |||||
| (point-max)))) | |||||
| (when (and awk-preview--env | |||||
| (awk-preview--env-running-p awk-preview--env)) | |||||
| (error "AWK-Preview already running")) | |||||
| (let ((e (make-awk-preview--env))) | |||||
| (setf (awk-preview--env-point-beg e) beg) | |||||
| (setf (awk-preview--env-point-end e) end) | |||||
| (setf (awk-preview--env-source-buffer e) (current-buffer)) | |||||
| (awk-preview--create-setup-preview-buffer e) | |||||
| (awk-preview--setup-program-buffer e | |||||
| (or program-buffer | |||||
| (awk-preview--create-program-buffer e))) | |||||
| (setf (awk-preview--env-window-configuration e) | |||||
| (current-window-configuration)) | |||||
| (cl-assert (awk-preview--env-point-beg e)) | |||||
| (cl-assert (awk-preview--env-point-end e)) | |||||
| (cl-assert (awk-preview--env-preview-point-beg e)) | |||||
| (cl-assert (awk-preview--env-preview-point-end e)) | |||||
| (cl-assert (awk-preview--env-program-filename e)) | |||||
| (cl-assert (awk-preview--env-source-buffer e)) | |||||
| (cl-assert (awk-preview--env-preview-buffer e)) | |||||
| (cl-assert (awk-preview--env-program-buffer e)) | |||||
| (cl-assert (awk-preview--env-window-configuration e)) | |||||
| (setq awk-preview--env e) | |||||
| (set-window-buffer (get-buffer-window (awk-preview--env-source-buffer e)) | |||||
| (awk-preview--env-preview-buffer e)) | |||||
| (pop-to-buffer (awk-preview--env-program-buffer e)) | |||||
| (switch-to-buffer (awk-preview--env-program-buffer e)) | |||||
| (setf (awk-preview--env-running-p e) t) | |||||
| (awk-preview-update-preview) | |||||
| )) | |||||
| (defun awk-preview-update-preview () | |||||
| "Update awk-preview." | |||||
| (interactive) | |||||
| (cl-assert awk-preview--env) | |||||
| (with-current-buffer (awk-preview--env-program-buffer awk-preview--env) | |||||
| (write-region (point-min) | |||||
| (point-max) | |||||
| (awk-preview--env-program-filename awk-preview--env))) | |||||
| (let ((output (with-current-buffer (get-buffer-create " *awk-preview output*") | |||||
| (erase-buffer) | |||||
| (current-buffer))) | |||||
| (progfile (awk-preview--env-program-filename awk-preview--env))) | |||||
| (awk-preview--invoke-awk (awk-preview--env-source-buffer awk-preview--env) | |||||
| (awk-preview--env-point-beg awk-preview--env) | |||||
| (awk-preview--env-point-end awk-preview--env) | |||||
| progfile | |||||
| output) | |||||
| (with-current-buffer (awk-preview--env-preview-buffer awk-preview--env) | |||||
| (let ((inhibit-read-only t)) | |||||
| (goto-char (awk-preview--env-preview-point-end awk-preview--env)) | |||||
| (delete-region (awk-preview--env-preview-point-beg awk-preview--env) | |||||
| (point)) | |||||
| (insert-buffer-substring output) | |||||
| (setf (awk-preview--env-preview-point-end awk-preview--env) | |||||
| (point))) | |||||
| ))) | |||||
| (defun awk-preview-reset () | |||||
| "Show original input in preview buffer." | |||||
| (interactive) | |||||
| (cl-assert awk-preview--env) | |||||
| (with-current-buffer (awk-preview--env-preview-buffer awk-preview--env) | |||||
| (let ((inhibit-read-only t)) | |||||
| (goto-char (awk-preview--env-preview-point-end awk-preview--env)) | |||||
| (delete-region (awk-preview--env-preview-point-beg awk-preview--env) | |||||
| (point)) | |||||
| (insert-buffer-substring (awk-preview--env-source-buffer awk-preview--env) | |||||
| (awk-preview--env-point-beg awk-preview--env) | |||||
| (awk-preview--env-point-end awk-preview--env)) | |||||
| (setf (awk-preview--env-preview-point-end awk-preview--env) | |||||
| (point))))) | |||||
| (defun awk-preview-commit () | |||||
| "Exit awk-preview and update buffer." | |||||
| (interactive) | |||||
| (cl-assert awk-preview--env) | |||||
| (awk-preview--invoke-awk (awk-preview--env-source-buffer awk-preview--env) | |||||
| (awk-preview--env-point-beg awk-preview--env) | |||||
| (awk-preview--env-point-end awk-preview--env) | |||||
| (awk-preview--env-program-filename awk-preview--env) | |||||
| t | |||||
| t | |||||
| t) | |||||
| (awk-preview--cleanup)) | |||||
| (defun awk-preview-abort () | |||||
| "Discard result and exit awk-preview." | |||||
| (interactive) | |||||
| (awk-preview--cleanup)) | |||||
| (defun awk-preview--cleanup() | |||||
| "Cleanup awk-preview buffers variables and files." | |||||
| (cl-assert awk-preview--env) | |||||
| (with-current-buffer (awk-preview--env-source-buffer awk-preview--env) | |||||
| (kill-buffer (awk-preview--env-preview-buffer awk-preview--env)) | |||||
| (when (and (not (buffer-file-name (awk-preview--env-program-buffer awk-preview--env))) | |||||
| (if (eq 'ask | |||||
| awk-preview-kill-orphan-program-buffer) | |||||
| (yes-or-no-p "Program buffer does not visit any file. Kill? ") | |||||
| awk-preview-kill-orphan-program-buffer)) | |||||
| (kill-buffer (awk-preview--env-program-buffer awk-preview--env))) | |||||
| (delete-file (awk-preview--env-program-filename awk-preview--env)) | |||||
| (setf (awk-preview--env-running-p awk-preview--env) nil)) | |||||
| (set-window-configuration (awk-preview--env-window-configuration awk-preview--env))) | |||||
| (defvar awk-preview-program-mode-map | |||||
| (let ((map (make-sparse-keymap))) | |||||
| (define-key map (kbd "C-c C-l") 'awk-preview-update-preview) | |||||
| (define-key map (kbd "C-c C-k") 'awk-preview-abort) | |||||
| (define-key map (kbd "C-c C-c") 'awk-preview-commit) | |||||
| (define-key map (kbd "C-c C-r") 'awk-preview-reset) | |||||
| map) | |||||
| "Keymap for `awk-preview-program-mode'.") | |||||
| (define-minor-mode awk-preview-program-mode | |||||
| "Minor mode for awk-preview program buffer." | |||||
| :lighter " AWKPrev" | |||||
| :keymap awk-preview-program-mode-map) | |||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
| ;; editorconfig-auto-apply | ;; editorconfig-auto-apply | ||||