【问题标题】:Cannot Bind Key to term-send-home in term-mode in Emacs 24.x and Prelude无法在 Emacs 24.x 和 Prelude 中的 term-mode 中将 Key 绑定到 term-send-home
【发布时间】:2016-07-09 01:44:15
【问题描述】:

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

这是我对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,它是crux 库的一部分,它是prelude 包的子组件。它是全局次要模式,我必须以某种方式杀死它吗?它从term-unbind-key-list 中的绑定开始,这个解决方案和其他解决方案,无论我尝试什么C-a 总是被发送到症结。功能。

【问题讨论】:

    标签: emacs key-bindings


    【解决方案1】:

    我不使用prelude,也不知道crux,但我曾经使用multi-term。您通常不想在您的init.el 中使用defcustom;您应该使用customize 或普通方法来设置变量,如setq 或setq-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)))
        )
    

    【讨论】:

    • 非常深入的回答。我想有时从其他人​​的 ~.el~ 复制意大利面可能会适得其反。现在工作周结束了,我会试试这个,如果它有效,请标记为正确。对不起。
    • 事实证明这是一个可靠的帮助,但我必须禁用 prelude 全局定义的 crux 绑定,因为这不起作用。 github.com/bbatsov/prelude/issues/1009
    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多