135

コード折り畳みのようなもの、またはorg-modeが使用するサイクリングのタイプを実現するための最良の方法は何ですか。このタイプの動作を作成するためのelispの最良の解決策は何でしょうか?

編集:私ははっきりしていなかった申し訳ありません。コードフォールディングと非常によく似た、または実際には拡張可能な階層を備えたorg-modeに最も似たものを、elispでプログラムしたいと思います。私はこの効果を達成するための最良の方法を考えています。emacsオーバーレイが良い解決策だと聞いたと思いますが、わかりません。

折りたたみに関しては、組み込みのset-selective-displayを使用します

編集番号2:

答えてくれてありがとう。でも私は間違った質問をしていると思うので、私がやろうとしていることをもっと明確にしようと思います。以下を作成したい

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

4

14 に答える 14

157

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

ほとんどの人は、単純なインクリメンタル検索でうまくいきます。どこかで言及されている「foo」を参照してください。と入力C-sfooし、定義を見つけて Enter キーを押し、それを読み、 を押しC-x C-xて元の場所に戻ります。シンプルで非常に便利です。

ほとんどのモードはimenuをサポートしています。 M-ximenu名前で関数定義(など)にジャンプできます。マウスのクリックにバインドして、機能のメニューを取得することもできます (または、メニューバーに追加します。詳細については、Info ページを参照してください)。which-function-mode のデータを提供します。これにより、現在モードライン内にいる関数を確認できます。(しかし、なぜあなたの関数はこれほど長いのですか?)

また、imenu 情報 (およびその他のもの) をグラフィカルに表示するspeedbarもあります。

