Обрабатывать символы как слова в режимах прог


12

В 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пропустить дефисы и подчеркивания и т. Д.

Ответы:


4

Emacs уже должен использовать « соответствующие границы слов для синтаксиса текущего языка ». Если это не так, подайте ошибку для основного режима для этого языка.

Но, может быть, вы на самом деле не имеете в виду слова . Может быть, вы имеете в виду синтаксис символа , а не синтаксис слова. Emacs различает два.

Для синтаксиса символов используйте команды символов, а не команды слов: forward-symbolи т. Д. Из вашего описания это то, что вы действительно хотите.

Если вы чувствуете, что действительно хотите использовать словесную функцию для символа, вы можете изменить категорию синтаксиса отдельных символов, чтобы иметь составной синтаксис слова вместо составного синтаксиса символа. Но, как правило, это не то, что вы хотите сделать, и вам не нужно это делать.

Обратитесь к руководству по Elisp за информацией о синтаксисе символов. И посмотрите руководство Emacs и руководство Elisp для команд и других функций, которые работают с символами (не символами Lisp, а текстом с синтаксисом символов на любом языке).

И имейте в виду, что операции с секстами часто полезны также для действий с символами: C-M-f( forward-sexp), C-M-t( transpose-sexps) и т. Д.


C-M-fсвязан forward-sexpи ведет себя не так, как вы описываете. Вы правы в том, что я хочу ориентироваться по символам, но я не вижу такой возможности.
Nispio

@nispio, forward sexpпо сути, forward-symbolбольшую часть времени, с добавленной универсальностью, также переходя через соответствующие скобки. Вы должны дать ему шанс.
Малабарба

@ Malabarba Я категорически не согласен, что forward-sexpявляется близким приближением forward-symbol. Для начала, это может сбить вас с толку перепрыгнуть через целые функции, высадив вас на сотни строк от того, с чего вы начали. Он также перепрыгивает через списки аргументов и т. Д. И попробуйте это: учитывая следующий код lisp, (global-set-key [remap list-buffers] 'ibuffer)поместите курсор в середину слова remapи запустите forward-sexpнесколько раз. Это вызывает ошибку, когда он достигает закрытия ]. Спасибо, не надо.
Ниспио

@nispio Я всегда использую сочетание навигации по полу и словам. Таким образом, я могу избежать любой из этих проблем, имея универсальность обоих. Но это все вопрос предпочтений. ;-) Если вы знаете, что никогда не пропустите навигацию по словам, superword-modeвозможно, это ваш парень.
Малабарба

Извините, я не должен был предлагать это C-M-fи C-M-tдействовать на символы (они действуют на sexps). Я буду редактировать, чтобы исправить это впечатление. Но вы, безусловно, можете связать forward-symbolлюбую понравившуюся клавишу, если сочтете ее особенно полезной. Нет transpose-symbols, но вы можете написать еще раз, если считаете, что это полезно.
Дрю

11

Посмотрите на superword-modeи subword-mode. Superword обрабатывает подчеркивания как часть слова, а не границы, поэтому foo_bar будет рассматриваться как одно слово .
Подслово делает противоположное, но для camelCase, поэтому fooBarрассматривается как два слова вместо одного.

Похоже, поведение, которое вы хотите cc-modeиспользовать superword-mode.

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

Я бы порекомендовал читать поверх источника subword-mode, поскольку, даже если эти два режима не выполняют именно то, что вам нужно, они должны показать вам, как изменить поведение при обнаружении слова.

Более продолжительное обсуждение emacsredux и ergomacs .


Можно ли сделать superword-modeигру приятной paredit? Например, paredit-forward-kill-wordне удаляет все слово (содержащее подчеркивание), когда superword-modeоно включено.
Ренан Ранелли

Он меняет определение слова и pareditуважает его, поэтому я думаю, что он делает то, что от него требуется .
dgtized

Дело в том , что paredit это не уважая этого. paredit-forward-kill-wordне убивает то же самое слово , определенное superword-mode.
Ренан Ранелли

О, я неправильно понял. Хм. Просто посмотрел, paredit-forward-kill-wordи похоже, что он выполняет собственный анализ. Так что может быть в состоянии поменять это, но, вероятно, нет.
dgtized

3

Если бы я понял ваш вопрос, вы могли бы изменить таблицу синтаксиса языка, например, для c ++:

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

M-x apropos тогда поиск синтаксической таблицы должен вам тоже помочь.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.