2. modda bir org modu taslağını dinamik bir içindekiler tablosu olarak nasıl alabilirim?


25

Büyük belgeleri düzenlerken, taslağı (içeriksiz) ayrı bir arabellekte görerek nerede olduğumu görmek istiyorum. Bir PDF dosyasını okurken olduğu gibi solda da bir TOC var. (aşağıya bakınız)

Org modunda, anahattı genişletmek / daraltmak mümkündür. Ancak solda (veya sağda) statik bir anahattı ayrı bir tamponda tutmak mümkündür, böylece başlıkları tıklattığınızda diğer tampon bu konuma geçer mi?

Biraz böyle ama org-mode için? görüntü tanımını buraya girin

[Düzenle] çok yakın ne istiyorum etmektir. Bulmacanın eksik parçası, bir başlığa / (veya herhangi bir noktaya gerçekten) tıkladığınızda aynı yere atlamaktır.
clone-indirect-buffer

Bunun için bazı kodlar yazmaya çalıştım: Diğer klonlanmış arabellek aynı noktaya mı taşındı? (dolaylı tamponların senkronizasyon pozisyonu) (org modu)

Ancak içerik daraltılmışsa çalışmaz. Bu işe yaramazsa, klon inderect-buffer, bunun için tam bir çözümdür.

[Edit2 Solution]
Yukarıdaki bağlantıdaki ve aşağıdaki cevaptaki kod ileri geri atlamayı çözmek için niceley'i birleştirir.

;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
Belki dene C-c C-x bya da org-tree-to-indirect-buffer.
Samuel Flint

@SWFlint Kısa bir testten sonra, OP'nin istediğinden farklı bir şey yapıyor gibi görünüyor: geçerli alt ağacı dolaylı bir ara belleğe kopyalar. İhtiyacımız olan şey bir org-sparse-tree-to-indirect-bufferişlev olurdu , örneğin, ancak var görünmüyor.
T. Verron

Biraz daha baktıktan sonra, org-panes
Samuel Flint

Ben de imenu listesinden bahsetmeye değer . Bazı gereksinimlerden yoksundur, ancak diğerlerine gider.
incandescentman

org-tree-to-dolaylı-tampon harika.
ninrod

Yanıtlar:


9

Akla birkaç seçenek geliyor. İlk ikisi, speedbariddiaya göre iyi oynadığı org-modeve minimapbunları kullanmadığım halde kişisel olarak doğrulayamadıkları.

En basit seçenek (ve aynı zamanda en esnek olanı), dolaylı bir tampon kullanmak olabilir .

Uygulamada, organahatlarını almak istediğiniz tampona gidersiniz , vurur M-x clone-indirect-buffer( C-u M-x clone-indirect-bufferklonun ne dendiğini kontrol etmek istiyorsanız kullanın ) ve ardından bom kullanın, kullanmanız için tamponun başka bir kopyası var. Bu klonu orijinal arabellekle yan yana bir pencereye veya çerçeveye koyun ve klonda anahatları zevkinize göre ayarlayın.

Bahsettiğiniz "anahatla tıklatma başlığı" işlevini görmez, ancak kenar çubuğunun ruhunu alır.

Düzenleme: Yorumunuza cevaben, işte arabellek klonundan çağrıldığında , temel arabellek ve imlecin arabellek klonunda olduğu noktaya taşınacak basit bir komut :

