न्यूनतम कीस्ट्रोक्स के साथ वर्तमान लाइन को मारें या कॉपी करें


32

मैं C-a C-k C-kपूरी लाइन को मारने के लिए करता हूं ।

यदि मैं इसे मारने के बजाय लाइन को कॉपी करना चाहता हूं , तो मैं C-/ C-/ ऊपर दिए गए अनुक्रम को टाइप करने के बाद सही हिट कर सकता हूं ।

वैकल्पिक रूप से, मैं कर सकता हूं C-a C-SPC C-n M-w

क्या पूरी रेखा बिंदु को मारने या उसकी प्रतिलिपि बनाने का एक तेज़ तरीका है?


1
वाह! इन उत्तर से पता चलता है कि बड़ी लंबाई वाले लोग बिल्ट-इन का उपयोग करने से बचने के लिए जाएंगे kill-whole-line। :)
उमर

जैसा कि नीचे बताया गया है, उपयोग करें evil-mode। विम आदेशों को जानें, आपको पछतावा नहीं होगा!
ए ब्लिज़ार्ड

जवाबों:


44

आप kill-whole-lineपूरे लाइन बिंदु को मारने के लिए उपयोग कर सकते हैं । बिंदु की स्थिति मायने नहीं रखती है। यह आदेश C-S-DELडिफ़ॉल्ट रूप से बाध्य है ।

आप वैरिएबल को नॉन- वैल्यू पर सेट करके पूरी लाइन को मारने का निर्देश kill-line(बाध्य कर सकते हैं C-k) : kill-whole-linenil

(setq kill-whole-line t)

ध्यान दें कि इस काम के लिए लाइन की शुरुआत में बिंदु को होना चाहिए।


फिर ये दो रत्न हैं ( emacs-fu के माध्यम से ):

(defadvice kill-region (before slick-cut activate compile)
  "When called interactively with no active region, kill a single line instead."
  (interactive
   (if mark-active
       (list (region-beginning) (region-end))
     (list (line-beginning-position) (line-beginning-position 2)))))

(defadvice kill-ring-save (before slick-copy activate compile)
  "When called interactively with no active region, copy a single line instead."
  (interactive
   (if mark-active
       (list (region-beginning) (region-end))
     (message "Copied line")
     (list (line-beginning-position) (line-beginning-position 2)))))

इनके स्थान पर आप लाइन को मार सकते हैं या कॉपी कर सकते हैं, जो एक कीस्ट्रोके के साथ है :

  • C-w वर्तमान लाइन को मारता है
  • M-w वर्तमान लाइन को कॉपी करता है

ध्यान दें कि यदि कोई सक्रिय क्षेत्र है, kill-regionऔर kill-ring-saveवे वही करते रहेंगे जो वे सामान्य रूप से करते हैं: उसे मारें या उसकी नकल करें।


पोर्टिंग slick-cutऔर slick-copyनई सलाह प्रणाली के लिए

24.4 Emacs एक नई सलाह प्रणाली का परिचय देता हैdefadvice अभी भी काम करते समय , एक मौका है कि इसे भविष्य के संस्करणों के एमएसीएस में नई प्रणाली के पक्ष में चित्रित किया जा सकता है। इसके लिए तैयार करने के लिए, आप अपडेट किए गए संस्करणों का उपयोग करना चाहते हैं slick-cutऔर slick-copy:

(defun slick-cut (beg end)
  (interactive
   (if mark-active
       (list (region-beginning) (region-end))
     (list (line-beginning-position) (line-beginning-position 2)))))

(advice-add 'kill-region :before #'slick-cut)

(defun slick-copy (beg end)
  (interactive
   (if mark-active
       (list (region-beginning) (region-end))
     (message "Copied line")
     (list (line-beginning-position) (line-beginning-position 2)))))

(advice-add 'kill-ring-save :before #'slick-copy)

2
ध्यान दें कि kill-regionऔर तब kill-ring-saveभी काम करें जब क्षेत्र "सक्रिय" न हो। यह उस व्यवहार को ओवरराइड करेगा। मैं समय-समय पर उस व्यवहार का उपयोग करता हूं, लेकिन अगर आप उन्हें इस तरह इस्तेमाल करने के लिए उपयोग नहीं करते हैं, तो आप शायद अंतर को नोटिस नहीं करेंगे।
nispio

