私は数週間emacsを使用してきましたが、これまでのところ素晴らしく、vim
からのアクセスは思ったより簡単でした(実際、emacsのキーボードショートカットはもっと自然に感じます)。
M-Left/Right/Up/Down
を使用してバッファ間を移動するなど、いくつかのカスタマイズを追加しました。これは、一度に4つのファイルを開いたときにC-x o
が少し遅すぎると感じたためです。
ここまでは順調ですね :-)
しかし、私を悩ませていることが1つあります。
C-x 3
とC-x 2
を使用していくつかの分割を開きますM-x term ENT
を使用してそのうちの1つでターミナルを開きます通常のショートカットは明らかに機能しません-ターミナルはすべてのemacsコマンドをインターセプトしているので、別のバッファーをクリックしてアクティブにする必要があります。
用語モードでは、通常のC-x whatever
キーバインドは代わりにC-c whatever
になります。
用語モードでは、C-c b RET
と入力して、他のバッファに切り替えます。
これは、C-x bRETが通常行うことを行います。
これで、C-xbを機能させることができます。カスタム移動コマンドのバインディングを追加する必要がある場合があります。
(add-hook 'term-mode-hook
(lambda ()
;; C-x is the prefix command, rather than C-c
(term-set-escape-char ?\C-x)
(define-key term-raw-map "\M-y" 'yank-pop)
(define-key term-raw-map "\M-w" 'kill-ring-save)))
ところで、シェルモードとタームモードには大きな違いがあります。前者はemacsとよりよく統合されます(例:cdコマンド)。後者は完全なターミナルエミュレーションであり、cursesプログラムを処理できます。彼らは両方とも彼らの場所を持っています。
Emacsのウィンドウを扱うより一般的な答えについては、Emacs22頃にEmacsで出荷され始めたwindmove
を見ることができます。
;;; Commentary:
;;
;; This package defines a set of routines, windmove-{left,up,right,
;; down}, for selection of windows in a frame geometrically. For
;; example, `windmove-right' selects the window immediately to the
;; right of the currently-selected one. This functionality is similar
;; to the window-selection controls of the BRIEF editor of yore.
;;
;; One subtle point is what happens when the window to the right has
;; been split vertically; for example, consider a call to
;; `windmove-right' in this setup:
;;
;; -------------
;; | | A |
;; | | |
;; | |-----
;; | * | | (* is point in the currently
;; | | B | selected window)
;; | | |
;; -------------
;;
;; There are (at least) three reasonable things to do:
;; (1) Always move to the window to the right of the top Edge of the
;; selected window; in this case, this policy selects A.
;; (2) Always move to the window to the right of the bottom Edge of
;; the selected window; in this case, this policy selects B.
;; (3) Move to the window to the right of point in the selected
;; window. This may select either A or B, depending on the
;; position of point; in the illustrated example, it would select
;; B.
;;
;; Similar issues arise for all the movement functions. Windmove
;; resolves this problem by allowing the user to specify behavior
;; through a prefix argument. The cases are thus:
;; * if no argument is given to the movement functions, or the
;; argument given is zero, movement is relative to point;
;; * if a positive argument is given, movement is relative to the top
;; or left Edge of the selected window, depending on whether the
;; movement is to be horizontal or vertical;
;; * if a negative argument is given, movement is relative to the
;; bottom or right Edge of the selected window, depending on whether
;; the movement is to be horizontal or vertical.