16

我希望能够在 Emacs (Ma, Me) 中按句子导航。这就是问题所在:默认情况下,Emacs 期望每个句子由两个空格分隔,而我习惯于只放置一个空格。当然,可以关闭该设置,以允许句子仅由一个空格分隔,如下所示:

(setq sentence-end-double-space nil)   

但是随后 Emacs 认为句子在带有句号(“.”)的缩写之后结束,例如在“...一个奇怪的命令,例如 foo...”之类的东西之后。

因此,除了使用上面的代码之外,有没有一种方法可以定义句尾变量,以便将 [.!?] 视为标记句子的结尾,如果后面是一个或多个空格,后跟一个大写字母 [ AZ]?

并且...还允许 [.!?] 标记句子的结尾,如果后面跟着零个或多个空格,然后是“\”?[后一种情况的原因是为了编写 LaTeX 代码:一个句子后面跟着一个 LaTeX 命令,如 \footnote{},例如“...所以我们可以看到这一点得到了证明。\footnote{在一些替代世界,至少。}"]

我试着玩弄句尾的定义,并想出了:

(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))

您的大部分调整都需要关注正在查看的正则表达式,以确保它满足您需要的所有潜在的句末条件。修改它以根据它找到的内容将光标移动到特定位置会相对容易:如果它是一个正常的句子,则保留它,如果你使用的是乳胶命令,则移过下一个 { ,或者任何适合你的东西。

一旦你完成了这项工作,就可以将函数绑定到 Ma 和 Me,可能使用模式挂钩,除非你想在每种模式下都使用它们。

于 2011-01-21T03:19:54.640 回答