diff --git a/symbol-tag.el b/symbol-tag.el --- a/symbol-tag.el +++ b/symbol-tag.el @@ -179,28 +179,30 @@ (let ((i (string-match-p (concat "\\(?:" (or regexp "[ \t\n\r]+") "\\)\\'") string))) (if i (substring string 0 i) string)))) - (condition-case err - (progn - (require 'map) - (defalias 'unorg-x-plist-delete 'map-delete)) - (error - (defun unorg-x-plist-delete (map key) - "Imported `map--plist-delete' from map.el. + (ignore-errors (require 'help-fns)) + (unless (fboundp #'help--symbol-completion-table) + (defun help--symbol-completion-table (&rest args))) + (ignore-errors + (require 'map) + (defalias 'unorg-x-plist-delete 'map-delete)) + (unless (fboundp #'unorg-x-plist-delete) + (defun unorg-x-plist-delete (map key) + "Imported `map--plist-delete' from map.el. Only available for Emacs 26." - (let ((tail map) last) - (while (consp tail) - (cond - ((not (equal key (car tail))) - (setq last tail) - (setq tail (cddr last))) - (last - (setq tail (cddr tail)) - (setf (cddr last) tail)) - (t - (cl-assert (eq tail map)) - (setq map (cddr map)) - (setq tail map)))) - map)))) + (let ((tail map) last) + (while (consp tail) + (cond + ((not (equal key (car tail))) + (setq last tail) + (setq tail (cddr last))) + (last + (setq tail (cddr tail)) + (setf (cddr last) tail)) + (t + (cl-assert (eq tail map)) + (setq map (cddr map)) + (setq tail map)))) + map))) (unless (boundp 'occur-buffer) (defvar occur-buffer nil))) @@ -787,6 +789,99 @@ comments, e.g.: (concat "\n" (symbol-tag-pp-to-string def t)))) ;; (insert (symbol-tag-redef-vars (quote (dired-re-mark dired-re-sym)))) +(defvar wsk-kill-on-quit-prev-buffer nil + "Buffer to return to after quitting.") +(make-variable-buffer-local 'wsk-kill-on-quit-prev-buffer) + +(defvar wsk-kill-on-quit-no-kill nil + "Do not kill buffer after quitting it not nil. +Just bury it alive.") +(make-variable-buffer-local 'wsk-kill-on-quit-no-kill) + +(defvar wsx-kill-on-quit-mode-map nil + "|:todo:| doc.") +(unless wsx-kill-on-quit-mode-map + (define-prefix-command 'wsx-kill-on-quit-mode-map nil "koq")) + +(defun wsx-kill-on-quit () + "|:todo:| doc." + (interactive) + (let ((to-be-killed (current-buffer)) + (prev-buffer wsk-kill-on-quit-prev-buffer) + (no-kill wsk-kill-on-quit-no-kill)) + (if no-kill (bury-buffer) (kill-buffer)) + (if prev-buffer (select-window (get-buffer-window prev-buffer))))) + +(define-key wsx-kill-on-quit-mode-map [?\C-c ?\C-c] 'wsx-kill-on-quit) + +;;;###autoload +(define-minor-mode wsx-kill-on-quit-minor-mode + "Minor mode for killing temporary buffer when quitting. + +The following keys are defined when +`wsx-kill-on-quit-minor-mode' is activated with +`\\[wsx-kill-on-quit-minor-mode]': + +\\{wsx-kill-on-quit-mode-map}" + :group 'workspace + :lighter " koq" + :global nil + :keymap wsx-kill-on-quit-mode-map + (cond + (wsx-kill-on-quit-minor-mode + ;; Turned on. + ) + (t + ;; Turned off. + ))) +;; (wsx-kill-on-quit-minor-mode) + +;;;###autoload +(defun symbol-tag-redefine (variable) + "Redefine VARIABLE in temporary buffer." + (interactive + (let ((v (variable-at-point)) + (enable-recursive-minibuffers t) + (orig-buffer (current-buffer)) + val) + (setq val (completing-read + (if (symbolp v) + (format + "Redefine variable (default %s): " v) + "Redefine variable: ") + #'help--symbol-completion-table + (lambda (vv) + (with-current-buffer orig-buffer + (or (get vv 'variable-documentation) + (and (boundp vv) (not (keywordp vv)))))) + t nil nil + (if (symbolp v) (symbol-name v)))) + (list (if (equal val "") + v (intern val))))) + (if (not (symbolp variable)) + (error "You did not specify a variable")) + (let ((orig-buffer (current-buffer)) + (buffer (format "*redefine %s*" variable)) + output-buffer) + (with-output-to-temp-buffer buffer + (princ + (substring + (symbol-tag-redef-vars (list variable)) 1))) + (setq output-buffer (get-buffer buffer)) + (select-window (get-buffer-window output-buffer)) + (read-only-mode 0) + (goto-char (point-min)) + (unless (looking-at "^;;") + (insert ";; `C-c C-c' to quit\n")) + (emacs-lisp-mode) + (wsx-kill-on-quit-minor-mode 1) + ;; (setq wsk-kill-on-quit-no-kill t) + (setq wsk-kill-on-quit-prev-buffer orig-buffer) + (ignore-errors + (down-list 2) + (forward-sexp 3) + (forward-sexp -1)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; :doc: Variables - Mode :var: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -929,9 +1024,11 @@ Use the following expression to insert a ) "Symbol tag delimiter stack. -Use the following expression to insert a valid expression to -redefine all dlm stack variables: -;; (insert (symbol-tag-redef-vars (quote (symbol-tag-dlm-default symbol-tag-dlm-stack-default symbol-tag-dlm symbol-tag-dlm-stack))))") +Use the following expression to redefine: +;; (insert (symbol-tag-redef-vars (quote (symbol-tag-dlm-stack-default)))) + +Use the following expression to redefine all dlm stack variables: +;; (symbol-tag-dlm-redefine)") ;;;###autoload (defvar symbol-tag-dlm