Answers:
最简单的解决方法:用于ciW
选择以空格分隔的单词。
更大的问题与语法表中_
字符的值有关。问题是,默认情况下是语法表中的符号组成部分,您希望将其视为单词组成部分。_
如果您使用的是emacs 24.4,则可以尝试启用superword-mode
。我自己还没有尝试过,所以您的里程可能会有所不同。
一种替代方法是简单地自己修改语法表,并告诉Emacs您希望它将_
字符视为单词组成部分,如下所示:
(modify-syntax-entry ?_ "w")
完成此操作后,ciw
将按您希望的方式工作,这样它将选择全部abc_def_ghi
而不是def
。
但是,以这种方式执行此操作可能会过大,尤其是如果您只希望将_
算作文本对象单词的一部分。相反,您可以建议evil-inner-word
如下:
(defadvice evil-inner-word (around underscore-as-word activate)
(let ((table (copy-syntax-table (syntax-table))))
(modify-syntax-entry ?_ "w" table)
(with-syntax-table table
ad-do-it)))
现在,除了内字文本对象之外,_
它仍然是所有内容的符号组成,因此将精确地执行您想要的操作,而不会影响其他功能。ciw
您可以在EmacsWiki节点上阅读有关修改语法表的更多信息。
(modify-syntax-entry ?_ "w")
由于某种原因对我不起作用。以交互方式进行操作也不起作用。知道为什么或如何调试吗?我在Spacemacs上使用,以防万一。
(modify-syntax-entry ?_ "w" rust-mode-syntax-table)
,然后它起作用了。
superword-mode
不影响的移动evil-mode
。因此,它不是修改语法表的组成部分。
该spacemacs常见问题提供了以下语言的具体的解决方案:
;; For python
(add-hook 'python-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))
;; For ruby
(add-hook 'ruby-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))
;; For Javascript
(add-hook 'js2-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))
它也可以在常规emacs中使用。与邪恶的,它适用于所有字相关的命令(w
,e
,*
,#
,等)
更一般而言,这将在所有主要模式下执行:
(add-hook 'after-change-major-mode-hook
(lambda ()
(modify-syntax-entry ?_ "w")))
'prog-mode-hook
一种覆盖所有语言的选项?
引入superword-mode
了Emacs 24 ,这是将下划线视为单词一部分的次要模式。evil-mode
尊重此设置。
这里是文档:
(superword-mode &optional ARG)
切换超级字词的移动和编辑(超级字词模式)。使用前缀参数
ARG
,如果ARG
为正,则启用超级字模式,否则,将其禁用。如果从Lisp调用,则启用该模式(如果ARG
省略或为nil)。超字模式是局部于缓冲区的次要模式。启用它会更改单词的定义,以便将符号字符视为单词的一部分:例如,中的
superword-mode
,"this_is_a_symbol"
算作一个单词。
evil-mode
不幸的是,如果您使用,superword-mode
则启用时会出现错误。当evil-forward-word-begin
被调用时,它会导致一些不稳定的行为:github.com/emacs-evil/evil/issues/721
w
,aw
等等),你可以做同样具有以下功能太:evil-forward-word-begin
,evil-forward-word-end
,evil-backward-word-begin
,evil-backward-word-end
,evil-a-word
,evil-inner-word
。注意:您需要更改underscore-as-word
为不同的唯一(任意)值。