Bagaimana saya bisa mendapatkan outline mode-org di buffer ke-2 sebagai daftar isi dinamis?

25

Ketika saya mengedit dokumen besar, saya ingin melihat di mana saya berada dengan melihat garis besar (tanpa konten) di buffer terpisah. Seperti ketika Anda membaca file PDF ada TOC di sebelah kiri. (Lihat di bawah)

Dalam mode-org dimungkinkan untuk memperluas / menciutkan garis besar. Tetapi apakah mungkin untuk memiliki garis statis di sebelah kiri (atau kanan) dalam buffer terpisah sehingga ketika Anda mengklik judul, buffer lain bergerak ke posisi itu?

Agak seperti ini tetapi untuk org-mode? masukkan deskripsi gambar di sini

[Sunting]
The clone-indirect-buffersangat dekat dengan apa yang saya inginkan. Potongan puzzle yang hilang adalah untuk melompat ke lokasi yang sama ketika mengklik tajuk / (atau titik mana pun juga).

Untuk ini saya telah mencoba menulis beberapa kode: Pindah ke buffer kloning lain ke titik yang sama? (posisi sinkronisasi buffer tidak langsung) (mode-org)

Tapi itu tidak berfungsi jika kontennya diciutkan. Jika itu bisa dilakukan untuk bekerja, maka klon-inderect-buffer adalah solusi lengkap untuk ini.

[Edit2 Solusi]
Kode di tautan di atas dan di jawaban di bawah ini menggabungkan niceley untuk menyelesaikan lompatan bolak-balik.

;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)
Leo Ufimtsev
sumber
2
Mungkin mencoba C-c C-x b, atau org-tree-to-indirect-buffer.
Samuel Flint
@SWFlint Setelah tes singkat, sepertinya ia melakukan sesuatu yang berbeda dari apa yang diinginkan OP: ia menyalin subtree saat ini ke buffer tidak langsung. Apa yang kita butuhkan adalah org-sparse-tree-to-indirect-bufferfungsi, misalnya, tetapi sepertinya tidak ada.
T. Verron
Setelah melihat sedikit lebih jauh, coba sesuatu di sepanjang garis org-pane
Samuel Flint
Saya pikir itu juga layak disebut imenu-list . Itu tidak memiliki beberapa persyaratan tetapi alamat yang lain.
incandescentman
org-tree-to-indirect-buffer mengagumkan.
ninrod

Jawaban:

9

Beberapa pilihan muncul di benak saya. Dua yang pertama adalah speedbar, yang diduga bermain dengan baik org-mode, dan minimap, meskipun saya belum menggunakannya jadi tidak bisa menjamin mereka secara pribadi.

Apa yang mungkin menjadi pilihan paling sederhana (dan juga yang paling fleksibel), adalah dengan menggunakan buffer tidak langsung .

Dalam praktiknya, Anda akan pergi ke orgbuffer yang ingin Anda garis besar, tekan M-x clone-indirect-buffer(gunakan C-u M-x clone-indirect-bufferjika Anda ingin mengontrol apa yang disebut klon), dan kemudian boom, ada salinan lain dari buffer untuk Anda gunakan. Letakkan klon itu di jendela atau bingkai berdampingan dengan buffer asli dan, di klon, sesuaikan garis dengan selera Anda.

Ini tidak memberi Anda fungsionalitas "klik pada judul" yang Anda sebutkan, tetapi memberi Anda semangat bilah sisi.

Sunting: sebagai tanggapan atas komentar Anda, inilah perintah sederhana yang, ketika dipanggil dari klon buffer , akan beralih ke buffer dasar dan memindahkan titik ke mana pun kursor berada di klon buffer:

(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)))))
Dan
sumber
Saya mencoba speedbar / Sr-Speedbar. Ini sangat bagus tetapi hanya menunjukkan 2 level pertama. Saya bertanya apakah mungkin untuk memiliki lebih banyak level di sini: emacs.stackexchange.com/questions/9533/... Buffer tidak langsung adalah opsi yang bagus. Saya ingin tahu apakah mungkin untuk memindahkan kursor di buffer lain ke posisi yang sama dengan buffer kloning ..
Leo Ufimtsev
Saya mencoba menulis kode yang akan melompat ke lokasi yang sama di buffer lain, tetapi hanya berfungsi jika semuanya diperluas. Jika itu bisa dibuat agar berfungsi secara otomatis mengembang, maka klon-buffer adalah solusi sempurna. Posting: emacs.stackexchange.com/questions/9536/…
Leo Ufimtsev
Terima kasih atas cuplikan kode di atas. Sangat dihargai ^ _ ^.
Leo Ufimtsev
16

