以下のコードはあなたのために働くでしょう。Emacsのアドバイスメカニズムを使用しており、ユーザーはソースコードを直接変更せずに関数の動作を動的に変更できます。この場合、元の定義を実行する前にwinmove-*
関数を実行するために使用されます。term-char-mode
、などの他のウィンドウ選択機能も使用している場合other-window
はwinmove-*
、同じ方法でそれらの機能にアドバイスすることができます。アドバイスメカニズムの詳細については、アドバイス機能を参照してください。
このコードは、term-raw-map
キーマップに関連する問題も処理します。が完全にロードされる(または実行される)term-raw-map
まで定義されません。したがって、フォームをinitファイルの最上位に配置するのではなく、ロード時に自動的に実行されるフックにフォームを追加する必要があります。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)))