Хорошо, просто для ясности предположим, что вы говорите о командах forward-word и back-word , которые по умолчанию привязаны к Alt+f и Alt+b
например к строке: "Здравствуйте, куколка, я здесь"
Если ваш курсор находится на "H" в слове "Здравствуйте", и вы делаете форвард-слово, курсор переместится в пространство между "Здравствуйте" и "куколкой", но это звучит так, как будто вы хотите, чтобы курсор был на букву "d" в слове "куколка", а не напротив него.
Итак, сделай вперед слово дважды, потом назад слово один раз.
Это поставит ваш курсор на букву "d" из "куколки".
Это можно автоматизировать с помощью макроса.
;; = комментарии, не набирайте их
Ctrl+x (;..; start macro
Alt+f Alt+f Alt+b
Ctrl+x ) ;;end macro
Then to run last defined macro do this:
Ctrl+x e
EDIT: как указано в комментарии, это также можно сделать с помощью
Alt+f Ctrl+f
Можно также поместить это в макрос, в любом случае результат будет один и тот же.
Можно достигнуть этого поведения при помощи forward-to-word
и backward-to-word
найденный в misc.el
. У меня есть они связанные с Meta-F/Meta-B
(т.е. с нажатым Сдвигом). Они эквивалентны Meta-f/Meta-b
для forward-word/backward-word
, Мой .emacs имеет следующую привязку
(global-set-key (kbd "M-F") #'forward-to-word)
(global-set-key (kbd "M-B") #'backward-to-word)
, которое является правильным поведением. Согласно руководству , «,« [117525], «[F] орденское движение останавливается сразу после последней буквы слова, в то время как обратное движение останавливается прямо перед первой буквой».
Почему это так? Возможно, быть последовательным с убийством-словом (M-D).
Описанный макрос-решение - отличный способ получить это поведение на сеансе, но это немного неудобно, если это Поведение по умолчанию, поскольку вы должны определить его каждый раз, когда вы запускаете Emacs. Если вы хотите M-F работать так все время, вы можете определить функцию ELISP и связать его к ключу. Положите это в ваш файл .emacs:
(defun next-word (p)
"Move point to the beginning of the next word, past any spaces"
(interactive "d")
(forward-word)
(forward-word)
(backward-word))
(global-set-key "\M-f" 'next-word)
Попробуйте что-нибудь вроде следующего:
;; replace common word-operations on same-syntax-operations
(require 'thingatpt)
(global-set-key "\M-f" 'forward-same-syntax)
(global-set-key "\M-b" (lambda()
(interactive)
(forward-same-syntax -1)))
(defun kill-syntax (&optional arg)
"Kill ARG sets of syntax characters after point."
(interactive "p")
(let ((opoint (point)))
(forward-same-syntax arg)
(kill-region opoint (point))))
(global-set-key "\M-d" 'kill-syntax)
(global-set-key [(meta backspace)] (lambda()
(interactive)
(kill-syntax -1)))
Дважды двигаться вперед и один раз назад можно, если только вы не находитесь в начале строки с пробелами в начале. Затем, дважды переходя вперед и один раз назад, вы перейдете к следующему слову, а не к первому. Приведенный ниже код идеально имитирует команду vi "w".Я написал это довольно быстро, так что этот код можно очистить дальше.
(defun forward-word-to-beginning (&optional n)
"Move point forward n words and place cursor at the beginning."
(interactive "p")
(let (myword)
(setq myword
(if (and transient-mark-mode mark-active)
(buffer-substring-no-properties (region-beginning) (region-end))
(thing-at-point 'symbol)))
(if (not (eq myword nil))
(forward-word n))
(forward-word n)
(backward-word n)))
(global-set-key (kbd "M-C-f") 'forward-word-to-beginning)