एक बफर में दो स्थानों के बीच आगे और पीछे कैसे स्विच करें


38

कभी-कभी मैं खुद को अक्सर दो कार्यों के बीच बारी-बारी से पाता हूं जिन्हें मैं एक दूसरे के साथ मिलकर संपादित करता हूं। इन स्थितियों में, C-s <functionname>अन्य फ़ंक्शन पर स्विच करने और फिर उस सटीक स्थान को ढूंढने के लिए यह कठिन और दर्दनाक है, जिसे मैं पहले संपादित कर रहा था।

मैं मार्कर कैसे सेट करूं और फिर बफ़र में दो स्थानों के बीच आसानी से आगे पीछे कूदूं?


3
आप यह गलत कर रहे है। आपके पास एक ऊर्ध्वाधर विभाजन दृश्य होना चाहिए ताकि आप एक ही समय में दोनों फ़ंक्शन देखें।
कैप्टनकोडमैन

8
मैं असहमत हूं कि ओपी "गलत कर रहा है।" जबकि एक विभाजित विंडो सहायक होगी, ओपी को अभी भी दोनों कार्यों को संपादित करते समय खिड़कियों के बीच आगे और पीछे कूदने की आवश्यकता है। इसके अलावा, यह प्रश्न विशिष्ट उपयोग के मामले से अधिक सामान्य है: ओपी जल्दी से एक बफर में विभिन्न स्थानों पर कूदने में सक्षम होना चाहता है। नीचे दिए गए उत्तर के बहुत सारे उपयोगी तरीके इसे करने के लिए देते हैं।
दान

@ वह शांत आदमी है, और मैं आपसे सहमत हूं, लेकिन मेरी प्रतिक्रिया उसकी समस्या को हल करने का इरादा नहीं है - केवल यह बताने के लिए कि कोई वैकल्पिक तरीका है।
कैप्टनकोडमैन

4
@ CaptainCodeman, यह ठीक है, हालांकि नीचे टी। वेरनॉन का जवाब विभाजन-खिड़की विकल्प प्रदान करता है। कृपया मेरी टिप्पणी को पोस्ट में सक्रिय भाषा के लिए अधिक सामान्य अनुरोध के रूप में मानें।
दान

1
@CaptainCodeman आप बिल्कुल सही हैं। मुझे इस बात की जानकारी नहीं थी कि एमएसीएस एक ऊर्ध्वाधर विभाजन दृश्य का समर्थन करता है। जैसे, मैंने उस उत्तर को स्वीकार कर लिया है जो इन ऊर्ध्वाधर विभाजन विचारों के उपयोग का विवरण देता है।
वेदाद शाकिब

जवाबों:


20

खिड़कियों को खाली करता है

C-x 2वर्तमान बफर के नीचे एक और विंडो (= फ़्रेम को विभाजित करें) खोलेगी, उसी बफर से जुड़ी। आप दूसरे को प्रभावित किए बिना किसी भी विंडो में पॉइंट ले जा सकते हैं।

आप एक विंडो से दूसरी विंडो का उपयोग कर सकते हैं C-x o। अंतर्निहित विंडमॉव लाइब्रेरी कुछ फ़ंक्शन प्रदान करती है जो खिड़कियों के बीच नेविगेट करना आसान बनाती है।

यदि यह विधि आपको सूट करती है, तो आप अप्रत्यक्ष बफ़रों पर भी नज़र डालना चाहते हैं ।

यहाँ छवि विवरण दर्ज करें


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

@Francesco मैं देख रहा हूं कि अब आपका क्या मतलब है (अप्रत्यक्ष बफ़र्स के बारे में अन्य उत्तर के साथ), वास्तव में विकल्प का उपयोग करना बहुत आसान है। यह वह उपयोग नहीं है जो मेरे मन में था: अप्रत्यक्ष बफ़र्स का मेरा उपयोग एक अलग विंडो का उपयोग करने की जगह नहीं लेता है, लेकिन यह संकीर्णता के साथ दृश्य को बदलने की अनुमति देता है, उदाहरण के लिए। समय मिलने पर मैं उत्तर में कुछ शब्द जोड़ूंगा।
टी। वेरॉन

56

रजिस्टर:

