kill-word / forward-word должен останавливаться на новой строке

Меня довольно раздражает, что kill-word и forward-word рассматривают символ новой строки как пробел и, например, убить все до конца слова в следующей строке. Вместо этого я хотел бы, чтобы он остановился в конце строки.

Я попытался изменить синтаксическую таблицу, чтобы включить символ новой строки в определение слова следующим образом:

(изменить-синтаксис-запись ?\n "w")

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

Есть ли способ добиться этого эффекта глобально?


person Andrzej Pronobis    schedule 15.12.2012    source источник


Ответы (3)


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

Во-вторых, я согласен с ответом, данным Стефаном, в том, что возня с синтаксической таблицей или переопределение самого forward-word не вызовет у вас ничего, кроме неприятностей и горя.

Если вам действительно нужно поведение, которое вы описываете для M-d и M-f, то, возможно, было бы лучше определить новый набор функций, которые имеют это желаемое поведение и к которым вы можете привязать клавиши M-d и M-f.

Действительно, это был бы традиционный способ изменить стандартное поведение некоторых основных функций в любом emacs.

Может быть, что-то вроде этого? (едва протестировано)

(defun forward-word-stop-eol (arg)
  (interactive "p")
  (let ((start (point)))
    (save-restriction
      (save-excursion
        (move-end-of-line 1)
        (narrow-to-region start (point)))
      (forward-word arg))))

(defun kill-to-end-of-word-or-line (arg)
  (interactive "p")
  (kill-region (point) (progn (forward-word-stop-eol arg) (point))))

(global-set-key "\ef" forward-word-stop-eol)
(global-set-key "\ek" kill-to-end-of-word-or-line)
person Greg A. Woods    schedule 17.12.2012
comment
Спасибо! Это работает. Мне еще предстоит выяснить, какой для меня самый эффективный способ навигации по коду/тексту, но это, безусловно, отличная отправная точка. - person Andrzej Pronobis; 18.12.2012
comment
это довольно хорошо, я адаптировался к bacwkard-will-word-stop-eol. Я просто хотел бы удалить новую строку, если я нажму ее еще раз. в основном поведение обратного слова-убийцы, но делает «одну остановку» на новой строке - person mtourne; 23.05.2017

Изменение синтаксиса символа ?\n быстро навлечет на вас неприятности во всех видах режимов. Вместо этого вы хотите изменить то, как такие вещи, как forward-word, ведут себя при интерактивном вызове (обратите внимание, что изменение поведения функции forward-word также может привести к проблемам, поскольку она часто используется в таких вещах, как код отступа). Вы можете взглянуть на то, как работает subword-mode, в качестве примера того, как это можно сделать.

person Stefan    schedule 16.12.2012
comment
Я проверил код режима подслов, и это также отличный источник информации. Если я решу использовать более сложную навигационную функциональность, я обязательно буду использовать подслово в качестве примера. - person Andrzej Pronobis; 18.12.2012

Я использовал with-syntax-table для временного (и глобального) изменения синтаксической таблицы.

Например, я использовал его с режимом syntax-subword:

(defadvice syntax-subword-forward (around testing activate)
  (with-syntax-table (copy-syntax-table (syntax-table))
    (modify-syntax-entry ?\n ">")
    ad-do-it))
person AhLeung    schedule 09.02.2017