From 13bdd94c38a54955327db0d432971c18392f60f9 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 11 May 2012 11:05:03 -0400 Subject: [PATCH] * lisp/term.el: Move keymap initialization code to be more idiomatic. (term-signals-menu, term-mode-map, term-raw-map, term-raw-escape-map) (term-terminal-menu): Move initialization into declaration. (term-escape-char): Let the user set it in her .emacs. --- lisp/ChangeLog | 5 + lisp/term.el | 325 +++++++++++++++++++++++-------------------------- 2 files changed, 157 insertions(+), 173 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index a70257b2a83..246906df9f9 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,10 @@ 2012-05-11 Stefan Monnier + * term.el: Move keymap initialization code to be more idiomatic. + (term-signals-menu, term-mode-map, term-raw-map, term-raw-escape-map) + (term-terminal-menu): Move initialization into declaration. + (term-escape-char): Let the user set it in her .emacs. + * progmodes/sh-script.el: Use post-self-insert-hook&electric-pair-mode. Provide SMIE-based indentation (not enabled by default yet). (sh-mode-map): Don't bind electric keys. diff --git a/lisp/term.el b/lisp/term.el index 841641a9709..e6a4bc15dd6 100644 --- a/lisp/term.el +++ b/lisp/term.el @@ -622,6 +622,28 @@ executed once when the buffer is created." :type 'hook :group 'term) +(defvar term-signals-menu + (let ((map (make-sparse-keymap "Signals"))) + (define-key map [eof] + '(menu-item "EOF" term-send-eof + :help "Send an EOF to the current buffer's process")) + (define-key map [kill] + '(menu-item "KILL" term-kill-subjob + :help "Send kill signal to the current subjob")) + (define-key map [quit] + '(menu-item "QUIT" term-quit-subjob + :help "Send quit signal to the current subjob.")) + (define-key map [cont] + '(menu-item "CONT" term-continue-subjob + :help "Send CONT signal to process buffer's process group")) + (define-key map [stop] + '(menu-item "STOP" term-stop-subjob + :help "Stop the current subjob")) + (define-key map [brk] + '(menu-item "BREAK" term-interrupt-subjob + :help "Interrupt the current subjob")) + (cons "Signals" map))) + (defvar term-mode-map (let ((map (make-sparse-keymap))) (define-key map "\ep" 'term-previous-input) @@ -653,28 +675,66 @@ executed once when the buffer is created." (define-key map "\C-c\C-j" 'term-line-mode) (define-key map "\C-c\C-q" 'term-pager-toggle) - ;; ;; completion: - ;; (define-key map [menu-bar completion] - ;; (cons "Complete" (make-sparse-keymap "Complete"))) - ;; (define-key map [menu-bar completion complete-expand] - ;; '("Expand File Name" . term-replace-by-expanded-filename)) - ;; (define-key map [menu-bar completion complete-listing] - ;; '("File Completion Listing" . term-dynamic-list-filename-completions)) - ;; (define-key map [menu-bar completion complete-file] - ;; '("Complete File Name" . term-dynamic-complete-filename)) - ;; (define-key map [menu-bar completion complete] - ;; '("Complete Before Point" . term-dynamic-complete)) - ;; ;; Put them in the menu bar: - ;; (setq menu-bar-final-items (append '(terminal completion inout signals) - ;; menu-bar-final-items)) + ;; completion: (line mode only) + (let ((completion-menu (make-sparse-keymap "Complete"))) + (define-key map [menu-bar completion] + (cons "Complete" completion-menu)) + (define-key completion-menu [complete-expand] + '("Expand File Name" . term-replace-by-expanded-filename)) + (define-key completion-menu [complete-listing] + '("File Completion Listing" . term-dynamic-list-filename-completions)) + (define-key completion-menu [complete-file] + '("Complete File Name" . term-dynamic-complete-filename)) + (define-key completion-menu [complete] + '("Complete Before Point" . term-dynamic-complete))) + + ;; Input history: (line mode only) + (let ((inout-menu (make-sparse-keymap "In/Out"))) + (define-key map [menu-bar inout] + (cons "In/Out" inout-menu)) + (define-key inout-menu [kill-output] + '("Kill Current Output Group" . term-kill-output)) + (define-key inout-menu [next-prompt] + '("Forward Output Group" . term-next-prompt)) + (define-key inout-menu [previous-prompt] + '("Backward Output Group" . term-previous-prompt)) + (define-key inout-menu [show-maximum-output] + '("Show Maximum Output" . term-show-maximum-output)) + (define-key inout-menu [show-output] + '("Show Current Output Group" . term-show-output)) + (define-key inout-menu [kill-input] + '("Kill Current Input" . term-kill-input)) + (define-key inout-menu [copy-input] + '("Copy Old Input" . term-copy-old-input)) + (define-key inout-menu [forward-matching-history] + '("Forward Matching Input..." . term-forward-matching-input)) + (define-key inout-menu [backward-matching-history] + '("Backward Matching Input..." . term-backward-matching-input)) + (define-key inout-menu [next-matching-history] + '("Next Matching Input..." . term-next-matching-input)) + (define-key inout-menu [previous-matching-history] + '("Previous Matching Input..." . term-previous-matching-input)) + (define-key inout-menu [next-matching-history-from-input] + '("Next Matching Current Input" . term-next-matching-input-from-input)) + (define-key inout-menu [previous-matching-history-from-input] + '("Previous Matching Current Input" . + term-previous-matching-input-from-input)) + (define-key inout-menu [next-history] + '("Next Input" . term-next-input)) + (define-key inout-menu [previous-history] + '("Previous Input" . term-previous-input)) + (define-key inout-menu [list-history] + '("List Input History" . term-dynamic-list-input-ring)) + (define-key inout-menu [expand-history] + '("Expand History Before Point" . term-replace-by-expanded-history))) + + (define-key map [menu-bar signals] term-signals-menu) + map)) -(defvar term-raw-map nil - "Keyboard map for sending characters directly to the inferior process.") (defvar term-escape-char nil "Escape character for char sub-mode of term mode. Do not change it directly; use `term-set-escape-char' instead.") -(defvar term-raw-escape-map nil) (defvar term-pager-break-map nil) @@ -713,9 +773,6 @@ Buffer local variable.") (defmacro term-handling-pager () 'term-pager-old-local-map) (defmacro term-using-alternate-sub-buffer () 'term-saved-home-marker) -(defvar term-signals-menu) -(defvar term-terminal-menu) - ;; Let's silence the byte-compiler -mm (defvar term-ansi-at-host nil) (defvar term-ansi-at-dir nil) @@ -770,112 +827,82 @@ is buffer-local." :group 'term :type 'integer) -(when (featurep 'xemacs) - (defvar term-terminal-menu - '("Terminal" - [ "Character mode" term-char-mode (term-in-line-mode)] - [ "Line mode" term-line-mode (term-in-char-mode)] - [ "Enable paging" term-pager-toggle (not term-pager-count)] - [ "Disable paging" term-pager-toggle term-pager-count]))) - -;; Menu bars: -(unless (featurep 'xemacs) - ;; terminal: - (let (newmap) - (setq newmap (make-sparse-keymap "Terminal")) - (define-key newmap [terminal-pager-enable] - '(menu-item "Enable paging" term-fake-pager-enable - :help "Enable paging feature")) - (define-key newmap [terminal-pager-disable] - '(menu-item "Disable paging" term-fake-pager-disable - :help "Disable paging feature")) - (define-key newmap [terminal-char-mode] - '(menu-item "Character mode" term-char-mode - :help "Switch to char (raw) sub-mode of term mode")) - (define-key newmap [terminal-line-mode] - '(menu-item "Line mode" term-line-mode - :help "Switch to line (cooked) sub-mode of term mode")) - (setq term-terminal-menu (cons "Terminal" newmap)) - - ;; completion: (line mode only) - (defvar term-completion-menu (make-sparse-keymap "Complete")) - (define-key term-mode-map [menu-bar completion] - (cons "Complete" term-completion-menu)) - (define-key term-completion-menu [complete-expand] - '("Expand File Name" . term-replace-by-expanded-filename)) - (define-key term-completion-menu [complete-listing] - '("File Completion Listing" . term-dynamic-list-filename-completions)) - (define-key term-completion-menu [menu-bar completion complete-file] - '("Complete File Name" . term-dynamic-complete-filename)) - (define-key term-completion-menu [menu-bar completion complete] - '("Complete Before Point" . term-dynamic-complete)) - - ;; Input history: (line mode only) - (defvar term-inout-menu (make-sparse-keymap "In/Out")) - (define-key term-mode-map [menu-bar inout] - (cons "In/Out" term-inout-menu)) - (define-key term-inout-menu [kill-output] - '("Kill Current Output Group" . term-kill-output)) - (define-key term-inout-menu [next-prompt] - '("Forward Output Group" . term-next-prompt)) - (define-key term-inout-menu [previous-prompt] - '("Backward Output Group" . term-previous-prompt)) - (define-key term-inout-menu [show-maximum-output] - '("Show Maximum Output" . term-show-maximum-output)) - (define-key term-inout-menu [show-output] - '("Show Current Output Group" . term-show-output)) - (define-key term-inout-menu [kill-input] - '("Kill Current Input" . term-kill-input)) - (define-key term-inout-menu [copy-input] - '("Copy Old Input" . term-copy-old-input)) - (define-key term-inout-menu [forward-matching-history] - '("Forward Matching Input..." . term-forward-matching-input)) - (define-key term-inout-menu [backward-matching-history] - '("Backward Matching Input..." . term-backward-matching-input)) - (define-key term-inout-menu [next-matching-history] - '("Next Matching Input..." . term-next-matching-input)) - (define-key term-inout-menu [previous-matching-history] - '("Previous Matching Input..." . term-previous-matching-input)) - (define-key term-inout-menu [next-matching-history-from-input] - '("Next Matching Current Input" . term-next-matching-input-from-input)) - (define-key term-inout-menu [previous-matching-history-from-input] - '("Previous Matching Current Input" . - term-previous-matching-input-from-input)) - (define-key term-inout-menu [next-history] - '("Next Input" . term-next-input)) - (define-key term-inout-menu [previous-history] - '("Previous Input" . term-previous-input)) - (define-key term-inout-menu [list-history] - '("List Input History" . term-dynamic-list-input-ring)) - (define-key term-inout-menu [expand-history] - '("Expand History Before Point" . term-replace-by-expanded-history)) - - ;; Signals - (setq newmap (make-sparse-keymap "Signals")) - (define-key term-mode-map [menu-bar signals] - (setq term-signals-menu (cons "Signals" newmap))) - (define-key newmap [eof] - '(menu-item "EOF" term-send-eof - :help "Send an EOF to the current buffer's process")) - (define-key newmap [kill] - '(menu-item "KILL" term-kill-subjob - :help "Send kill signal to the current subjob")) - (define-key newmap [quit] - '(menu-item "QUIT" term-quit-subjob - :help "Send quit signal to the current subjob.")) - (define-key newmap [cont] - '(menu-item "CONT" term-continue-subjob - :help "Send CONT signal to process buffer's process group")) - (define-key newmap [stop] - '(menu-item "STOP" term-stop-subjob - :help "Stop the current subjob")) - (define-key newmap [brk] - '(menu-item "BREAK" term-interrupt-subjob - :help "Interrupt the current subjob")) - )) +(defvar term-terminal-menu + (if (featurep 'xemacs) + '("Terminal" + [ "Character mode" term-char-mode (term-in-line-mode)] + [ "Line mode" term-line-mode (term-in-char-mode)] + [ "Enable paging" term-pager-toggle (not term-pager-count)] + [ "Disable paging" term-pager-toggle term-pager-count]) + (let ((map (make-sparse-keymap "Terminal"))) + (define-key map [terminal-pager-enable] + '(menu-item "Enable paging" term-fake-pager-enable + :help "Enable paging feature")) + (define-key map [terminal-pager-disable] + '(menu-item "Disable paging" term-fake-pager-disable + :help "Disable paging feature")) + (define-key map [terminal-char-mode] + '(menu-item "Character mode" term-char-mode + :help "Switch to char (raw) sub-mode of term mode")) + (define-key map [terminal-line-mode] + '(menu-item "Line mode" term-line-mode + :help "Switch to line (cooked) sub-mode of term mode")) + (cons "Terminal" map)))) ;; Set up term-raw-map, etc. +(defvar term-raw-map + (let* ((map (make-keymap)) + (esc-map (make-keymap)) + (i 0)) + (while (< i 128) + (define-key map (make-string 1 i) 'term-send-raw) + ;; Avoid O and [. They are used in escape sequences for various keys. + (unless (or (eq i ?O) (eq i 91)) + (define-key esc-map (make-string 1 i) 'term-send-raw-meta)) + (setq i (1+ i))) + (define-key map [remap self-insert-command] 'term-send-raw) + (define-key map "\e" esc-map) + + ;; Added nearly all the 'gray keys' -mm + + (if (featurep 'xemacs) + (define-key map [button2] 'term-mouse-paste) + (define-key map [mouse-2] 'term-mouse-paste) + (define-key map [menu-bar terminal] term-terminal-menu) + (define-key map [menu-bar signals] term-signals-menu)) + (define-key map [up] 'term-send-up) + (define-key map [down] 'term-send-down) + (define-key map [right] 'term-send-right) + (define-key map [left] 'term-send-left) + (define-key map [delete] 'term-send-del) + (define-key map [deletechar] 'term-send-del) + (define-key map [backspace] 'term-send-backspace) + (define-key map [home] 'term-send-home) + (define-key map [end] 'term-send-end) + (define-key map [insert] 'term-send-insert) + (define-key map [S-prior] 'scroll-down) + (define-key map [S-next] 'scroll-up) + (define-key map [S-insert] 'term-paste) + (define-key map [prior] 'term-send-prior) + (define-key map [next] 'term-send-next) + map) + "Keyboard map for sending characters directly to the inferior process.") + +(defvar term-raw-escape-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map 'Control-X-prefix) + ;; Define standard bindings in term-raw-escape-map. + (define-key map "\C-v" (lookup-key (current-global-map) "\C-v")) + (define-key map "\C-u" (lookup-key (current-global-map) "\C-u")) + (define-key map "\C-q" 'term-pager-toggle) + ;; The keybinding for term-char-mode is needed by the menubar code. + (define-key map "\C-k" 'term-char-mode) + (define-key map "\C-j" 'term-line-mode) + ;; It's convenient to have execute-extended-command here. + (define-key map [?\M-x] 'execute-extended-command) + map)) + (defun term-set-escape-char (key) "Change `term-escape-char' and keymaps that depend on it." (when term-escape-char @@ -883,59 +910,11 @@ is buffer-local." (define-key term-raw-map term-escape-char 'term-send-raw)) (setq term-escape-char (vector key)) (define-key term-raw-map term-escape-char term-raw-escape-map) - ;; Define standard bindings in term-raw-escape-map - (define-key term-raw-escape-map "\C-v" - (lookup-key (current-global-map) "\C-v")) - (define-key term-raw-escape-map "\C-u" - (lookup-key (current-global-map) "\C-u")) ;; FIXME: If we later call term-set-escape-char again with another key, ;; we should undo this binding. - (define-key term-raw-escape-map term-escape-char 'term-send-raw) - (define-key term-raw-escape-map "\C-q" 'term-pager-toggle) - ;; The keybinding for term-char-mode is needed by the menubar code. - (define-key term-raw-escape-map "\C-k" 'term-char-mode) - (define-key term-raw-escape-map "\C-j" 'term-line-mode) - ;; It's convenient to have execute-extended-command here. - (define-key term-raw-escape-map [?\M-x] 'execute-extended-command)) - -(let* ((map (make-keymap)) - (esc-map (make-keymap)) - (i 0)) - (while (< i 128) - (define-key map (make-string 1 i) 'term-send-raw) - ;; Avoid O and [. They are used in escape sequences for various keys. - (unless (or (eq i ?O) (eq i 91)) - (define-key esc-map (make-string 1 i) 'term-send-raw-meta)) - (setq i (1+ i))) - (define-key map [remap self-insert-command] 'term-send-raw) - (define-key map "\e" esc-map) - (setq term-raw-map map) - (setq term-raw-escape-map (copy-keymap 'Control-X-prefix)) - - ;; Added nearly all the 'gray keys' -mm + (define-key term-raw-escape-map term-escape-char 'term-send-raw)) - (if (featurep 'xemacs) - (define-key term-raw-map [button2] 'term-mouse-paste) - (define-key term-raw-map [mouse-2] 'term-mouse-paste) - (define-key term-raw-map [menu-bar terminal] term-terminal-menu) - (define-key term-raw-map [menu-bar signals] term-signals-menu)) - (define-key term-raw-map [up] 'term-send-up) - (define-key term-raw-map [down] 'term-send-down) - (define-key term-raw-map [right] 'term-send-right) - (define-key term-raw-map [left] 'term-send-left) - (define-key term-raw-map [delete] 'term-send-del) - (define-key term-raw-map [deletechar] 'term-send-del) - (define-key term-raw-map [backspace] 'term-send-backspace) - (define-key term-raw-map [home] 'term-send-home) - (define-key term-raw-map [end] 'term-send-end) - (define-key term-raw-map [insert] 'term-send-insert) - (define-key term-raw-map [S-prior] 'scroll-down) - (define-key term-raw-map [S-next] 'scroll-up) - (define-key term-raw-map [S-insert] 'term-paste) - (define-key term-raw-map [prior] 'term-send-prior) - (define-key term-raw-map [next] 'term-send-next)) - -(term-set-escape-char ?\C-c) +(term-set-escape-char (or term-escape-char ?\C-c)) (defvar overflow-newline-into-fringe) -- 2.39.2