2011-01-12 31 views
9

Tôi sử dụng Emacs để viết hầu hết các tác phẩm của tôi. Tôi viết bằng cách sử dụng reStructuredText, và sau đó chuyển đổi chúng sang LaTeX sau một số tiền xử lý vì tôi viết trích dẫn của tôi là la-la LaTeX. Đây là một đoạn trích của một trong những văn bản của tôi (trong tiếng Tây Ban Nha):Làm thế nào để làm cho flyspell bỏ qua một số từ theo ngữ cảnh?

En \cite[pp.~XXVIII--XXIX]{Crnkovic2002} se brindan algunos riesgos 
que se pueden asumir con el desarrollo basado en componentes, los 

Văn bản này được xử lý bởi một số kịch bản tùy chỉnh mà đề cập đến việc \cite phần rất rst2latex có thể làm công việc của mình.

Khi tôi kích hoạt chế độ flyspell, nó báo hiệu hầu hết các phím trích dẫn là lỗi chính tả.

Làm cách nào tôi có thể yêu cầu flyspell không kiểm tra chính tả mọi thứ trong các lệnh \cite.

Hơn nữa, làm cách nào tôi có thể kết hợp chế độ rst và flyspell, do đó chế độ rst sẽ giữ flyspell khỏi kiểm tra chính tả như sau?

  • yên bình luận đang
  • phần còn lại đen
  • còn lại các thông số chỉ thị và lập luận
  • còn lại nội dung chỉ thị thô

Bất kỳ ý tưởng?

Trả lời

11

Bạn có thể đặt biến ispell-parser thành giá trị 'tex để flyspell sẽ bỏ qua (la) chuỗi tex. Để làm như vậy, bạn có thể đặt thủ công trong mỗi bộ đệm như sau:

M-: (setq 'ispell-parser 'tex) 

hoặc bạn viết một chức năng nhỏ sẽ làm điều đó cho bạn. Đặt sau đây trong emacs tập tin của bạn:

(defun flyspell-ignore-tex() 
    (interactive) 
    (set (make-variable-buffer-local 'ispell-parser) 'tex)) 

Sau đó, bạn vẫn có thể gọi nó bằng tay, sử dụng

M-x flyspell-ignore-tex 

hoặc bạn có thể thêm một cái móc mà các cuộc gọi chức năng tự động bất cứ khi nào bạn chỉnh sửa một tập tin của một loại nhất định. Bạn sẽ thực hiện thao tác sau bằng cách thêm hàm mới được xác định vào auto-mode-alist. Nói tên tập tin của bạn thường kết thúc với ".rst", sau đó thêm dòng này vào tập tin emacs của bạn:

(add-to-list 'auto-mode-alist '("\\.rst$" . flyspell-ignore-tex)) 

Đối với phần thứ hai của câu hỏi của bạn: làm flyspell chế độ bỏ qua khu vực lớn hơn, chẳng hạn như, ví dụ, ý kiến ​​reST, không dễ dàng đạt được. Nó trở nên rõ ràng khi bạn nghĩ về cách hoạt động của flyspell: nó kiểm tra văn bản theo từng từ. Đối với điều đó, flyspell-word chỉ xem xét một từ tại một thời điểm mà nó gửi đến một quá trình ispell chạy trong nền. Quá trình ispell thực hiện tra cứu từ điển và trả về cho dù từ hiện tại có đúng hay không. Nếu flyspell-word phải kiểm tra mỗi lần có hay không từ hiện tại là một phần của nhận xét hoặc vùng khác không được kiểm tra, nó sẽ khá chậm, vì điều đó sẽ bao gồm khá nhiều tìm kiếm thông qua bộ đệm. Bây giờ tất nhiên, người ta có thể tiếp cận điều này một chút thông minh hơn và đầu tiên tìm các vùng không bình luận, vv và sau đó thực hiện kiểm tra từng chữ một trong những phần nằm ngoài những vùng đó - nhưng thật không may, đó không phải là cách flyspell được thực hiện.

Nếu bạn có thể làm mà không có phần "bay", tuy nhiên, chế độ ispell có cơ chế tùy chỉnh vùng nào của bộ đệm có thể bỏ qua. Điều này được thực hiện thông qua biến số ispell-skip-region-alist. Nhưng mặc dù chế độ flyspell hoạt động tắt chế độ ispell, vì những lý do được nêu ở trên biến số đó không được sử dụng bởi chế độ flyspell.

+0

Thomas, cảm ơn rất nhiều! Tôi đã sử dụng chế độ ispell trong quá khứ, nhưng flyspell phù hợp với tôi tốt hơn vào lúc này. Tuy nhiên, sau khi đọc tài liệu 'ispell-skip-region-alist', tôi nghĩ tôi sẽ phải lập trình một hàm để phát hiện phần cuối của chú thích. Tôi chưa quen với Emacs Lisp. Dù sao, cách phân tích cú pháp 'ispell-parser' vẫn hữu ích. Có lẽ tôi có thể kiểm tra cách nó được sử dụng và tạo ra trình phân tích cú pháp phân tích cú pháp của chính tôi khi tôi có thể. – manu

+0

Manu, có thể bạn sẽ không phải lập trình hàm lisp để phát hiện phần đầu và phần cuối của nhận xét. Thông thường, cụm từ thông dụng phải đủ, một biểu thức khớp với phần đầu và biểu thức khớp với phần kết thúc. Bạn đặt cả hai trong ngoặc đơn và thêm nó vào 'ispell-skip-region-alist' (tôi đã thử nó vào ngày hôm qua, nó thực sự không phải là khó khăn) và có một cơ hội tốt mà' rst-mode' đã chứa regexps bạn đang tìm kiếm một nơi nào đó. – Thomas

+0

Trong reStructuredText phần cuối của phần mã được phát hiện khi mức thụt đầu dòng bị giảm. Vì vậy, regexp sẽ không giúp đỡ. Trân trọng, Manu. – manu

4

Bạn cũng có thể sử dụng flyspell-generic-check-word-predicate khi tôi giải thích in this question tại Super User.

1

(lọc tex aspell của thể thực hiện chính xác những gì bạn muốn - nhưng nếu bạn muốn có một giải pháp tổng quát hơn)

Mặc dù tôi đang sử dụng mã dưới đây để thuyết phục flyspell không cờ một số từ với những con số trong họ, bạn có thể sử dụng loại móc này để khớp với ngữ cảnh nhất định.

bắt đầu tìm kiếm ở vị trí bạn muốn - vì vậy, bạn có thể muốn tìm kiếm ngược lại để bắt đầu/kết thúc bất kỳ ngữ cảnh nào bạn quan tâm.

(when "another attempt to accept certain words flyspell/ispell/aspell flags as incorrect" 
    (defun flyspell-ignore-WordNumber99-stuff/ag (beg end info) 
    (save-excursion 
     (goto-char beg) 
     (cond 
    ((or 
     (looking-at "\\bWord1\\b") 
     (looking-at "\\bWord99Foo\\b") 
     ) 
     t) 
    (t nil) 
    ) 
    ) 
    ) 
) 

(add-hook 'flyspell-incorrect-hook 'flyspell-ignore-WordNumber99-stuff/ag) 
Các vấn đề liên quan