@nispio कब / कैसे kill-regionआदि उपयोगी है / कब mark-activeहै इस पर विस्तार करें nil
फिल हडसन

1
@PhilHudson चिह्न सक्रिय होने के बिना सेट (और आमतौर पर) हो सकता है। C-SPCसक्रिय करने के लिए दो बार करने की कोशिश करें और फिर निशान को निष्क्रिय करें। कर्सर को फ़ाइल में कहीं और ले जाएं और चलाएं kill-regionऔर यह बिंदु और निशान के बीच के क्षेत्र को मार देगा, भले ही निशान सक्रिय न हो। आदेशों के कुछ उदाहरण जो सेट करते हैं (लेकिन सक्रिय नहीं होते हैं) निशान हैं yankऔर isearch। इन प्रकार के आदेशों को करने के बाद, मुझे पता है कि निशान कहां है, भले ही वह सक्रिय न हो, और कई कमांड (सहित kill-region) मुझे स्पष्ट रूप से सक्रिय किए बिना चिह्न का उपयोग करने देगा।
nispio

धन्यवाद @nispio बेशक। यह कैसे होता है, विशेष रूप से, इससे पहले कि दृश्य क्षेत्र हाइलाइटिंग डिफ़ॉल्ट रूप से प्रमुख रिलीज के एक जोड़े को वापस हो गया है, है ना? मैं "सेट" के साथ "सक्रिय" को भ्रमित कर रहा था।
फिल हडसन

1
यह किसी भी एसएक्स पर पोस्ट किया गया सबसे बड़ा जवाब है। गंभीरता से।
बेंजामिन लिंडक्विस्ट

15

मैंने अपने लिए जो समाधान खोजा है, वह उपसर्ग तर्कों का उपयोग करना है।

मेरे लिए, आधी लाइन को मारना एक उपयोगी विशेषता है, लेकिन मैं पूरी लाइनों को मारने का एक आसान तरीका भी चाहता हूं। इसलिए मैंने इसे इसलिए बनाया कि kill-lineजब उपसर्ग तर्क दिया जाए तो वह सब कुछ दृष्टि में हत्या कर दे।

