О прямом и обратном поведении слова в Emacs - PullRequest
8 голосов
/ 16 января 2010

Я не знаю, если что-то не так с моими настройками, но когда я нажимаю M-f (переслать слово) не имеет значения, где я нахожусь, он никогда не помещает курсор в следующее слово (только между словами). Этого не происходит с M-b, который помещает мой курсор в начало предыдущего слова.

Это нормальное поведение? Как поместить мой курсор в начало следующего слова?

Ответы [ 5 ]

9 голосов
/ 17 января 2010

Описанное решение для макроса - отличный способ получить такое поведение в сеансе, но это немного неудобно, если вы хотите использовать это поведение по умолчанию, так как вы должны определять его каждый раз при запуске 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)
7 голосов
/ 16 января 2010

Хорошо, просто, чтобы мы поняли, я собираюсь предположить, что вы говорите о командах forward-word и backward-word они по умолчанию связаны с Alt + f и Alt + b

например, строка: "Привет, Долли, я здесь"

Если курсор находится на «H» в «Hello», и вы делаете forward-word , курсор переместится в пространство между «Hello» и «dolly», но звучит так, как будто вы хотите курсорбыть на букве "d" слова "тележка", а не напротив него.

Итак, дважды делайте вперед одно слово, а затем одно слово назад.

Это наведет курсор на "d" слова "dolly".

Это можно автоматизировать с помощью макроса.

;;= комментарии, не вводите их

Ctrl + x ( ;; запуск макроса

Alt + f Alt + f Alt + b

Ctrl + x ) ;; конец макроса

Затем для запуска последнего определенного макроса выполните следующее:

Ctrl + x e

РЕДАКТИРОВАТЬ: как указано в комментарии паскалем, это также можно сделать с помощью

Alt + f Ctrl + f

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

4 голосов
/ 27 апреля 2010

Движение вперед и назад дважды - это хорошо, если только вы не в начале строки с пробелами впереди. Затем двиньтесь вперёд и вернитесь, чтобы перейти к следующему слову, а не к первому. Код ниже будет идеально имитировать команду "w" в vi. Я написал это довольно быстро, чтобы этот код можно было очистить дальше.

(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 голосов
/ 16 января 2010

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

Почему так? Возможно, чтобы быть в согласии с kill-word (M-d).

0 голосов
/ 02 апреля 2010

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

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