键绑定 - 无法在 Emacs 24.x 和 Prelude 中以术语模式将密钥绑定到术语发送主页



我正在尝试正确绑定C-a term-mode以转到命令外壳中文本的开头,而不是提示符的开头。 我使用 prelude 包,除了从 SO 和其他地方的其他人那里抄袭的这段代码。

这是我最后一次迭代term-mode代码。

(require 'term)
(require 'multi-term)
(defcustom term-unbind-key-list
  '("C-z" "C-x" "C-c" "C-h" "C-y" "<ESC>")
  "The key list that will need to be unbind."
  :type 'list
  :group 'multi-term)
(defcustom term-bind-key-alist
  '(("C-c C-c" . term-interrupt-subjob)
    ("C-c C-j" . term-line-mode)
    ("C-c C-k" . term-char-mode)
    ("C-m" . term-send-raw)
    ("C-p" . previous-line)
    ("C-n" . next-line)
    ("C-s" . isearch-forward)
    ("C-r" . isearch-backward)
    ("M-f" . term-send-forward-word)
    ("M-b" . term-send-backward-word)
    ("M-o" . term-send-backspace)
    ("M-p" . term-send-up)
    ("M-n" . term-send-down)
    ("M-M" . term-send-forward-kill-word)
    ("M-N" . term-send-backward-kill-word)
    ("M-r" . term-send-reverse-search-history)
    ("M-," . term-send-input)
    ("M-." . comint-dynamic-complete))
  "The key alist that will need to be bind.
If you do not like default setup, modify it, with (KEY . COMMAND) format."
  :type 'alist
  :group 'multi-term)
(add-hook 'term-mode-hook
          (lambda ()
            (add-to-list 'term-bind-key-alist '("A-M-[" . multi-term-prev))
            (add-to-list 'term-bind-key-alist '("A-M-]" . multi-term-next))))
(add-hook 'term-mode-hook
          (lambda ()
            (define-key term-raw-map (kbd "C-y") 'term-paste)
            (define-key term-raw-map (kbd "C-a") 'term-send-home)))
(define-key term-mode-map (kbd "C-a") 'term-send-home)

每次我尝试将绑定添加到term-mode-map和/或将其加倍term-raw-map时,我都会eval-buffer它以重新加载。当我查询键绑定C-a时,它总是引用crux-beginning-of-line,这是prelude包子组件的crux库的一部分。这是一个全局次要模式,我必须以某种方式杀死它吗? 它始于term-unbind-key-list中的绑定,这个解决方案和其他解决方案,无论我尝试什么C-a总是被送到症结所在。功能。

我不使用prelude,也不知道crux,但我曾经使用multi-term。 您通常不想在init.el中使用defcustom;您应该使用customize或正常的方式来设置变量,例如 setqsetq-default 。 下面,我使用add-to-list.

您需要弄清楚prelude和/或crux如何设置绑定(次要模式、钩子、define-key、...),然后解决它。 这可能就像向term-mode添加钩子一样简单。

(defun jpk/term-mode-hook ()
  (local-set-key (kbd "C-a") 'term-send-raw))
(add-hook 'term-mode-hook 'jpk/term-mode-hook)

这是我的旧multi-term配置:

(with-eval-after-load "multi-term"
  (defun term-send-C-x ()
    "Type C-x in term-mode."
    (interactive "*")
    (term-send-raw-string "C-x"))
  (dolist
      (bind '(("C-<right>"     . term-send-forward-word)
              ("C-<left>"      . term-send-backward-word)
              ("C-<backspace>" . term-send-backward-kill-word)
              ("C-<delete>"    . term-send-forward-kill-word)
              ("C-k"           . term-send-raw)
              ("C-y"           . term-send-raw)
              ("C-c C-z"       . term-stop-subjob)
              ("C-c C-x"       . term-send-C-x)
              ("C-z"           . term-stop-subjob)
              ("C-c C-y"       . term-paste)
              ;; work like urxvt tabbed
              ("<S-down>"      . multi-term)
              ("<S-left>"      . multi-term-prev)
              ("<S-right>"     . multi-term-next)
              ))
    (add-to-list 'term-bind-key-alist bind))
  )

我现在使用 sane-term ,具有以下内容:

(with-eval-after-load "term"
  (defun term-send-reverse-search-history ()
    "Search history reverse."
    (interactive)
    (term-send-raw-string "C-r"))
  (defun term-send-esc ()
    "Send ESC in term mode."
    (interactive)
    (term-send-raw-string "e"))
  (defun term-send-return ()
    "Use term-send-raw-string "C-m" instead term-send-input.
Because term-send-input have bug that will duplicate input when you C-a and C-m in terminal."
    (interactive)
    (term-send-raw-string "C-m"))
  (defun term-send-backward-kill-word ()
    "Backward kill word in term mode."
    (interactive)
    (term-send-raw-string "C-w"))
  (defun term-send-forward-kill-word ()
    "Kill word in term mode."
    (interactive)
    (term-send-raw-string "ed"))
  (defun term-send-backward-word ()
    "Move backward word in term mode."
    (interactive)
    (term-send-raw-string "eb"))
  (defun term-send-forward-word ()
    "Move forward word in term mode."
    (interactive)
    (term-send-raw-string "ef"))
  (defun term-send-reverse-search-history ()
    "Search history reverse."
    (interactive)
    (term-send-raw-string "C-r"))
  (defun term-send-quote ()
    "Quote the next character in term-mode.
Similar to how `quoted-insert' works in a regular buffer."
    (interactive)
    (term-send-raw-string "C-v"))
  (defun term-send-M-x ()
    "Type M-x in term-mode."
    (interactive)
    (term-send-raw-string "ex"))
  (defun term-send-C-x ()
    "Type C-x in term-mode."
    (interactive "*")
    (term-send-raw-string "C-x"))
    (dolist
      (bind '(;; from multi-term
              ("C-z" . nil)
              ("C-x" . nil)
              ("C-c" . nil)
              ("C-h" . nil)
              ("C-y" . nil)
              ("<ESC>" . nil)
              ("C-c C-c" . term-interrupt-subjob)
              ("C-c C-e" . term-send-esc)
              ("C-p" . previous-line)
              ("C-n" . next-line)
              ("C-s" . isearch-forward)
              ("C-r" . isearch-backward)
              ("C-m" . term-send-return)
              ;;("C-y" . term-paste)
              ("M-f" . term-send-forward-word)
              ("M-b" . term-send-backward-word)
              ("M-o" . term-send-backspace)
              ("M-p" . term-send-up)
              ("M-n" . term-send-down)
              ("M-M" . term-send-forward-kill-word)
              ("M-N" . term-send-backward-kill-word)
              ("<C-backspace>" . term-send-backward-kill-word)
              ("M-r" . term-send-reverse-search-history)
              ("M-," . term-send-raw)
              ("M-." . comint-dynamic-complete)
              ;; personal
              ("C-<right>" . term-send-forward-word)
              ("C-<left>" . term-send-backward-word)
              ("C-<backspace>" . term-send-backward-kill-word)
              ("C-<delete>" . term-send-forward-kill-word)
              ("C-k" . term-send-raw)
              ("C-y" . term-send-raw)
              ("C-c C-z" . term-stop-subjob)
              ("C-c C-x" . term-send-C-x)
              ("C-z" . term-stop-subjob)
              ("C-c C-y" . term-paste)
              ("C-c C-u" . universal-argument)
              ("<S-down>" . sane-term-create)
              ("<S-left>" . sane-term-prev)
              ("<S-right>" . sane-term-next)))
    (define-key term-raw-map
      (read-kbd-macro (car bind)) (cdr bind)))
    )

最新更新