Emacs: किल रिंग के बिना टेक्स्ट कैसे डिलीट करें?


81

मैं केवल कुछ पाठ हटाना चाहता हूँ, इसलिए मैं इसके बजाय कुछ अन्य पाठ निकाल सकता हूँ । मैं उसे कैसे कर सकता हूँ? Cw रिंग को मारने के लिए चयनित पाठ को काट देता है और मैं उस पाठ के बिना समाप्त होता हूं जिसे मैं yank करना चाहता था।

इसके अलावा, क्या यह संभव है कि इसे दबाए बिना बटन दबाए बिना कुछ पाठ के बजाय सीधे पाठ को yank करना संभव है?



2
नीचे मेरे जवाब का संदर्भ लें, आप 1 प्रश्न के लिए कीबोर्ड पर बैकस्पेस बटन का उपयोग कर सकते हैं, 2 वें प्रश्न के लिए पाठ चिह्नित कर सकते हैं
केविन झू

अपने ब्लॉक को परिभाषित करने के बाद क्या यह सिर्फ Cx rk नहीं है?
yalu2015

जवाबों:


49

मैं M-x delete-regionअक्सर टाइप करता हूं , लेकिन आप इसे एक कुंजी से बांध सकते हैं।

Emacs के नए संस्करणों में सेलेक्शन मोड को हटाने के साथ आपको एक कमांड टाइप करने की जरूरत नहीं है:

डिफ़ॉल्ट रूप से, पाठ सम्मिलन सामान्य रूप से तब भी होता है, भले ही चिह्न सक्रिय हो- उदाहरण के लिए, वर्ण 'a' को सम्मिलित करता है, फिर चिह्न को निष्क्रिय कर देता है। चयन मोड को हटाएं, एक मामूली मोड, इस व्यवहार को संशोधित करता है: यदि आप उस मोड को सक्षम करते हैं, तो पाठ को सम्मिलित करते समय निशान सक्रिय होने के कारण क्षेत्र में पाठ को पहले हटा दिया जाता है। इसके अलावा, कमांड्स जो सामान्य रूप से सिर्फ एक चरित्र को हटाती हैं, जैसे कि C-dया DEL, इसके बजाय पूरे क्षेत्र को हटा देंगी। डिलीट सलेक्शन मोड को चालू या बंद करने के लिए टाइप करेंM-x delete-selection-mode.


33
इसके अलावा, Emacs के नवीनतम संस्करण के साथ, आपको delete-regionएक कुंजी को बांधने की भी आवश्यकता नहीं है क्योंकि बैकस्पेस अब ऐसा करता है। बैकस्पेस उसे मारने के बजाय चयनित क्षेत्र को हटा देता है, दूसरे शब्दों में, बैकस्पेस चयनित टेक्स्ट को बिना खोले / मारकर रिंग में धकेल देता है। इसका कारण यह है का मूल्य है delete-active-regionहै tजब तक आप इसे कुछ अन्य मूल्य के लिए अनुकूलित।
जिसांग यू


21

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

(defun ruthlessly-kill-line ()
  "Deletes a line, but does not put it in the kill-ring. (kinda)"
  (interactive)
  (move-beginning-of-line 1)
  (kill-line 1)
  (setq kill-ring (cdr kill-ring)))

1
सिर्फ (डिलीट-रीजन-लाइन-लाइन-पोजिशन) (लाइन-एंड-पोजिशन) क्यों नहीं?
कोडिचन