C-xrSPCरन point-to-register
C-xrjचलता हैjump-to-register

संकेत दिए जाने पर रजिस्टर निर्दिष्ट करने के लिए कोई भी वर्ण लिखें। 1

बुकमार्क्स:

C-xrmरन bookmark-set
C-xrbचलता हैbookmark-jump

निशान की अंगूठी:

C-SPCC-SPCनिशान की अंगूठी के लिए वर्तमान स्थिति को धक्का देता है (इसे सक्रिय छोड़ने के बिना)।
C-uC-SPCमार्क रिंग को चबूतरे, पिछली स्थिति में कूदते हुए। संपूर्ण रिंग के माध्यम से नेविगेट करने के लिए आप इसका बार-बार उपयोग कर सकते हैं।

ध्यान दें कि कुछ कमांड (विशेष रूप से जो आपको अपने मूल स्थान से अज्ञात या मनमानी दूरी को स्थानांतरित करने के लिए उत्तरदायी हैं) स्वचालित रूप से मार्क रिंग में धकेल देंगे ताकि आप C-uC-SPCबाद में वापस आने के लिए उपयोग कर सकें । इसमें शामिल है isearch, इसलिए C-sकहीं जाने के लिए उपयोग करने के बाद , आप आसानी से फिर से वापस कूद सकते हैं।

विनिमय बिंदु और निशान:

और Tu Do टिप्पणियों के रूप में, C-xC-xरन exchange-point-and-markजो दो स्थानों के बीच कूदने के लिए बहुत उपयोगी है। यह चिह्न / क्षेत्र को भी सक्रिय करता है, लेकिन आप C-SPCहाइलाइटिंग को साफ़ करने के लिए उपयोग कर सकते हैं।


1 यदि आप elisp में रजिस्टर कार्यक्षमता का लाभ ले रहे हैं, तो चार के बजाय नाम के लिए कुछ गैर-परस्पर विरोधी प्रतीक का उपयोग करें, ताकि आप अंतःक्रियात्मक रूप से सेट किए गए रजिस्टरों के साथ संघर्ष न कर सकें (जब तक, निश्चित रूप से, आप करना चाहते हैं उस)।


2
आपको इसके C-x C-xसाथ ही जोड़ना चाहिए , क्योंकि यह दो पदों के बीच आगे और पीछे कूद सकता है। C-u C-SPCमार्क की अंगूठी चबूतरे और फिर से निष्पादित करें बिंदु कहीं और स्थानांतरित हो जाएंगे।
Tu Do

18

Phils के जवाब के अलावा, कुछ और विकल्प हैं:

  • हेलम-ऑल-मार्क-रिंग्स : यह आपको स्थानीय और वैश्विक दोनों मार्क रिंग्स की सामग्री को एक अनुकूल इंटरफेस में देखने की अनुमति देता है, इसलिए आप हमेशा वहीं वापस कूद सकते हैं जहां आप थे। आप के साथ निशान धक्का कर सकते हैं C-SPC C-SPC। डेमो:

पतवार सभी-मार्क-छल्ले

  • helm-semantic-or-imenu : वर्तमान फ़ाइल में सभी उपलब्ध परिभाषाओं को सूचीबद्ध करें। यदि कर्सर परिभाषा के अंदर है, तो उस परिभाषा को हाइलाइटर को सक्रिय करता है।

  • sr-speedbar : एक फ़ाइल ब्राउज़र जो प्रत्येक फ़ाइल में अपनी परिभाषाओं को सूचीबद्ध करता है। यह आईडीई में पेड़ की रूपरेखा के समान है।


9

