2012-03-20 2 views
0

私はabbrev-modeの大ファンで、少し似ていたいと思っています。あなたは入力を開始し、句読点を入力するとすぐに(またはスペースだけで十分です)関数を呼び出します。特殊な省略形の後にはもちろん、abbrev-modeのように)。私は間違いなくいくつかの機能私はスペースを打った一つ一つの時間を実行する必要はありませんabbrev-modeと同等ですが、関数には対応していますか?

...

ので、代わりの abbrev-modeを使用して略語を展開し、それは私の選択の機能を実行します。

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

どうすればこの現象が起こりますか?

+0

なぜ誰かが私の周りにこれを投票しています...質問は明らかです。明らかに非常に役立つかもしれません(ちょうどabbrev-modeが非常に役立つように)、もう1つのすてきな答えがあります。 –

答えて

3

1つのアプローチは、pre-abbrev-expand-hookを使用することができます。私は自分自身で略語モードを使用しませんが、あたかもこのように略語モードの機械を再利用できるかのように聞こえます。そして、単に自分自身に(あるいは何にもならない)拡張するいくつかの「略語」を定義し、そのフックであなたが望む何らかの行動を取る。

expandライブラリは明らかに関連しており、expand-expand-hookを提供しています。

編集:おっとり;

ラッパーフック `拡大-略称」周り:23.1

abbrev-expand-functionsが使用する正しい変数であるためpre-abbrev-expand-hookは廃止されました。 この特殊フックの関数は、1つの引数、つまり という略式拡張を実行する関数で呼び出されます。拡張が行われた場合は、略号を に戻す必要があります。

は、コードのためM-x find-function RET expand-abbrev RETを参照してください、そしてあなたも、このフックを使用する方法を理解するC-h f with-wrapper-hook RETを読むことをお勧めします。

+0

ah +1素晴らしいアイデアのように聞こえる私はEmacs-fuが十分強いとは思っていませんが、私は省略モードのマシンを再利用する考えが好きです:) –

3

編集: あなたの改訂された質問は、私の答えが対処しなかったいくつかの重要な詳細を追加します。 philsはこの問題に取り組む一つの方法を提供しました。もう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) 

おそらく、カスタムモードマップ内にこれをやりたいので、あなたは、モードを切り替えるときは、通常の動作に戻すことができます。グローバルに自己挿入以外のものにスペースを設定することは役に立たないでしょう。

+0

私は自分の関数にバインドし、abbrev-modeまたは "my-funabbrev-mode"のいずれかにディスパッチする必要がありますか?私は* one *関数にスペースをバインドしたくないので、スペースの前に入力したものに応じて関数を実行するようにしたいと思います。たとえば、abbrev-modeでは "teh"と入力して "the"にすることができます。私の場合、「fbf」とタイプして、Emacsが自動的にfoo-bar-forthewin *関数を実行するようにしたいと思います(foo-bar-forthewinにfbdをバインドしていたからです)。 "sof"と入力してEmacsを自動的に* some-other-function *を実行させます。 –

+0

これはabbrev-modeと同じように、別のモードで入力する必要のある関数にバインドすることはできません。そのため、時間の99.999%の短縮形のスペースは、スペースのように機能します(それで、abbrev-modeはとても素晴らしいです)。競合が発生した場合は、いつもその特定の関数のバインディングを削除できます... –

2

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

関連する問題