Cách nhận danh sách tất cả các chức năng được cung cấp riêng bởi một chế độ chính nhất định


8

Câu hỏi này lấy cảm hứng từ https://stackoverflow.com/q/605785/ . Bởi M-x describe-function <TAB>tôi có thể nhận được một danh sách tất cả các chức năng tương tác hoặc không hấp dẫn có sẵn trong trạng thái hiện tại của emacs. Nếu một chế độ cụ thể được kích hoạt (ví dụ chế độ latex), chúng ta sẽ có một danh sách dài hơn, vì các chức năng có sẵn trong chế độ latex cũng được liệt kê.

Câu hỏi của tôi là làm thế nào để có được danh sách tất cả các chức năng có sẵn trong một chế độ cụ thể (ví dụ: chế độ latex)? Nói cách khác, không bao gồm tất cả các chức năng khác không được cung cấp bởi chế độ đó. Giống như trong liên kết ở trên cung cấp một mô tả ngắn về các chức năng cũng sẽ có ích.


1
smex thử điều này và cung cấp một danh sách các lệnh cho chế độ chính hiện tại khi sử dụng smex-major-mode-commands.
wasamasa

@wasamasa cảm ơn vì đã giới thiệu smex. Đối với các lệnh (chức năng tương tác) điều này dường như thực hiện công việc. Nó vẫn là các chức năng không tương tác.
Tên

1
Rất tiếc, quên điểm thực tế của tôi. Nghiên cứu các nguồn của nó để có một cái gì đó để so sánh với mã từ các câu trả lời khác.
wasamasa 24/07/2015

Câu trả lời:


2

Nó có ý nghĩa gì đối với một chế độ để cung cấp một chức năng? Bạn nói " danh sách tất cả các chức năng chỉ có sẵn trong một chế độ cụ thể " và " loại trừ tất cả các chức năng khác không được cung cấp bởi chế độ đó ".

Có vẻ như bạn đang nhầm lẫn một chế độ với thư viện xác định nó . Một thư viện cung cấp / định nghĩa các chức năng. Một chế độ thường không làm như vậy.

Nếu bạn muốn nhận danh sách tất cả các hàm được xác định trong một thư viện nhất định , hãy xem câu trả lời của @ wvxvw, để bắt đầu. Bạn cũng có thể thử kết hợp tiền tố thư viện với các tên hàm - thường không phù hợp, nhưng nó không có nghĩa là dứt khoát.

Tuy nhiên, nếu bạn muốn có một danh sách tất cả các chức năng có thể phù hợp với một chế độ nhất định , ví dụ: các chức năng chỉ có thể được sử dụng hoặc hữu ích nhất, khi chế độ đó được bật, thì tôi sợ bạn sẽ cần kiểm tra thư viện nơi chế độ được xác định. Và bạn thậm chí có thể cần kiểm tra một số thư viện khác.

Một thư viện nhất định thường định nghĩa nhiều hơn chỉ một số thứ phù hợp với một chế độ nhất định. Và một chế độ nhất định có thể sử dụng rất tốt những thứ được xác định trong các thư viện khác nhau và trong một số trường hợp, những thứ đó chỉ có ý nghĩa đối với chế độ đã cho đó hoặc một bộ chế độ bao gồm nó.

Tóm lại, như hiện tại đặt ra, câu hỏi của bạn không rõ ràng lắm. Bạn có thể giúp mình trả lời tốt hơn bằng cách làm rõ nó.


Bạn nói đúng, câu hỏi nên chính xác hơn. Ví dụ cho latex tôi có nghĩa là tất cả các chức năng được xác định trong các .eltệp có trong thư mục site-lisp>auctex. Đối với chế độ org, tôi có nghĩa là tất cả các chức năng được xác định trong các .eltệp có trong thư mục site-lisp>org. Đối với nhiều chế độ, tình huống đơn giản hơn vì chúng chỉ có một .eltệp. Tôi hy vọng những giải thích này làm cho động cơ của câu hỏi của tôi rõ ràng bây giờ.
Tên

2

Có lẽ, mã này sẽ có một số hiệu quả giáo dục:

(defun remove-all-extensions (file-name)
  (let ((go-on t) next)
    (while go-on
      (setq next (file-name-sans-extension file-name))
      (setq go-on (not (string= next file-name))
            file-name next))
    next))

(defun function-symbols-of (library)
  (let ((origin (remove-all-extensions
                 (find-library-name
                  (if (stringp library) library
                    (symbol-name library)))))
        (result))
    (mapatoms (lambda (sym)
                (when (and (symbol-function sym)
                           (symbol-file sym)
                           (string= (remove-all-extensions (symbol-file sym))
                                    origin))
                  (push sym result))))
    result))

Vấn đề