सूचीबद्ध फ़ंक्शन अच्छा लग रहा था, लेकिन सामान्य रूप से मेरे लिए काम नहीं किया। विशेष रूप से, मैंने पाया कि यह यान-सूचक को किल-रिंग के दूसरे छोर पर इंगित करेगा, जो सामान्य रूप से (वास्तव में लगभग हमेशा?) सूची में अगला तत्व नहीं है! (स्टाल एक कार्य को हैक करने की कोशिश कर रहा है जो शिष्टमंडल के माध्यम से `किल-लाइन 'के लिए मज़बूती से काम करता है ... हो सकता है कि मैं सिर्फ डिलीट-रीजन का सहारा लूंगा, जैसा कि दूसरों ने किया है ...)
pnkfelix

11

EmacsWiki से लिया गया :

समतुल्य ‘kill-line’( ‘C-k’) लेकिन बिना वलय-अंगूठी के दुष्प्रभाव

(delete-region (point) (line-end-position))

सबसे अच्छा जवाब IMO। और मैं क्षेत्र को हटाने के लिए ctrl-shift-W बाध्य करता हूं: (वैश्विक-सेट-कुंजी (kbd "CSw") 'डिलीट-क्षेत्र)
Tongfa

5

एमएक्स इवेल-एक्सप्रेशन (सेट किल-रिंग (सीडीआर किल-रिंग)) - किल-रिंग से अंतिम वस्तु निकालता है


यह केवल वर्तमान सत्र के लिए अजीब तरह से करता है। Emacs के बाहर इसे मारने की अंगूठी से हटाया नहीं जाता है!
पास्कलवूटेन

4

अपने दूसरे प्रश्न के लिए, वैकल्पिक रूप से DeleteSelectionMode के लिए आप CUA मोड को सक्षम कर सकते हैं जो अतिरिक्त रूप से आपको C- रिटर्न द्वारा सक्षम एक अच्छा आयत चयन मोड देता है। CUA मोड 22.1 के बाद से emacs का हिस्सा है।


3

इसका जवाब मिला।

पहले यहाँ पोस्ट किया ।

;; Ctrl-K with no kill
(defun delete-line-no-kill ()
  (interactive)
  (delete-region
   (point)
   (save-excursion (move-end-of-line 1) (point)))
 (delete-char 1)
)
(global-set-key (kbd "C-k") 'delete-line-no-kill)

समस्या यह है कि यह कमांड हमेशा न्यूलाइन को भी डिलीट कर देता है, जबकि किल-लाइन केवल न्यूलाइन को डिलीट कर देता है यदि वैरिएबल किल-पूरी-लाइन का मान नॉन-नील हो। बेहतर होगा कि "(डिलीट-चार 1)" को "(यदि किल-पूरी-लाइन (डिलीट-1))" "में बदल दिया जाए।
एलन

3

अधिकांश किल फ़ंक्शंस, kill-regionटेक्स्ट को मारने का वास्तविक कार्य करने के लिए उपयोग करते हैं। मैं किल कार्यों से हटाने के कार्यों को बनाने के लिए एक लिस्प मैक्रो का उपयोग करता हूं।

(defmacro jpk/delete-instead-of-kill (&rest body)
  "Replaces `kill-region' with `delete-region' in BODY."
  `(cl-letf (((symbol-function 'kill-region)
              (lambda (beg end &optional yank-handler)
                (delete-region beg end))))
     ,@body))

(defun jpk/delete-word (arg)
  "Like `kill-word', but does not save to the `kill-ring'."
  (interactive "*p")
  (jpk/delete-instead-of-kill (kill-word arg)))

यह कैसे काम करता है? क्या आपको इस बारे में अधिक जानकारी है? ये अद्भुत है।
सिनकोनाटा

1
cl-letfगतिशील दायरे के साथ एक फ़ंक्शन का स्थानीय बंधन बना सकता है। इसका मतलब है कि यह केवल अंदर के कोड के लिए प्रभाव में है cl-letf, लेकिन यह संपूर्ण कॉल ट्री पर लागू होता है (जैसे kill-regionसीधे में दिखाई नहीं देता है body, लेकिन kill-wordकॉल kill-regionऔर इसे बदल दिया जाता है delete-region)।
jpkotta

यदि आप पहली बार इसे किसी भिन्न नाम से बाँधते हैं, तो आप इसके प्रतिस्थापन से मूल फ़ंक्शन को भी कॉल कर सकते हैं cl-letf। उस अर्थ में cl-letfकाम करता let*है।
jpkotta

