Зупиніться на початку слова на "вперед-слово"


17

Я часто використовую кілька викликів, за якими forward-wordслідує одна, backward-wordщоб перемістити точку до початку слова на рядку. Я думаю, я ніколи не звик до того, як forward-wordвідрізняється від vim's, wі навіть через роки використання Emacs я не можу звикнути до різниці.

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


Можливо, у якийсь момент ви будете зацікавлені у написанні власного слова / абзацу вперед / назад та пов'язаних із ними функцій вбивства. Нижче наведено три посилання на деякі спеціальні функції, якими я користуюся щодня - поведінка дуже нагадує певні текстові процесори, якими я користувався протягом багатьох років: 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просто розмиваюся, і я просто рухаюся. Дивно. Я був певний, що 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 , яка не охоплює деякі випадки, але простіша для розуміння.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.