Emacs

2013-08-15 8 views
6

में किसी क्षेत्र में अक्षर मामलों को टॉगल कैसे करें I Emacs में किसी क्षेत्र के टेक्स्ट के अक्षरों के मामले को कैसे टॉगल कर सकते हैं (अपरकेस अक्षरों को लोअरकेस और लोअरकेस अक्षरों को अपरकेस में स्विच करें)?Emacs

रूपांतरण के लिए सूचीबद्ध कमांड हैं लेकिन टॉगलिंग के लिए कुछ भी नहीं है।

उदाहरण:

कृपया टॉगल मेरे पत्र मामले

हो जाना चाहिए:

कृपया मेरे पत्र मामला टॉगल

+1

ऐसा लगता है कि कई प्रयास किए गए उत्तरों वास्तव में आप जो पूछ रहे हैं उसके लिए उपयोग केस देखने में विफल रहते हैं, इसलिए वे इसके बजाय एक अलग समस्या हल करते हैं। क्या आप समझा सकते हैं कि यह उपयोगी होगा, अगर केवल हमारे मनोरंजन के लिए? – tripleee

+1

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

उत्तर

2

मैंने इसे आपके लिए लिखा है; यह पूरी तरह से परीक्षण नहीं था, लेकिन ऐसा लगता है कि आप क्या चाहते हैं।

इसके पीछे तर्क टेक्स्ट में प्रत्येक वर्ण पर लूप करना है। यदि चरित्र डाउनकेस में वर्ण के बराबर है, तो इसे अपकेस में रिटर्न स्ट्रिंग में जोड़ें। यदि नहीं, तो इसे डाउनकेस में संलग्न करें। अंत में, क्षेत्र हटाएं और वापसी स्ट्रिंग डालें।

यह टेक्स्ट के एक पृष्ठ पर तुरंत काम करता है, हालांकि मैं इसे बड़े ग्रंथों पर उपयोग करने के लिए सावधान रहूंगा (अभी भी ठीक होना चाहिए)।

(defun toggle-case() 
    (interactive) 
    (when (region-active-p) 
    (let ((i 0) 
     (return-string "") 
     (input (buffer-substring-no-properties (region-beginning) (region-end)))) 
     (while (< i (- (region-end) (region-beginning))) 
    (let ((current-char (substring input i (+ i 1)))) 
     (if (string= (substring input i (+ i 1)) (downcase (substring input i (+ i 1)))) 
      (setq return-string 
      (concat return-string (upcase (substring input i (+ i 1))))) 
     (setq return-string 
      (concat return-string (downcase (substring input i (+ i 1))))))) 
    (setq i (+ i 1))) 
     (delete-region (region-beginning) (region-end)) 
     (insert return-string)))) 
+0

ठीक काम करने लगता है। –

1

आप पत्र मामले मतलब है, तो इस समारोह अच्छी तरह से काम करता है: http://ergoemacs.org/emacs/modernization_upcase-word.html

(defun toggle-letter-case() 
    "Toggle the letter case of current word or text selection. 
    Toggles between: “all lower”, “Init Caps”, “ALL CAPS”." 
    (interactive) 
    (let (p1 p2 (deactivate-mark nil) (case-fold-search nil)) 
    (if (region-active-p) 
     (setq p1 (region-beginning) p2 (region-end)) 
     (let ((bds (bounds-of-thing-at-point 'word))) 
     (setq p1 (car bds) p2 (cdr bds)))) 
    (when (not (eq last-command this-command)) 
     (save-excursion 
     (goto-char p1) 
     (cond 
     ((looking-at "[[:lower:]][[:lower:]]") (put this-command 'state "all lower")) 
     ((looking-at "[[:upper:]][[:upper:]]") (put this-command 'state "all caps")) 
     ((looking-at "[[:upper:]][[:lower:]]") (put this-command 'state "init caps")) 
     ((looking-at "[[:lower:]]") (put this-command 'state "all lower")) 
     ((looking-at "[[:upper:]]") (put this-command 'state "all caps")) 
     (t (put this-command 'state "all lower"))))) 
    (cond 
    ((string= "all lower" (get this-command 'state)) 
     (upcase-initials-region p1 p2) (put this-command 'state "init caps")) 
    ((string= "init caps" (get this-command 'state)) 
     (upcase-region p1 p2) (put this-command 'state "all caps")) 
    ((string= "all caps" (get this-command 'state)) 
     (downcase-region p1 p2) (put this-command 'state "all lower"))) 
    )) 
+0

क्षेत्र में प्रत्येक पत्र के लिए ऊपरी से नीचे और ऊपरी से ऊपरी। –

1

कमांड upcase-region, downcase-region, और capitalize-region टॉगल नहीं हैं, और शायद आपके द्वारा संदर्भित "रूपांतरण" आदेश हैं। यहां एक आदेश है कि उनमें से चक्र।

(defvar cycle-region-capitalization-last 'upper) 
(defun cycle-region-capitalization (&optional msgp) 
    "Cycle the region text among uppercase, lowercase and capitalized (title case)." 
    (interactive "p") 
    (setq cycle-region-capitalization-last 
     (case cycle-region-capitalization-last 
      (upper (call-interactively #'downcase-region) 'lower) 
      (lower (call-interactively #'capitalize-region) 'title) 
      (title (call-interactively #'upcase-region)  'upper))) 
    (when msgp (message "Region is now %scase" cycle-region-capitalization-last))) 
0

मैं this-command और last-command तुलना, तो मैं यह मेरे पुराने समारोह में शामिल किया गया है के अन्य जवाब की तकनीक पसंद आया। परिणाम यहां दिया गया है:

(defun upcase-word-toggle() 
    (interactive) 
    (let ((bounds (bounds-of-thing-at-point 'symbol)) 
     beg end 
     regionp) 
    (if (eq this-command last-command) 
     (setq regionp (get this-command 'regionp)) 
     (put this-command 'regionp nil)) 
    (cond 
     ((or (region-active-p) regionp) 
     (setq beg (region-beginning) 
      end (region-end)) 
     (put this-command 'regionp t)) 
     (bounds 
     (setq beg (car bounds) 
      end (cdr bounds))) 
     (t 
     (setq beg (point) 
      end (1+ beg)))) 
    (save-excursion 
     (goto-char (1- beg)) 
     (and (re-search-forward "[A-Za-z]" end t) 
      (funcall (if (char-upcasep (char-after)) 
         'downcase-region 
         'upcase-region) 
        beg end))))) 

(defun char-upcasep (letter) 
    (eq letter (upcase letter))) 

(global-set-key (kbd "C->") 'upcase-word-toggle) 
+0

आपके कोड का परीक्षण नहीं कर सकता: प्रतीक की फ़ंक्शन परिभाषा शून्य है: char-upcasep –

7

आप एक regexp प्रतिस्थापन के साथ यह कर सकते हैं:

M-x replace-regexp RET 
\([[:upper:]]+\)?\([[:lower:]]+\)? RET 
\,(concat (downcase (or \1 "")) (upcase (or \2 ""))) RET 

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

+0

प्रतिस्थापन में अंत में एक अतिरिक्त माता-पिता है लेकिन यह पुरस्कार –

+1

देता है हां, मैंने आपकी टिप्पणी से कुछ ही समय पहले इसे देखा (और सही किया)। – angus