लाइनों के अंत तक चलते रहें


9

कुंजी बाइंडिंग C-a/C-eका डिफ़ॉल्ट केवल एक चीज के लिए है, लाइन की शुरुआत / अंत तक जाएं, क्या कोई पैकेज है जो Emacs को इस तरह कार्य कर सकता है:

  1. यदि मैं एक पंक्ति के अंत में नहीं हूं, तो पंक्ति के अंत में C-eजाएंगे, अन्यथा, अगली पंक्ति के अंत में जाएं
  2. यदि मैं एक पंक्ति की शुरुआत में नहीं हूं, C-aतो लाइन की शुरुआत में जाऊंगा, अन्यथा अगली पंक्ति की शुरुआत में जाऊंगा।

मुद्दा यह है कि आप C-a/eअपनी उंगली तक पहुँचने के लिए बस हर लाइन की शुरुआत / अंत तक जाने के लिए मार रख सकते हैं C-n/p

और एक उपसर्ग ( C-u) के साथ वे विपरीत दिशा में लाइन की शुरुआत / अंत तक जाएंगे।


@Kaushalmodi के नीचे एक उत्तर के लिए एक टिप्पणी में कहा गया है कि मैंने आपके प्रश्न की गलत व्याख्या की हो सकती है। क्या आप C-a"ऊपर" जाना चाहते हैं और C-e"नीचे" जाना चाहते हैं? दूसरे शब्दों में, आइटम 1 और 2 में समान "अगली पंक्ति" का अर्थ है?
कॉन्स्टेंटाइन

@ कॉन्स्टेंटाइन मैंने वास्तव में " C-aटू अप, एंड C-eडाउन" समस्या के बारे में सोचा था जब मैंने यह प्रश्न पोस्ट किया था, लेकिन फिर मैंने सोचा कि अगर किसी ने defunआपके जैसे समाधान दिए, तो किसी को पता चलेगा कि क्या करना है अगर वह C-a"अप" करना पसंद करता है ..
कोडिचन 24'14

ठीक; मुझे लगता है कि यह अभी भी फिक्सिंग के लायक है। मैं उत्तर को अपडेट करूंगा - यह केवल एक-पंक्ति परिवर्तन है।
कांस्टेंटाइन

जवाबों:


11

मुझे ऐसे पैकेज का पता नहीं है जो इस व्यवहार को सक्षम करेगा, लेकिन यहाँ एक तरीका यह है।

C-h k C-aयह जानने के लिए दबाएं कि C-aयह बाध्य है move-beginning-of-line; यह वह फ़ंक्शन है जिसे हमें संशोधित करने की आवश्यकता है --- या "शुरुआत से आगे बढ़" भाग को लागू करने के लिए उपयोग करें। इसी तरह, C-h kमैं पा सकता हूं forward-line, जिसका उपयोग ऊपर / नीचे जाने के लिए किया जाएगा।

एक फ़ंक्शन को एक कुंजी से बांधने में सक्षम होने के लिए हमें इसे एक कमांड बनाने की आवश्यकता है , इसलिए हमें interactiveविशेष फॉर्म ( इंटरएक्टिव का उपयोग करके देखें ) का उपयोग करने की आवश्यकता है । C-uउपसर्ग तर्क लेने के लिए हमें "P"कोड वर्ण की आवश्यकता होती है।

इसके साथ संयोजन bolp(एक पंक्ति की शुरुआत में eolpजाँच करें ) और (अगर एक पंक्ति के अंत में जाँच करें), हम लिख सकते हैं:

(defun my-move-beginning-of-line (arg)
  (interactive "P")
  (when (bolp) (previous-line (if arg -1 1)))
  (move-beginning-of-line nil))

(defun my-move-end-of-line (arg)
  (interactive "P")
  (when (eolp) (forward-line (if arg -1 1)))
  (move-end-of-line nil))

अब हम फिर से बाँध सकते हैं C-aऔर C-eइन्हें कॉल कर सकते हैं:

