Самый простой обходной путь: используйте 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 .
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
на разные, уникальные (произвольные) значения.(modify-syntax-entry ?_ "w")
не работает для меня по какой-то причине. Делать это в интерактивном режиме тоже не получалось. Любая идея, почему или как я могу отладить это? Я на Spacemacs в случае, если это актуально.(modify-syntax-entry ?_ "w" rust-mode-syntax-table)
, тогда это сработало.superword-mode
не влияет на движение вevil-mode
. Так что это не является составляющей для изменения таблиц синтаксиса.Следующий фрагмент заставит Зло рассматривать символ Emacs как слово.
Это имеет то преимущество, что оно меняется в зависимости от языка:
является одним символом,
lisp-mode
но двумя символами (разделенными-
) вc-mode
.источник
В spacemacs FAQ предлагает следующий язык конкретного решения:
Это также работает в обычном Emacs. С зла на, он работает со всеми командами слов , связанных с (
w
,e
,*
,#
и т.д.)В целом, это будет сделано для всех основных режимов:
источник
'prog-mode-hook
ли вы возможность охватить каждый язык?В Emacs 24 введен
superword-mode
второстепенный режим, который обрабатывает подчеркивание как часть слов.evil-mode
уважает этот параметр.Вот документация:
источник
evil-mode
, к сожалению, приsuperword-mode
включении возникает ошибка . Когда вызывается, это вызывает некоторое ошибочное поведениеevil-forward-word-begin
: github.com/emacs-evil/evil/issues/721Мне действительно очень нравится это поведение, так как я мог бы просто захотеть отредактировать часть слова и оставить остальные части без изменений. Если я хочу , чтобы перейти на целое слово , я всегда могу использовать
E
,W
илиB
, варианты в верхнем регистре. Это дает мне более детальный контроль.источник