4

menu-bar-openバインドしてf11メニューバーをオフにしました。そのため、をf11呼び出しますtmm-menubar。これは不便で、何らかの理由でモード固有のメニュー項目がありません(org-modeのorgやtblなど)。メニューバーを表示し、ユーザーがメニュー項目を選択できるようにしてから、メニューバーを再び非表示にします。

そのための最も慣用的でエレガントな方法は何ですか?

私はアドバイスを書くことを考えましたが、デバッグの問題を引き起こし、標準のEmacsコードにはアドバイスが含まれていないため、Emacs開発者は通常それを推奨しません。

GUIでEmacs24.1を使用しています。

4

4 に答える 4

10

Emacs-24では、これを簡単に行うことができます。

(global-set-key [f9] 'toggle-menu-bar-mode-from-frame)
  • 24より古いバージョンのEmacsについてはよくわかりません。
  • インストールでf9が実際に使用可能であることを確認してください。
于 2014-02-28T16:23:19.520 に答える
4

menu-bar-modeグラフィカルなEmacsセッションを無効にして実行している場合C-<mouse-3>は、メニューの内容全体をポップアップダイアログボックスとして表示する必要があります。ただし、ターミナルでEmacsを実行している場合、これは間違いなく機能しません。あなたはどちらの場合かを指定していないので、私は仮定をしないようにします。mouse-popup-menubarおよび/または関数へのカスタムマウスバインディング(オプションで、キーボード修飾子を使用)を作成することも可能ですmouse-popup-menubar-stuffが、最終的には、上記で説明した標準機能と同様の動作を複製することしかできません。

やや柔軟性がなくグローバルな性質menu-bar-mode(つまり、すべてのEmacsフレームに適用され、フックなどによるカスタマイズが比較的少ないという事実)のため、バニラで希望する動作を正確に実現することは非常に難しいと思います。 Emacs。カスタム関数を作成して一時的に有効にし、選択後に再度無効にするmenu-bar-modeなどの方法を使用することも可能かもしれませんが、よくわかりません。post-command-hook時間が許せばさらに調査していきます。

また、サードパーティのメニューバーパッケージ(qv、EmacsWikiのメニューバーセクション)を調べることもできます。

編集:私はあなたが役に立つと思うかもしれないかなり厄介な解決策を一緒にハックしました...

(add-hook
 'pre-command-hook
 (lambda ()
   (when (eq menu-bar-mode 42)
     (menu-bar-mode -1))))

(defun my-menu-bar-open ()
  (interactive)
  (unless menu-bar-mode
    (menu-bar-mode 1))
  (menu-bar-open)
  (setq menu-bar-mode 42))

私はこれをグラフィカルセッションでテストしましたが、実行my-menu-bar-openと選択の間にコマンドとしてEmacsが登録するアクション(基本的にはナビゲート以外のもの)を実行しない限り、必要な動作をシミュレートしているように見えますメニュー自体)。の選択は、変数42のより一般的な値に対してフック関数がアクティブ化されるリスクを最小限に抑えることを目的としたマジックナンバー(およびダグラスアダムズオマージュ)です。menu-bar-modeこれが決してエレガントであるとは言いませんが、明らかに醜い方法で機能します。これを使用する場合は、(または任意の)にバインドmy-menu-bar-openするだけです。f11

(global-set-key [f11] 'my-menu-bar-open)

または、類似した方法で使用し、代わりにの一時的な切り替えを実行するpre-command-hookようにアドバイスすることで、非常に類似した機能を実現できる可能性があります。menu-bar-openmenu-bar-mode

于 2012-06-25T04:17:03.153 に答える
2

グレッグの答えを少し改善しました。これにより、pre-command-hookクリーンな状態が保たれます。

(menu-bar-mode -1)

(defun my-menu-bar-open-after ()
  (remove-hook 'pre-command-hook 'my-menu-bar-open-after)
  (when (eq menu-bar-mode 42)
    (menu-bar-mode -1)))

(defun my-menu-bar-open (&rest args)
  (interactive)
  (let ((open menu-bar-mode))
    (unless open
      (menu-bar-mode 1))
    (funcall 'menu-bar-open args)
    (unless open
      (setq menu-bar-mode 42)
      (add-hook 'pre-command-hook 'my-menu-bar-open-after))))

(global-set-key [f10] 'my-menu-bar-open)
于 2012-12-28T21:05:44.047 に答える
0

私はこれをGNUEmacs25.2および26.3でテストしました。

(menu-bar-mode -1)

(advice-add 'menu-bar-open
            :around
            (lambda (orig-fun &rest args)
              (menu-bar-mode 1)
              (apply orig-fun args)
              (menu-bar-mode -1)))

結果として生じる動作(デフォルトであるにmenu-bar-openバインドされていると仮定):F10

  • メニューバーはデフォルトでは表示されません。
  • を押すF10と、メニューバーが表示されます。
  • メニューバーを離れると、次にを押すまでメニューバーは消えますF10

これは、適切な解決策というよりはハックのようなものであることに注意してください。

于 2021-01-11T19:22:37.233 に答える