Có một gói để đơn giản hóa văn bản có thể nhấp?


7

Tôi đang viết một giao diện trình gỡ lỗi và trong quá trình thực hiện chương trình, một số dấu được thêm vào bên trong mã nguồn. Trong các bộ đệm khác, chẳng hạn như bộ đệm hiển thị lịch sử thực hiện hoặc bộ đệm chứa backtrace hoặc callstack, tôi muốn có trong các bộ đệm đó thông tin văn bản nhấp qua văn bản nguồn.

Nhìn vào http://www.gnu.org/software/emacs/manual/html_node/elisp/Clickable-Text.html , quá trình thêm văn bản có thể nhấp có vẻ hơi phức tạp.

Ví dụ: chỉ để đặt một vùng văn bản có thể nhấp được, tôi cần một cái gì đó như:

(setq link-start (point))
(insert (format "%s" (realgud-loc-marker loc)))
(setq link-end (point))
(add-text-properties
 link-start link-end
 '(mouse-face highlight
      help-echo "mouse-2: go to this location"))
(setq map (make-sparse-keymap))
(define-key map [mouse-2] 'realgud:follow-link)
(define-key map [mouse-1] 'realgud:follow-link)
(define-key map [follow-link] 'mouse-face)
(put-text-property link-start link-end 'keymap map)
(put-text-property link-start link-end 'loc loc)

Và sau đó tôi cũng cần một định nghĩa cho realgud: follow-link:

(defun realgud:follow-link(event)
  (interactive "e")
  (let* ((pos (posn-point (event-end event)))
     (loc (get-text-property pos 'loc)))
    (if (realgud-loc-p loc)
      (realgud-loc-goto loc))))

Tất cả điều này có vẻ hơi sôi nổi và có rất nhiều. Tôi có thể viết các thói quen của riêng mình, vì điều này có vẻ như là một suy nghĩ khá cơ bản phải làm: liên kết một số văn bản trong bộ đệm với một dấu ở một nơi khác, tôi nghĩ rằng phải có một gói đơn giản hóa ở trên. Lanhung?

Câu trả lời:


8

Emacs cung cấp các nút để trừu tượng hóa các bước này, tôi khuyên bạn nên xem các nguồn Emacs cho các trường hợp make-buttoninsert-button.


1
Cảm ơn! Điều này độc đáo xử lý khối mã đầu tiên, nhưng còn bản tóm tắt cho trình xử lý sự kiện thì sao? Những thứ tôi muốn liên kết đã được đánh dấu, hoặc bộ đệm hoặc tên tệp. Các mô hình (defun name(event) (interactive "e") (let* ((pos (posn-point (event-end event))) (loc (get-text-property pos 'some-property))) (call-some-fn loc))) cũng là khá nhiều nồi hơi.
đá

1
(info "(elisp) Button Types")và có thể một macro sẽ đưa bạn đến đó.
trị

4

Nếu văn bản có thể nhấp của bạn có thể được xác định bằng một biểu thức thông thường, thư viện khóa nút kết hợp các nút với khóa phông chữ và có thể xác định các mẫu có thể nhấp trong một bước. Thí dụ:

(button-lock-set-button "http://google.com" 'browse-url-at-mouse)


wiki-nav có vẻ gần gũi và có lẽ tôi sẽ biến bộ đệm thành một loại bộ đệm wiki để tôi có thể sử dụng loại đánh dấu đó. Nhưng điều đáng buồn ở đây là tôi đã có các dấu vị trí emacs ở mức độ chi tiết có thể của một vị trí cột và tôi phải biến nó trở lại thành một tệp và số dòng.
đá

0

Thư viện linkd.elcung cấp một cách rất đơn giản để thêm văn bản có thể nhấp vào tệp của bạn. Từ tệp nguồn Bình luận:

Linkd-mode is a major mode that automatically recognizes and
processes certain S-expressions, called "links", embedded in plain
text files.  Links may be followed by invoking certain interactive
functions when point is on the link text.  Links may also be
interpreted as marking up the surrounding text.  Different types
of links have different behaviors when followed, and they may have
different interpretations as markup.

With Linkd mode, you can do the following:
* Embed hyperlinks to files, webpages, or documentation into
  any type of text file in any major mode.
* Delimit and name regions of text ("blocks") in these text files.
* Extract and send blocks to other programs for processing.
* Identify and mark locations and concepts in source code.
* Embed active data objects ("datablocks") into text files.
* Convert Lisp source-code listings to LaTeX for publication.
* Define new link behaviors.

Cảm ơn đã gợi ý và sửa lỗi ngữ pháp / chính tả tệ hại của tôi. Mặc dù linkd có thể thu được thông qua el-get, mối quan tâm của tôi với điều này là nó chưa được cập nhật từ năm 2009 hoặc Emacs 22 và rất nhiều điều đã xảy ra kể từ đó. Vì vậy, tôi đã thực hiện với cách tiếp cận button.el, mặc dù nó vẫn chỉ là một nửa (hoặc có thể là 2/3) của vấn đề
đá

Nếu mối quan tâm của bạn là nó có thể không hoạt động hoặc có thể không hoạt động tốt, với các phiên bản Emacs gần đây, thì đừng lo lắng về điều đó - nó có. Nếu mối quan tâm của bạn là nó không sử dụng bất kỳ tính năng nào được thêm vào Emacs kể từ năm 2009 thì đó là một câu chuyện khác - không, nó không. Vẫn là "một cách rất đơn giản" để hoàn thành công việc. Xem thêm chế độ Org, để biết cách dễ dàng hơn, đầy đủ hơn.
vẽ
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.