रजिस्टरों और मार्करों के अलावा (मेरे और मेरे दोनों के बारे में @ phils का जवाब देखें, मार्करों के बारे में आइकल्स का जवाब), बुकमार्क , विशेष रूप से या तो ऑटोनोमेड या अस्थायी बुकमार्क, इसके लिए मददगार हो सकते हैं। आपको इन विशेष बुकमार्क प्रकारों के लिए लाइब्रेरी बुकमार्क + की आवश्यकता है ।

  • एक autonamed बुकमार्क एक है कि आप नाम की जरूरत नहीं है है। इसे बनाना और हटाना त्वरित है: बस एक कुंजी मारो। वही कुंजी बिंदु पर एक बुकमार्क बनाता है या हटाता है। (डिफ़ॉल्ट रूप से, यह बाध्य है C-x p RET, लेकिन आप निश्चित रूप से किसी भी कुंजी का उपयोग कर सकते हैं।)

  • ऑटोनॉम्ड बुकमार्क सामान्य, लगातार, बुकमार्क की तरह होते हैं। लेकिन आप वैकल्पिक रूप से उन्हें स्वचालित रूप से हटा सकते हैं।

  • आप अस्थायी बुकमार्क भी बना सकते हैं या किसी भी मौजूदा बुकमार्क को अस्थायी बना सकते हैं । उदाहरण के लिए, आप स्वतःनामित बुकमार्क को स्वचालित रूप से अस्थायी बनाने के लिए चुन सकते हैं।

  • आप दिए गए बुकमार्क के सेट के बीच जल्दी से साइकिल चला सकते हैं। उदाहरण के लिए, ऑटोनॉम्ड बुकमार्क के बीच चक्र करने के लिए, कमांड का उपयोग करें bmkp-next-autonamed-bookmark-repeatऔर bmkp-previous-autonamed-bookmark-repeat(उन्हें कुंजियों से बांधकर)।

  • आप बुकमार्क किए गए स्थानों को विभिन्न तरीकों से हाइलाइट कर सकते हैं, इसलिए उन्हें स्पॉट करना आसान है।


7

स्वीकृत उत्तर में उल्लिखित अप्रत्यक्ष बफ़र्स के संबंध में ...

M-x clone-indirect-bufferवर्तमान बफर के लिए एक अप्रत्यक्ष बफर बनाएगा। नए बफ़र का नाम '<2>' होगा, इसे जोड़ा जाएगा (या अधिक संख्या में अगर आपको पहले से डुप्लिकेट बफ़र नाम मिल गए हैं)। नया बफर एक नई विंडो में खोला गया है। आप किसी एकल विंडो का उपयोग करके वापस स्विच कर सकते हैं C-x 0या C-x 1

साथ M-x winner-modeआप आसानी से दो स्थानों के बीच स्विच कर सकते हैं। विंडो कॉन्फ़िगरेशन के बीच C-c <left>/ M-x winner-undoऔर C-c <right>/ M-x winner-redoस्विच। इस मामले में विन्यास एक फाइल को देखने वाले दो बफ़र्स में स्थिति होगा।

नोट: winner-undoऔर winner-redoफ़ंक्शंस कॉन्फ़िगरेशन की सूची पर काम करते हैं। यदि कॉन्फ़िगरेशन बदल दिया जाता है, उदाहरण के लिए चलती बिंदु, तो वर्तमान कॉन्फ़िगरेशन सूची का प्रमुख बन जाता है और winner-redoअमान्य है, इस मामले winner-undoमें पिछली स्थिति को वापस लाएगा।

ओपी की स्थिति के लिए यह निम्नलिखित प्रक्रिया की ओर जाता है;

  1. विजेता मोड चालू करें M-x winner-mode
  2. फ़ाइल पर जाएँ (फ़ाइल नाम: File1.txt, बफर नाम: File1.txt)
  3. M-x clone-indirect-buffer (नया अप्रत्यक्ष बफर नाम: File1.txt <2>)
  4. करंट विंडो को ही विंडो बनाएं C-x 1
  5. पहले स्थान संपादित करें, परिवर्तन करें।
  6. मूल बफर विज़िटिंग फ़ाइल पर स्विच करें, C-x b(जब तक कि चरण 3 के बाद किसी अन्य बफर पर स्विच नहीं किया जाता है, तब तक डिफ़ॉल्ट मूल बफर होगा)। यह विजेता को वापस स्विच करने के लिए एक नया कॉन्फ़िगरेशन बनाता है।
  7. वैकल्पिक संपादन स्थान खोजें, परिवर्तन करें।

