Переопределить "предложение" в Emacs? (одно место между предложениями, но игнорирование аббревиатур)

Я хотел бы иметь возможность перемещаться по предложению в Emacs (M-a, M-e). Здесь проблема: по умолчанию Emacs ожидает, что каждое предложение разделяется двумя пробелами, и я привык просто помещать одно пространство. Конечно, эту настройку можно отключить, чтобы допускать предложения, разделенные только одним пространством, например:

(setq sentence-end-double-space nil)   

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

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

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

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

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

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

Любые предложения?

Ответы

Ответ 1

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

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

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