1. ホーム
  2. emacs

[解決済み] Emacsでコードの折りたたみ効果を得るには?

2022-06-13 22:39:27

質問

コードの折りたたみや、org-modeが使っているようなサイクリングを実現するには、どのような方法があるのでしょうか。 このような動作を実現するために、elispではどのようなソリューションが最適でしょうか?

EDIT 私は明確でなかったので、申し訳ありません。 私は、コードの折りたたみに非常に似た、または実際に展開できる階層を持つorg-modeに最も似たことを行うelispで何かをプログラムしたいのです。 この効果を得るための最良の方法について考えています。 私はemacsのオーバーレイが良い解決策であると聞いたことがあるように思いますが、私は知りません。

折りたたみに関しては、私は単にビルトインの set-selective-display を使用しています。

編集番号2。

ご回答ありがとうございます。 私は次のようなものを作りたいと思っています。

関数にポイントを置いて、このelisp関数を呼び出すと、関数定義がどこにあるのか(このためにfind-tagを使おうと思っています)、現在のバッファにそれを展開します。 もし、関数定義を読むために別のバッファにジャンプしなければならないとしたら、それは別のファイルへのコンテキストスイッチのような気がするのです。 そこで、コードの折りたたみのような動作をさせたいのですが、バッファから外部のコードを取り込むだけです。 この場合、実際にコードをバッファに貼り付けることはできませんし、誰かが保存すると、取り込んだコードが保存されてしまうという問題があります。 そこで、バッファの中に、バッファの一部ではない領域を作成する方法はないかと考えています。 私はそれが理にかなっていると思います。

どのように解決するのですか?

emacsには、コードを折りたたむときに手動で行う操作を明示的に実装するツールがあるため、折りたたみは一般に不要です。

ほとんどの人は、単純なインクリメンタル検索でうまくいきます。 どこかで言及された "foo" を参照してください。タイプ C-s foo をクリックすると、定義を見つけてエンターキーを押し、それを読んでから C-x C-x で元の場所に戻る。 シンプルでとても便利です。

ほとんどのモードでは imenu . M-x imenu を使うと、関数定義(など)の名前にジャンプすることができます。 また、マウスクリックにバインドして関数のメニューを表示させることもできます(メニューバーに追加することも可能です。) which-function-modeのデータを提供し、modelineで現在どの関数の中にいるのかを確認することができます。 (なぜ関数はこんなに長いのでしょうか?)

また スピードバー があり、これは imenu の情報 (と他のもの) をグラフィカルに表示します。

ファイルの概要を知りたい場合は、試しに M-x occur "。 正規表現が与えられると、現在のバッファにマッチする各バッファを新しく作成します。 現在のファイルが実装している関数の概要を知るために、"(defun")で検索することができます。 結果をクリックすると、ファイル内のその位置に移動します。

とにかく、本当に実現したいことは何か、Emacsはおそらくそれを実装しているのだと考えてください。常に折り畳んだり広げたりさせるような不完全なツールとは戦わないことです。