मुझे इसके बारे में पता है, यह अभी भी मेरे लिए तकनीकी है। मुझे अजगर के साथ मुश्किल से मध्यवर्ती अनुभव है। इस "ओवरराइटिंग" / पुनर्लेखन / फोर्किंग कार्यों के लिए सामान्य नाम क्या है? क्या यह लिस्प जैसी भाषाओं की विशिष्ट विशेषता है?
sinekonata

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

2

तकनीकी रूप से, पहले भाग पर अन्य उत्तर गलत हैं।

यहाँ मेरा कार्यान्वयन और प्रेरणा है:

(defun delete-word (arg)
  "Delete characters backward until encountering the beginning of a word.
With argument ARG, do this that many times."
  (interactive "p")
  (delete-region (point) (progn (backward-word arg) (point))))

मैंने यहां " kill-word" से कोड को अनुकूलित किया simple.el। मैंने kill-regionसाथ स्विच किया delete-regionऔरforward-word लिएbackward-word । इस तरह यह TRUELY kill-ringअन्य स्थितियों के विपरीत, जहां, emacs के बाहर, को प्रभावित नहीं करता है , मैंने देखा कि यह kill-ringप्रभावित था।


2
मैं इस उत्तर को पसंद करता हूं क्योंकि यह ओएस क्लिपबोर्ड से चिपकाने से नहीं बचता है (जहां मारने की अंगूठी से आखिरी चीज को छोड़ने में मदद नहीं मिलती है क्योंकि ओएस क्लिपबोर्ड में क्या खो गया है)
२१:१३

मार समारोह की परिभाषा की नकल के बिना ऐसा करने के लिए मेरे जवाब की जाँच करें।
jpkotta

1
(defun copy-to-register-z (p1 p2)
  "Copy text selection to register named “z”."
  (interactive "r")
  (copy-to-register ?z p1 p2))
(defun replace-register-content-z (p1 p2)
  "Replace register named “z”'s content."
  (interactive "r")
  (delete-region p1 p2)
  (insert-register ?z))
