मैं सामग्री की एक गतिशील तालिका के रूप में 2-बफर में एक ऑर्ग-मोड रूपरेखा कैसे प्राप्त कर सकता हूं?


25

जब मैं बड़े दस्तावेजों को संपादित करता हूं, तो मैं यह देखना चाहूंगा कि एक अलग बफर में रूपरेखा (बिना सामग्री के) को देखकर मैं कहां हूं। जैसे जब आप पीडीएफ फाइल पढ़ते हैं तो बाईं ओर एक TOC होता है। (निचे देखो)

Org- मोड में रूपरेखा का विस्तार / पतन संभव है। लेकिन क्या एक अलग बफर में बाईं (या दाएं) में एक स्थिर रूपरेखा होना संभव है ताकि जब आप शीर्षकों पर क्लिक करें, तो दूसरा बफर उस स्थिति में चला जाए?

Kinda इस तरह, लेकिन org- मोड के लिए? यहाँ छवि विवरण दर्ज करें

[संपादित करें] बहुत जो मैं चाहता के करीब है। पहेली का लापता टुकड़ा एक हेडिंग / (या वास्तव में किसी भी बिंदु) पर क्लिक करते समय उसी स्थान पर कूदना है।
clone-indirect-buffer

इसके लिए मैंने कुछ कोड लिखने की कोशिश की है: अन्य क्लोन बफर को उसी बिंदु पर ले जाएं? (अप्रत्यक्ष बफ़र्स की सिंक स्थिति) (ऑर्ग-मोड)

लेकिन यह काम नहीं करता है अगर सामग्री ढह गई है। यदि वह काम करने के लिए बनाया जा सकता है, तो क्लोन-इनडरेक्ट-बफर इसका पूर्ण समाधान है।

[संपादित करें 2 समाधान]
ऊपर दिए गए लिंक में और नीचे दिए गए उत्तर में कोड जंपिंग बैक को आगे और पीछे हल करने के लिए गठबंधन करें।

;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 एक छोटे परीक्षण के बाद, ऐसा लगता है कि यह ओपी क्या चाहता है से अलग कुछ करता है: यह वर्तमान उपप्रकार को एक अप्रत्यक्ष बफर में कॉपी करता है। org-sparse-tree-to-indirect-bufferउदाहरण के लिए, हमें एक फ़ंक्शन की आवश्यकता होगी , लेकिन यह मौजूद नहीं है।
टी। वेरॉन

थोड़ा आगे देखने के बाद, ऑर्गन-पैनस
सैमुअल फ्लिंट

मुझे लगता है कि यह भी imenu- सूची का उल्लेख करने के लायक है । इसमें कुछ आवश्यकताओं का अभाव है लेकिन दूसरों को संबोधित करता है।
गरमागरम

ऑर्ग-ट्री-टू-इनडायरेक्ट-बफर कमाल है।
निन्रॉड

जवाबों:


9

कुछ विकल्प दिमाग में आते हैं। पहले दो हैं speedbar, जो कथित रूप से अच्छी तरह से खेलते हैं org-mode, और minimap, हालांकि मैंने उनका उपयोग नहीं किया है इसलिए व्यक्तिगत रूप से उनके लिए वाउच नहीं कर सकता।

सबसे सरल विकल्प क्या हो सकता है (और सबसे लचीला भी), एक अप्रत्यक्ष बफर का उपयोग करना होगा ।

व्यवहार में, आप उस orgबफर पर जाएंगे, जिसके लिए आप एक रूपरेखा, हिट चाहते हैं M-x clone-indirect-buffer(उपयोग करें C-u M-x clone-indirect-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)))))

मैंने स्पीडबार / सीन-स्पीडबार की कोशिश की। यह बहुत अच्छा है लेकिन यह केवल पहले 2 स्तरों को दर्शाता है। मैंने पूछा कि क्या यहां अधिक स्तर होना संभव है: emacs.stackexchange.com/questions/9533/… अप्रत्यक्ष बफर एक अच्छा विकल्प है। मुझे आश्चर्य है कि अगर यह किसी भी तरह से अन्य बफर में कर्सर को उसी स्थिति में स्थानांतरित करना संभव है, जैसा कि क्लोन बफर में है ..
लियो यूफिमेटसेव