पिछले संपादन स्थान (विंडो कॉन्फ़िगरेशन) पर स्विच इस बात पर निर्भर करता है कि स्विच के बीच विंडो कॉन्फ़िगरेशन में कोई बदलाव किया गया है या नहीं;

  • यदि एक बदलाव का उपयोग कर स्विच किया जाता है C-c <left>/ M-x winner-undo
  • कोई परिवर्तन नहीं का उपयोग कर स्विच किया जाता है C-c <left>/ M-x winner-undoवापस के लिए और C-c <right>/ M-x winner-redoआगे के लिए।

एक बदलाव दूसरे के अलावा winner-undoया कुछ भी है winner-redo


3

यदि आप उपयोग करते हैं evil-mode, तो vim लेयर, C-oऔर फिर C-iवही काम करेगा।

वे कमांड चलाते हैं evil-jump-backward/ forwardC-oकूद सूची में पुराने स्थान पर कूदता है, जो स्वचालित रूप से सेट किया गया है (चिह्न गति कमांड पर सेट हैं)। C-iउलटा हो जाता है। हम यह भी उपयोग कर सकते हैं TABएक के बाद C-oके बजाय C-i। इसलिए दोनों फ़ंक्शन का उपयोग करना आपको अपने वर्तमान बफर में आगे और पीछे ले जाएगा।

यदि आप चाहते हैं कि यह सुविधा क्रॉस-बफ़र हो, तो देखें evil-jumpers: http://melpa.org/#/evil-jumper

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

नोट: मैंने इसे इस विकी पर सीखा है


यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण मांगने या उसका अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें।
दान

1
डी'ओह, और उस स्वचालित टिप्पणी से, मेरा वास्तव में मतलब है कि उत्तर ऐसा लगता है जैसे किसी अन्य उत्तर पर टिप्पणी करना था । आप इस चाहते हैं, तो अपने आप में एक जवाब होना करने के लिए आप क्या पर एक छोटा सा विस्तार कर सकता है C-oऔर C-iक्या ज़रूरत है?
दान

आप सही हे ! किया हुआ।
एहविंस

2

यदि आप आइकल्स का उपयोग करते हैं तो आप जल्दी mark-ringसे प्रत्येक बफ़र या global-mark-ring(जो प्रत्येक बफ़र में एक एकल मार्कर है) के मार्करों के बीच नेविगेट कर सकते हैं ।

आप मल्टी-कमांड C-- C-SPC (एक बफ़र के लिए mark-ring) या C-- C-x C-SPC(के लिए ) का उपयोग करके ऐसा करते हैं global-mark-ring। कुंजी को एक बार मारने के बाद, आप रिंग के मार्करों के बीच जाने के लिए सामान्य आइकल्स साइकिलिंग कीज़ आदि का उपयोग करते हैं ।

(उपसर्ग arg के बिना समान कुंजियाँ चिह्न सेट करती हैं set-mark-command) ( और वैश्विक चिह्न पॉप ( pop-global-mark), क्रमशः, जैसे वेनिला Emacs में करते हैं।)

प्रत्येक मार्कर की पंक्ति के पाठ को एक पूर्ण उम्मीदवार के रूप में उपयोग किया जाता है। जैसे ही आप टाइप करते हैं, आपका मिनीबफ़र इनपुट उम्मीदवारों को उस मैच से जोड़ देता है (जैसे, मिलान या रीजैक्सप मिलान)। आप मिलान मार्करों के बीच जल्दी से साइकिल चला सकते हैं या उनमें से किसी पर भी सीधे जा सकते हैं। आप C-,साइकिल चलाने के लिए सॉर्ट ऑर्डर ( ) भी बदल सकते हैं ।


2

एक न्यूनतम लेकिन अक्सर उपयोगी संभावना - जब आप बस दूसरे फ़ंक्शन को झांकना चाहते हैं - सेटिंग है

(setq scroll-preserve-screen-position t)

जो आपको बीच में स्विच करते समय अपनी सटीक शुरुआती कर्सर स्थिति में लाता है C-vऔर M-v


1

