基本モードでマイナーモードを自動的に有効にする


8

設計上、fundamental-mode他の主要なモードがこのモードから派生することになっているため、は必要最低限​​のものです。

情報ページから(elisp) Major Modes、私たちは持っています:

これは、基本モードのメジャーモードコマンドです。他のモードコマンドとは異なり、このモードをカスタマイズする必要がないため、モードフック実行されませ(*メジャーモードの規則::に注意)。

そのため、

  • ありませんfundamental-mode-hook
  • また、私のmy-minor-mode主要なモードのバッファでのみ有効になりませんが(global-my-minor-mode 1)、私の設定にはあります。

以下は機能しますが、手動で入力した場合のみですM-x fundamental-mode

(add-hook 'after-change-major-mode-hook #'my-minor-mode)

以下の場合、fundamental-modeデフォルトでバッファ(* abcd *)が作成されるので役に立ちません。

(with-current-buffer (get-buffer-create "*abcd*")
  (insert "Hello world"))

なぜマイナーモードを有効にしたいのfundamental-modeですか?

マイナーモードマップにカスタムキーバインディングを保持したい。このマイナーモードをグローバルに有効化しています(ただし、fundamental-modeバッファーでのみ有効化されません)。

これが、この質問をここで行うようにした使用例です。M-x esupesupパッケージ)を実行*esup-log*するfundamental-modeと、メジャーモードとしてバッファを作成します。しかし、マイナーモードを手動で有効にする必要があるたびに、便利なバインディングを使用します。

my-minor-mode本当にグローバルな方法で実現したいのfundamental-modeか、そうでないのか。

更新1:

これがマイナーモードの定義ですmodi-mode

アップデート2:

@npostavsのコメントに基づいて、マイナーモードmodi-modeとの違いを確認しoverride-global-modeましたuse-package/bind-key.el。そして、それは私のモードのINIT値があることが判明nilしてのことoverride-global-modeIS t

モードの初期値をに変更するtと、基本モードバッファーでも有効になります!しかし、行為は(global-modi-mode 1)同じ結果で終わるわけではありません。変ですか?おそらくバグですか?


同様のカスタムキーバインディングモードがfundamental-modeバッファーで有効になるので、おそらく問題はモードの定義にあります。override-global-mode
npostavs 2015

@npostavsありがとう。それをuse-package実装する方法を確認します。
Kaushal Modi

@npostavs更新された質問を確認してください..私のモードの初期値がであるという理由だけでこの問題に直面していることがわかりましたnil。しかし、私はそれをグローバルに有効にします。
Kaushal Modi

1
ではbuffer.c、関数の最後でをget-buffer-create実行しbuffer-list-update-hookているように見えます。おそらく、独自の関数に条件付きのフックをアタッチできますか?
法律家、2015

1
Emacsは、あらゆる種類の目的で「内部」一時バッファーを使用します(たとえば、ファイルまたはプロセスとの間のI / Oのコーディングシステム変換を行うと、一時バッファーを使用する場合があります)。これらのバッファーは基本モードを使用しており、マイナーモードを有効にしないのは正しいと思います。他のバッファに関しては、私にとってのルールは次のとおりです:このバッファを見たい場合(デバッグ目的以外の場合)は、おそらく基本モードを使用すべきではありません。
Stefan

回答:


4

fundamental-modeバッファーでマイナーモードをデフォルトで有効にできる唯一の方法は、そのマイナーモードのinit値をに設定することtです。

(define-minor-mode my-minor-mode
 "My minor mode"
 :init-value t)

グローバル化されたマイナーモード(を参照C-h i g (elisp) Defining Minor Modes)をinit値で オンに切り替えるだけでnilは、同じことは行われないことに注意してください。この場合、fundamental-modeバッファはこのマイナーモードを無効にして作成されます。


もちろん、上記はマイナーモードソースを制御する場合にのみ機能します。異なるパッケージに付属する他のすべてのマイナーモードでは、fundamental-modeバッファーでマイナーモードをデフォルトで有効にする場合は、次の操作を行う必要があります。

(setq-default the-minor-mode t)

1
他のマイナーモードについても(setq-default 'the-minor-mode t)、同じ効果を得るために実行できると思います。
npostavs 2015

いい視点ね!回答を更新します(一重引用符は削除しました)。ありがとう!
Kaushal Modi

(setq-default modi-mode 1)関数turn-on-modi-mode(setq-default modi-mode nil) to the function turn-off-modi-mode`に追加した場合は、実際にモードをグローバルに有効または無効にするのに1歩近づきます。
nispio

@nispioそれは良い点です。これを行う必要はまだありません。しかし、基本モードバッファーでマイナーモードを切り替える必要がある場合、何をする必要があるかがわかりました。
Kaushal Modi

2

使用しないでください fundamental-mode -少なくとも対話的には使用しないでください。あなたはめったにになりたくありませんfundamental-mode。ほとんどの場合、より良いものが存在します。

全体のポイントは、fundamental-modeすることですではない通常の主要なモードの取り扱い(フックなど)を持っています。fundamental-mode抽象クラスのようなものと考えることができます。

あるパッケージが入っているバッファにあなたを入れたら、fundamental-modeこれを防ぐためにあなたがする必要があることをしてください-それには他のモードを使ってください。

デフォルトが以外になるようにカスタマイズ major-modeすることを検討してくださいfundamental-mode。(私は使用しますindented-text-mode。)


以前はdefault-major-modeこれについて少し明確でしたが、彼らはそれを廃止することを決定しました(もちろんそれはまだ機能します)。

default-major-mode is a variable defined in `C source code`.
Its value is indented-text-mode

  This variable is obsolete since 23.2;
  use `major-mode' instead.

Documentation:
Value of `major-mode` for new buffers.

は使用していませんfundamental-mode。問題の核心は、パッケージがget-buffer-create一時バッファーの生成に使用する場合、そのバッファーがfundamental-modeメジャーモードとして作成されることです。これらのバッファでは、マイナーモードはデフォルトで有効になりません(初期値がnilなので、グローバルに有効にしても)。
Kaushal Modi

私がリストできるそのようなパッケージはほとんどありません:esupkeyfreq
Kaushal Modi '17 / 09/15

呼び出すだけのパッケージはget-buffer-create、メジャーモード(またはマイナーモード)を確立するために何もしません。万一それ(問題のパッケージ用)?もしそうなら、パッケージのメンテナに連絡することを検討してください。そうでない場合は、自分で優先メジャーモードまたはマイナーモードをオンにすることを検討してください。IOW、それがあなたが望むものに関するものであり、パッケージ一般的にセットアップすべきものではない場合、あなたが望む方法でそれをセットアップするのはあなた次第です。
2015

なぜこれが反対票だったのか知りたいです。
ドリュー

@Drewは問題に対応していないためです。OPは、他のモードが基本モードでバッファーを作成していることを明示的に述べており、提案する解決策は基本モードを使用しないことです。
nispio

0

関数get-buffer-createはで定義されておりbuffer.c、その関数の最後でを呼び出しますbuffer-list-update-hook。このようなフックを使用してカスタム関数を実行できますが、そのフックが他の関数によって呼び出されるたびにカスタム関数が不都合な瞬間に起動しないように、特定の条件を追加する必要がある場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.