(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'ı denedim. Çok hoş ama sadece ilk 2 seviyeyi gösteriyor. Burada daha fazla seviyenin bulunmasının mümkün olup olmadığını sordum: emacs.stackexchange.com/questions/9533/… Dolaylı tampon güzel bir seçenektir. Bir şekilde imleci diğer tampondaki klonlanmış tampondakiyle aynı konuma
getirmenin

Diğer tamponda aynı yere atlayacak bir kod yazmaya çalıştım, fakat sadece her şey genişletilmişse işe yarar. Otomatik olarak genişlemesi için çalışması yapılabilirse, klon tamponu mükemmel bir çözümdür. Mesaj: emacs.stackexchange.com/questions/9536/…
Leo Ufimtsev

Yukarıdaki kod snippet'i için teşekkür ederiz. Çok takdir ^ ^.
Leo Ufimtsev

16

Şunlar hakkında: M-x occur RET ^*+ RET(regexp'in sonunda bir boşluk olduğuna dikkat edin).


Neden birisinin bu cevabı düşürdüğünü bilmiyorum, bence bu aslında oldukça temiz bir çözüm. Tek tuhaflık seni takip etmemesi. Yani, bulunduğunuz olay tamponunda açık değildir (örneğin mevcut başlığı vurgulayın) ve uzun uzun dokümanlar için kaydırma yapmaz. Ancak küçük belgeler için işe yarıyor.
Leo Ufimtsev

Bu basit, yerleşik çözümü seviyorum. Birinin vurgulanması gerekiyorsa, bunun yerine dümen oluşumunu kullanın. Ek bir avantaj, çoklu oluşum kullanarak birden fazla kuruluş dosyası arabelleği için tek bir gezinti kullanabilmektir. Son olarak, geçtiği düzenleme ile kişi hem görünümleri hem de anahat görünümünü ve genişletilmiş görünümü düzenleyebilir. Her durumda, bunu oylayacağım.
Emacs Kullanıcısı

Bunu başarmak için gidiyor, çünkü harika, basit ve verimli
Gambo

Çok basit. Çok zeki. Yani hackish. Çok harika.
dangom

7

Dan'in cevabını ve buna göre çözümünüzü okuduktan sonra, bunu bir araya getirdim. Bu yeni, dar salt okunur klon mevcut tampon sola ve bağlandığı açılır <mouse-1>ve RETbazlı bir tamponla o pozisyonda atlamak için klon lokal olarak.

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

Bu çalışacak outline-modeve outline-minor-modeaynı zamanda gibi onlara modlar bu yapı, org-mode. Yerel anahtar haritaları alma konusunda bazı bilgiler buldum , ancak hangisinin kopyalanacağını seçeceğimi bilmiyorum. Ayrıca tampon yerel anahtarları ayarlamak için otomatik olarak ara belleğe özgü küçük modlar oluşturma işlevine sahip bir sayfa var, ancak bu sorun için kapsam dışı görünüyor.


1
Bunu paylaştığın için teşekkür ederim. Kullanarak outline-mode-mapyerine org-mode-mapben yönetilen bu çalışmaya yapmak AUCTeXile outline-minor-modegüzel olan.
Oleg Domanov

Bu arada, outline-mode'işlevi, hide-bodybaşlıklar dışındaki her şeyi gizler.
Oleg Domanov

@OlegDomanov Bu bilgi için teşekkürler! Kullanmak kod geliştirilmiş outline-mode-mapve hide-bodyve diğer birkaç küçük iyileştirmeler.
blujay

2

Son olarak, bu paket içinde uygulanmıştır org-sidebar:

org-sidebar-ağaç demosu


1
Hoooray! Bazen sadece çalışmayı durduran bir shakey kurulumum var, şimdi bir paketse kesinlikle BRILLIANT!
Thriveth

0

Aquamacs'ı metin editörü olarak kullanmak isteyen programcı olmayanlardan iki düşük kira önerisi (ne yapıyorum):

  1. arabellek içi komutlarla ileri geri geçiş yapma:

BAŞLANGIÇ: girinti (şelale türü anahat tüm olarak görmek daha kolay göstermek için)

bu, sekme odaklı arabellek görüntüleme içindir

ve

+ SEÇENEKLER: H: N, ki burada N = = html verme işleminde görmek istediğiniz seviye sayısı, bu da öneri # 2

bakınız: https://emacsclub.github.io/html/org_tutorial.html

  1. TOC görmek için html (CC CE hh) olarak dışa aktarın. html veya text (CC CE ta) metin çıktısını kolayca girintiye çıkaracak birini bulamıyorum

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.