16

Emacs (Ma, Me) で文単位でナビゲートできるようにしたいです。ここに問題があります。デフォルトでは、Emacs は各文が 2 つのスペースで区切られていることを想定しており、私は 1 つのスペースを入れることに慣れています。もちろん、その設定をオフにして、次のように、1 つのスペースだけで区切られた文を許可することができます。

(setq sentence-end-double-space nil)   

しかし、Emacs は、ピリオド (".") を使用した省略形の後、たとえば "... a奇妙なコマンド、たとえば foo..." のようなものの後に、文が終了したと見なします。

したがって、上記のコードを使用するのではなく、[.!?] が文の終わりを示すものとしてカウントされるように、文末変数を定義する方法はありますか。 AZ]?

そして...また、[.!?] が文の終わりをマークできるようにするには、その後に 0 個以上のスペースが続き、その後に「\」が続きますか? [この後者の条件の理由は、LaTeX コードを書くためです: 文の後に \footnote{} のような LaTeX コマンドが続きます。世界、少なくとも。}"]

文末の定義をいじってみたところ、次のようになりました。

(setq sentence-end "[.!?][]'\")}]*\\(\\$\\|[ ]+[A-Z]\\|[ ]+[A-Z]\\| \\)[
 ;]*")

しかし、これはまったく機能していないようです。

助言がありますか?

4

1 に答える 1

4

文末が必要なことを行うとは思いません。これには先読み正規表現が本当に必要ですが、Emacs はそれらをサポートしていません。

ただし、独自の関数をロールして、必要なことを行うことができます。私はあなたの要件をすべて理解しているわけではありませんが、次のことから始めましょう。

(defun my-next-sentence ()
"Move point forward to the next sentence.
Start by moving to the next period, question mark or exclamation.
If this punctuation is followed by one or more whitespace
characters followed by a capital letter, or a '\', stop there. If
not, assume we're at an abbreviation of some sort and move to the
next potential sentence end"
  (interactive)
  (re-search-forward "[.?!]")
  (if (looking-at "[    \n]+[A-Z]\\|\\\\")
      nil
    (my-next-sentence)))

(defun my-last-sentence ()
  (interactive)
  (re-search-backward "[.?!][   \n]+[A-Z]\\|\\.\\\\" nil t)
  (forward-char))

微調整のほとんどは、必要なすべての潜在的な文末条件を確実に満たすために、look-at regexp に集中する必要があります。見つかった内容に基づいてカーソルを特定の場所に移動するように変更するのは比較的簡単です。通常の文であればそのままにし、ラテックス コマンドを使用している場合は次の { を過ぎて移動します。

それが機能したら、すべてのモードで使用したくない場合を除き、おそらくモードフックを使用して、関数を Ma と Me にバインドできます。

于 2011-01-21T03:19:54.640 に答える