О форварде и назад поведении слова в Emacs

9
задан alexchenco 16 January 2010 в 20:45
поделиться

6 ответов

Хорошо, просто для ясности предположим, что вы говорите о командах 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

Можно также поместить это в макрос, в любом случае результат будет один и тот же.

7
ответ дан 4 December 2019 в 08:33
поделиться

Можно достигнуть этого поведения при помощи 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)
0
ответ дан 4 December 2019 в 08:33
поделиться

, которое является правильным поведением. Согласно руководству , «,« [117525], «[F] орденское движение останавливается сразу после последней буквы слова, в то время как обратное движение останавливается прямо перед первой буквой».

Почему это так? Возможно, быть последовательным с убийством-словом (M-D).

4
ответ дан 4 December 2019 в 08:33
поделиться

Описанный макрос-решение - отличный способ получить это поведение на сеансе, но это немного неудобно, если это Поведение по умолчанию, поскольку вы должны определить его каждый раз, когда вы запускаете 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)
10
ответ дан 4 December 2019 в 08:33
поделиться

Попробуйте что-нибудь вроде следующего:

;; 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)))
0
ответ дан 4 December 2019 в 08:33
поделиться

Дважды двигаться вперед и один раз назад можно, если только вы не находитесь в начале строки с пробелами в начале. Затем, дважды переходя вперед и один раз назад, вы перейдете к следующему слову, а не к первому. Приведенный ниже код идеально имитирует команду 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)
4
ответ дан 4 December 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: