下面的代码将为您工作。它使用 Emacs 建议机制,允许用户动态更改函数的行为,而无需直接修改其源代码。在这种情况下,它用于使winmove-*
函数term-char-mode
在执行其原始定义之前运行。如果您还使用其他窗口选择功能,例如other-window
,除 之外winmove-*
,您可以以相同的方式建议这些功能。有关建议机制的详细信息,请参阅建议功能。
该代码还处理与term-raw-map
键盘映射相关的问题。在完全加载(或执行)term-raw-map
之前未定义。因此,您应该将表单添加到钩子中,该钩子在加载时会自动运行,而不是将它们放在初始化文件的顶层。term.el
M-xansi-term(define-key term-raw-map ...)
term-load-hook
term.el
(global-set-key (kbd "M-J") 'windmove-left)
(global-set-key (kbd "M-L") 'windmove-right)
(global-set-key (kbd "M-I") 'windmove-up)
(global-set-key (kbd "M-K") 'windmove-down)
(defun ansi-term-char-mode ()
(if (string= (buffer-name) "*ansi-term*")
(term-char-mode)))
(defadvice windmove-left (before windmove-left-ansi-term (&optional arg))
(ansi-term-char-mode))
(defadvice windmove-right (before windmove-right-ansi-term (&optional arg))
(ansi-term-char-mode))
(defadvice windmove-up (before windmove-up-ansi-term (&optional arg))
(ansi-term-char-mode))
(defadvice windmove-down (before windmove-down-ansi-term (&optional arg))
(ansi-term-char-mode))
(add-hook 'term-load-hook
(lambda ()
(define-key term-raw-map (kbd "M-J") 'windmove-left)
(ad-activate 'windmove-left)
(define-key term-raw-map (kbd "M-L") 'windmove-right)
(ad-activate 'windmove-right)
(define-key term-raw-map (kbd "M-I") 'windmove-up)
(ad-activate 'windmove-up)
(define-key term-raw-map (kbd "M-K") 'windmove-down)
(ad-activate 'windmove-down)))