Остановитесь в начале слова на `forward-word`

17

Я часто использую несколько вызовов, forward-wordза которыми следует один, backward-wordчтобы переместить точку в начало слова в строке. Я думаю, я никогда не привык к тому, что он forward-wordотличается от Vim, wи даже после многих лет использования Emacs я не могу привыкнуть к разнице.

Есть ли функция, которую я мог бы использовать вместо того, forward-wordчтобы не перепрыгивать через слова, а останавливается также в начале слова? Существуют ли другие стратегии перехода к началу слова при перемещении точки вперед, которые не требуют многократного выполнения forward-char?

rekado
источник
Вы можете (в какой-то момент) быть заинтересованным в написании своего собственного вперед / назад слова / абзаца и связанных с ним функций kill-word. Ниже приведены три ссылки на некоторые пользовательские функции, которые я использую ежедневно - поведение близко напоминает некоторые текстовые процессоры, которые я использовал на протяжении многих лет: stackoverflow.com/a/20456861/2112489 | stackoverflow.com/q/18675201/2112489 | superuser.com/a/685604/206164
юрист

Ответы:

24

miscПакет (поставляется с Emacs) имеет встроенную функцию forward-to-word, которая делает то , что я думаю , что вы хотите:

forward-to-word is an interactive compiled Lisp function in `misc.el'.

It is bound to M-f.

(forward-to-word ARG)

Move forward until encountering the beginning of a word.
With argument, do this that many times.

Чтобы использовать его, сначала добавьте (require 'misc)в ваш файл конфигурации.

Устаревшее
источник
Спасибо, это полезно. К сожалению, это не также остановится в конце слова, хотя.
Rekado
1
Верно, но ни один не делает Vim w. Насколько я вижу, существует почти идеальное отображение vim-to-emacs: w= forward-to-word; e= forward-word; b= backward-word; ge= backward-to-word. Но я не опытный пользователь vim, так что, может быть, мне не хватает какой-то тонкости.
устарел
Хех, ты на самом деле прав. Я думаю, всякий раз, когда я в Vim w, eи bпросто размываю, и я просто передвигаюсь. Weird. Я был уверен, что wостановился в обеих точках! Итак, я приму ваш ответ, потому что он точно соответствует моему вопросу :)
rekado
4

Вы можете привязать приведенную ниже функцию к M-fи привязать оригинал forward-wordк M-F. Эта функция просто принимает argи передает ее forward-wordфункции. Таким образом, универсальные аргументы будут работать так же хорошо, как и с исходной функцией.

(defun modi/forward-word-begin (arg)
  "Move forward a word and end up with the point being at the beginning of the
next word.  Move point forward ARG words (backward if ARG is negative).
If ARG is omitted or nil, move point forward one word."
  (interactive "p")
  (forward-word arg)
  (forward-word 1)
  (backward-word 1))

Слово предостережения, хотя, что вышеупомянутая функция не всегда может делать правильные вещи ; это очень сильно зависит от того, находится ли точка в начале слова или нет.


Вот еще один способ реализации описанного выше, где граница слова не соответствует синтаксической таблице, а строго разделена пробелами:

(defun modi/forward-word-begin (arg)
  "Move forward ARG (defaults to 1) number of words.
Here 'words' are defined as characters separated by whitespace."
  (interactive "p")
  (dotimes (_ arg)
    (forward-whitespace 1)))

Кредит идет на @glucas для этой идеи.

Каушал Моди
источник
1

После долгого и мучительного поиска идеальных функций «вперед / назад» я нашел следующее, чем я теперь очень доволен:

(progn
  (defun boundary ()
    (and      (= (char-syntax (char-after))  ?w)
         (not (= (char-syntax (char-before)) ?w))))
  (defun my-forward-word ()
    (interactive) 
    (while (progn (forward-char)  (not (boundary)))))
  (defun my-backward-word ()
    (interactive) 
    (while (progn (backward-char) (not (boundary)))))
  (global-set-key [M-right] 'my-forward-word)
  (global-set-key [M-left]  'my-backward-word)
  )
Рюи
источник
0

Если вы готовы к использованию evil, wв нормальном состоянии привязан evil-forward-word-begin, что является функциональностью в стиле Vim, к которой вы стремитесь.

Дэн
источник
Раньше я использовал evilдавно, но с тех пор я использую god-modeи обычные привязки Emacs.
rekado
0

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

Как вы упомянули, хитрость заключается в том, чтобы идти вперед на два слова, а затем на одно слово назад.

Следующее должно сделать трюк и должно уважать другие режимы, такие как режим подслов.

(define-key global-map (kbd  "M-f")
  (lambda ()
    (interactive)
    (forward-word)
    (forward-word)
    (backward-word)))

Это элементарная версия /emacs//a/4272/508 , которая не охватывает некоторые случаи, но проще для понимания.

Ustun
источник