web-dev-qa-db-ja.com

Emacsでコードの折りたたみ効果を実現する方法は?

コードの折りたたみや、org-modeが使用するサイクリングの種類などを実現する最良の方法は何ですか。このタイプの動作を作成するために、elispで最適なソリューションは何でしょうか?

編集:すみません、はっきりしませんでした。コードの折りたたみと非常によく似た処理を行うelispで何かをプログラミングしたい、または実際に拡張可能な階層を備えた組織モードのようなものを作成したい。私はこの影響を達成するための最良の方法を疑問に思っています。 emacsオーバーレイが良い解決策だと聞いたことがありますが、わかりません。

折りたたみに関しては、組み込みのset-selective-displayを使用するだけです。

編集番号2:

回答ありがとうございますが、間違った質問をしていると思うので、私がやろうとしていることをもっとはっきりさせてください。以下を作成したい

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

108
jacob

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

ほとんどの人は、単純なインクリメンタル検索で大きな成功を収めています。どこかに記載されている「foo」を参照してください。タイプ C-sfoo、定義を見つけてEnterキーを押して読み、それからを押します C-xC-x あなたがいた場所に戻るために。シンプルで非常に便利です。

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

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

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

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

147
jrockway

非表示モード(hs-minor-mode)デフォルトのキーバインド付きC-c @ C-M-h折り畳みをトリガーする(hs-hide-all

90
dmckee

猫の皮を剥ぐ別の方法:

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

M-1 C-x $そして魔法が起こる!

いつものように、それは白魔術です:C-x $はコードを戻します。

Emacsのヘルプシステムを使用して、何が起こっているのかを発見できます。Chk Cx $は、上記のキーの組み合わせがset-selective-displayを呼び出していることを示します。 1つの数値引数(M-1プレフィックスがその引数の値として1を渡す)を取り、当然のことながら、変数selection-displayをその引数の値に設定する関数。

from マイナーemacsウィザードのブログ

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

FWIW今日は、smthに基づいて小さなヘルパーを作成しました。 found here これにより、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))))))
33
einSelbst

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

http://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.htmlhttp://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)
)
21
Nikwin

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

(global-semantic-folding-mode t)

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

12
Alex Ott

hs-minor-modeは美しく機能します。

折り畳み式の水泳と組み合わせると、さらに美しく機能します(つまり、意味を成します)。次に、fold-dwim-orgがあります。これは、コードを折り畳むためのキーバインディングのような組織モードを提供します!どちらもマーマレード経由でインストールできます(そしてelpaと思います)。

9
Jones

どうやら完璧な解決策はありませんが、最良の解決策はこれだと思います:

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

7
freitass

vimish-foldも素敵で簡単な解決策です。

https://github.com/mrkkrp/vimish-fold

ホームページから:

これは、Vimのようにテキストの折りたたみを実行するためのパッケージです。次の機能があります。

  • アクティブ領域の折りたたみ。
  • 優れた視覚的フィードバック:テキストのどの部分が折り畳まれているかは明らかです。
  • デフォルトの永続性:ファイルを閉じても折り畳みは消えません。
  • 永続性のスケーリングは良好であり、悪影響を与えることなく、多くの折り畳みを伴う数百のファイルを処理できます。
  • インデントなどを壊しません。
  • 折り畳みは、折り畳まれた状態から展開された状態に非常に簡単に切り替えることができます。
  • 既存の折り畳み間の迅速なナビゲーション。
  • マウスを使用して折り畳みを展開できます(初心者だけでなく、それらにも適しています)。
  • avyパッケージのファンの場合:avyを使用して、最小限のキーストロークでテキストを折りたたむことができます!

優れたuse-package私は私の設定でこのスニペットを使用してそれをインストールして有効にします:

(use-package vimish-fold
  :ensure t
  :config (vimish-fold-global-mode t))
5
Horus

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

2
eunikorn

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

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

hs-minor-modeを使用する場合は、より便利なショートカットも設定することをお勧めします。例:

(eval-after-load 'hideshow
 '(progn
   (global-set-key (kbd "C-+") 'hs-toggle-hiding)))
1
quazgar

einSelbst's answer からインスピレーションを得て:

(advice-add 'set-selective-display 
:filter-args(lambda(args)
(if(または(car args)selection-display)
 args 
(list(1+(current-column)))))
 '((name。set-selective-display-from-cursor-column)))

出来上がり、C-x $は、C-u nor M-4ビジネス。

0
DomQ