動的な目次として2番目のバッファーに組織モードのアウトラインを取得するにはどうすればよいですか?


25

大きなドキュメントを編集するとき、アウトライン(コンテンツなし)を別のバッファーに表示することで、現在の場所を確認したいと思います。PDFファイルを読むときのように、左側に目次があります。(下記参照)

組織モードでは、アウトラインを展開/縮小することができます。しかし、別のバッファーの左(または右)に静的なアウトラインを設定して、見出しをクリックすると、他のバッファーがその位置に移動することは可能ですか?

ちょっとこのようなが、組織モードのために? ここに画像の説明を入力してください

[編集]非常に近い私が何をしたいのです。パズルの欠けている部分は、見出し/(または実際に任意のポイント)をクリックしたときに同じ場所にジャンプすることです。
clone-indirect-buffer

このために、私はいくつかのコードを書き込もうとしました:他のクローンされたバッファを同じポイントに移動しますか?(間接バッファの同期位置)(組織モード)

ただし、コンテンツが折りたたまれている場合は機能しません。これを機能させることができる場合、clone-inderect-bufferはこれに対する完全なソリューションです。

[Edit2 Solution]
上記のリンクと以下の回答のコードは、niceleyを組み合わせて、前後のジャンプを解決します。

;first call 'clone-indirect-buffer'. Then...

;This function works between buffer and it's clone.
(defun my/goto-same-spot-in-other-buffer () 
  "Go to the same location in the other buffer. Useful for when you have cloned indirect buffers"
  (interactive)
  (let ((my/goto-current-point (point)))
       (other-window 1)
       (goto-char my/goto-current-point)
       (when (invisible-p (point))
        (org-reveal)))
)

;This function is a clone-to-buffer jump only:
; It does find the other buffer first thou instead of just jumping to the other 
; window as does the function above.
(defun my/jump-to-point-and-show ()
  "Switch to a cloned buffer's base buffer and move point to the
cursor position in the clone."
  (interactive)
  (let ((buf (buffer-base-buffer)))
    (unless buf
      (error "You need to be in a cloned buffer!"))
    (let ((pos (point))
          (win (car (get-buffer-window-list buf))))
      (if win
          (select-window win)
        (other-window 1)
        (switch-to-buffer buf))
      (goto-char pos)
      (when (invisible-p (point))
        (show-branches)))))


