Як ставитися до підкреслення як частини слова?


34

Я використовую evilрежим Emacs + .

Коли я розміщую курсор на e(у звичайному стані) в шматку тексту, наприклад abc_def_ghi, ciw(змінити внутрішнє слово), змінюється лише defчастина рядка, тоді як Vim змінює всю abc_def_ghi.

Як я можу змусити evilставитися до підкреслення як Вім (тобто як частина слова)?

Відповіді:


26

Найпростіший спосіб вирішення: використовуйте 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різні, унікальні (довільні) значення.
sitaktif

(modify-syntax-entry ?_ "w")чомусь не працювали для мене. Робити це інтерактивно, теж не вийшло. Будь-яка ідея, чому або як я можу це налагодити? Я на Spacemacs на випадок, якщо це актуально.
Хелдер S Ribeiro

1
Це пояснює мою проблему. Мабуть, ви повинні експліцитно посилатися на цільову таблицю синтаксису. У моєму випадку я використовував (modify-syntax-entry ?_ "w" rust-mode-syntax-table), тоді це працювало.
Helder S Ribeiro

Які ненавмисні ефекти зміни запису синтаксису?
обід

FTR: superword-modeне впливає на переміщення в evil-mode. Тому це не є складовою для модифікації таблиць синтаксису.
Привіт-Ангел

28

Наступний фрагмент змусить Зло трактувати символ Emacs як слово.

(with-eval-after-load 'evil
    (defalias #'forward-evil-word #'forward-evil-symbol)
    ;; make evil-search-word look for symbol rather than word boundaries
    (setq-default evil-symbol-word-search t))

Це має ту перевагу, що вона змінюється залежно від мови:

foo-bar

- один символ, lisp-modeале два символи (розділені -) в c-mode.


14

У spacemacs FAQ пропонує наступний мову конкретного рішення:

;; 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")))

2
Чи використовується 'prog-mode-hookваріант для покриття кожної мови?
BallpointBen

2

Уведений Emacs 24 superword-mode, другорядний режим, який розглядає підкреслення як частину слів. evil-modeповажає цей параметр.

Ось документація:

(superword-mode &optional ARG)

Увімкніть переміщення та редагування суперсловів (режим Superword). За допомогою аргументу префікса ARGввімкніть режим Superword, якщо він ARGє позитивним, і відключіть його інакше. Якщо дзвонить з Lisp, увімкніть режим, якщо ARGвін опущений або нульовий.

Режим "Суперслова" - це мізерний буфер, локальний режим. Увімкнення цього змінює визначення слів таким чином, що символи символів трактуються як частини слів: наприклад, в superword-mode, "this_is_a_symbol"вважається одним словом.


Якщо ви використовуєте evil-mode, на жаль, помилка при superword-modeвключенні. Це викликає деяку помилкову поведінку, коли evil-forward-word-beginвикликається: github.com/emacs-evil/evil/isissue/721
modulitos

0

Насправді мені дуже подобається така поведінка, оскільки, можливо, я хочу просто відредагувати частину слова та зберегти недоторканні інші частини. Якщо я хочу , щоб перейти на ціле слово , я завжди можу використовувати E, Wабо B, варіанти у верхньому регістрі. Це дає мені більш тонкий контроль.

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