ファイルの概要を取得したい場合は、M-xoccur" を試してください。正規表現を指定すると、現在のバッファーに一致するたびに新しいバッファーが作成されます。"(defun" を検索して、現在のファイルの関数の概要を取得できます。結果をクリックすると、ファイル内のその位置に移動します。

とにかく、あなたが本当に達成したいことを考えてください. Emacsはおそらくそれを実装しています. 物事を常に折りたたんだり広げたりする不完全なツールと戦わないでください。

于 2009-07-31T08:35:36.777 に答える
48

猫の皮を剥ぐ別の方法:

たまたま、そのためのパッケージや追加の構成は必要ありません。任意のソース ファイルに移動して、次のように入力します。

M-1 Cx $と魔法が起こります!

いつものように、これは白魔術です: Cx $はコードを元に戻します。

Emacs のヘルプ システムを使用して何が起こっているのかを知ることができます: Ch k Cx $ は、上記のキーの組み合わせが set-selective-displayを呼び出していることを示しています。当然のことながら、変数 selected-display をその引数の値に設定します。

マイナーな Emacs ウィザードリィ ブログから

完全を期すために: M-3 Cx $は、より深くネストされたコードなどを表示します。

FWIW 今日は smth に基づいて小さなヘルパーを作成しました。F5 が現在のカーソル位置に基づいてコードの折りたたみを切り替えるように、ここにあります。

(global-set-key (kbd "<f5>") 'set-selective-display-dlw)

(defun set-selective-display-dlw (&optional level)
"Fold text indented same of more than the cursor.
If level is set, set the indent level to LEVEL.
If 'selective-display' is already set to LEVEL, clicking
F5 again will unset 'selective-display' by setting it to 0."
  (interactive "P")
  (if (eq selective-display (1+ (current-column)))
      (set-selective-display 0)
    (set-selective-display (or level (1+ (current-column))))))
于 2015-01-02T21:50:18.783 に答える
24

アウトライン マイナー モードを使用して、Python コードを折りたたみます。折りたたみモードのように {{{ と }}} を配置する代わりに、ブロックが定義されている場所を使用します。

http://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.html http://www.emacswiki.org/emacs/OutlineMinorMode

emacsに付属していると確信しています。次に、これを .emacs に追加します

;;======= Code folding =======
(add-hook 'python-mode-hook 'my-python-outline-hook)
; this gets called by outline to deteremine the level. Just use the length of the whitespace
(defun py-outline-level ()
  (let (buffer-invisibility-spec)
    (save-excursion
      (skip-chars-forward "    ")
      (current-column))))
; this get called after python mode is enabled
(defun my-python-outline-hook ()
  ; outline uses this regexp to find headers. I match lines with no indent and indented "class"
  ; and "def" lines.
  (setq outline-regexp "[^ \t]\\|[ \t]*\\(def\\|class\\) ")
  ; enable our level computation
  (setq outline-level 'py-outline-level)
  ; do not use their \C-c@ prefix, too hard to type. Note this overides some bindings.
  (setq outline-minor-mode-prefix "\C-t")
  ; turn on outline mode
  (outline-minor-mode t)
  ; initially hide all but the headers
  ;(hide-body)
  ; make paren matches visible
  (show-paren-mode 1)
)
于 2009-07-06T05:29:02.087 に答える
13

initファイルに次のコードを指定してCEDETを使用することにより、コードを折りたたむこともできます。

(global-semantic-folding-mode t)

このコードを評価すると、フリンジ領域に小さな三角形が表示されるので、それを使用してコードを折りたたんだり展開したりできます。この方法は、ソースコードから抽出された構文情報を使用するため、より正確です。

于 2009-07-06T05:46:40.460 に答える
10

hs-minor-mode は美しく動作します。

fold-dwim と組み合わせると、さらに美しく機能します (私の言いたいことを実行してください)。次に、コードの折りたたみに org-mode のようなキー バインディングを提供する fold-dwim-org があります。どちらもマーマレード経由でインストールできます (そして私は elpa だと思います)。

于 2012-07-24T23:01:59.147 に答える
6

どうやら完璧な解決策はありませんが、最善の解決策は次のとおりだと思います。

http://www.emacswiki.org/emacs/FoldingMode

于 2009-07-06T02:37:37.643 に答える
6

誰も狭小化について言及していないことに驚いています。それは非常に素晴らしいです。emacs にもバンドルされています。注目したいコードを選択して を押すC-x n nだけで、フル ビュー モードに戻ることができますC-x n w。私は常に、ユーザースペースを別のパッケージで乱雑にするよりも、組み込みの emacs 機能を使用することを好みます。emacsが組み込み機能でそれを実行できる場合、サードパーティのパッケージよりもそれを好みますが、それは私だけであり、複雑で長い構成よりも単純なものが好きだということ以外には何も意味も暗示もしていません.

于 2019-09-30T10:01:21.140 に答える
3

折りたたみとは、バッファーの内容 (テキスト) をそのまま維持しながら外観を変更することであるため、「プロジェクト」と折りたたみの比較はあまり良くないと思います。あなたのプロジェクトでは、バッファの内容をそのまま維持しながら余分なテキストを表示する必要があります.AFAIU. そう。テキストの挿入と折り畳みの構成としては実装できません (その場合、バッファーの内容が変更されます)。

しかし、おそらく、折りたたみが行われるのと同じメカニズムで実際に可能です-「オーバーレイ」...「文字列の前」および「文字列の後」のオーバーレイプロパティを検討してください。おそらく、ポイントで長さゼロのオーバーレイに属するこれらの文字列に関数定義を入れることができます。オーバーレイがアウトライン モードでどのように使用されるかを確認するには、outline-flag-region 関数を参照してください

于 2010-07-25T14:41:54.300 に答える
2

emacsにはhs-minor-modeが付属しており、バランスの取れた式間のコード折り畳みを容易にします http://www.emacswiki.org/emacs/HideShow

于 2010-06-25T03:12:21.750 に答える
1

einSelbstの回答からインスピレーションを得て:

(アドバイス追加 'set-selective-display
            :filter-args (ラムダ (引数)
                           (if (または (car args) 選択的表示)
                               引数
                             (リスト (1+ (現在の列)))))
            '((name.set-selective-display-from-cursor-column)))

出来上がり、何もビジネスC-x $がなくても突然便利になりました。C-uM-4

于 2018-09-29T11:36:04.720 に答える