evil-modeऔजार -शैली मार्करों को लागू करता है । आप ( m, यानी evil-set-marker) के साथ मार्कर सेट कर सकते हैं और backtick `( evil-goto-mark) या चिह्न की रेखा '( evil-goto-mark-line) के साथ चिह्न पर जाएं ।

इसलिए, आप पहले स्थान पर "a" के साथ ma, दूसरे स्थान पर "b" का चिह्न बना सकते हैं ma, और फिर 'a"a" 'bको चिह्नित करने के लिए और "b" को चिह्नित करने के लिए कूद सकते हैं।


1

imenu और नीचे कोड का उपयोग करें

(defvar rimenu-position-pair nil "positions before and after imenu jump")
(add-hook 'imenu-after-jump-hook
          (lambda ()
            (let ((start-point (marker-position (car mark-ring)))
                  (end-point (point)))
              (setq rimenu-position-pair (list start-point end-point)))))

(defun rimenu-jump ()
  "jump to the closest before/after position of latest imenu jump"
  (interactive)
  (when rimenu-position-pair
    (let ((p1 (car rimenu-position-pair))
          (p2 (cadr rimenu-position-pair)))

      ;; jump to the far way point of the rimenu-position-pair
      (if (< (abs (- (point) p1))
             (abs (- (point) p2)))
          (goto-char p2)
          (goto-char p1))
      )))

1

पिछले 20 वर्षों से, मैं इन दो रत्नों का उपयोग कर रहा हूं:

(defun ska-point-to-register ()
  "Store cursorposition _fast_ in a register. Use ska-jump-to-register
to jump back to the stored position."
  (interactive)
  (point-to-register 8))

(defun ska-jump-to-register ()
  "Switches between current cursorposition and position
that was stored with ska-point-to-register."
  (interactive)
  (let ((tmp (point-marker)))
    (jump-to-register 8)
    (set-register 8 tmp)))

मैं उन्हें C- से बांधता हूं। और सी-, क्रमशः और उन्हें लगातार साकार करने के बिना उपयोग करें।

हां, रजिस्टर और मार्कर और इस तरह के बहुत अधिक लचीले और शक्तिशाली हैं, लेकिन फिर भी, यह उन छोटे, त्वरित सहायकों में से एक है जो मेरे लिए अन्य संपादकों पर स्विच करना असंभव बनाते हैं।


1
वाह, आप इसे लंबे समय से उपयोग कर रहे हैं जितना मैं जीवित हूं।
वेदाद शाकिब

मुझे लगता है कि यह अभी तक नोड या विज़ुअल स्टूडियो कोड की दुनिया में नहीं होगा, लेकिन कौन जानता है ... :-) युवा और स्मार्ट लोगों को अभी भी Emacs उठाते हुए देखने के लिए खुशी है। ओह, और, मैं अभी तक 50 नहीं; ;-)
स्टीफन कम्पहेसन

यह बहुत बढ़िया है। मैं क्षणिक-चिह्न-सक्षम मोड के साथ दो मनमाना स्थानों के बीच स्विच करने का एक तरीका खोजने की कोशिश कर रहा हूं, और यह समस्या को बहुत अच्छी तरह हल करता है :) धन्यवाद।
प्लेगहैमेर

0

आप मैक्रोज़ का लाभ भी उठा सकते हैं, क्योंकि वे जल्दी से सुविधाजनक चाबियों से बंधे हो सकते हैं।

उदाहरण के लिए, स्थिति N का उपयोग करने के लिए एक छलांग रिकॉर्ड करें <F3> M-g g N <F4>और इसे कुंजी F5 के साथ असाइन करें C-x C-k b <F5>। फिर स्थिति एम और एफ 6 के साथ भी ऐसा ही करें। अब से आप बस N और M के बीच कूदने के लिए F5 और F6 को वैकल्पिक कर सकते हैं।

और भी आसान है, क्योंकि <F4>कार्यान्वित पिछले मैक्रो दर्ज की गई और <C-u> F4पिछले एक के बगल में, आप कुंजी बाइंडिंग कदम और बस वैकल्पिक पदों को छोड़ का उपयोग कर सकते हैं <F4>और <C-u> F4


एक और बल्कि कट्टरपंथी संभावना के साथ एक और खिड़की में एक अप्रत्यक्ष बफर बनाने के लिए है <C-x> 4 c। इस बफ़र में समान सामग्री है लेकिन एक अलग बिंदु स्थिति हो सकती है। अब बस <C-x> oसामान्य तरीके से खिड़कियों के बीच वैकल्पिक करें ।

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