在编模式下将符号视为单词


12

Emacs中有许多命令适用于“单词”。实例包括forward-wordkill-wordupcase-wordmark-wordtranspose-words,等。“字”的定义似乎改变命令之间的位。例如,forward-word将在单词(例如foo_bar)内的下划线处停止,但mark-word不会在下划线处停止。

当我处于编模式时,是否可以更改“单词”的定义,以便Emacs将适当的单词边界用于当前语言的语法?

当我进入时,c-mode我想forward-word跳过下划线,当我进入时,lisp-mode我想forward-word跳过连字符和下划线,等等。

Answers:


4

Emacs应该已经使用“ 当前语言语法的适当单词边界 ”。如果没有,则针对该语言的主要模式提交错误。

但是也许你并不是真的刻薄的。也许您的意思是符号语法,而不是单词语法。Emacs区分了两者。

对于符号语法,请使用符号命令,而不要使用单词命令:forward-symbol等等。根据您的描述,这才是您真正想要的。

如果您确实要在符号上使用单词功能,则可以将特定字符的语法类别更改 为具有单词构成的语法,而不是符号构成的语法。但这通常不是您想要执行的操作,因此您不需要这样做。

有关字符语法的信息,请参见Elisp手册。并请参见Emacs手册和Elisp手册,了解在符号(不是Lisp符号,而是带有符号语法的文本,无论使用哪种语言)上运行的命令和其他功能。

并且请记住,对六分仪进行的操作通常也可用于对符号C-M-fforward-sexp),C-M-ttranspose-sexps)等进行操作。


C-M-f绑定到forward-sexp您的描述且行为与您描述的不同。没错,我想要的是通过符号导航,但是我看不到该选项。
nispio 2014年

@nispio forward sexp本质上是forward-symbol大多数时间,同时还增加了匹配括号的通用性。您应该给它一个机会。
马拉巴巴2014年

@Malabarba我强烈不同意这forward-sexp是的近似值forward-symbol。对于初学者来说,它可能使您困惑于整个功能,使您从开始的地方滑了几百行。它还跳过参数列表等。请尝试以下操作:给定以下lisp代码,(global-set-key [remap list-buffers] 'ibuffer)将光标置于单词的中间remap并运行forward-sexp几次。它引发错误,当它到达关闭]。不用了,谢谢。
nispio 2014年

@nispio我总是结合使用sexp和单词导航。这样,我可以避免任何这些问题,同时兼具两者的多功能性。但这全都是偏好问题。;-)如果您知道您永远不会错过单词导航,superword-mode那么可能就是您。
马拉巴巴

抱歉,我不建议这样做C-M-f,而是C-M-t对符号起作用(它们对性行为起作用)。我将进行编辑以更正该印象。但是forward-symbol,如果发现它特别有用,则可以绑定到您喜欢的任何键。没有transpose-symbols,但是如果您认为有用的话,可以再次写一个。
2014年

11

看看superword-modesubword-mode。Superword将下划线视为单词的一部分而不是边界,因此foo_bar 将其视为单个单词
子字词与之相反,但对于camelCase,因此fooBar被视为两个字词而不是一个。

听起来您想要的行为是cc-mode要使用的superword-mode

(add-hook 'c-mode-common-hook 'superword-mode)

我建议您阅读的源代码subword-mode,因为即使这两种模式未完全满足您的要求,它们也应向您展示如何更改单词检测行为。

关于emacsreduxergomacs的讨论更长。


有可能使superword-mode比赛变得愉快paredit吗?例如,启用后paredit-forward-kill-word不会删除整个单词(包含下划线)superword-mode
Renan Ranelli 2014年

它正在改变一个单词的定义,并且paredit正在尊重它,所以我认为它正在做它所要求的。
dgtized 2014年

问题是paredit 尊重这一点。paredit-forward-kill-word不会杀死由定义的相同单词superword-mode
Renan Ranelli 2014年

哦,我看错了。嗯 只是看了一下,paredit-forward-kill-word看起来好像是在自己解析。因此也许可以将其交换出去,但可能无法。
dgtized

3

如果我理解您的问题,则可以修改语言语法表,例如对于c ++:

(modify-syntax-entry ?_ "w" c++-mode-syntax-table)

M-x apropos 然后查找语法表也应该对您有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.