1

私はEmacs24.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のcharrunモードに関連付ける方法はありますか?ウィンドウ間を移動するためにラインランモードに切り替える必要はありません。しばらくすると、端末に出入りするために入力したり前後したりするのが面倒になります。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-windowwinmove-*、同じ方法でそれらの機能にアドバイスすることができます。アドバイスメカニズムの詳細については、アドバイス機能を参照してください。

このコードは、term-raw-mapキーマップに関連する問題も処理します。が完全にロードされる(または実行される)term-raw-mapまで定義されません。したがって、フォームをinitファイルの最上位に配置するのではなく、ロード時に自動的に実行されるフックにフォームを追加する必要があります。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 に答える