5

ラテックス モードで単語構成要素として動作するように文字を定義しまし\た。結果にはかなり満足しています。私を悩ませている唯一のことは、のようなシーケンス\alpha\betaが単一の単語として扱われることです (もちろん、これは予想される動作です)。

emacsに特定の文字を「スターター」という単語として解釈させる方法はありますか? この方法では、常に後続の単語の一部と見なされますが、先行する単語の一部とは見なされません。

わかりやすくするために、以下に例を示します。

\alpha\beta
^          ^
1          2

ポイントが に1あり、 を押すM-dと、文字列 "\alpha" が削除されます。ポイントが に2あり、 を押すM-<backspace>と、文字列 "\beta" が削除されます。

どうすればこれを達成できますか?

4

2 に答える 2

3

別の考え:
あなたの要件はsubword-mode、camelCase を提供するものと非常に似ています。

subword-mode の動作をカスタマイズすることはできません -- 正規表現はハードコードされています -- しかし、そのライブラリをコピーして目的に合わせて変更することはできます。

M-x find-library RET subword RET

それはおそらくかなり堅牢なソリューションになるでしょう。

編集:提案されているように、コメントから更新されました:

記録のために、関数内およびsubword.el 内の[[:upper:]]toのすべてのインスタンスを変更すると、うまく機能します=) (「\」が「w」構文として定義されている限り)。[\\\\[:upper:]]subword-forward-internalsubword-backward-internal

個人的には、既存のライブラリをもう少し汎用的にする目的がない限り、直接編集するよりもライブラリのコピーを作成する傾向があります。最も簡単な解決策は、それらの正規表現を変数に移動することです- - その後、この種の目的のためにバッファローカルに変更されたバージョンを持つことは簡単です。

編集 2: Emacs 24.3 (現在はリリース候補) の時点で、subword-mode は newsubword-forward-regexpおよびsubword-backward-regexp変数 (単純な変更の場合) とsubword-forward-functionandsubword-backward-function変数 (より複雑な変更の場合) を使用してこれを容易にします。

これらの regexp 変数をラテックス モードで必要な値でバッファ ローカルにすることにより、サブワード モードを直接使用することができます。

于 2012-05-04T13:20:02.227 に答える
2

これは、構文テキスト プロパティを使用して実装できるはずです。

M-: (info "(elisp) Syntax Properties") RET

編集:実際、これを正確に行うことができるかどうかはわかりませんか?

以下 (単なる実験) は近いですがM-<backspace>、2 では "beta" のみが削除され、前の "\" は削除されません。

backward-kill-wordその前の「\」をチェックして、それも殺した関数に再マップできると思います。かなりハックですが、よりクリーンなソリューションがなければ、おそらくうまくいくでしょう。

私はこれまでこの機能を試したことがありません。おそらく他の誰かが明確にすることができます。

(modify-syntax-entry ?\\ "w")
(setq parse-sexp-lookup-properties t)
(setq syntax-propertize-function 'my-propertize-syntax)
(defun my-propertize-syntax (start end)
  "Set custom syntax properties."
  (save-excursion
    (goto-char start)
    (while (re-search-forward "\\w\\\\" end t)
      (put-text-property
       (1- (point)) (point) 'syntax-table (cons "." ?\\)))))
于 2012-05-04T03:06:41.990 に答える