(global-set-key (kbd "C-c c") 'copy-to-register-z)
(global-set-key (kbd "C-c v") 'replace-register-content-z)

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

1

निम्नानुसार किल-रीजन और किल-लाइन कुंजियों Cw और Ck के बराबर एक डिलीट जोड़ें। सीवी और सीजे के लिए बाध्य।

;; हटाने के लिए कीबाइंडिंग एक अच्छा "Windows CUT Ctrl-x समतुल्य" देता है।
;; क्या उपयोग करने के लिए कीबाइंडिंग चुनना अजीब है।
;; Cv "Windows PASTE Ctrl-v" का उपयोग करना काफी विध्वंसक विकल्प है।
;; Cv = emacs में स्क्रॉल करें जिसका मेरे पास कोई उपयोग नहीं है।
(वैश्विक-सेट-कुंजी (kbd "Cv") 'हटाएं-क्षेत्र)

;; Ck (किल-लाइन) के लिए एक "विंडोज कट" विकल्प भी हो सकता है:
(डिफॉन डिलीट-लाइन) ("डिलीट लाइन, इसे किल रिंग से बाहर निकालें। इस फंक को Cz में बांधें"
 (इंटरैक्टिव)
 (सेट-लास्ट-कमांड 'डिलीट-लाइन)
 (किल-लाइन)
 (सेट किल-रिंग (सीडीआर किल-रिंग))
 (सेट-किल-रिंग-यैंक-पॉइंटर किल-रिंग)
 (सेट-लास्ट-कमांड 'डिलीट-लाइन)
)
(ग्लोबल-सेट-की (kbd "Cz") 'डिलीट-लाइन'
;; अंतिम-कमांड 2+ C-zs की सेटिंग के बिना किल-रिंग को गड़बड़ाना

1

पहले प्रश्न का मेरा उत्तर: एमएसीएस (माउस या सेट मार्क का उपयोग करके) में पाठ को चिह्नित करें C-SPC, और इसके बजाय कीबोर्ड पर "<- बैकस्पेस" बटन दबाएं C-w। इस तरह आप सिस्टम क्लिपबोर्ड में टेक्स्ट पर पेस्ट कर सकते हैं, बिना इस चिंता के कि क्लिपबोर्ड द्वारा मारे गए टेक्स्ट से ओवरराइड हो गया हैC-w

इस उत्तर के लिए पृष्ठभूमि: कभी-कभी जब मुझे emacs के बाहर का पाठ मिला, जिसे मैं emacs में एक क्षेत्र को बदलने के लिए उपयोग करना चाहता हूं, तो मैंने अक्सर उस पाठ को पहले सिस्टम क्लिपबोर्ड (यानी विंडोज पर Ctrl + C) में कॉपी करके गलती की , फिर C-wemacs में एक कर रहा है " हटाएं "पाठ का क्षेत्र जिसे मैं बदलना चाहता हूं, इस उम्मीद के साथ कि बाद M-wमें किल-रिंग से क्लिपबोर्ड में मेरे पाठ को पुनर्प्राप्त कर सकता है। दुर्भाग्य से क्लिपबोर्ड को केवल मारे गए पाठ द्वारा ओवरराइड किया जाएगाC-w , और क्लिपबोर्ड में मूल संदेश किल-रिंग में कभी नहीं दिखाई देगा।

2 वें प्रश्न के लिए, हाँ आप हमेशा पहले emacs में और फिर सीधे टेक्स्ट को चिह्नित कर सकते हैं C-y


0

यहाँ एक संस्करण है kill-regionजो किल-रिंग में मूल्यों को बाध्य नहीं करता है।

(defun kill-or-delete-region (beg end prefix)
  "Delete the region, storing it in the kill-ring.
If a prefix argument is given, don't change the kill-ring."
  (interactive "r\nP")
  (if prefix
      (delete-region beg end)
    (kill-region beg end)))

(global-set-key (kbd "C-w") 'kill-or-delete-region)

यह आपको C-wपहले की तरह करने में सक्षम बनाता है , लेकिन C-u C-wअब किल-रिंग को बदले बिना पाठ को हटा देता है।


0

किल रिंग के बिना टेक्स्ट कैसे हटाएं?

delete-regionसमारोह को मारने की अंगूठी में जोड़ने के बिना चयनित क्षेत्र को नष्ट करेगा

इसके अलावा, क्या यह संभव है कि बटन को दबाए बिना कुछ पाठ के बजाय सीधे पाठ को मारना संभव है?

मुझे लगता है कि आप पूछ रहे हैं कि पाठ को किसी चयनित क्षेत्र में कैसे बदला जाए, जिसे आपने पहले ही मार दिया है।

सेटिंग (delete-selection-mode 1)आपको एक चयनित क्षेत्र पर यांक / पेस्ट करने की अनुमति देगा। यह आपको केवल चयनित क्षेत्र को टाइप करने और बदलने की अनुमति देता है।

OS XI के संस्करण 25.1.1 में (setq select-enable-primary nil)इसे चयनित क्षेत्र को मारने की अंगूठी में कॉपी करने से रोकने के लिए भी जोड़ना था


0

सभी उत्तरों के पूरक के रूप में। यदि आप हटाने के लिए क्विक कोड लिखते हैं, तो आप ऐसे कार्यों को कॉल कर सकते हैं जो तब तक मारते हैं जब तक आप इस तरह से स्थानीय किल-रिंग ऑब्जेक्ट का उपयोग करते हैं:

(defun delete-something()
  "Delete something without storing in kill ring."
  (let (kill-ring)
     (kill-something)))

किसी भी फ़ंक्शन का उपयोग करें जो कि कुछ को मारने के स्थान पर मारता है-कुछ। फ़ंक्शन तब हटा देगा और वास्तविक किल-रिंग में कुछ भी याद नहीं रहेगा।

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