Bagaimana dengan: M-x occur RET ^*+ RET(perhatikan bahwa ada spasi di akhir regexp).

Sup Saya yang Lain adalah Borscht
sumber
Saya tidak tahu mengapa seseorang menurunkan jawaban ini, saya pikir ini sebenarnya adalah solusi bebas gangguan yang cukup rapi sebenarnya. Satu-satunya kebiasaan adalah tidak mengikuti Anda. Yaitu tidak jelas di buffer terjadi di mana Anda berada, (sorot tajuk saat ini misalnya) dan tidak menggulir untuk dokumen yang panjang. Tetapi untuk dokumen kecil itu berfungsi.
Leo Ufimtsev
Saya suka solusi sederhana dan bawaan ini. Jika seseorang perlu disorot, gunakan helm-terjadi alih-alih terjadi. Manfaat tambahan adalah untuk dapat menggunakan navigasi tunggal untuk beberapa buffer file org dengan menggunakan multi-terjadi. Terakhir, dengan terjadi-edit, seseorang dapat mengedit tampilan, tampilan garis besar dan tampilan yang diperluas. Bagaimanapun, saya memilih ini.
Pengguna Emacs
Akan mengunggah ini karena mengagumkan, sederhana dan efisien
Gambo
Sangat sederhana. Sangat pintar. Jadi hackish. Sangat mengagumkan.
dangom
7

Setelah membaca jawaban Dan dan solusi Anda berdasarkan itu, saya menggabungkan ini. Ini membuka klon baru, sempit, hanya-baca di sebelah kiri buffer saat ini, dan mengikat <mouse-1>dan RETsecara lokal di klon untuk melompat ke posisi itu di buffer dasar.

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

Ini akan bekerja dengan outline-modedan outline-minor-mode, serta mode yang membangunnya, seperti org-mode. Saya menemukan beberapa info tentang mendapatkan peta kunci lokal, tetapi saya tidak tahu bagaimana memilih yang mana yang akan disalin. Ada juga halaman ini yang memiliki fungsi untuk secara otomatis membuat mode minor spesifik penyangga untuk mengatur kunci penyangga-lokal, tetapi itu tampaknya di luar cakupan untuk masalah ini.

blujay
sumber
1
Terima kasih telah berbagi ini. Dengan menggunakan outline-mode-mapalih-alih org-mode-mapsaya berhasil membuatnya bekerja AUCTeXdengan outline-minor-mode, yang bagus.
Oleg Domanov
Omong-omong, outline-modefungsi hide-bodymenyembunyikan semuanya kecuali tajuk utama.
Oleg Domanov
@OlegDomanov Terima kasih atas info itu! Saya meningkatkan kode untuk menggunakan outline-mode-mapdan hide-body, dan beberapa perbaikan kecil lainnya.
blujay
2

Akhirnya, ini telah diimplementasikan dalam paket org-sidebar:

demo org-sidebar-tree

blujay
sumber
1
Hoore! Saya memiliki setup goyah yang kadang-kadang hanya berhenti bekerja, itu benar-benar brilian jika itu paket sekarang!
Thriveth
0

dua saran sewa rendah (apa yang saya lakukan) dari non-programmer yang suka menggunakan aquamacs untuk editor teks:

  1. beralih bolak-balik dengan perintah di-buffer:

STARTUP: indent (untuk menunjukkan garis besar tipe air terjun lebih mudah dilihat secara keseluruhan)

ini untuk melihat buffer buffer yang digerakkan oleh tab

dan

+ PILIHAN: H: N, di mana N = = jumlah level yang ingin Anda lihat dalam ekspor html, yang merupakan saran # 2

lihat: https://emacsclub.github.io/html/org_tutorial.html

  1. ekspor sebagai html (CC CE hh) untuk melihat TOC. saya tidak dapat menemukan siapa pun yang dapat dengan mudah mendapatkan output teks dari html atau teks (CC CE ta) ke indent
richrat
sumber
0

Saya membutuhkan sesuatu yang serupa, jadi saya menggabungkan outline-tocmode . Ini harus bekerja untuk dokumen mode-org.

abingham
sumber