[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] 43/287: Be more conservative with substituting key commands.
From: |
Matthew Fidler |
Subject: |
[elpa] 43/287: Be more conservative with substituting key commands. |
Date: |
Wed, 02 Jul 2014 14:44:28 +0000 |
mlf176f2 pushed a commit to branch externals/ergoemacs-mode
in repository elpa.
commit 9141572b3fdc45747fa03c3ac0dc9ba17250a340
Author: Matthew L. Fidler <address@hidden>
Date: Wed Jun 4 13:32:44 2014 -0500
Be more conservative with substituting key commands.
---
ergoemacs-advices.el | 129 +++++++++++++++++++++++++++++++++++++++++++++
ergoemacs-mode.el | 18 +------
ergoemacs-theme-engine.el | 25 +++++++--
ergoemacs-translate.el | 14 ++++--
4 files changed, 161 insertions(+), 25 deletions(-)
diff --git a/ergoemacs-advices.el b/ergoemacs-advices.el
index e524476..0e22daf 100644
--- a/ergoemacs-advices.el
+++ b/ergoemacs-advices.el
@@ -40,6 +40,7 @@
(require 'ergoemacs-shortcuts)
(require 'ergoemacs-unbind)
+
(defmacro ergoemacs-define-overrides (&rest body)
"Force the define-keys to work"
`(let ((ergoemacs-run-mode-hooks t))
@@ -223,6 +224,134 @@ This assumes any key defined while running a hook is a
user-defined hook."
(ergoemacs-with-global
ad-do-it))
+;;; Unfortunately, the advice route doesn't seem to work :(
+
+(fset 'ergoemacs-real-substitute-command-keys (symbol-function
'substitute-command-keys))
+
+(defun ergoemacs-substitute-command (string &optional map)
+ "Substitutes command STRING
+will add MAP to substitution."
+ (save-match-data
+ (let* (ret
+ (test (ergoemacs-with-global
+ (ergoemacs-real-substitute-command-keys
+ (or (and map (concat map string)) string))))
+ (test-vect (read-kbd-macro test t))
+ (test-hash (gethash test-vect
ergoemacs-original-keys-to-shortcut-keys)))
+ (if test-hash
+ (progn
+ (ergoemacs-pretty-key (key-description (nth 0 test-hash))))
+ (let (ergoemacs-modal ergoemacs-repeat-keys ergoemacs-read-input-keys)
+ (ergoemacs-pretty-key
+ (ergoemacs-real-substitute-command-keys
+ (or (and map (concat map string)) string))))))))
+
+(defun ergoemacs-substitute-map--1 (string)
+ (substring
+ (replace-regexp-in-string
+ "`\\(binding\\|Prefix Command\\|-------\\)'" "\\1"
+ (replace-regexp-in-string
+ "---|\n|-" "---|"
+ (replace-regexp-in-string
+ "^|'[ \t]*|$" "|-"
+ (replace-regexp-in-string
+ "' |\n.*(that binding is.*\n|'" "' (shadowed)"
+ (replace-regexp-in-string
+ "^" "|"
+ (replace-regexp-in-string
+ "$" "' |"
+ (replace-regexp-in-string
+ "\\([ \t]\\{2,\\}\\|\t\\)" "\\1 | `"
+ string))))))) 0 -2))
+
+(defun ergoemacs-substitute-map (string &optional function)
+ (save-match-data
+ (let* (ret
+ ergoemacs-use-unicode-brackets
+ (max1 0) (max2 0)
+ (function (or function 'ergoemacs-real-substitute-command-keys))
+ (test (ergoemacs-with-global
+ (funcall function string)))
+ (shortcut-list '()))
+ (while (string-match (format
"^%s.*$"ergoemacs-original-keys-to-shortcut-keys-regexp) test)
+ (push (match-string 0 test) shortcut-list)
+ (setq test
+ (replace-match "" nil nil test)))
+ (let (ergoemacs-modal ergoemacs-repeat-keys ergoemacs-read-input-keys)
+ (setq test (funcall function string))
+ (while (string-match "^.*\\<ergoemacs-shortcut.*\n" test)
+ (setq test (replace-match "" test)))
+ (when (string-match ".*\n.*\n" test)
+ (setq ret (ergoemacs-substitute-map--1
+ (concat (match-string 0 test)
+ (mapconcat (lambda(x) x) shortcut-list "\n")
+ (replace-match "" nil nil test))))))
+ (with-temp-buffer
+ (insert ret)
+ (goto-char (point-min))
+ (forward-line 2)
+ (while (re-search-forward "^|\\(.*?\\)[ \t]+|" nil t)
+ (setq test (ergoemacs-pretty-key (match-string 1)))
+ (replace-match (format "| %s |" test))
+ (setq max1 (max max1 (length test))
+ max2 (max max2 (length (buffer-substring (point)
(point-at-eol))))))
+ (setq test (concat "|"
+ (make-string (+ max1 2) ?-)
+ "+"
+ (make-string (- max2 1) ?-)
+ "|"))
+ (goto-char (point-min))
+ (insert test "\n")
+ (while (re-search-forward "|-.*\\(\n|-.*\\)*" nil t)
+ (replace-match test))
+ (goto-char (point-min))
+ (while (re-search-forward "^| *\\(.*?[^ ]\\) +| *\\(.*?[^ ]\\) +|$"
nil t)
+ (replace-match (format "| \\1%s | \\2%s |"
+ (make-string (max 0 (- max1 (length
(match-string 1)))) ? )
+ (make-string (max 0 (- max2 (+ 3 (length
(match-string 2))))) ? ))))
+ (goto-char (point-max))
+ (insert "\n" test "\n\n")
+ (setq ret (buffer-string)))
+ ret)))
+
+
+
+(defun substitute-command-keys (string)
+ "Substitute key descriptions for command names in STRING.
+Each substring of the form \[COMMAND] is replaced by either a
+keystroke sequence that invokes COMMAND, or \"M-x COMMAND\" if COMMAND
+is not on any keys.
+
+Each substring of the form \{MAPVAR} is replaced by a summary of
+the value of MAPVAR as a keymap. This summary is similar to the one
+produced by `describe-bindings'. The summary ends in two newlines
+ (used by the helper function `help-make-xrefs' to find the end of the
+ summary).
+
+Each substring of the form \<MAPVAR> specifies the use of MAPVAR
+as the keymap for future \[COMMAND] substrings.
+\= quotes the following character and is discarded;
+thus, \=\= puts \= into the output, and \=\[ puts \[ into the output.
+
+Return the original STRING if no substitutions are made.
+Otherwise, return a new string, without any text properties.
+"
+ (let (ret str mapvar)
+ (if (not ergoemacs-mode)
+ (setq ret (ergoemacs-real-substitute-command-keys string))
+ (with-temp-buffer
+ (insert string)
+ (goto-char (point-min))
+ (while (re-search-forward "\\\\\\(\\[\\|<\\).*?\\(\\]\\|>\\)" nil t)
+ (if (string-match-p "\\`<" (match-string 0))
+ (setq mapvar (match-string 0))
+ (replace-match (ergoemacs-substitute-command (match-string 0)
mapvar))))
+ (goto-char (point-min))
+ (while (re-search-forward "\\\\{.*?}" nil t)
+ (replace-match (ergoemacs-substitute-map (match-string 0))))
+ (setq ret (buffer-string))))
+ ret))
+
diff --git a/ergoemacs-mode.el b/ergoemacs-mode.el
index 94d99eb..0605965 100644
--- a/ergoemacs-mode.el
+++ b/ergoemacs-mode.el
@@ -79,23 +79,7 @@
"Print keymap bindings."
(ergoemacs-debug-heading
(format "Keymap Description: %s" (symbol-name keymap)))
- (ergoemacs-debug
- "|-\n%s"
- (substring
- (replace-regexp-in-string
- "---|\n|-" "---|"
- (replace-regexp-in-string
- "^|[ \t]*|$" "|-"
- (replace-regexp-in-string
- ".*(that binding is.*\n" ""
- (replace-regexp-in-string
- "^" "|"
- (replace-regexp-in-string
- "$" "|"
- (replace-regexp-in-string
- "\\([ \t]\\{2,\\}\\|\t\\)" "\\1|"
- (substitute-command-keys (format "\\{%s}" (symbol-name
keymap)))))))))
- 0 -2)))
+ (ergoemacs-debug (substitute-command-keys (format "\\{%s}" (symbol-name
keymap)))))
(defvar ergoemacs-debug-heading-start-time (float-time))
(defvar ergoemacs-debug-heading-last-time (float-time))
diff --git a/ergoemacs-theme-engine.el b/ergoemacs-theme-engine.el
index 9074be3..e2ffeaf 100644
--- a/ergoemacs-theme-engine.el
+++ b/ergoemacs-theme-engine.el
@@ -243,7 +243,7 @@
(with-slots (deferred-keys) obj
(let ((deferred-list deferred-list))
(setq deferred-keys
- (mapcar
+ (mapcar
(lambda(x)
(if (equal (nth 0 x) key)
(prog1 (list key deferred-list)
@@ -798,6 +798,12 @@ ergoemacs-get-keymaps-for-hook OBJ HOOK")
(defmethod ergoemacs-get-keymaps-for-hook ((obj
ergoemacs-theme-component-map-list) hook &optional ret)
(ergoemacs-get-hooks obj (concat "\\`" (regexp-quote (symbol-name hook))
"\\'") ret t))
+(defvar ergoemacs-original-keys-to-shortcut-keys-regexp ""
+ "Regular expression of original keys that have shortcuts.")
+
+(defvar ergoemacs-original-keys-to-shortcut-keys (make-hash-table :test 'equal)
+ "Hash table of the original maps that `ergoemacs-mode' saves.")
+
(defvar ergoemacs-original-map-hash (make-hash-table)
"Hash table of the original maps that `ergoemacs-mode' saves.")
@@ -3293,8 +3299,10 @@ When NO-MESSAGE is true, don't tell the user."
;;; Restore maps
(ergoemacs-theme-restore-maps no-message)
(setq ergoemacs-command-shortcuts-hash (make-hash-table :test 'equal)
+ ergoemacs-original-keys-to-shortcut-keys-regexp ""
+ ergoemacs-original-keys-to-shortcut-keys (make-hash-table :test 'equal)
ergoemacs-extract-map-hash (make-hash-table :test 'equal)
- ergoemacs-shortcut-function-binding-hash (make-hash-table :test 'equal)
+ ;; ergoemacs-shortcut-function-binding-hash (make-hash-table :test
'equal)
ergoemacs-emulation-mode-map-alist '()
ergoemacs-shortcut-keys nil
ergoemacs-modal nil
@@ -3370,8 +3378,17 @@ This also:
(unless dont-install
(ergoemacs-theme-remove no-message)
;; Reset Shortcut hash.
- (dolist (c ergoemacs-theme-shortcut-reset-list)
- (puthash (nth 0 c) (nth 1 c) ergoemacs-command-shortcuts-hash))
+ (let (tmp)
+ (dolist (c ergoemacs-theme-shortcut-reset-list)
+ (puthash (nth 0 c) (nth 1 c) ergoemacs-command-shortcuts-hash)
+ (when (eq (nth 1 (nth 1 c)) 'global)
+ (dolist (global-key (ergoemacs-shortcut-function-binding (nth 0 (nth
1 c))))
+ (if (not (gethash global-key
ergoemacs-original-keys-to-shortcut-keys))
+ (puthash global-key (append (gethash global-key
ergoemacs-original-keys-to-shortcut-keys) (list (nth 0 c)))
ergoemacs-original-keys-to-shortcut-keys)
+ (push (key-description global-key) tmp)
+ (puthash global-key (list (nth 0 c))
ergoemacs-original-keys-to-shortcut-keys)))))
+ (setq ergoemacs-original-keys-to-shortcut-keys-regexp
+ (regexp-opt tmp t)))
(setq ergoemacs-emulation-mode-map-alist '())
;; Install persistent mode-based remaps.
(dolist (mode ergoemacs-theme-mode-based-remaps)
diff --git a/ergoemacs-translate.el b/ergoemacs-translate.el
index 1120313..1314b89 100644
--- a/ergoemacs-translate.el
+++ b/ergoemacs-translate.el
@@ -98,19 +98,26 @@ This assumes `ergoemacs-use-unicode-char' is non-nil. When
:type 'boolean
:group 'ergoemacs-mode)
+(defcustom ergoemacs-use-unicode-brackets t
+ "Use unicode brackets."
+ :type 'boolean
+ :group 'ergoemacs-mode)
+
(defun ergoemacs-pretty-key (code)
"Creates Pretty keyboard binding from kbd CODE from M- to Alt+"
(if (not code) ""
(let (deactivate-mark
+ (ob (or (and ergoemacs-use-unicode-brackets (ergoemacs-unicode-char
"【" "[")) "["))
+ (cb (or (and ergoemacs-use-unicode-brackets (ergoemacs-unicode-char
"】" "]")) "]"))
(ret (replace-regexp-in-string
" +$" "" (replace-regexp-in-string "^ +" "" code)))
(case-fold-search nil))
(when ergoemacs-use-ergoemacs-key-descriptions
(save-match-data
(with-temp-buffer
- (insert (ergoemacs-unicode-char "【" "["))
+ (insert ob)
(insert ret)
- (insert (ergoemacs-unicode-char "】" "]"))
+ (insert cb)
(goto-char (point-min))
(while (re-search-forward "<f\\([0-9]+\\)>" nil t)
(replace-match "<F\\1>"))
@@ -126,8 +133,7 @@ This assumes `ergoemacs-use-unicode-char' is non-nil. When
(replace-match "S-" t t))
(goto-char (point-min))
(while (re-search-forward " +" nil t)
- (replace-match (format "%s%s"
- (ergoemacs-unicode-char "】" "]")
(ergoemacs-unicode-char "【" "["))))
+ (replace-match (format "%s%s" cb ob)))
(goto-char (point-min))
(while (search-forward "M-" nil t)
(replace-match (if (eq system-type 'darwin)
- [elpa] 34/287: Now can get the fixed maps for a list of components., (continued)
- [elpa] 34/287: Now can get the fixed maps for a list of components., Matthew Fidler, 2014/07/02
- [elpa] 36/287: Use pushnew for get-hooks., Matthew Fidler, 2014/07/02
- [elpa] 37/287: Added ergoemacs-keymap-collapse and ergoemacs-keymap-empty-p, Matthew Fidler, 2014/07/02
- [elpa] 40/287: Remove shortcut override mode., Matthew Fidler, 2014/07/02
- [elpa] 44/287: Suppress shortcuts, Matthew Fidler, 2014/07/02
- [elpa] 39/287: Starting applying keymaps to ergoemacs-emulation-mode-map-alist, Matthew Fidler, 2014/07/02
- [elpa] 45/287: Fix ergoemacs-describe-key, Matthew Fidler, 2014/07/02
- [elpa] 31/287: Created composite map list, Matthew Fidler, 2014/07/02
- [elpa] 42/287: Push shortcuts to the bottom. Should allow overrides., Matthew Fidler, 2014/07/02
- [elpa] 49/287: Bug fix for substitute-command-keys, Matthew Fidler, 2014/07/02
- [elpa] 43/287: Be more conservative with substituting key commands.,
Matthew Fidler <=
- [elpa] 46/287: Fix Issue #7, Matthew Fidler, 2014/07/02
- [elpa] 50/287: Another bug-fix for substitute-command-keys, Matthew Fidler, 2014/07/02
- [elpa] 52/287: Debugging ergoemacs-theme obect, Matthew Fidler, 2014/07/02
- [elpa] 51/287: more substitute-command-keys fixes, Matthew Fidler, 2014/07/02
- [elpa] 58/287: Fix misplaced paren, Matthew Fidler, 2014/07/02
- [elpa] 57/287: Added basic variable/mode initialization routines., Matthew Fidler, 2014/07/02
- [elpa] 54/287: Maps seem correct now, Matthew Fidler, 2014/07/02
- [elpa] 48/287: Unstage the incompatible, Matthew Fidler, 2014/07/02
- [elpa] 55/287: Nicer theme debugging display, Matthew Fidler, 2014/07/02
- [elpa] 56/287: Better key replacements., Matthew Fidler, 2014/07/02