В Emacs есть ряд команд, которые применяются к «словам». Примеры включают forward-word
, kill-word
, upcase-word
, mark-word
, transpose-words
и т.д. Определение «слова» кажется немного отличаться между командами. Например, forward-word
остановится на подчеркивании в слове (например foo_bar
), но mark-word
не остановится на подчеркивании.
Можно ли изменить определение слова в режиме prog, чтобы Emacs использовал соответствующие границы слов для синтаксиса текущего языка?
Когда я вхожу, c-mode
я хочу forward-word
пропустить подчеркивания, а когда я вхожу, lisp-mode
я хочу forward-word
пропустить дефисы и подчеркивания и т. Д.
источник
C-M-f
связанforward-sexp
и ведет себя не так, как вы описываете. Вы правы в том, что я хочу ориентироваться по символам, но я не вижу такой возможности.forward sexp
по сути,forward-symbol
большую часть времени, с добавленной универсальностью, также переходя через соответствующие скобки. Вы должны дать ему шанс.forward-sexp
является близким приближениемforward-symbol
. Для начала, это может сбить вас с толку перепрыгнуть через целые функции, высадив вас на сотни строк от того, с чего вы начали. Он также перепрыгивает через списки аргументов и т. Д. И попробуйте это: учитывая следующий код lisp,(global-set-key [remap list-buffers] 'ibuffer)
поместите курсор в середину словаremap
и запуститеforward-sexp
несколько раз. Это вызывает ошибку, когда он достигает закрытия]
. Спасибо, не надо.superword-mode
возможно, это ваш парень.C-M-f
иC-M-t
действовать на символы (они действуют на sexps). Я буду редактировать, чтобы исправить это впечатление. Но вы, безусловно, можете связатьforward-symbol
любую понравившуюся клавишу, если сочтете ее особенно полезной. Нетtranspose-symbols
, но вы можете написать еще раз, если считаете, что это полезно.Посмотрите на
superword-mode
иsubword-mode
. Superword обрабатывает подчеркивания как часть слова, а не границы, поэтомуfoo_bar
будет рассматриваться как одно слово .Подслово делает противоположное, но для camelCase, поэтому
fooBar
рассматривается как два слова вместо одного.Похоже, поведение, которое вы хотите
cc-mode
использоватьsuperword-mode
.Я бы порекомендовал читать поверх источника
subword-mode
, поскольку, даже если эти два режима не выполняют именно то, что вам нужно, они должны показать вам, как изменить поведение при обнаружении слова.Более продолжительное обсуждение emacsredux и ergomacs .
источник
superword-mode
игру приятнойparedit
? Например,paredit-forward-kill-word
не удаляет все слово (содержащее подчеркивание), когдаsuperword-mode
оно включено.paredit
уважает его, поэтому я думаю, что он делает то, что от него требуется .paredit-forward-kill-word
не убивает то же самое слово , определенноеsuperword-mode
.paredit-forward-kill-word
и похоже, что он выполняет собственный анализ. Так что может быть в состоянии поменять это, но, вероятно, нет.Если бы я понял ваш вопрос, вы могли бы изменить таблицу синтаксиса языка, например, для c ++:
(modify-syntax-entry ?_ "w" c++-mode-syntax-table)
M-x apropos
тогда поиск синтаксической таблицы должен вам тоже помочь.источник