Emacs VIM ci के बराबर है ”?


13

क्या emacs में VIMs ci "कमांड के बराबर है? मूल रूप से मैं उद्धरण चिह्नों के एक सेट के अंदर पाठ को बदलना चाहता हूं।

Vim में मैं ci) या ci] या ci} को "इनर इनर *" बदल सकता हूं ...

जवाबों:


19

मेरे सिर के ऊपर से, निकटतम कमान, M-z "जो "चरित्र के अगले रोड़ा के बिंदु से सब कुछ हटा देती है।"

वहाँ भी है C-M-k, उर्फ ​​"संतुलित अभिव्यक्ति को मार", जो "संतुलित अभिव्यक्ति" की वर्तमान मोड परिभाषा और वर्तमान में बिंदु के तहत चरित्र (यानी) के आधार पर चरित्र के आधार पर एक पूर्ण कोष्ठक कथन या डबल उद्धृत स्ट्रिंग आदि को हटा देगा। उद्घाटन '' '' या '(' आदि) पर है।


7

इसी तरह जस्टिन के सुझाव पर CM-SPACE आपको "मार्क-सेक्सप" देता है, जो कि बैलेंसिंग परन, कोट्स आदि को सेलेक्ट करेगा और फिर आप Cw कर सकते हैं या इसे बनाने के लिए जो भी करना है चले जाएं। मामले में आप यह देखना चाहते हैं कि आप इसे हटाने से पहले क्या हटाने वाले हैं ...



3

बस इस सवाल पर अड़ गए; यहाँ एक कस्टम समाधान है जो मेरे लिए काम कर रहा है:

(defun seek-backward-to-char (chr)
  "Seek backwards to a character"
  (interactive "cSeek back to char: ")
  (while (not (= (char-after) chr))
    (forward-char -1)))


(defun delete-between-pair (char)
  "Delete in between the given pair"
  (interactive "cDelete between char: ")
  (seek-backward-to-char char)
  (forward-char 1)
  (zap-to-char 1 char)
  (insert char)
  (forward-char -1))

फिर जो भी कुंजी आपको पसंद हो उसे हटा दें। मेरे लिए, मेरे पास Cz i पर बाध्य है।


2

मुझे डर है कि मुझे VIM के ci फीचर के बारे में पता नहीं है, लेकिन क्या आपने Emacs regexp को बदला है? मैं सटीक शब्दार्थ से बात नहीं कर सकता या तुलना में इसका उपयोग करना कितना आसान है, लेकिन यह वही है जो मैं सोचता हूं कि आप क्या चाहते हैं।


emacs regexp प्रतिस्थापित vi: s / regex / प्रतिस्थापन / के बराबर है, वह जो चाहता है वह बिंदु पर वर्तमान संतुलित अभिव्यक्ति को हटाने और बदलने के लिए एक कुंजी है।
जस्टिन स्मिथ

2

मैंने एक छोटी सी विधा बनाई है, जो उन Vim सुविधाओं में से कुछ प्रदान करती है जिन्हें Markit कहा जाता है ।


0

मैग्नेर्स (EmacsRocks साइट के लेखक) ने इस प्लगइन को लिखा है कि आप जो पूछ रहे हैं, वही करें।

https://github.com/magnars/change-inner.el

जाहिर है, आप ईविल मोड का भी उपयोग कर सकते हैं।


0

यहाँ मेरा संस्करण है जो वर्णों की एक जोड़ी के भीतर (या सहित) सब कुछ हटा देगा। वर्ण जोड़े को एक सूची में परिभाषित किया गया है ताकि मिलान शुरू / अंत चरित्र ज्ञात हो। मैंने इसे "Cc i" में बदलने के लिए मैप किया है और सभी के बदलाव के लिए "Cc a"।

यह बाद में चिपकाने के लिए हटाए गए वर्णों को क्लिप बोर्ड पर भी कॉपी करता है।

; Re-create ci" ca"...
(defun seek-backward-to-char (chr)
  "Seek backwards to a character"
  (interactive "cSeek back to char: ")
  (while (not (= (char-after) chr))
    (forward-char -1)))

(setq char-pairs
      '(( ?\" . ?\" )
        ( ?\' . ?\' )
        ( ?\( . ?\) )
        ( ?\[ . ?\] )
        ( ?\{ . ?\} )
        ( ?<  . ?>  )))

(defun get-char-pair (chr)
  (let ((result ()))
    (dolist (x char-pairs)
      (setq start (car x))
      (setq end (cdr x))
      (when (or (= chr start) (= chr end))
        (setq result x)))
      result))

