밑줄을 단어의 일부로 취급하는 방법?


34

이맥스 + evil모드를 사용 합니다.

내가 커서 위치 할 때 e와 같은 텍스트의 체크에서 (정상 상태) abc_def_ghi, ciw(변경 내부 워드를) 변경 사항 만 def빔 전체를 변경 할 때, 문자열의 일부를 abc_def_ghi.

evilVim처럼 밑줄을 어떻게 강제 처리 할 수 있습니까 (즉, 단어의 일부로)?

답변:


26

가장 간단한 해결 방법 : ciW공백으로 구분 된 단어를 선택하는 데 사용 하십시오.

더 큰 문제는 구문 테이블_문자 값과 관련이 있습니다. 문제는 기본적으로 구문 표의 기호 구성 요소이며이를 단어 구성 요소로 취급하려고합니다._

emacs 24.4를 사용하는 경우을 활성화 할 수 superword-mode있습니다. 나는 그것을 직접 시도하지 않았으므로 마일리지가 다를 수 있습니다.

대안은 단순히 구문 테이블을 직접 수정하고 Emacs에게 다음과 같이 _문자를 단어 구성 요소로 취급하기를 원한다고 말하는 것입니다.

(modify-syntax-entry ?_ "w")

그 후에는 ciw원하는대로 작동하여 abc_def_ghi그냥보다는 모든 것을 선택합니다 def.

그러나이 방법 _을 사용하면 텍스트 개체에 대한 단어의 일부로 만 계산 하려는 경우 특히 과도 할 수 있습니다 . 대신 evil-inner-word다음과 같이 조언 할 수 있습니다 .

(defadvice evil-inner-word (around underscore-as-word activate)
  (let ((table (copy-syntax-table (syntax-table))))
    (modify-syntax-entry ?_ "w" table)
    (with-syntax-table table
      ad-do-it)))

이제는 _여전히 내부 단어 텍스트 개체를 제외한 모든 것을 구성하는 기호 이므로 ciw다른 기능을 건드리지 않고 원하는 것을 정확하게 수행 할 수 있습니다.

EmacsWiki 노드 에서 구문 테이블 수정에 대한 자세한 내용을 읽을 수 있습니다 .


이것은 매력처럼 작동합니다. 모든 운동 (변경하려면 w, aw등), 당신도 다음과 같은 기능과 동일한 기능을 수행 할 수 있습니다 : evil-forward-word-begin, evil-forward-word-end, evil-backward-word-begin, evil-backward-word-end, evil-a-word, evil-inner-word. 참고 : underscore-as-word다른 고유 한 (임의의) 값 으로 변경해야 합니다.
sitaktif

(modify-syntax-entry ?_ "w")어떤 이유로 든 나를 위해 일하지 않았다. 대화식으로하는 것도 효과가 없었습니다. 왜 또는 어떻게 이것을 디버깅 할 수 있습니까? 관련된 경우 Spacemacs에 있습니다.
Helder S Ribeiro

1
이것은 내 문제를 설명합니다. 분명히 대상 구문 테이블을 명시 적으로 참조해야합니다. 내 경우에는을 사용한 (modify-syntax-entry ?_ "w" rust-mode-syntax-table)다음 작동했습니다.
Helder S Ribeiro

구문 항목을 수정하면 의도하지 않은 결과는 무엇입니까?
luntain

FTR :의 superword-mode이동에는 영향을 미치지 않습니다 evil-mode. 따라서 구문 테이블을 수정하는 구성 요소가 아닙니다.
Hi-Angel

28

다음 스 니펫은 Evils가 Emacs 기호 를 단어로 취급하게합니다 .

(with-eval-after-load 'evil
    (defalias #'forward-evil-word #'forward-evil-symbol)
    ;; make evil-search-word look for symbol rather than word boundaries
    (setq-default evil-symbol-word-search t))

언어에 따라 달라진다는 장점이 있습니다.

foo-bar

에서 하나의 기호 lisp-mode이지만에서 두 개의 기호 (로 분리 -)입니다 c-mode.


14

spacemacs는 FAQ 이벤트에게 다음과 같은 언어 별 솔루션 :

;; For python
(add-hook 'python-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))
;; For ruby
(add-hook 'ruby-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))
;; For Javascript
(add-hook 'js2-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))

또한 일반 이맥스에서 작동합니다. 에 악으로, 모든 단어 관련 명령과 함께 작동 ( w, e, *, #, 등)

더 일반적으로 이것은 모든 주요 모드에서 수행됩니다.

(add-hook 'after-change-major-mode-hook
          (lambda ()
            (modify-syntax-entry ?_ "w")))

2
'prog-mode-hook모든 언어를 다루는 옵션을 사용 하고 있습니까?
BallpointBen

2

Emacs 24 superword-mode는 밑줄을 단어의 일부로 취급하는 작은 모드 인을 도입했습니다 . evil-mode이 설정을 존중합니다.

설명서는 다음과 같습니다.

(superword-mode &optional ARG)

슈퍼 워드 이동 및 편집을 전환합니다 (슈퍼 워드 모드). 접두어 인수 ARG를 사용하여 ARG양수 이면 슈퍼 워드 모드를 활성화 하고 그렇지 않으면 비활성화하십시오. Lisp에서 호출 된 경우 ARG생략되거나 nil 인 경우 모드를 활성화하십시오 .

수퍼 워드 모드는 버퍼 로컬 부 모드입니다. 에, 예를 들면 : 그것을 사용하면 귀하의 문자가 단어의 일부로 처리되도록 단어의 정의 변경 superword-mode, "this_is_a_symbol"하나 개의 단어로 카운트를.


evil-mode안타깝게도을 사용 하는 경우 superword-modeenable 일 때 버그 가 발생합니다. 그것은 몇 가지 이상한 행동의 원인 evil-forward-word-begin:라고 github.com/emacs-evil/evil/issues/721
modulitos

0

단어의 일부만 편집하고 다른 부분은 그대로 유지하고 싶을 수 있기 때문에 실제로이 동작을 매우 좋아합니다. 내가 항상 사용할 수있는 전체 단어를 통해 가고 싶은 경우 E, W또는 B, 대문자 변종. 이를 통해보다 세밀한 제어가 가능합니다.

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