特定のメジャーモードによって排他的に提供されるすべての関数のリストを取得する方法


8

この質問はhttps://stackoverflow.com/q/605785/に触発されています。ことでM-x describe-function <TAB>、私はemacsのが現在の状態で使用可能なすべての対話型またはnonintractive関数のリストを取得することができます。特定のモード(例えば、latex-mode)がアクティブ化されている場合、latex-modeで使用可能な機能もリストされるため、より長いリストが表示されます。

私の質問は、特定のモード(たとえば、latexモード)で排他的に使用できるすべての関数のリストを取得する方法ですか?つまり、そのモードでは提供されない他のすべての機能を除外します。上記のリンクのように、関数の短い説明を提供することも便利です。


1
smexはこれを試み、を使用するときに現在のメジャーモードのコマンドのリストを提供しsmex-major-mode-commandsます。
wasamasa 2015

@wasamasa smexをご紹介いただきありがとうございます。コマンド(対話式関数)の場合、これでうまくいくようです。非インタラクティブ機能のままです。
名前

1
おっと、私の実際のポイントを忘れてしまいました。そのソースを調べて、他の回答のコードと比較するものを探します。
wasamasa 2015

回答:


2

モードが機能を提供することは何を意味しますか?「特定のモードでのみ使用できるすべての機能のリスト」と「そのモードで提供されていない他のすべての機能を除いて」と言います

モードを定義しているライブラリと混同しているようです。ライブラリは関数を提供/定義します。通常、モードはそうしません。

特定のライブラリで定義されているすべての関数のリストを取得する場合は、@ wvxvwの回答を参照してください。ライブラリプレフィックスを関数名と照合することもできます。これは多くの場合適切ですが、これが絶対的なものではありません。

ただし、特定のモードに関連している可能性のあるすべての機能のリストを取得したい場合(たとえば、そのモードがオンになっている場合にのみ使用できる機能や最も役立つ機能)、私は恐れていますモードが定義されているライブラリを調べる必要があります。また、他のいくつかのライブラリを調べる必要がある場合もあります。

与えられたライブラリは通常、与えられたモードに関連するいくつかのこと以上のものを定義します。そして、与えられたモードは、異なるライブラリで定義されたものをうまく利用でき、場合によっては、与えられたモードまたはそれを含む一連のモードに対してのみ意味をなすものもあります。

要するに、現在提起されているように、あなたの質問はあまり明確ではありません。あなたはそれを明確にすることでより良い答えに自分自身を助けるかもしれません。


あなたは正しい、質問はより正確でなければなりません。たとえば、latexの.el場合は、フォルダーに含まれているファイルで定義されているすべての関数を意味しますsite-lisp>auctex。組織モードと.elは、フォルダに含まれるファイルで定義されているすべての関数を意味しますsite-lisp>org。多くのモードでは、.elファイルが1つしかないため、状況はより簡単です。これらの説明が私の質問の動機を明確にしてくれることを願っています。
名前

2

おそらく、このコードは教育効果をもたらすでしょう:

(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))

問題

コードの解析と読み込みは非決定的であるため、いくつかの問題に対処する必要があります。

  1. 関数はいつファイルで定義されますか?関数は条件付きで定義でき、条件が関数定義を優先するかどうかを予測することは、停止問題を解決することと同じです。これを説明するために、次のコードを想定します。

    (if (> (random 100) 50)
       (defun foo ())
       (defun bar ()))
    
  2. 一般に、lispフォームが(正常に)フォームを評価する前に関数を定義したかどうかを判別することはできません。これも、問題を停止することと同じであるため、一般的には解決できません。
  3. エイリアスやアドバイスなどの一般的な特殊なケースがいくつかあります。(a)重複を作成する、(b)関数を宣言したソースファイルについて誤解を招く可能性があります。
  4. 関数の大部分はCコードで宣言されています(必ずしもアクセス可能である必要はありません)。これは、Emacs Lispコードと同じ意味で実際にはライブラリに分割されていません。

以上のfind-func.elことから、レイアウトの概要とEmacs Lisp関数のソースコードの検索に関連する問題を理解するために、インスピレーションを得たいと思うでしょう。


これを報告させてください:このコードを実行すると、エラーが発生しますSymbol's function definition is void: find-library-name。これはまた、小さなタイプミスsymobols-> symbolsでもあります。
名前

@Name hm ...しかし、この関数は非常に古いものです(2002年にソースコードで言及されていました)。(require 'find-func)このコードを実行する前に試してみてください。見つかったタイプミスをありがとう。修正します。
wvxvw 2015

よろしくお願いいたします。ライブラリの名前を正規表現で指定できると便利です。
名前

1

この機能をlispyに追加し ました。新しいコマンド lispy-goto-elisp-commandsはにバインドされていogeます。

総称glispy-goto)はすべてのタグのリストを提供し、異なる面のコマンドを強調表示します lispy-goto-elisp-commandsが、コマンドタグのみを提供します。

コードリスト

(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))))

これは、CEDETのセマンティクスがタグのリストを取得するために使用されていることを示すためだけです。(semantic-tag-get-attribute tag :user-visible-flag)タグがコマンドかどうかを判別するために使用されます。

使い方

  1. コードを含むファイルに移動します。これはで行うことができます f1 f。そこを 押すとバッファを通過する必要がないので、代わりにカウンセル記述関数を使用するのが好き です。C-.*Help*

  2. ポイントを特別にし(括弧を開く前に移動するか、リージョンをアクティブにします)、を押しogeます。をそのまま使用することも可能M-x lispy-goto-elisp-commandsです。


ラテックスモードで提供されるすべての関数を取得したい場合、コードを使用して何をする必要がありますか?
名前

tex-mode.elを開きます。「oge」を押すと、このファイルに含まれる23個のコマンドタグのリストが表示されます。タグの1つを選択すると、そこに移動します。
abo-abo 2015

M-x lispy-goto-elisp-commandsバッファ上で実行tex-mode.elするとエラーが発生しますlispy--fetch-tags: Wrong type argument: stringp, ("c:/Program Files/GNU Emacs/share/emacs/24.5/lisp/textmodes/tex-mode.el")
名前

WindowsでCEDETを実行した経験はありません。このコマンドは、24.5.2および25のGNU / Linuxでも正常に機能するはずです。
abo-abo 2015

あなたの答えは「コマンド」について語っていますが、OPの質問はコマンドだけではなく、関数についてです。あなたが本当に機能を意味しているなら、あなたはテキストを修正したいかもしれません。コマンドだけを意味している場合、この投稿はまだ質問に実際には回答していません。
2015

1

SMEXのパッケージは、パッケージのすべてのコマンドを一覧表示するには、コードを持っています。このコードを変更して、すべての関数を取得できます。


ああ、はい、すみません。
15
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.