Làm thế nào để coi gạch dưới là một phần của từ này?


34

Tôi sử dụng evilchế độ Emacs + .

Khi tôi định vị con trỏ trên e(ở trạng thái bình thường) trong một đoạn văn bản như abc_def_ghi, ciw(thay đổi từ bên trong) chỉ thay đổi defmột phần của chuỗi, trong khi Vim sẽ thay đổi toàn bộ abc_def_ghi.

Làm thế nào tôi có thể buộc evilphải xử lý gạch dưới như Vim (nghĩa là một phần của từ)?

Câu trả lời:


26

Cách giải quyết đơn giản nhất: sử dụng ciWđể chọn một từ được phân tách bằng khoảng trắng.

Vấn đề lớn hơn liên quan đến giá trị của _ký tự trong bảng cú pháp . Vấn đề là _theo mặc định, một thành phần biểu tượng trong bảng cú pháp và bạn muốn coi nó như một thành phần từ.

Nếu bạn đang sử dụng emacs 24.4, bạn có thể thử bật superword-mode. Tôi đã không thử bản thân mình, vì vậy số dặm của bạn có thể thay đổi.

Một cách khác chỉ đơn giản là tự sửa đổi bảng cú pháp và nói với Emacs bạn muốn nó xử lý _ký tự như một thành phần từ, như vậy:

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

Sau khi bạn làm điều đó, ciwlàm việc như bạn muốn, như vậy nó sẽ chọn tất cả abc_def_ghithay vì chỉ def.

Tuy nhiên, làm theo cách này có thể là quá mức cần thiết, đặc biệt nếu bạn chỉ muốn _tính là một phần của từ cho đối tượng văn bản. Thay vào đó, bạn có thể tư vấn evil-inner-wordnhư sau:

(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)))

Bây giờ, _vẫn là một thành phần biểu tượng cho tất cả mọi thứ trừ đối tượng văn bản từ bên trong, vì vậy ciwsẽ làm chính xác những gì bạn muốn mà không cần chạm vào chức năng của bất cứ điều gì khác.

Bạn có thể đọc thêm về sửa đổi các bảng cú pháp trên nút EmacsWiki .


Công việc này như một cái duyên vậy. Để thay đổi tất cả các phong trào ( w, aw, vv), bạn có thể làm tương tự với các chức năng sau quá: evil-forward-word-begin, evil-forward-word-end, evil-backward-word-begin, evil-backward-word-end, evil-a-word, evil-inner-word. Lưu ý: bạn cần thay đổi underscore-as-wordthành các giá trị khác nhau, duy nhất (tùy ý).
sitaktif

(modify-syntax-entry ?_ "w")Không làm việc cho tôi vì một số lý do. Làm điều đó tương tác cũng không làm việc. Bất kỳ ý tưởng tại sao hoặc làm thế nào tôi có thể gỡ lỗi này? Tôi đang dùng Spacemac trong trường hợp có liên quan.
Helder S Ribeiro

1
Điều này giải thích vấn đề của tôi. Rõ ràng bạn phải tham khảo bảng cú pháp đích một cách rõ ràng. Trong trường hợp của tôi, tôi đã sử dụng (modify-syntax-entry ?_ "w" rust-mode-syntax-table), sau đó nó làm việc.
Helder S Ribeiro

Những tác động ngoài ý muốn của việc sửa đổi mục cú pháp là gì?
luntain

FTR: superword-modekhông ảnh hưởng đến chuyển động trong evil-mode. Vì vậy, nó không phải là một thành phần để sửa đổi các bảng cú pháp.
Hi-Angel

28

Đoạn trích sau đây sẽ khiến Evil coi biểu tượng Emacs là một từ.

(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))

Điều này có lợi thế là nó thay đổi tùy thuộc vào ngôn ngữ:

foo-bar

là một ký hiệu trong lisp-modenhưng hai ký hiệu (cách nhau -) trong c-mode.


14

Câu hỏi thường gặp về spacemacs cung cấp giải pháp dành riêng cho ngôn ngữ sau:

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

Nó cũng hoạt động trong emacs thường xuyên. Với ác trên, nó hoạt động với tất cả các lệnh soạn thảo văn bản liên quan ( w, e, *, #, vv)

Tổng quát hơn, điều này sẽ làm điều đó cho tất cả các chế độ chính:

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

2
Là sử dụng 'prog-mode-hookmột tùy chọn để bao gồm mọi ngôn ngữ?
BallpointBen

2

Emacs 24 đã giới thiệu superword-mode, một chế độ nhỏ coi phần dưới là một phần của từ. evil-modetôn trọng thiết lập này.

Đây là tài liệu:

(superword-mode &optional ARG)

Chuyển đổi chuyển động và chỉnh sửa siêu từ (chế độ Superword). Với một đối số tiền tốARG , bật chế độ Superword nếu ARGlà dương và tắt nó đi. Nếu được gọi từ Lisp, hãy bật chế độ nếu ARGđược bỏ qua hoặc không.

Chế độ Superword là chế độ phụ cục bộ đệm. Kích hoạt nó thay đổi định nghĩa của các từ sao cho các ký tự ký tự được coi là một phần của các từ: ví dụ: in superword-mode, "this_is_a_symbol"được tính là một từ.


Nếu bạn đang sử dụng evil-mode, thật không may, có một lỗi khi superword-modeđược kích hoạt. Nó gây ra một số hành vi thất thường khi evil-forward-word-beginđược gọi là: github.com/emacs-evil/evil/issues/721
modulitos

0

Tôi thực sự rất thích hành vi này vì tôi có thể chỉ muốn chỉnh sửa một phần của từ và giữ nguyên các phần khác. Nếu tôi muốn đi qua toàn bộ từ tôi luôn có thể sử dụng E, Whoặc B, các biến thể chữ hoa. Điều này cho tôi kiểm soát chi tiết hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.