(defmacro bol-with-prefix (function)
  "Define a new function which calls FUNCTION.
Except it moves to beginning of line before calling FUNCTION when
called with a prefix argument. The FUNCTION still receives the
prefix argument."
  (let ((name (intern (format "endless/%s-BOL" function))))
    `(progn
       (defun ,name (p)
         ,(format 
           "Call `%s', but move to BOL when called with a prefix argument."
           function)
         (interactive "P")
         (when p
           (forward-line 0))
         (call-interactively ',function))
       ',name)))

(global-set-key [remap paredit-kill] (bol-with-prefix paredit-kill))
(global-set-key [remap org-kill-line] (bol-with-prefix org-kill-line))
(global-set-key [remap kill-line] (bol-with-prefix kill-line))
(global-set-key "\C-k" (bol-with-prefix kill-line))

इस छोटे से स्थूल के साथ, C-kअभी भी बिंदु से मारता है, लेकिन C-3 C-kतीन पूरी लाइनों को निगलता है। एक बोनस के रूप में, हम kill-whole-lineव्यवहार करके प्राप्त करते हैं C-1 C-k


यह एक महान विचार है, इसे साझा करने के लिए धन्यवाद! :) आप एक या एक से अधिक लाइनों की प्रतिलिपि बनाने के लिए इस समाधान को कैसे अनुकूलित करेंगे? kill-ring-saveउपसर्ग तर्कों को स्वीकार नहीं करता है ...
itjeyd

@itsjeyd मुझे यकीन है कि दोनों उत्तरों को मर्ज करने के लिए ऐसा ही कुछ किया जा सकता है। लेकिन यह सिर्फ थोड़ा और काम करेगा।
मालाबार

अंतिम पंक्ति में पैराडिट-किल का उल्लेख है। क्या यह इरादा है?
बोकापार्टा-आईटी

1
ओह, ठीक है, धन्यवाद। हालांकि मुझे अपेक्षित व्यवहार नहीं मिल रहा है। अगर मैं एक लाइन के बीच में पॉइंटर लगाता हूं और C-3 C को हिट करता हूं, तो पहली लाइन पूरी तरह से नहीं मारी जाती है। क्या यह है कि यह काम करने वाला है या मैं कुछ गलत कर रहा हूं?
बोकापार्टा-आईटी

1
@ मालाबार आप सही कह रहे हैं, के kill-visual-lineलिए बाध्य है C-k। मैं इसे ठीक कर दूंगा। एक बार फिर धन्यवाद।
बोकापेटा-आईटी

15

एक पैकेज कहा जाता है whole-line-or-regionजो विभिन्न अंतर्निहित कमांडों को सलाह देता है ताकि वे वर्तमान रेखा पर कार्य करें यदि कोई क्षेत्र सक्रिय नहीं है, तो M-wवर्तमान लाइन को कॉपी करेगा, और C-wउदाहरण के लिए, इसे मार देगा। मैं वर्षों से पैकेज का उपयोग कर रहा हूं, और इसे अपरिहार्य लगता है।

इसके अतिरिक्त, यह पैकेज ऐसा बनाता है कि एक संख्यात्मक उपसर्ग लाइनों की संख्या को कार्य करने के लिए इंगित करेगा, इसलिए M-2 M-wदो पंक्तियों को कॉपी करेगा। यहाँ अन्य उत्तर उस आसान कार्यक्षमता को प्रदान नहीं करते हैं।

मैंने अपने गिथब खाते में पैकेज का रखरखाव किया, जब लेखक ने इसे बनाए रखना बंद कर दिया और अनुत्तरदायी बन गया।

whole-line-or-region इस व्यवहार को आगे के आदेशों में जोड़ने के लिए सुविधाएं प्रदान करता है, क्या आपको इसकी आवश्यकता है


कृपया इसके लिए एक एमईएलपीए मुद्दा दर्ज करें, क्योंकि मुझे यकीन नहीं है कि आपका क्या मतलब है: मैं इस पैकेज को एमईएलपीए से हर समय मुद्दों के बिना स्थापित करता हूं।
संन्यासी

9

यह रूढ़िवादी emacs के लिए एक जवाब नहीं है। यदि, हालांकि, आप evilआधुनिक संपादन के साथ निंदा करने के लिए तैयार हैं , तो आप कर सकते हैं:

  • dd किल लाइन के लिए
  • cc कॉपी लाइन के लिए

दोनों को मारने / कॉपी करने के लिए लाइनों की संख्या के द्वारा उपसर्ग किया जा सकता है (जैसे, 4ccअगली 4 पंक्तियों की नकल करेगा)।


5

@Itsjeyd उत्तर के अलावा, क्या मैं उन दो कार्यों का सुझाव दे सकता हूं?

(defun xah-copy-line-or-region ()
  "Copy current line, or text selection.
When `universal-argument' is called first, copy whole buffer (but respect `narrow-to-region')."
  (interactive)
  (let (p1 p2)
    (if (null current-prefix-arg)
        (progn (if (use-region-p)
                   (progn (setq p1 (region-beginning))
                          (setq p2 (region-end)))
                 (progn (setq p1 (line-beginning-position))
                        (setq p2 (line-end-position)))))
      (progn (setq p1 (point-min))
             (setq p2 (point-max))))
    (kill-ring-save p1 p2)))

(defun xah-cut-line-or-region ()
  "Cut current line, or text selection.
When `universal-argument' is called first, cut whole buffer (but respect `narrow-to-region')."
  (interactive)
  (let (p1 p2)
    (if (null current-prefix-arg)
        (progn (if (use-region-p)
                   (progn (setq p1 (region-beginning))
                          (setq p2 (region-end)))
                 (progn (setq p1 (line-beginning-position))
                        (setq p2 (line-beginning-position 2)))))
      (progn (setq p1 (point-min))
             (setq p2 (point-max))))
    (kill-region p1 p2)))

फिर, मुख्य परिभाषाएँ (आप शायद उन्हें अनुकूलित करना चाहेंगे):

(global-set-key (kbd "<f2>") 'xah-cut-line-or-region) ; cut

(global-set-key (kbd "<f3>") 'xah-copy-line-or-region) ; copy

(global-set-key (kbd "<f4>") 'yank) ; paste

ErgoEmacs के सौजन्य से


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

1
क्या ऐसा करना संभव है, लेकिन नीचे @Jonathan पोस्ट की तरह इसे संशोधित करें ताकि यह पहले sexp या शब्द ले और फिर अगर फिर से लाइन लेता है?
J Spen

@ जेस्पेन मैं क्या कर रहा हूं कार्य करने के लिए एक शॉर्टकट कुंजी प्रदान कर रहा है। जोनाथन क्या कर रहा है एक समारोह के लिए सलाह को परिभाषित कर रहा है। तो, आप केवल फ़ंक्शन को सलाह दे सकते हैं, फिर सलाह दी गई फ़ंक्शन के लिए शॉर्टकट कुंजी परिभाषित कर सकते हैं; और आपका परिणाम होगा। देरी के लिए खेद है;)
न्सुकामी _

4

इसके विस्तार के रूप में @ इसके जवाब के ऊपर मेरे पास निम्नलिखित है। (तर्क को शायद थोड़ा साफ किया जा सकता है और जब मैं नई सलाह प्रणाली में पोर्ट करूंगा, तो संभवतः मैं इसे sexp/ / paragraphफिर दोहराया जाए तो इसका विस्तार भी करूंगा ।

एक प्रारंभिक C-w/ M-wकेवल बिंदु पर केवल शब्द को पकड़ लेगा, जबकि दूसरी बार कॉल करने पर यह पूरी रेखा को पकड़ लेगा।

;; *** Copy word/line without selecting
(defadvice kill-ring-save (before slick-copy-line activate compile)
  "When called interactively with no region, copy the word or line

Calling it once without a region will copy the current word.
Calling it a second time will copy the current line."
    (interactive
     (if mark-active (list (region-beginning) (region-end))
       (if (eq last-command 'kill-ring-save)
           (progn
             ;; Uncomment to only keep the line in the kill ring
             ;; (kill-new "" t)
             (message "Copied line")
             (list (line-beginning-position)
                   (line-beginning-position 2)))
         (save-excursion
           (forward-char)
           (backward-word)
           (mark-word)
           (message "Copied word")
           (list (mark) (point)))))))

;; *** Kill word/line without selecting
(defadvice kill-region (before slick-cut-line first activate compile)
  "When called interactively kill the current word or line.

Calling it once without a region will kill the current word.
Calling it a second time will kill the current line."
  (interactive
   (if mark-active (list (region-beginning) (region-end))
    (if (eq last-command 'kill-region)
        (progn
          ;; Return the previous kill to rebuild the line
          (yank)
          ;; Add a blank kill, otherwise the word gets appended.
          ;; Change to (kill-new "" t) to remove the word and only
          ;; keep the whole line.
          (kill-new "")
          (message "Killed Line")
          (list (line-beginning-position)
                (line-beginning-position 2)))
      (save-excursion
        (forward-char)
        (backward-word)
        (mark-word)
        (message "Killed Word")
        (list (mark) (point)))))))

क्या आपने इसे अपडेट किया है और यदि ऐसा है तो कॉपी कहां है? इसके अलावा, यह मार्क रिंग में एक टन अंक जोड़ता है। क्या यह केवल एक चिह्न जोड़ सकता है जहां इसकी प्रतिलिपि बनाई गई है। तो शब्द की शुरुआत या लाइन की शुरुआत। अब यह हर बार चार अंकों की तरह जुड़ जाता है जो कष्टप्रद है। मैंने वास्तव में इसे उपयोग करने के लिए बदल दिया है (बैकवर्ड-सेक्सप) लेकिन कभी-कभी यह एक को नहीं खोज पाता है और यह एक त्रुटि देता है। अगर यह एक नहीं मिल रहा है तो क्या यह लाइन को कॉपी कर सकता है? मुझे यकीन नहीं था कि यह कैसे करना है या केवल त्रुटि को अनदेखा करना है और शोर नहीं करना है। क्षमा करें, मैं लिस्प में सर्वश्रेष्ठ नहीं हूं।
J Spen

1

चूंकि आप इसे न्यूनतम कुंजी स्ट्रोक के साथ करना चाहते हैं, इसलिए आप डेविड एंडरसन के उत्कृष्ट की-कॉर्ड पैकेज का उपयोग कर सकते हैं । एक "कुंजी कॉर्ड" दो कुंजी एक साथ दबाया जाता है, या एक ही कुंजी दो बार दबाया जाता है।

आप उन कार्यों के लिए किसी भी महत्वपूर्ण तार को बांध सकते हैं।

(require 'key-chord)
(key-chord-mode 1)
(key-chord-define-global "dd"  'kill-whole-line)
(key-chord-define-global "cc"  'yank-whole-line)

आपके उत्तर के लिए धन्यवाद :) मैंने अतीत में कई बार कुछ chords की कोशिश की और वास्तव में उनके लिए अभ्यस्त नहीं हो सका। लेकिन यह निश्चित रूप से सेट के लिए एक उपयोगी अतिरिक्त है यदि उत्तर यहां एकत्र किए गए हैं!
इसका अजायबघर

1

एक कम तदर्थ तरीका परिभाषित करना है mark-whole-line, जिसके लिए Emacs के पास वास्तव में एक डिफ़ॉल्ट आदेश होना चाहिए।

(defun mark-whole-line ()               
    "Combinition of C-a, mark, C-e"
    (interactive)
    (move-beginning-of-line nil)
    (set-mark-command nil)
    (move-end-of-line nil)
)
(global-set-key (kbd "C-2") 'mark-whole-line) ; 2 is near w

फिर C-2 C-wनौकरी करेंगे।

यह चीजों को आसान भी बनाता है जैसे वर्तमान पूरी लाइन पर टिप्पणी करना।


0

यह अपने द्वारा किए गए जवाब का एक संशोधन है - वर्तमान में सबसे अधिक मतदान का जवाब है, और एक जो मैंने वर्षों से उपयोग किया है। हालाँकि, इसमें समस्याएँ हैं: कुछ समय का एडवांस संस्करण kill-ring-saveविफल हो जाता है क्योंकि चिह्न सेट नहीं होता है (आमतौर पर एक नए बफर में), और यहां तक ​​कि जब यह काम करता है, तो कर्सर ने एक लाइन को कॉपी करने के लिए फ़ंक्शन के उपयोग के बाद एक अजीब नृत्य किया। । कुछ खुदाई के बाद, यह मुझ पर हावी हो गया कि ऐसा इसलिए होता है क्योंकि kill-ring-saveकॉल के indicate-copied-regionबाद यह अपना काम करता है, लेकिन जैसा कि बिंदु और निशान कॉपी किए गए क्षेत्र से मेल नहीं खाते हैं, indicate-copied-regionगलत क्षेत्र को चिह्नित करता है।

पर्याप्त कथन। यहाँ एक उपाय है जो इसका उपचार करता है:

(define-advice kill-ring-save
    (:before-while (beg end &optional region) slick)
  (or mark-active
      (not (called-interactively-p 'interactive))
      (prog1 nil
    (copy-region-as-kill
     (line-beginning-position) (line-beginning-position 2))
    (message "Copied current line"))))

इसके बारे में कुछ भी गलत नहीं है kill-region। यहाँ इसका किसी भी प्रकार, ऊपर से शैलीगत रूप से अधिक संगत होना है:

(define-advice kill-region
    (:around (kill-region beg end &optional region) slick)
  (if (or mark-active (not region))
      (funcall kill-region beg end region)
    (funcall kill-region
             (line-beginning-position) (line-beginning-position 2))
    (message "Killed current line")))

ध्यान दें कि यदि transient-mark-modeचालू नहीं है, तो ये सलाह कुछ नहीं करती हैं।


यदि आप अधिक व्यापक समाधान चाहते हैं, तो whole-line-or-regionइसके बजाय पैकेज का उपयोग करने पर विचार करें ; @sanityinc द्वारा उत्तर देखें।
हेराल्ड हैन्च-ऑलसेन

0

मैं composable.el नामक पैकेज का उपयोग करता हूं । पैकेज के बारे में साफ-सुथरी बात यह है कि यह Mw और Cw (कॉपी और कमांड्स को मारता है) को अधिक Vim-be होने की तरह ट्विस्ट होने के साथ पारंपरिक emacs कमांड के बजाय स्वीकार करता है। तो C-w lएक पूरी लाइन मारता है। लेकिन आप C-w M->फ़ाइल के अंत को मारने जैसे काम भी कर सकते हैं । किसी क्षेत्र को चिह्नित करते समय दोनों आदेश सामान्य की तरह काम करते हैं।

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