我希望能够在Emacs(M-a,M-e)中按句子导航。这是问题所在:默认情况下,Emacs期望每个句子用两个空格分隔,而我习惯于只放一个空格。当然,可以关闭该设置,以允许仅由单个空格分隔的句子,如下所示:
(setq sentence-end-double-space nil)
然后Emacs认为句子在带有句号(“。”)的缩写后结束,例如在诸如“......一个奇怪的命令,例如foo ......”之类的东西之后。
因此,有没有一种方法可以定义句末项变量,以便将[。!?]计为标记句子的结尾,iff后面是一个或多个空格后跟一个大写字母[AZ]?
并且......还允许[。!?]标记句子的结尾,如果后跟零或多个空格后跟“\”? [后一种情况的原因是编写LaTeX代码:其中一个句子后跟一个LaTeX命令,例如\ footnote {},例如“......所以我们可以看到这一点得到证实。\ footnote {在某些替代世界,至少。}”
我尝试了解句末的定义,并提出:
(setq sentence-end "[.!?][]'\")}]*\\(\\$\\|[ ]+[A-Z]\\|[ ]+[A-Z]\\| \\)[
;]*")
但这似乎根本不起作用。
有什么建议吗?
答案 0 :(得分:4)
我认为句末不会做你需要它做的事情。你真的需要前瞻性的regexp,而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))
您的大多数调整都需要关注正在查看的正则表达式,以确保它能够满足您所需的所有潜在句末条件。修改它以根据它找到的内容将光标移动到特定位置会相对容易:如果它是正常的句子,则移动它,移动到下一个{如果你是乳胶命令,或任何适合你的。< / p>
一旦你有了工作,可以将函数绑定到M-a和M-e,可能使用模式挂钩,除非你想在每种模式下使用它们。