1

私は の大ファンでabbrev-mode、少し似たようなものが欲しいと思っています。入力を開始し、句読点を入力するとすぐに (またはスペースだけで十分です)、関数が呼び出されます(特別な略語の後にスペースを入力した場合) 、もちろん、abbrev-mode と同じように) .

スペースに入るたびに何らかの機能を実行したくないのは間違いありません...

したがって、 を使用して略語を展開する代わりにabbrev-mode、選択した関数を実行します。

もちろんabbrev-mode、私がいつも使っている と互換性がある必要があります。

どうすればこの動作を取得できますか?

4

3 に答える 3

3

1 つのアプローチは、 を使用することpre-abbrev-expand-hookです。私自身は略語モードを使用していませんが、この方法で略語モードの仕組みを再利用し、それ自体に展開される (または何もない?) いくつかの「略語」を定義するだけで、それらをキャッチできるように思えます。そのフックで、必要なアクションを実行します。

expandライブラリは明らかに関連しておりexpand-expand-hook、別の代替手段となる可能性のあるを提供しますか?

編集:おっと; pre-abbrev-expand-hook23.1以降廃止されました

abbrev-expand-functions使用する正しい変数は次のとおりです。

`expand-abbrev' のラッパーフック。この特別なフックの関数は、1 つの引数 (略語展開を実行する関数) で呼び出されます。展開が行われた場合、省略記号を返す必要があります。

M-x find-function RET expand-abbrev RETコードについてはを参照してください。またC-h f with-wrapper-hook RET、このフックがどのように使用されるかを理解するために読むこともできます。

于 2012-03-20T21:06:01.613 に答える
3

すべての略語は、いくつかの要素で構成されています。主な要素には、名前 (例: "fbf")、展開 (任意の文字列)、およびフック (呼び出される関数) があります。foo-bar-for-the-winあなたの場合、展開を空の文字列にして、単にフックとして指定したいようです。

于 2012-03-21T12:52:29.743 に答える
3

編集:あなたの改訂された質問は、私の答えが対処しなかったいくつかの重要な詳細を追加します。phils は、この問題にアプローチする 1 つの方法を提供しています。もう 1 つはyasnippetを使用することです。スニペット テンプレートに任意の Lisp コードを含めることができるため、次のようにすることができます。

# -*- mode: snippet -*-
# name: foobars
# key: fbf
# binding: direct-keybinding
# --
 `(foo-bar-for-the-win)`

関数が何も返さなかったことを確認する必要があります。そうしないと、関数がバッファーに挿入されます。私は省略モードを使用していないので、これが競合を引き起こすかどうかはわかりません。yas/snippet を実行するには少し実験が必要ですが、セットアップが完了すると非常に便利です。

元の答え: 好きな関数にスペースをバインドできます。すべての句読点キーを同じ関数または異なる関数にバインドできます。

(define-key your-mode-map " " 'your-choice-function)

カスタム モード マップ内でこれを行うと、モードを切り替えたときに通常の動作に戻ることができます。グローバルにスペースを self-insert 以外に設定するのは役に立ちません。

于 2012-03-20T20:15:32.340 に答える