我正在尝试正确绑定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
或正常的方式来设置变量,例如 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)))
)