branch: externals/ergoemacs-mode commit 465d265f1ed6058c6e1b9986f63c38db92be829b Merge: 0e2f769 577997b Author: Matthew Fidler <514778+mattfid...@users.noreply.github.com> Commit: Matthew Fidler <514778+mattfid...@users.noreply.github.com>
Merge branch 'passthrough' --- .Rhistory | 2 - ergoemacs-advice.el | 2 +- ergoemacs-cua.el | 42 ++++++---- ergoemacs-functions.el | 215 +++++++++++++++++++++++++++++++++++++++++++++++-- ergoemacs-mode.el | 60 ++++++++++++-- ergoemacs-themes.el | 2 +- 6 files changed, 295 insertions(+), 28 deletions(-) diff --git a/.Rhistory b/.Rhistory deleted file mode 100644 index d4718b6..0000000 --- a/.Rhistory +++ /dev/null @@ -1,2 +0,0 @@ -q() -n diff --git a/ergoemacs-advice.el b/ergoemacs-advice.el index 38af9d6..39da47e 100644 --- a/ergoemacs-advice.el +++ b/ergoemacs-advice.el @@ -96,7 +96,7 @@ TYPE is the type of translation installed." (defun ergoemacs-advice-undefined (orig-fun) "Allow `ergoemacs-mode' to display keys, and intercept ending <apps> keys." - (if ergoemacs-mode + (if (and ergoemacs-mode (not ergoemacs--temporary-disable)) (ergoemacs-mode--undefined-advice) (call-interactively orig-fun))) diff --git a/ergoemacs-cua.el b/ergoemacs-cua.el index 7a276ba..c73bb61 100644 --- a/ergoemacs-cua.el +++ b/ergoemacs-cua.el @@ -113,21 +113,38 @@ This is also used to select the region keymaps.") This override is enabled for active regions before the copy and paste are enabled.") - - (defvar ergoemacs-inhibit-cua-keys nil "Buffer-local variable that may disable the CUA keymappings.") (make-variable-buffer-local 'ergoemacs-inhibit-cua-keys) (defvar ergeoemacs-mode-term-raw-mode) - +(defvar ergoemacs-mode) +(defvar ergoemacs--temporary-disable) +(defvar ergoemacs-mode-regular) +(defvar ergoemacs-mode-send-emacs-keys) (defun ergoemacs--select-keymaps () "Setup conditions for selecting the proper keymaps in `ergoemacs--keymap-alist'." - ;; The prefix override (when mark-active) operates in three substates: - ;; [1] Before using a prefix key - ;; [2] Immediately after using a prefix key - ;; [3] A fraction of a second later - (setq ergoemacs--ena-region-keymap ; Determines if the ergion is active + (when ergoemacs--temporary-disable + ;; The temporary disable commands set `ergoemacs--temporary-disable' to t + ;; The first time when the keys are put on the `unread-command-events', `ergoemacs-mode' is disabled + ;; The second command is executed, and `ergoemacs-mode' is turned back on and `ergoemacs--temporary-disable' is to nil + (if ergoemacs-mode-regular + (progn + (setq ergoemacs--ena-region-keymap nil + ergoemacs--ena-prefix-override-keymap nil + ergoemacs--ena-prefix-repeat-keymap nil + ergoemacs-mode-regular nil + ergoemacs-mode-send-emacs-keys nil)) + (setq ergoemacs--temporary-disable nil + ergoemacs-mode-regular t + ;; This assumes that `ergoemacs--tempoary-disable' is only called on the remap keys layer + ergoemacs-mode-send-emacs-keys t))) + (when ergoemacs-mode + ;; The prefix override (when mark-active) operates in three substates: + ;; [1] Before using a prefix key + ;; [2] Immediately after using a prefix key + ;; [3] A fraction of a second later + (setq ergoemacs--ena-region-keymap ; Determines if the ergion is active (and (not ergeoemacs-mode-term-raw-mode) (region-active-p) (not deactivate-mark)) ;; Enable Override -- This is the first state where the keys are intercepted; cua state [1] ergoemacs--ena-prefix-override-keymap @@ -144,10 +161,7 @@ This override is enabled for active regions before the copy and paste are enable (and ergoemacs--ena-region-keymap (not ergeoemacs-mode-term-raw-mode) (or (timerp ergoemacs--prefix-override-timer) - (eq ergoemacs--prefix-override-timer 'shift)))) - ;; In ergoemacs-mode the corresponding `cua--ena-cua-keys-keymap' and `cua--ena-global-mark-keymap' are not needed or used - (message "r: %s po: %s pr: %s") - ) + (eq ergoemacs--prefix-override-timer 'shift)))))) (defun ergoemacs--prefix-override-timeout () "This is whap happens on the `ergoemacs-mode' timeout for C-c and C-v are supplied." @@ -255,8 +269,8 @@ Pass prefix ARG to the respective copy functions." "Post command hook for `ergoemacs-mode' based cua keys." (when ergoemacs-mode (condition-case nil - (ergoemacs--cua-post-command-handler-1) - (error nil)))) + (ergoemacs--cua-post-command-handler-1) + (error nil)))) (add-hook 'post-command-hook #'ergoemacs--cua-post-command-handler) (add-hook 'pre-command-hook #'ergoemacs--cua-pre-command-handler) diff --git a/ergoemacs-functions.el b/ergoemacs-functions.el index e1773f3..3bd1d6a 100644 --- a/ergoemacs-functions.el +++ b/ergoemacs-functions.el @@ -95,12 +95,217 @@ (declare-function w32-long-file-name "compat") (declare-function term-paste "term") (declare-function calc-yank "calc-yank") +(defvar ergoemacs-temporary-disable) (defcustom ergoemacs-isearch-backward-char-to-edit nil "Backward char will edit isearch." :type 'boolean :group 'ergoemacs-mode) +(defun ergoemacs--send-emacs-key (key &optional key2 key3) + "This replays the events from the intial key press. + +KEY is the first key in the sequence. +KEY2 is the optional second key in the sequence. +KEY3 is the optional third key in the sequence." + ;; Don't record this command + (setq ergoemacs--temporary-disable t + this-command last-command) + ;; Restore the prefix arg + (prefix-command-preserve-state) + ;; Push the key back on the event queue + (when key3 + (setq unread-command-events (cons (cons 'no-record key3) + unread-command-events))) + (when key2 + (setq unread-command-events (cons (cons 'no-record key2) + unread-command-events))) + (setq unread-command-events (cons (cons 'no-record key) + unread-command-events))) + +(defun ergoemacs-kill-line () + "Ergoemacs replacement for `kill-line' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-k)) + +(defun ergoemacs-mark-whole-buffer () + "Ergoemacs replacement for `mark-whole-buffer' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-x ?h)) + +(defun ergoemacs-find-file () + "Ergoemacs replacement for `find-file' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-x ?\C-f)) + +(defun ergoemacs-save-buffer () + "Ergoemacs replacement for `save-buffer' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-x ?\C-s)) + +(defun ergoemacs-write-file () + "Ergoemacs replacement for `write-file' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-x ?\C-w)) + +(defun ergoemacs-goto-line () + "Ergoemacs replacement for `write-file' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\M-g ?\M-g)) + +(defun ergoemacs-delete-char () + "Ergoemacs replacement for `delete-char' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-d)) + +(defun ergoemacs-move-beginning-of-line () + "Ergoemacs replacement for `move-beginning-of-line' using `ergoemacs--send-emacs-key'." + (interactive) + (if this-command-keys-shift-translated + (ergoemacs--send-emacs-key ?\C-\S-a) + (ergoemacs--send-emacs-key ?\C-a))) + +(defun ergoemacs-move-end-of-line () + "Ergoemacs replacement for `move-end-of-line' using `ergoemacs--send-emacs-key'." + (interactive) + (if this-command-keys-shift-translated + (ergoemacs--send-emacs-key ?\C-\S-e) + (ergoemacs--send-emacs-key ?\C-e))) + +(defun ergoemacs-set-mark-command () + "Ergoemacs replacement for `set-mark-command' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-\ )) + +(defun ergoemacs-delete-backward-char () + "Ergoemacs replacement for `delete-backward-char' using `ergoemacs--send-emacs-key'." + (interactive) + ;; 127 = DEL + (ergoemacs--send-emacs-key 127)) + +(defun ergoemacs-delete-char () + "Ergoemacs replacement for `delete-char' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-d)) + +(defun ergoemacs-kill-word () + "Ergoemacs replacement for `kill-word' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\M-d)) + +(defun ergoemacs-backward-word () + "Ergoemacs replacement for `backward-word' using `ergoemacs--send-emacs-key'." + (interactive) + (if this-command-keys-shift-translated + (ergoemacs--send-emacs-key ?\M-\S-b) + (ergoemacs--send-emacs-key ?\M-b))) + +(defun ergoemacs-backward-kill-word () + "Ergoemacs replacement for `backward-kill-word' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key 'C-backspace)) + +(defun ergoemacs-forward-word () + "Ergoemacs replacement for `forward-word' using `ergoemacs--send-emacs-key'." + (interactive) + (if this-command-keys-shift-translated + (ergoemacs--send-emacs-key ?\M-\S-f) + (ergoemacs--send-emacs-key ?\M-f))) + +(defun ergoemacs-backward-paragraph () + "Ergoemacs replacement for `backward-paragraph' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\M-\{)) + +(defun ergoemacs-forward-paragraph () + "Ergoemacs replacement for `forward-paragraph' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\M-\})) + +(defun ergoemacs-scroll-down-command () + "Ergoemacs replacement for `scroll-down-command' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\M-v)) + +(defun ergoemacs-scroll-up-command () + "Ergoemacs replacement for `scroll-up-command' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-v)) + +(defun ergoemacs-beginning-of-buffer () + "Ergoemacs replacement for `beginning-of-buffer' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\M-\<)) + +(defun ergoemacs-end-of-buffer () + "Ergoemacs replacement for `end-of-buffer' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\M-\>)) + +(defun ergoemacs-query-replace () + "Ergoemacs replacement for `query-replace' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\M-\%)) + +(defun ergoemacs-query-replace-regexp () + "Ergoemacs replacement for `query-replace-regexp' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-\M-\%)) + +(defun ergoemacs-other-window () + "Ergoemacs replacement for `other-window' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-x ?o)) + +(defun ergoemacs-delete-other-windows () + "Ergoemacs replacement for `delete-other-windows' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-x ?1)) + +(defun ergoemacs-delete-window () + "Ergoemacs replacement for `delete-window' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-x ?0)) + +(defun ergoemacs-split-window-below () + "Ergoemacs replacement for `split-window-below' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-x ?2)) + +(defun ergoemacs-split-window-right () + "Ergoemacs replacement for `split-window-right' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-x ?3)) + +(defun ergoemacs-switch-to-buffer () + "Ergoemacs replacement for `switch-to-buffer' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-x ?b)) + +(defun ergoemacs-shell-command () + "Ergoemacs replacement for `shell-command' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\M-\!)) + +(defun ergoemacs-recenter-top-bottom () + "Ergoemacs replacement for `recenter-top-bottom' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\C-l)) + +(defun ergoemacs-comment-dwim () + "Ergoemacs replacement for `comment-dwim' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\M-\;)) + +(defun ergoemacs-delete-horizontal-space () + "Ergoemacs replacement for `delete-horizontal-space' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\M-\\)) + +(defun ergoemacs-mark-paragraph () + "Ergoemacs replacement for `mark-paragraph' using `ergoemacs--send-emacs-key'." + (interactive) + (ergoemacs--send-emacs-key ?\M-\S-\ )) (defvar ergoemacs-delete-functions '(delete-backward-char delete-char kill-word backward-kill-word) @@ -1106,15 +1311,15 @@ Subsequent calls expands the selection to larger semantic unit." (mark-sexp -1)))) ;;; TEXT TRANSFORMATION RELATED - (defun ergoemacs-kill-line-backward (&optional number) "Kill text between the beginning of the line to the cursor position. If there's no text, delete the previous line ending." (interactive "p") - (if (and (= number 1) (looking-back "\n" nil)) - (delete-char -1) - (setq current-prefix-arg (- 1 number)) - (kill-line))) + (save-match-data + (if (looking-back "\n" nil) + (delete-char -1) + (setq current-prefix-arg '(0)) + (ergoemacs--send-emacs-key ?\C-k)))) (defun ergoemacs-move-cursor-previous-pane (&optional number) "Move cursor to the previous pane." diff --git a/ergoemacs-mode.el b/ergoemacs-mode.el index f407da6..7543ac9 100644 --- a/ergoemacs-mode.el +++ b/ergoemacs-mode.el @@ -118,7 +118,6 @@ Added beginning-of-buffer Alt+n (QWERTY notation) and end-of-buffer Alt+Shift+n" :initialize #'custom-initialize-default :group 'ergoemacs-mode) - (defcustom ergoemacs-mode-line t "Determines when the ergoemacs-mode modeline indicator is shown." :type '(choice @@ -127,6 +126,50 @@ Added beginning-of-buffer Alt+n (QWERTY notation) and end-of-buffer Alt+Shift+n" (const :tag "Never Show Mode Line" nil)) :group 'ergoemacs-mode) +(defcustom ergoemacs-mode-send-emacs-keys t + "When t, send corresponding Emacs keys for `ergoemacs-mode' commands." + :type 'boolean + :group 'ergoemacs-mode) + +(defvar ergoemacs--send-emacs-keys-map (let ((map (make-sparse-keymap))) + (define-key map [remap kill-line] 'ergoemacs-kill-line) + (define-key map [remap mark-whole-buffer] 'ergoemacs-mark-whole-buffer) + (define-key map [remap find-file] 'ergoemacs-find-file) + (define-key map [remap save-buffer] 'ergoemacs-save-buffer) + (define-key map [remap write-file] 'ergoemacs-write-file) + (define-key map [remap goto-line] 'ergoemacs-goto-line) + (define-key map [remap delete-char] 'ergoemacs-delete-char) + (define-key map [remap move-beginning-of-line] 'ergoemacs-move-beginning-of-line) + (define-key map [remap move-end-of-line] 'ergoemacs-move-end-of-line) + (define-key map [remap set-mark-command] 'ergoemacs-set-mark-command) + (define-key map [remap delete-backward-char] 'ergoemacs-delete-backward-char) + (define-key map [remap delete-char] 'ergoemacs-delete-char) + (define-key map [remap kill-word] 'ergoemacs-kill-word) + (define-key map [remap backward-kill-word] 'ergoemacs-backward-kill-word) + (define-key map [remap backward-word] 'ergoemacs-backward-word) + (define-key map [remap forward-word] 'ergoemacs-forward-word) + (define-key map [remap backward-paragraph] 'ergoemacs-backward-paragraph) + (define-key map [remap forward-paragraph] 'ergoemacs-forward-paragraph) + (define-key map [remap scroll-down-command] 'ergoemacs-scroll-down-command) + (define-key map [remap scroll-up-command] 'ergoemacs-scroll-up-command) + (define-key map [remap end-of-buffer] 'ergoemacs-end-of-buffer) + (define-key map [remap beginning-of-buffer] 'ergoemacs-beginning-of-buffer) + (define-key map [remap query-replace] 'ergoemacs-query-replace) + (define-key map [remap query-replace-regexp] 'ergoemacs-query-replace-regexp) + (define-key map [remap other-window] 'ergoemacs-other-window) + (define-key map [remap delete-other-windows] 'ergoemacs-delete-other-windows) + (define-key map [remap delete-window] 'ergoemacs-delete-window) + (define-key map [remap split-window-below] 'ergoemacs-split-window-below) + (define-key map [remap split-window-right] 'ergoemacs-split-window-right) + (define-key map [remap switch-to-buffer] 'ergoemacs-switch-to-buffer) + (define-key map [remap recenter-top-bottom] 'ergoemacs-recenter-top-bottom) + (define-key map [remap shell-command] 'ergoemacs-shell-command) + (define-key map [remap comment-dwim] 'ergoemacs-comment-dwim) + (define-key map [remap delete-horizontal-space] 'ergoemacs-delete-horizontal-space) + (define-key map [remap mark-paragraph] 'ergoemacs-mark-paragraph) + map) + "This defines the remaps for the `ergoemacs-mode-send-emacs-keys' commands.") + (defun ergoemacs-mode-line (&optional text) "Set ergoemacs-mode-line. @@ -155,6 +198,9 @@ The TEXT will be what the mode-line is set to be." (font-lock-add-keywords 'emacs-lisp-mode ergoemacs-font-lock-keywords) +(defvar ergoemacs--temporary-disable nil + "Variable for temporarily disabling `ergoemacs-mode'") + (defvar ergoemacs-mode-startup-hook nil @@ -180,6 +226,7 @@ The TEXT will be what the mode-line is set to be." (defvar ergoemacs-post-command-hook nil) (defvar ergeoemacs-mode-term-raw-mode nil) +(defvar ergoemacs-mode-regular nil) (defun ergoemacs-post-command-hook () "Run `ergoemacs-mode' post command hooks." (when ergoemacs-mode @@ -251,6 +298,7 @@ IS-ERGOEMACS is true when the `ergoemacs-mode' keybindings are installed." (dolist (k ergoemacs-mode--save-keymaps-list) (set k (ergoemacs-mode--get-map k is-ergoemacs)))) + ;; ErgoEmacs minor mode ;;;###autoload (define-minor-mode ergoemacs-mode @@ -277,7 +325,7 @@ The `execute-extended-command' is now \\[execute-extended-command]. (add-hook 'pre-command-hook #'ergoemacs-pre-command-hook) (add-hook 'post-command-hook #'ergoemacs-post-command-hook) (add-hook 'after-load-functions #'ergoemacs-after-load-functions) - + (setq ergoemacs-mode-regular t) (setq ergoemacs-mode--default-frame-alist nil) (dolist (elt (reverse default-frame-alist)) (push elt ergoemacs-mode--default-frame-alist)) @@ -315,6 +363,7 @@ The `execute-extended-command' is now \\[execute-extended-command]. (remove-hook 'after-load-functions #'ergoemacs-after-load-functions) (ergoemacs-mode--restore-maps) (define-key global-map [menu-bar] ergoemacs-old-menu) + (setq ergoemacs-mode-regular nil) (message "Ergoemacs-mode turned OFF."))) (defvar ergoemacs-translate--event-hash (make-hash-table) @@ -428,9 +477,10 @@ after initializing ergoemacs-mode. (ergoemacs--ena-prefix-override-keymap . ,ergoemacs--prefix-override-keymap) (ergoemacs--ena-prefix-repeat-keymap . ,ergoemacs--prefix-repeat-keymap) (ergoemacs--ena-region-keymap . ,ergoemacs-mark-active-keymap) - (ergoemacs-mode . ,ergoemacs-user-keymap) - (ergoemacs-mode . ,ergoemacs-override-keymap) - (ergoemacs-mode . ,ergoemacs-keymap))) + (ergoemacs-mode-regular . ,ergoemacs-user-keymap) + (ergoemacs-mode-regular . ,ergoemacs-override-keymap) + (ergoemacs-mode-regular . ,ergoemacs-keymap) + (ergoemacs-mode-send-emacs-keys . ,ergoemacs--send-emacs-keys-map))) (add-hook 'emulation-mode-map-alists ergoemacs-override-alist) (advice-add 'undefined :around #'ergoemacs-advice-undefined) (advice-add 'read-key :before #'ergoemacs-advice-read-key)) diff --git a/ergoemacs-themes.el b/ergoemacs-themes.el index 4df9a04..8aad1ee 100644 --- a/ergoemacs-themes.el +++ b/ergoemacs-themes.el @@ -609,7 +609,7 @@ These keys do not depend on the layout." (ergoemacs-define-key keymap (kbd "<apps> x") 'ergoemacs-cut-line-or-region) (ergoemacs-define-key keymap (kbd "<apps> c") 'ergoemacs-copy-line-or-region) (ergoemacs-define-key keymap (kbd "<apps> v") 'ergoemacs-paste) - (ergoemacs-define-key keymap (kbd "<apps> b") '(redo undo-tree-redo ergoemacs-redo)) + (ergoemacs-define-key keymap (kbd "<apps> b") 'ergoemacs-redo) (ergoemacs-define-key keymap (kbd "<apps> t") 'switch-to-buffer) (ergoemacs-define-key keymap (kbd "<apps> z") 'undo) (ergoemacs-define-key keymap (kbd "<apps> r") 'goto-map) ;; Already in CUA)