diff --git a/emacs.el b/emacs.el index 6325f4a..888a94c 100644 --- a/emacs.el +++ b/emacs.el @@ -150,6 +150,7 @@ found, otherwise returns nil." ;;window-organizer ilookup pasteboard + awk-preview )) @@ -1800,294 +1801,6 @@ This mode is a simplified version of `adoc-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