Розглядайте символи як слова в режимах прог


12

У Emacs є ряд команд, які застосовуються до "слів". Приклади включають forward-word, kill-word, upcase-word, mark-word, transpose-wordsі т.д. Визначення «слова» здається трохи відрізнятися між командами. Наприклад, forward-wordзупиниться на підкресленні в межах слова (наприклад foo_bar), але mark-wordне зупиниться на підкресленні.

Чи можливо змінити визначення "слово", коли я перебуваю в режимі прог, щоб 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

@nispio Я завжди використовую комбінацію sexp та навігації по словах. Таким чином я можу уникнути будь-якої з цих проблем, маючи при цьому універсальність обох. Але все це питання переваги. ;-) Якщо ви знаєте, що ніколи не пропустите навігацію по словах, superword-modeможливо, буде ваш хлопець.
Малабарба

Вибачте, я не повинен був пропонувати це C-M-fі C-M-tдіяти на символах (вони діють на сексепах). Я відредагую, щоб виправити це враження. Але ви, звичайно, можете прив’язати forward-symbolбудь-який ключ, який вам подобається, якщо вам це стане особливо корисним. Немає transpose-symbols, але ви можете написати ще раз, якщо вважаєте, що це корисно.
Дрю

11

Погляньте на superword-modeі subword-mode. Суперслова розглядає підкреслення як частину слова замість межі, тому 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поважає це, тому я думаю, що він робить те, що проситься.
дегтизовано

Вся справа в тому, що паритет цього не поважає. paredit-forward-kill-wordне вбиває те саме слово, яке визначено superword-mode.
Ренан Ранеллі

Ой, я перечитав. Хм. Щойно подивився на paredit-forward-kill-wordце, і схоже, він робить власний розбір. Тож, можливо, вдасться поміняти це, але, мабуть, ні.
дегтізовано

3

Якщо я зрозумів ваше запитання, ви можете змінити таблицю синтаксису мови, наприклад для c ++:

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

M-x apropos тоді пошук синтаксичної таблиці також повинен допомогти вам.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.