मैंने कोड लिखने की कोशिश की जो दूसरे बफर में एक ही स्थान पर कूद जाएगा, लेकिन यह केवल तभी काम करता है जब सब कुछ विस्तारित हो। यदि यह काम करने के लिए बनाया जा सकता है ताकि यह ऑटो-फैल जाए, तो क्लोन-बफर एक सही समाधान है। पोस्ट: emacs.stackexchange.com/questions/9536/…
सिंह

ऊपर दिए गए कोड के स्निपेट के लिए धन्यवाद। बहुत सराहना की ^ _ ^।
सिंह उफिम्त्सेव

16

कैसे के बारे में: M-x occur RET ^*+ RET(ध्यान दें कि regexp के अंत में एक स्थान है)।


मुझे नहीं पता कि किसी ने इस जवाब को क्यों गलत ठहराया, मुझे लगता है कि यह वास्तव में एक बहुत ही साफ-सुथरा बिल्ड-इन परेशानी मुक्त समाधान है। केवल विचित्र बात यह है कि यह आपके आस-पास का अनुसरण नहीं करता है। यानी यह होने वाले बफर में स्पष्ट नहीं है कि आप कहां हैं, (उदाहरण के लिए वर्तमान शीर्षक को हाइलाइट करें) और यह लंबे समय तक दस्तावेज़ों के लिए स्क्रॉल नहीं करता है। लेकिन छोटे दस्तावेजों के लिए यह काम करता है।
सिंह उफिम्त्सेव

मुझे यह सरल, अंतर्निहित समाधान पसंद है। यदि किसी को हाइलाइटिंग की आवश्यकता है, तो होने के बजाय हेल्म-होने का उपयोग करें। एक अतिरिक्त लाभ मल्टी-ओग का उपयोग करके कई ओआरजी फ़ाइल बफ़र्स के लिए एकल नेविगेशन का उपयोग करने में सक्षम होना है। अंत में, घटित-संपादन के साथ, दोनों दृश्य, रूपरेखा दृश्य और विस्तारित दृश्य संपादित कर सकते हैं। किसी भी मामले में, मैं इसे वोट कर रहा हूं।
Emacs यूजर

इसके उत्थान के लिए जा रहे हैं क्योंकि इसकी भयानक, सरल और कुशल है
Gambo

बहुत आसन। कितनी होशियार। तो हैक कर लो। इतना अद्भुत।
डोलॉम

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मैं इसके AUCTeXसाथ काम करने में कामयाब रहा outline-minor-mode, जो अच्छा है।
ओलेग डोमनोव

वैसे, outline-mode'का काम hide-bodyसुर्खियों को छोड़कर सब कुछ छिपा देता है।
ओलेग डोमनोव

@OlegDomanov उस जानकारी के लिए धन्यवाद! मैंने outline-mode-mapऔर hide-body, और कुछ अन्य छोटे सुधारों का उपयोग करने के लिए कोड में सुधार किया।
ब्ल्यूज

2

अंत में, यह पैकेज में लागू किया गया है org-sidebar:

ऑर्ग-साइडबार-ट्री डेमो


1
Hoooray! मेरे पास एक शेक सेटअप है जो कभी-कभी बस काम करना बंद कर देता है, यह बिलकुल सही है अगर यह अभी पैकेज है!
Thriveth

0

एक गैर-प्रोग्रामर से दो कम किराए के सुझाव (मैं क्या करूं) जो पाठ संपादक के लिए एक्वामैक का उपयोग करना पसंद करता है:

  1. इन-बफर कमांड के साथ आगे और पीछे टॉगल करें:

STARTUP: इंडेंट (पूरे के रूप में देखने के लिए आसान झरने के प्रकार को दिखाने के लिए)

यह बफर के टैब-संचालित देखने के लिए है

तथा

+ विकल्प: एच: एन, जहां एन = = एचटीएमएल निर्यात में आप कितने स्तर देखना चाहते हैं, जो सुझाव # २ है

देखें: https://emacsclub.github.io/html/org_tutorial.html

  1. TOC देखने के लिए html (CC CE hh) के रूप में निर्यात करें। मुझे कोई नहीं मिल सकता है जो आसानी से html या पाठ (CC CE टा) के पाठ उत्पादन को इंडेंट कर सके

0

मुझे कुछ इसी तरह की जरूरत थी, इसलिए मैंने एक साथ outline-tocमोड डाला । यह org- मोड डॉक्स के लिए काम करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.