(defun get-start-char (chr)
  (car (get-char-pair chr)))
(defun get-end-char (chr)
  (cdr (get-char-pair chr)))

(defun seek-to-matching-char (start end count)
  (while (> count 0)
    (if (= (following-char) end)
        (setq count (- count 1))
      (if (= (following-char) start)
          (setq count (+ count 1))))
    (forward-char 1)))

(defun seek-backward-to-matching-char (start end count)
  (if (= (following-char) end)
      (forward-char -1))
  (while (> count 0)
    (if (= (following-char) start)
        (setq count (- count 1))
      (if (= (following-char) end)
          (setq count (+ count 1))))
    (if (> count 0)
        (forward-char -1))))

(defun delete-between-pair (char)
  "Delete in between the given pair"
  (interactive "cDelete between char: ")
  (seek-backward-to-matching-char (get-start-char char) (get-end-char char) 1)
  (forward-char 1)
  (setq mark (point))
  (seek-to-matching-char (get-start-char char) (get-end-char char) 1)
  (forward-char -1)
  (kill-region mark (point)))

(defun delete-all-pair (char)
  "Delete in between the given pair and the characters"
  (interactive "cDelete all char: ")
  (seek-backward-to-matching-char (get-start-char char) (get-end-char char) 1)
  (setq mark (point))
  (forward-char 1)
  (seek-to-matching-char (get-start-char char) (get-end-char char) 1)
  (kill-region mark (point)))

(global-set-key (kbd "C-c i") 'delete-between-pair)
(global-set-key (kbd "C-c a") 'delete-all-pair)

0

यह कुछ ऐसा था जो मुझे विम से याद आ रहा था, और zap-to-charयह सही नहीं लग रहा था ।

यहाँ "ci" और "ca" को पुनः बनाने का मेरा विनम्र प्रयास है:

(defun change-outer (str)
  (interactive "sChange outer: ")
  (condition-case nil
      (search-backward str (line-beginning-position))
    (error (search-forward str (line-end-position))
       (forward-char -1)))
  (kill-sexp)
)

(defun change-inner (str)
  (interactive "sChange inner: ")
  (condition-case nil
      (search-backward str (line-beginning-position))
    (error (search-forward str (line-end-position))
       (forward-char -1)))
  (push-mark)
  (forward-sexp)
  (forward-char -1)
  (exchange-point-and-mark)
  (forward-char 1)
  (kill-region (point) (mark))
)

आम तौर पर, स्थिति-केस आवश्यक नहीं है, क्योंकि खोज-फ़ॉरवर्ड / खोज-बैकवर्ड के तीसरे (वैकल्पिक) पैरामीटर का मतलब यह है कि खोज विफल होने की स्थिति में क्या करना है। लेकिन किसी कारण से, पहले एक के लिए तीसरे पैरामीटर के रूप में दूसरी खोज रखने से अजीब व्यवहार होता है।


0

मैंने यहां समाधान की कोशिश की, लेकिन उनमें से प्रत्येक को किसी तरह से वांछित पाया, इसलिए मैं इस के साथ आया। यह या तो एक शुरुआत या समाप्ति सीमांकक को स्वीकार करता है, और अंतर्निहित इमैक फ़ंक्शंस का उपयोग करता है ताकि सीमांकक के लिए अनुवाद तालिका की आवश्यकता न हो।

(defun change-inner (prefix character)
  "Kill region inside delimiters, using either beginning or
ending delimiter.  With prefix arg, kill including delimiters."

  (interactive "p\nc")
  (let ((initial-point (point))
        (start)
        (end)
        (move-point-by (if (> prefix 1) 0 1)))

    (condition-case nil
        (progn
          ;; Search forward for given char
          (search-forward (char-to-string character))
          (setq end (- (point) move-point-by))

          (condition-case nil
              (backward-sexp)
            (error (backward-list)))

          (setq start (+ (point) move-point-by))
          (kill-region start end)
          (or prefix (forward-char)))

      (error (progn
               ;; Reset and search backward for given char
               (goto-char initial-point)
               (search-backward (char-to-string character))
               (setq start (+ (point) move-point-by))

               (condition-case nil
                   (forward-list)
                 (error (forward-sexp))))

             (setq end (- (point) move-point-by))
             (kill-region start end)
             (or prefix (backward-char))))))
(global-set-key (kbd "M-i") 'change-inner)

(defun change-outer ()
  (interactive)
  (let ((current-prefix-arg '(4)))
    (call-interactively 'change-inner)))
(global-set-key (kbd "M-o") 'change-outer) 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.