Пересмотреть «предложение» в Emacs?(один пробел между предложениями, но без аббревиатур) - PullRequest
15 голосов
/ 21 января 2011

Я бы хотел иметь возможность перемещаться по предложениям в Emacs (Ma, Me).Вот проблема: по умолчанию Emacs ожидает, что каждое предложение разделено двумя пробелами, и я привык просто ставить один пробел.Конечно, этот параметр можно отключить, чтобы предложения могли разделяться только одним пробелом, например:

(setq sentence-end-double-space nil)   

Но тогда Emacs считает, что предложение закончилось после сокращений с полной остановкой (". "), например, после чего-то вроде" ... странная команда, например, foo ... ".

Таким образом, вместо использования приведенного выше кода, есть способ определить переменную конца предложения, чтобыон считается [.!?] как обозначающий конец предложения, если ниже следует один или несколько пробелов, за которыми следует заглавная буква [AZ]?

И ... также разрешить [.!?]отметить конец предложения, если за ним следует ноль или более пробелов, за которыми следует "\"?[Причиной этого последнего условия является написание кода LaTeX: когда за предложением следует команда LaTeX, такая как \ footnote {}, например, "... и поэтому мы можем видеть, что точка доказана. \ Footnote {В некотором альтернативном вариантеworld, по крайней мере.} "]

Я попытался поиграться с определением конца предложения, и придумал:

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

Но это, похоже, не работает вообще.

Есть предложения?

1 Ответ

4 голосов
/ 21 января 2011

Я не думаю, что конец предложения будет делать то, что вам нужно. Для этого вам действительно нужны регулярные регулярные выражения, и 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))

Большая часть ваших настроек должна быть сосредоточена на регулярном выражении, чтобы убедиться, что оно соответствует всем потенциальным условиям окончания предложения, которые вам нужны. Было бы относительно легко изменить его, чтобы переместить курсор в определенные места на основе того, что он находит: оставьте его, если оно является обычным предложением, перейдите за следующее {если вы используете команду латекса или что-то другое, что вам подходит. 1006 *

Как только вы это заработаете, можете связать функции с M-a и M-e, возможно, используя ловушки режима, если вы не хотите использовать их для каждого режима.

...