(global-set-key (kbd "<s-mouse-1>") 'my/goto-same-spot-in-other-buffer)
(global-set-key (kbd "s-m") 'my/goto-same-spot-in-other-buffer)
(global-set-key (kbd "<C-s-mouse-1>") 'my/jump-to-point-and-show)
(global-set-key (kbd "C-s-m") 'my/jump-to-point-and-show)

2
たぶん試してC-c C-x b、またはorg-tree-to-indirect-buffer
サミュエルフリント

@SWFlint短いテストの後、OPが望んでいることとは異なる何かをするように見えます:現在のサブツリーを間接バッファにコピーします。org-sparse-tree-to-indirect-bufferたとえば、関数が必要ですが、存在しないようです。
T.ヴェロン

少し詳しく見てから、組織ペインに
サミュエルフリント

imenu-listも言及する価値があると思います。一部の要件はありませんが、他の要件に対応しています。
白熱

org-tree-to-indirect-bufferは素晴らしいです。
ニンロッド

回答:


9

いくつかのオプションが思い浮かびます。最初の2つはspeedbar、と言われていますが、、とorg-mode、をminimap使用していませんが、個人的に保証することはできません。

最も単純なオプション(および最も柔軟なオプション)は、間接バッファを使用することです。

実際にはorg、アウトラインが必要なバッファに移動し、ヒットM-x clone-indirect-bufferC-u M-x clone-indirect-bufferクローンの名前を制御したい場合に使用)してから、使用するバッファのコピーがもう1つあります。そのクローンを元のバッファと並べてウィンドウまたはフレームに配置し、クローンでアウトラインを好みに合わせて調整します。

あなたが言及した「アウトラインの見出しをクリックする」機能は使用できませんが、サイドバーの精神は使用できます。

編集:コメントへの応答として、バッファクローンから呼び出されたときにベースバッファに切り替え、カーソルがバッファクローン内のどこにあったとしてもポイントを移動する簡単なコマンドを次に示します。

(defun jump-to-point-and-show ()
  "Switch to a cloned buffer's base buffer and move point to the
cursor position in the clone."
  (interactive)
  (let ((buf (buffer-base-buffer)))
    (unless buf
      (error "You need to be in a cloned buffer!"))
    (let ((pos (point))
          (win (car (get-buffer-window-list buf))))
      (if win
          (select-window win)
        (other-window 1)
        (switch-to-buffer buf))
      (goto-char pos)
      (when (invisible-p (point))
        (show-branches)))))

私はspeedbar / Sr-Speedbarを試しました。とてもいいですが、最初の2つのレベルしか表示されません。ここにさらにレベルを設定できるかどうかを尋ねました:emacs.stackexchange.com/questions/9533/… 間接バッファーは良いオプションです。それは何らかの形でクローン化されたバッファと同じ位置に他のバッファにカーソルを移動することが可能ですかしら...
レオUfimtsev

他のバッファの同じ場所にジャンプするコードを記述しようとしましたが、すべてが展開されている場合にのみ機能します。自動拡張するように機能させることができれば、クローンバッファは完璧なソリューションです。ポスト:emacs.stackexchange.com/questions/9536/...
レオUfimtsev

上記のコードの断片をありがとう。本当に感謝しています^ _ ^。
レオUfimtsev

16

方法:(M-x occur RET ^*+ RET正規表現の最後にスペースがあることに注意してください)。


なぜ誰かがこの答えを否定したのかわかりません。実際、これは実際には非常にきちんとした組み込みの手間のかからないソリューションだと思います。唯一の風変わりな点は、あなたの周りを追いかけないことです。つまり、あなたがいるオカレンスバッファでは明らかではなく(たとえば、現在の見出しを強調表示します)、長い長いドキュメントではスクロールしません。しかし、小さなドキュメントでは機能します。
レオUfimtsev

このシンプルな組み込みソリューションが気に入っています。強調表示が必要な場合は、発生の代わりにhelm-occurを使用します。追加の利点は、マルチオカレンスを使用することにより、複数の組織ファイルバッファに対して単一のナビゲーションを使用できることです。最後に、発生編集では、アウトラインビューと展開ビューの両方のビューを編集できます。いずれにせよ、私はこれを支持しています。
Emacsのユーザー

その素晴らしい、シンプルで効率的なのでこれを賛成するつもりです
ガンボ

とても簡単。とても賢い。だからハック。非常にすばらしい。
dangom

7

ダンの答えとそれに基づいた解決策を読んだ後、これをまとめました。現在のバッファの左にある新しい、読み取り専用の狭いクローンを開き、クローン内<mouse-1>RETローカルにバインドして、ベースバッファ内のその位置にジャンプします。

(defun my/open-tree-view ()
  "Open a clone of the current buffer to the left, resize it to 30 columns, and bind <mouse-1> to jump to the same position in the base buffer."
  (interactive)
  (let ((new-buffer-name (concat "<tree>" (buffer-name))))
    ;; Create tree buffer
    (split-window-right 30)
    (if (get-buffer new-buffer-name)
        (switch-to-buffer new-buffer-name)  ; Use existing tree buffer
      ;; Make new tree buffer
      (progn  (clone-indirect-buffer new-buffer-name nil t)
              (switch-to-buffer new-buffer-name)
              (read-only-mode)
              (hide-body)
              (toggle-truncate-lines)

              ;; Do this twice in case the point is in a hidden line
              (dotimes (_ 2 (forward-line 0)))

              ;; Map keys
              (use-local-map (copy-keymap outline-mode-map))
              (local-set-key (kbd "q") 'delete-window)
              (mapc (lambda (key) (local-set-key (kbd key) 'my/jump-to-point-and-show))
                    '("<mouse-1>" "RET"))))))

(defun my/jump-to-point-and-show ()
  "Switch to a cloned buffer's base buffer and move point to the cursor position in the clone."
  (interactive)
  (let ((buf (buffer-base-buffer)))
    (unless buf
      (error "You need to be in a cloned buffer!"))
    (let ((pos (point))
          (win (car (get-buffer-window-list buf))))
      (if win
          (select-window win)
        (other-window 1)
        (switch-to-buffer buf))
      (goto-char pos)
      (when (invisible-p (point))
        (show-branches)))))

これは、outline-modeおよびoutline-minor-modeに加えて、に基づいて構築されたモードで動作しますorg-mode。ローカルキーマップの取得に関する情報を見つけましたが、コピーするキーマップを選択する方法がわかりません。このページには、バッファローカルキーを設定するためのバッファ固有のマイナーモードを自動的に作成する機能もありますが、この問題では範囲外のようです。


1
これを共有していただきありがとうございます。のoutline-mode-map代わりに使用org-mode-mapすることAUCTeXoutline-minor-mode、でうまく動作させることができました。
オレグドマノフ

ところで、outline-modeの関数hide-bodyは、見出し以外のすべてを隠します。
オレグドマノフ

@OlegDomanovその情報をありがとう!outline-mode-mapand を使用するようにコードを改善し、hide-bodyその他のいくつかのマイナーな改善を行いました。
ブルージェイ

2

最後に、これはパッケージに実装されましたorg-sidebar

org-sidebar-treeデモ


1
やったー!時々動作が停止するような不安定なセットアップがありますが、現在パッケージである場合は絶対に素晴らしいです!
スライブス

0

テキストエディタにaquamacsを使用するのが好きな非プログラマからの2つの低賃料の提案(私が行うこと):

  1. インバッファコマンドで前後に切り替えます。

STARTUP:インデント(ウォーターフォールタイプのアウトラインを全体として見やすくするため)

これは、バッファーのタブ駆動の表示用です

そして

+オプション:H:N、N = = htmlエクスポートで表示したいレベルの数、これは提案#2です

参照:https : //emacsclub.github.io/html/org_tutorial.html

  1. 目次を表示するには、html(CC CE hh)としてエクスポートします。インデントするHTMLまたはテキスト(CC CE ta)のテキスト出力を簡単に取得できる人は見つかりません

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