3

私がプログラムするとき、私は両方にEmacsを備えた2つの画面を使用し、各ウィンドウで2つのバッファーが分割され、一度に画面上に合計4つのオープンソースファイルが表示されます。

でバッファを切り替えC-x bたり、でWindowsを切り替えたりしAlt-TABます。との異なる面を定義することにより、バッファを切り替えるときにバッファの外観を変更しmode-lineますmode-line-inactive。しかし、Emacsウィンドウから別のEmacsウィンドウに完全に切り替えるときにバッファを非アクティブ化するにはどうすればよいAlt-TABですか?

Ubuntu11.04でGnome2.32.1を使用してEmacs23.2.1を使用していることもおそらく関連性があります。

PS:Emacsでフォーカスを失ったときにファイルを自動的に保存する方法は、別の目標の後ですが、「ウィンドウがフォーカスを失う」という同じ元のイベントがあります。

4

4 に答える 4

3

それはあなたのウィンドウマネージャーとそれがemacsの用語で複数のウィンドウまたはフレームをどのように管理するかに依存するかもしれません。以下のコードはfvwmのチャンピオンのように機能しますが、常にgnomeでは機能しません。

キーストロークCoをマップしてフレーム間を移動します。これは、他のフレームに移動する場合に役立ちますが、Alt-Tabキーを押すと、途中で不要なアプリが多数表示されます。

2つのフレームを持つemacsの単一インスタンスを実行している場合は、次のようなものを使用できます。

(defun pgr-previous-frame ()
  "go to the previous frame"
  (interactive)
  (pgr-switch-frame (previous-frame)))

(defun pgr-next-frame ()
  "go to the next frame"
  (interactive)
  (pgr-switch-frame (next-frame)))

(defun pgr-switch-frame (frame)
  "go to the specified frame and raise it"
  ;; reset the frame properties here
  (select-frame frame)     
  (raise-frame frame)
  ;;change the display in some manner here
  )

また、raise-frameとlower-frameにアドバイスを追加してみることもできますが、試してみる価値はあります。

于 2011-09-01T18:55:31.223 に答える
2

focus-in-hookEmacs 24.4以降では、とを使用できますfocus-out-hook。このコードは、非アクティブなフレームのアクティブなウィンドウが非アクティブなウィンドウと同じ色になるように機能しているようです。

(defvar my-mode-line-active-background "gray75")
(defvar my-mode-line-inactive-background "gray40")

(defun my-unhighlight-mode-line ()
  (set-face-attribute 'mode-line nil
                      :background my-mode-line-inactive-background))

(add-hook 'focus-out-hook 'my-unhighlight-mode-line)

(defun my-highlight-mode-line ()
  (set-face-attribute 'mode-line nil
                      :background my-mode-line-active-background))

(add-hook 'focus-in-hook 'my-highlight-mode-line)
于 2014-02-21T16:58:20.803 に答える
2

私は@logosciaの回答が本当に気に入りました。これにより、このより一般的なバージョンを実行できました。mode-line-inactive焦点が合っていないときに顔を使用します。

(add-hook 'focus-out-hook
      (lambda ()
        (copy-face 'mode-line '--mode-line-backup)
        (copy-face 'mode-line-inactive 'mode-line)))
(add-hook 'focus-in-hook
      (lambda ()
        (copy-face '--mode-line-backup 'mode-line)))
于 2015-06-05T11:43:39.893 に答える
0

Emacsでしか実行できないかどうかはわかりませんが、シェルスクリプトでwmctrlを実行して、フォーカスのあるウィンドウを定期的にチェックし、変更がある場合は、lispを送信できるemacsclientを介してEmacsに通知します評価のために実行中のEmacsへのコード:

-e'--eval'いくつかのファイルにアクセスする代わりに、いくつかのEmacsLispコードを評価するようにEmacsに指示します。このオプションを指定すると、 `emacsclient'の引数は、アクセスするファイルのリストではなく、評価する式のリストとして解釈されます。

于 2011-09-01T14:07:45.607 に答える