(global-set-key [remap move-beginning-of-line] #'my-move-beginning-of-line)
(global-set-key [remap move-end-of-line] #'my-move-end-of-line)

वैकल्पिक रूप से, कोई इसमें सलाह दे सकता है move-beginning-of-lineऔर move-end-of-line


यह वास्तव में अच्छी व्याख्या और एक सुरुचिपूर्ण समाधान है। my-move-beginning-of-lineसमारोह में एक टाइपो है .. यह होना चाहिए (previous-line (if arg -1 1))या (forward-line (if arg 1 -1))(1 और -1 स्विच)?
कौशल मोदी

@kaushalmodi: प्रश्न में आइटम 1 और 2 दोनों "अगली पंक्ति" कहते हैं, जिसे मैंने "डाउन" के रूप में व्याख्या की है। तो, चलिए सवाल लेखक से पूछते हैं! :-)
कांस्टेंटाइन

आह, मैंने ओपी के सवाल पर अपनी खुद की धारणा को जोड़ा। आप सही हैं, वह या तो उपयोग करते समय अगली पंक्ति में जाने के लिए निर्दिष्ट करता है । C-aC-e
कौशल मोदी

@kaushalmodi: यह पता चला है कि आप सही थे! मैंने C-a"ऊपर" जाने का उत्तर अपडेट किया ।
कांस्टेंटाइन

8

लाइब्रेरी misc-cmds.elमें लंबे समय से यह सुविधा थी।

ये प्रासंगिक आदेश हैं, और सुझाए गए प्रमुख बाइंडिंग (ये बाइंडिंग में किए गए हैं setup-keys.el)।

(cond ((fboundp 'move-beginning-of-line)
       (substitute-key-definition 'move-beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'move-end-of-line 'end-of-line+ global-map))
      (t
       (substitute-key-definition 'beginning-of-line 'beginning-of-line+ global-map)
       (substitute-key-definition 'end-of-line 'end-of-line+ global-map)))
(when (boundp 'visual-line-mode-map)
  (define-key visual-line-mode-map [remap move-beginning-of-line] nil)
  (define-key visual-line-mode-map [remap move-end-of-line]       nil)
  (define-key visual-line-mode-map [home] 'beginning-of-line+)
  (define-key visual-line-mode-map [end]  'end-of-line+)
  (define-key visual-line-mode-map "\C-a" 'beginning-of-visual-line+)
  (define-key visual-line-mode-map "\C-e" 'end-of-visual-line+)))

यहाँ C-h f end-of-line+एक उदाहरण के रूप में क्या कहा गया है:

end-of-line+ is an interactive compiled Lisp function in
`misc-cmds.el'.

It is bound to C-e, end.

(end-of-line+ &optional N)

Move cursor to end of current line or end of next line if repeated.
This is similar to `end-of-line', but:
  If called interactively with no prefix arg:
     If the previous command was also `end-of-line+', then move to the
     end of the next line.  Else, move to the end of the current line.
  Otherwise, move to the end of the Nth next line (Nth previous line
     if N<0).  Command `end-of-line', by contrast, moves to the end of
     the (N-1)th next line.

यह बहुत सुंदर है।
20

1

निम्नलिखित दो कार्य वांछित क्रियाएं करते हैं।

(defun move-beginning-of-line-or-previous (&optional pre)
  "Move to the start of the line. If we are already at the start
of the line, move to the start of the previous line or, if called 
with a prefix argument, the next line."
  (interactive "P")
  (let* ((pos (point)))
    (move-beginning-of-line nil)
    (if (= (point) pos)
        (if pre
            (next-line)
          (previous-line)))))

(defun move-end-of-line-or-next (&optional pre)
  "Move to the end of the line. If we are already at the end of
the line, move to the end of the next line or, if called with a 
prefix argument, the previous line."
  (interactive "P")
  (let* ((pos (point)))
    (move-end-of-line nil)
    (if (= (point) pos)
        (if pre
            (previous-line)
          (next-line)))))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.