1

我在 Emacs 24.1中使用WindMove使用键盘快捷键在多个窗口中移动:

(global-set-key (kbd "M-J") 'windmove-left)          ; move to window on the left
(global-set-key (kbd "M-L") 'windmove-right)         ; move "       "    the right
(global-set-key (kbd "M-I") 'windmove-up)            ; move "       "    above
(global-set-key (kbd "M-K") 'windmove-down);         ; move "       "    below

有没有办法将这些WindMove键盘快捷键与ansi-term上的字符运行模式相关联?我想避免不得不切换到行运行模式以在窗口之间移动。一段时间后,输入和来回进入/离开终端变得乏味。C-c C-kC-c C-j

4

2 回答 2

2

默认情况下,term-char-mode将大多数键转发到终端,而不在 Emacs 中解释它们,这就是windmove键绑定不起作用的原因。

这是一种覆盖键term-char-mode映射以强制windmove解释而不是转发绑定的方法:

(eval-after-load "term"
  '(progn
     (define-key term-raw-map (kbd "M-J") 'windmove-left)
     (define-key term-raw-map (kbd "M-L") 'windmove-right)
     ;; ...
     ))
于 2012-09-20T08:57:57.610 回答
2

下面的代码将为您工作。它使用 Emacs 建议机制,允许用户动态更改函数的行为,而无需直接修改其源代码。在这种情况下,它用于使winmove-*函数term-char-mode在执行其原始定义之前运行。如果您还使用其他窗口选择功能,例如other-window,除 之外winmove-*,您可以以相同的方式建议这些功能。有关建议机制的详细信息,请参阅建议功能

该代码还处理与term-raw-map键盘映射相关的问题。在完全加载(或执行)term-raw-map之前未定义。因此,您应该将表单添加到钩子中,该钩子在加载时会自动运行,而不是将它们放在初始化文件的顶层。term.elM-xansi-term(define-key term-raw-map ...)term-load-hookterm.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)))
于 2012-09-20T22:03:23.087 回答