2012-05-15 40 views
20

Tôi cần truy cập vùng chọn trong bộ đệm Emacs. Tôi đã tìm thấy bài viết này How do I access the contents of the current region in Emacs Lisp? và nó giúp tôi rất nhiều.Làm thế nào để có được vùng (lựa chọn) lập trình trong Emacs Lisp?

Nhưng có sự cố. Lần đầu tiên tôi chọn (đánh dấu) một vùng, nó hoạt động tốt, nhưng khi tôi nhấn Cg và di chuyển con trỏ đến một nơi khác mà không làm nổi bật bất kỳ ký tự nào, tôi nhận chuỗi từ dấu cuối đến điểm hiện tại trong khi tôi mong đợi một dấu trống .

Thực ra tôi cần triển khai hàm sẽ trả về lựa chọn hiện tại (được đánh dấu) dưới dạng chuỗi hoặc chuỗi rỗng nếu không có gì được đánh dấu. Đoạn mã sau có thể diễn tả rõ ràng hơn.


(defun get-search-term() 
    (interactive) 
    (let (
     (selection (buffer-substring-no-properties (region-beginning) (region-end)))) 
    (if (= (length selection) 0) 
     (message "empty string") 
     (message selection)))) 

Mọi đề xuất? Cảm ơn rất nhiều!

+1

Bất kỳ lý do nào bạn không sử dụng biểu mẫu 'tương tác' được hiển thị bởi Gareth Rees trong câu hỏi mà bạn đã liên kết? – phils

+0

Cảm ơn bạn đã trả lời và xin lỗi vì đã không đọc kỹ bài viết đó. (tương tác "r") đã giải quyết được vấn đề của tôi. Tôi cần đọc thêm về tương tác. – sailing

+1

có thể trùng lặp của [Làm cách nào để truy cập nội dung của khu vực hiện tại trong Emacs Lisp?] (Http://stackoverflow.com/questions/605846/how-do-i-access-the-contents-of-the-current -region-in-emacs-lisp) – phils

Trả lời

24

Đặc điểm kỹ thuật "r" tương tác là câm. Bạn đang thấy lý do tại sao.

(defun get-search-term (beg end) 
    "message region or \"empty string\" if none highlighted" 
    (interactive (if (use-region-p) 
        (list (region-beginning) (region-end)) 
       (list (point-min) (point-min)))) 
    (let ((selection (buffer-substring-no-properties beg end))) 
    (if (= (length selection) 0) 
     (message "empty string") 
     (message selection)))) 

Tôi không có nghĩa là "câm" như trong ngu ngốc và không hữu ích; chỉ là nó không quan tâm về việc liệu nhãn hiệu có hoạt động hay không. Tôi nghĩ rằng nó có trước chế độ đánh dấu tạm thời.

EDIT: Sử dụng (point-min) hai lần trên làm cho mã khó hiểu hơn khi đọc lại. Dưới đây là triển khai tốt hơn:

(defun get-search-term (beg end) 
    "message region or \"empty string\" if none highlighted" 
    (interactive (if (use-region-p) 
        (list (region-beginning) (region-end)) 
       (list nil nil))) 
    (message "%s" (if (and beg end) 
        (buffer-substring-no-properties beg end) 
        "empty string"))) 
+0

Điểm thứ hai-min nên là điểm-max, tôi nghĩ vậy. – ramen

+0

@ramen Tôi vừa sửa lại. Hơn tôi đọc lại câu hỏi, và điểm-phút là chính xác vì nó tạo ra một chuỗi rỗng. –

+0

Bây giờ tôi đã thêm một triển khai dễ hiểu hơn. –

1

Kiểm tra biến đánh dấu hoạt động, ví dụ: C-h v mark-active

==> đánh dấu hoạt động là một biến được xác định trong `mã nguồn C '. Giá trị của nó là nil Địa phương trong bộ đệm Apropos; giá trị toàn cầu là nil

Tự động trở thành bộ đệm cục bộ khi được đặt theo bất kỳ kiểu nào.

Tài liệu: Không có nghĩa là dấu và vùng hiện đang hoạt động trong bộ đệm này.

(defun get-search-term() 
    (interactive) 
    (if mark-active 
     (let (
     (selection (buffer-substring-no-properties (region-beginning) (region-end)))) 
    (if (= (length selection) 0) 
     (message "empty string") 
     (message selection)) 
    ) 
    (error "mark not active")) 
) 
+2

'mark-active' sẽ chỉ hoạt động nếu bạn sử dụng chế độ transient-mark-mode, vì vậy nó tốt cho việc sử dụng của bạn, nhưng nếu mã có thể sử dụng được bởi người khác, bạn nên sử dụng' region-active-p' (hoặc 'use -region-p'). – Stefan

Các vấn đề liên quan