'앞으로'단어의 시작 부분에서 멈춤


17

나는 종종 여러 호출을 사용하여 forward-word하나의 다음을 backward-word한 줄에 단어의 시작 부분에 포인트를 이동합니다. 나는 forward-wordvim과는 다른 방식에 익숙해지지 않았고 w몇 년 동안 Emacs를 사용한 후에도 그 차이에 익숙해 질 수 없다고 생각합니다.

대신 forward-word단어를 뛰어 넘지 않고 단어의 시작 부분에서 멈추는 대신 사용할 수있는 기능이 있습니까? 포인트를 앞으로 이동할 때 반복적으로 실행하지 않는 단어의 시작으로 이동하는 다른 전략이 forward-char있습니까?


당신은 (어느 시점에서) 자신의 앞으로 / 뒤로 단어 / 문단 및 관련 킬-워드 기능을 작성하는 데 관심이있을 수 있습니다. 다음은 매일 사용하는 일부 사용자 정의 함수에 대한 세 개의 링크입니다.이 동작은 지난 몇 년 동안 사용한 특정 워드 프로세서와 매우 유사합니다. stackoverflow.com/a/20456861/2112489 | stackoverflow.com/q/18675201/2112489 | superuser.com/a/685604/206164
lawlist

답변:


24

misc(이맥스와 함께 제공) 패키지가 내장 된 기능 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 's도 마찬가지 w입니다. 내가 볼 수있는 한, 거의 완벽한 vim-to-emacs 매핑이 있습니다. w= forward-to-word; e= forward-word; b= backward-word; ge= backward-to-word. 그러나 나는 전문가 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 의 기본 버전입니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.