2012-05-04 33 views
5

Tôi đã xác định ký tự \ hoạt động như một thành phần từ trong chế độ latex, và tôi khá hài lòng với kết quả. Điều duy nhất làm phiền tôi là một chuỗi như \alpha\beta được coi là một từ duy nhất (tất nhiên là hành vi dự kiến).Xác định ký tự làm ranh giới từ

Có cách nào để làm cho các emacs diễn giải một ký tự cụ thể như một từ "khởi động" không? Bằng cách này, nó sẽ luôn luôn được coi là một phần của từ sau nó, nhưng không bao giờ là một phần của từ trước nó.

Để rõ ràng, đây là một ví dụ:

\alpha\beta 
^  ^
1   2 

Nếu điểm là tại 1 và tôi nhấn M-d, chuỗi "\ alpha" nên bị giết. Nếu điểm là 2 và tôi nhấn M-<backspace>, chuỗi "\ beta" sẽ bị hủy.

Tôi làm cách nào để đạt được điều này?

Trả lời

3

Một suy nghĩ:
yêu cầu của bạn là rất giống như những gì subword-mode cung cấp cho camelCase.

Bạn không thể tùy chỉnh hành vi của chế độ từ vựng - regexps được mã hóa cứng - nhưng bạn chắc chắn có thể sao chép thư viện đó và sửa đổi nó cho mục đích của bạn.

M-xfind-libraryRETsubwordRET

Đó có lẽ sẽ là một giải pháp khá mạnh mẽ.

Edit: được cập nhật từ các ý kiến, theo đề nghị:

Đối với hồ sơ, thay đổi mỗi thể hiện của [[:upper:]]-[\\\\[:upper:]] trong các chức năng subword-forward-internalsubword-backward-internal bên subword.el hoạt động tuyệt vời =) (miễn như "\" được định nghĩa là "w" cú pháp).

Cá nhân tôi có khuynh hướng tạo bản sao thư viện hơn là chỉnh sửa trực tiếp, trừ khi nhằm mục đích làm cho thư viện hiện có có mục đích chung hơn một chút, mà giải pháp đơn giản nhất dường như di chuyển những regexps đó vào các biến - sau đó nó sẽ là tầm thường để có các phiên bản sửa đổi cục bộ vùng đệm cho loại mục đích này.

Chỉnh sửa 2: Tính đến Emacs 24,3 (hiện một release candidate), subword chế độ tạo điều kiện này với sự mới subword-forward-regexpsubword-backward-regexp biến (đối với những thay đổi đơn giản), và subword-forward-functionsubword-backward-function biến (đối với những thay đổi phức tạp hơn).

Bằng cách thực hiện các biến regexp đệm cục bộ trong chế độ latex với các giá trị mong muốn, bạn chỉ có thể sử dụng chế độ từ vựng trực tiếp.

+0

Vâng, tôi đã tự hỏi liệu chế độ từ khóa có thể giúp ích gì không. Tôi sẽ kiểm tra các regexps. – Malabarba

+0

Thực ra, nếu quản lý để có được '\\' được coi là chữ hoa, _subword-mode_ sẽ làm phần còn lại cho tôi. Tôi nghĩ rằng đó là cấu hình trong * Cú pháp Properties *, nhưng tôi không chắc chắn được nêu ra. – Malabarba

+0

Ý tưởng hay, nhưng có vẻ như tôi không thể có một ký tự viết hoa mà không chỉ định biến thể chữ thường của nó? (Tôi đang nhìn vào 'Trường hợp bảng' và' Trường hợp chuyển đổi' dưới '(elisp) Strings và ký tự', cũng như' [: upper:] 'và' [: lower:] 'định nghĩa trong' (elisp) Char Classes'.) – phils

2

Bạn sẽ có thể thực hiện điều này sử dụng thuộc tính văn bản cú pháp:

M:(info "(elisp) Syntax Properties")RET

Edit: Trên thực tế, tôi không chắc chắn nếu bạn có thể làm một cách chính xác điều này?

Sau đây (chỉ là thử nghiệm) là gần, nhưng M-<backspace> ở mức 2 sẽ chỉ xóa "beta" chứ không xóa "\" trước đó.

Tôi giả sử bạn có thể remap backward-kill-word vào một chức năng đã kiểm tra cụm từ trước đó \ "\" và cũng đã xóa nó. Khá công bằng, nhưng nó có lẽ sẽ thực hiện mẹo nếu không có giải pháp sạch hơn.

Tôi chưa từng chơi với chức năng này trước đây; có lẽ ai đó khác có thể làm rõ.

(modify-syntax-entry ?\\ "w") 
(setq parse-sexp-lookup-properties t) 
(setq syntax-propertize-function 'my-propertize-syntax) 
(defun my-propertize-syntax (start end) 
    "Set custom syntax properties." 
    (save-excursion 
    (goto-char start) 
    (while (re-search-forward "\\w\\\\" end t) 
     (put-text-property 
     (1- (point)) (point) 'syntax-table (cons "." ?\\))))) 
Các vấn đề liên quan