3

文字列 'target="_blank"' を略語 'tgt' に割り当てたいと思います。これは頻繁に使用し、毎回入力するのが面倒だからです。

上記の文字列にはおそらくエスケープなどが必要なので、より簡単な出発点として、「target」を「tgt」に割り当てようとしました。これをオンにしてグローバル略語として定義しているにもかかわらずabbrev-mode、「tgt」と入力してスペースを押しても何も起こりません。もしそうなら、私はM-x list-abbrevsこれを得る:

(global-abbrev-table)

"target"       1    "tgt"

というわけで収録されているようです。tgt の後にスペースを押すと、tgt がターゲットに展開されることを期待していましたが、そうはなりません。私は何が欠けていますか?略語の性質を完全に誤解していませんか? 私はEmacs の wiki ページを見てきましたが、多くの Emacs ページと同様に、多くの複雑な解決策と、面倒なほどまばらな基本事項が記載されています。

編集:恥ずかしいことに、これは間違った略語ファイルと逆の割り当ての組み合わせであったため、「ターゲット」と入力すると「tgt」が生成されたようです。必要に応じて「tgt」が「target="_blank"」を生成するようになりました。申し訳ありません。

ただし、関連する質問があります。この省略形は、スペースを押すと展開されますが、通常、'target="_blank"' 文字列の後にスペースは必要ありません。スペースを自動的に削除する方法はありますか?

4

1 に答える 1

4

略語を逆に定義する必要があります。あなたが行った方法は、「ターゲット」を「tgt」に展開します。

正しいことを行うには、最初に、省略形を展開したいものをバッファに入力します。あなたの場合、それは「ターゲット」になります。次に、単語の直後にポイントを置いて、 と入力しC-x a gます。これにより、「tgt」と入力する略語を入力するよう求められます。

Et voilà:abbrev-modeがオンになっている場合、入力tgt は「ターゲット」に展開されます。

略語を定義する方法は他にもあります。たとえば、 などM-x define-global-abbrevがあります

略語の後のスペースを削除する際の問題は、略語が展開された後に Emacs がスペースを挿入することです。したがって、スペースを押すと、基本的に 2 つのことが行われます。略語の展開がトリガーされ、通常の自己挿入コマンドが実行されます。

これを回避する簡単な方法の 1 つは、 をオンにするのではなく、省略形を入力するC-x 'か明示的に展開することです。ただし、それは少し面倒です。ただし、ドキュメントをもう一度見ると、次のことがわかります。C-x a eabbrev-mode

機能: define-abbrev テーブル名展開 &optional フック数

[...]

hookが、no-self-insert プロパティが非 nil である非 nil シンボルの場合、フックは、展開をトリガーした自己挿入入力文字を挿入するかどうかを明示的に制御できます。この場合、フックが nil 以外を返すと、文字の挿入が禁止されます。対照的に、フックが nil を返す場合、expand-abbrev も nil を返します。これは、展開が実際には行われていないかのように行われます。

これは、たとえば、「.emacs」ファイルに次の行を追加すると、次のようになります。

(defun my-after-abbrev-expand ()
  (when (looking-back "\"\"\\|''\\|()\\|\\[\\]\\|{}")
    (backward-char 1))
  t)
(put 'my-after-abbrev-expand 'no-self-insert t)

次に、次のように略語を定義できます。

(define-abbrev global-abbrev-table "tgt" "target=\"\"" 'my-after-abbrev-expand)

スペース文字の挿入を避けるため。また、my-after-abbrev-expand展開が 2 つの二重引用符、2 つの単一引用符、または丸括弧、角括弧、または中括弧のペアで終了する場合、関数はポイントを 1 位置左に移動します。

于 2012-07-11T02:21:02.230 に答える