Do tính chất không xác định của phân tích mã và tải một số vấn đề cần được giải quyết:

  1. Khi nào chức năng được xác định trong một tập tin? Các hàm có thể được xác định theo điều kiện và dự đoán liệu một điều kiện có thiên về định nghĩa hàm hay không tương đương với việc giải quyết vấn đề tạm dừng. Để minh họa điều này, giả sử mã này:

    (if (> (random 100) 50)
       (defun foo ())
       (defun bar ()))
    
  2. Nói chung không thể nói, liệu một hình thức lisp đã xác định một chức năng trước khi (thành công) đánh giá biểu mẫu. Điều này, một lần nữa, tương đương với vấn đề tạm dừng, vì vậy, không thể giải quyết được nói chung.
  3. Có một số trường hợp đặc biệt phổ biến như răng cưa và tư vấn, trong đó (a) tạo các bản sao, (b) có thể khiến bạn hiểu nhầm về tệp nguồn đã khai báo hàm.
  4. Phần lớn các hàm được khai báo bằng mã C (không nhất thiết có thể truy cập được), không thực sự được chia thành các thư viện theo cùng nghĩa với mã Lisp của Emacs.

Tất cả điều này đã nói, có lẽ bạn muốn xem xét find-func.elcảm hứng, để có được ý tưởng chung về bố cục và các vấn đề liên quan đến việc định vị mã nguồn cho các hàm Emacs Lisp.


Hãy để tôi báo cáo điều này: khi chạy mã này tôi gặp lỗi Symbol's function definition is void: find-library-name. Đây cũng là một symobols đánh máy nhỏ -> biểu tượng.
Tên

@Name hm ... nhưng chức năng này rất cũ (tôi thấy nó được đề cập trong mã nguồn năm 2002). Bạn có thể thử (require 'find-func)trước khi chạy mã này. Cảm ơn các lỗi đánh máy được tìm thấy. Tôi sẽ sửa nó.
wvxvw 24/07/2015

Cảm ơn, sẽ thật tuyệt nếu tên của thư viện có thể được đưa ra bằng các biểu thức thông thường.
Tên

1

Tôi vừa thêm chức năng này vào lispy . Lệnh mới lispy-goto-elisp-commands, bị ràng buộc oge.

Chung g( lispy-goto) đưa ra một danh sách tất cả các thẻ, làm nổi bật các lệnh với một mặt khác, trong khi lispy-goto-elisp-commandschỉ đưa ra các thẻ lệnh.

Danh sách mã

(defun lispy-goto-elisp-commands (&optional arg)
  "Jump to Elisp commands within current file.
When ARG is non-nil, force a reparse."
  (interactive "P")
  (deactivate-mark)
  (let ((lispy-force-reparse arg))
    (lispy--fetch-tags (list (buffer-file-name)))
    (let ((struct (gethash (buffer-file-name) lispy-db)))
      (lispy--select-candidate
       (mapcar #'lispy--format-tag-line
               (delq nil
                     (cl-mapcar
                      (lambda (tag pretty-tag)
                        (when (semantic-tag-get-attribute tag :user-visible-flag)
                          pretty-tag))
                      (lispy-dbfile-plain-tags struct)
                      (lispy-dbfile-tags struct))))
       #'lispy--action-jump))))

Điều này chỉ để chỉ ra rằng ngữ nghĩa của CEDET được sử dụng để lấy danh sách các thẻ; (semantic-tag-get-attribute tag :user-visible-flag)được sử dụng để xác định xem thẻ có phải là lệnh hay không.

Cách sử dụng

  1. Điều hướng đến tệp có chứa mã. Điều này có thể được thực hiện với f1 f. Tôi thích sử dụng chức năng tư vấn-mô tả thay thế, vì nhấn vào C-.đó bỏ qua việc phải đi qua *Help*bộ đệm.

  2. Làm cho điểm đặc biệt (di chuyển nó trước khi mở paren hoặc kích hoạt vùng) và nhấn oge. Cũng có thể chỉ sử dụng M-x lispy-goto-elisp-commands.


Tôi hơi bối rối, nếu tôi muốn có được tất cả các chức năng được cung cấp bởi chế độ latex, tôi phải làm gì khi sử dụng mã của bạn?
Tên

Mở tex-mode.el. Nhấn "oge" để nhận danh sách 23 thẻ lệnh mà tệp này chứa. Chọn một trong các thẻ sẽ điều hướng ở đó.
abo-abo

Chạy M-x lispy-goto-elisp-commandstrên bộ đệm gây tex-mode.elra lỗilispy--fetch-tags: Wrong type argument: stringp, ("c:/Program Files/GNU Emacs/share/emacs/24.5/lisp/textmodes/tex-mode.el")
Tên

Tôi không có kinh nghiệm chạy CEDET trên Windows. Lệnh sẽ hoạt động tốt trên GNU / Linux cho 24.5.2 và 25.
abo-abo

Câu trả lời của bạn nói về " các lệnh ", nhưng câu hỏi OP là về các chức năng , không chỉ các lệnh . Nếu bạn thực sự có nghĩa là chức năng thì bạn có thể muốn sửa văn bản. Nếu bạn chỉ có nghĩa là các lệnh thì bài đăng này chưa thực sự trả lời câu hỏi, trong trường hợp đó bạn có thể muốn sửa nó (ví dụ: thay đổi mã hoặc bất cứ điều gì).
vẽ

1

Các smex gói có mã để liệt kê tất cả các lệnh của một gói. Bạn có thể điều chỉnh mã này để có được tất cả các chức năng.


Ồ vâng, xin lỗi tôi đã bỏ lỡ điều đó.
rumember
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.