Coi các ký hiệu là các từ trong chế độ prog


12

Có một số lệnh trong Emacs áp dụng cho "từ". Ví dụ như forward-word, kill-word, upcase-word, mark-word, transpose-words,, vv Định nghĩa của "từ" dường như khác nhau một chút giữa các lệnh. Ví dụ: forward-wordsẽ dừng ở dấu gạch dưới trong một từ (ví dụ foo_bar) nhưng mark-wordkhông dừng lại ở dấu gạch dưới.

Có thể thay đổi định nghĩa của "từ" khi tôi ở chế độ prog để Emacs sẽ sử dụng ranh giới từ thích hợp cho cú pháp của ngôn ngữ hiện tại không?

Khi tôi ở trong c-modetôi muốn forward-wordbỏ qua phần dưới, và khi tôi ở trong lisp-modetôi muốn forward-wordbỏ qua cả dấu gạch ngang và dấu gạch dưới, v.v.

Câu trả lời:


4

Emacs nên sử dụng " ranh giới từ thích hợp cho cú pháp của ngôn ngữ hiện tại ". Nếu không thì sẽ báo lỗi cho chế độ chính cho ngôn ngữ đó.

Nhưng có lẽ bạn không thực sự có nghĩa là lời nói . Có thể bạn có nghĩa là cú pháp ký hiệu , không phải cú pháp từ. Emacs phân biệt hai.

Đối với cú pháp ký hiệu, sử dụng các lệnh ký hiệu, không phải lệnh từ: forward-symbolv.v. Từ mô tả của bạn, đây là những gì bạn thực sự muốn.

Nếu bạn cảm thấy bạn thực sự muốn sử dụng một hàm từ trên một ký hiệu, bạn có thể thay đổi loại cú pháp của các ký tự cụ thể để có cú pháp cấu thành từ thay vì cú pháp cấu thành ký hiệu. Nhưng nhìn chung đây không phải là điều bạn muốn làm và bạn không cần phải làm điều đó.

Xem hướng dẫn Elisp để biết thông tin về cú pháp ký tự. Và xem hướng dẫn sử dụng Emacs và hướng dẫn Elisp để biết các lệnh và các chức năng khác hoạt động trên các ký hiệu (không phải ký hiệu Lisp, mà là văn bản có cú pháp ký hiệu, bằng bất kỳ ngôn ngữ nào).

Và hãy nhớ rằng các thao tác trên sexps cũng hữu ích cho việc hành động trên các biểu tượng: C-M-f( forward-sexp), C-M-t( transpose-sexps), v.v.


C-M-fbị ràng buộc forward-sexpvà hành xử không giống như những gì bạn mô tả. Bạn đúng rằng những gì tôi muốn là điều hướng bằng các biểu tượng, nhưng tôi không thấy tùy chọn đó.
nispio

@nispio forward sexpvề cơ bản là forward-symbolhầu hết thời gian, với sự linh hoạt được thêm vào cũng phù hợp với niềng răng phù hợp. Bạn nên cho nó một cơ hội.
Malabarba

@Malabarba Tôi hoàn toàn không đồng ý rằng đó forward-sexplà một xấp xỉ gần đúng forward-symbol. Đối với người mới bắt đầu, nó có thể khiến bạn bối rối trong toàn bộ các chức năng, đưa bạn đến hàng trăm dòng từ nơi bạn bắt đầu. Nó cũng nhảy qua các danh sách đối số, v.v. Và hãy thử điều này: với mã lisp sau đây (global-set-key [remap list-buffers] 'ibuffer)đặt con trỏ của bạn vào giữa từ remapvà chạy forward-sexpmột vài lần. Nó phát sinh một lỗi khi nó đạt đến kết thúc ]. Không, cám ơn.
nispio

@nispio Mình luôn dùng sự kết hợp giữa sexp và chuyển hướng từ. Bằng cách đó tôi có thể tránh được bất kỳ vấn đề nào trong khi có sự linh hoạt của cả hai. Nhưng tất cả chỉ là vấn đề ưu tiên. ;-) Nếu bạn biết bạn sẽ không bao giờ bỏ lỡ điều hướng từ, superword-modecó thể là chàng trai của bạn.
Malabarba

Xin lỗi, tôi không nên đề xuất điều đó C-M-fC-M-thành động theo biểu tượng (họ hành động trên sexps). Tôi sẽ chỉnh sửa để sửa ấn tượng đó. Nhưng bạn chắc chắn có thể liên kết forward-symbolvới bất kỳ khóa nào bạn thích, nếu bạn thấy nó đặc biệt hữu ích. Không có transpose-symbols, nhưng bạn có thể viết một lần nữa, nếu bạn nghĩ nó hữu ích.
vẽ

11

Hãy xem superword-modesubword-mode. Superword coi các dấu gạch dưới là một phần của một từ thay vì một ranh giới, do đó foo_bar sẽ được coi là một từ duy nhất .
Subword làm ngược lại nhưng đối với camelCase, do đó fooBarđược coi là hai từ thay vì một.

Nghe có vẻ như hành vi bạn muốn cc-modesử dụng superword-mode.

(add-hook 'c-mode-common-hook 'superword-mode)

Tôi khuyên bạn nên đọc qua nguồn cho subword-mode, vì ngay cả khi hai chế độ đó không thực hiện chính xác những gì bạn muốn, chúng sẽ chỉ cho bạn cách thay đổi hành vi phát hiện từ.

Thảo luận dài hơn về emacsreduxergomacs .


Có thể làm cho superword-modechơi tốt với paredit? Ví dụ: paredit-forward-kill-wordkhông xóa toàn bộ từ (chứa dấu gạch dưới) khi superword-modeđược bật.
Renan Ranelli

Nó thay đổi định nghĩa của một từ và paredittôn trọng điều đó, vì vậy tôi nghĩ rằng nó đang làm những gì được yêu cầu.
năm14

Có điều là paredit không tôn trọng điều đó. paredit-forward-kill-wordkhông giết cùng một từ được định nghĩa bởi superword-mode.
Renan Ranelli

Ôi tôi đọc nhầm. Hừm. Chỉ cần nhìn vào paredit-forward-kill-wordvà có vẻ như nó đang phân tích cú pháp. Vì vậy, có thể có thể trao đổi mà ra, nhưng có lẽ không.
2014

3

Nếu tôi hiểu câu hỏi của bạn, bạn có thể sửa đổi bảng cú pháp ngôn ngữ, ví dụ: Đối với c ++:

(modify-syntax-entry ?_ "w" c++-mode-syntax-table)

M-x apropos sau đó tra cứu bảng cú pháp cũng sẽ giúp bạ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.