Emacs VIM ci "ile eşdeğer mi?


13

Emacs eşdeğer VIMs ci "komut var mı? Temelde bir tırnak işareti içindeki metni değiştirmek istiyorum.

Vim'de ci) veya ci] veya ci} "iç * 'i değiştirmek için ..."

Yanıtlar:


19

Başımın en üstünde, en yakın komut M-z ""karakterin bir sonraki tekrarına kadar her şeyi silen komuttur .

Ayrıca C-M-k, "dengeli ifade" nin geçerli mod tanımına ve şu anda nokta altındaki karaktere (yani imleç yalnızca '"' veya '(' vb.) açıklığındadır.


7

Justin'in önerisine benzer şekilde CM-SPACE size dengeleyici paren, alıntı, vb. Seçecek "mark-sexp" verir ve sonra Cw ya da onu yapmak için her şeyi yapabilirsiniz. Silmeden önce silmek üzere olduğunuz şeyi GÖRMEK istiyorsanız ...



3

Sadece bu soru üzerine tökezledi; İşte benim için çalışan özel bir çözüm:

(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))

Ardından, çiftler arasında sil komutunu istediğiniz tuşa bağlayın. Benim için Cz i'ye bağlıyım.


2

Korkarım VIM'in ci özelliği hakkında bilmiyorum, ama Emacs regexp replace'e baktınız mı? Tam semantikle veya karşılaştırmada kullanmanın ne kadar kolay olduğunu konuşamam, ama istediğini düşündüğüm şey için kullanacağım şey bu.


emacs regexp replace, vi: s / regex / replacement / ile eşdeğerdir; istediği nokta, geçerli dengeli ifadeyi silmek ve değiştirmek için bir tuşa basmaktır.
Justin Smith

2

Markit adı verilen Vim tesislerinden bazılarını sağlayan küçük bir mod yaptım .



0

Eşleşen bir karakter çiftindeki (veya dahil olduğu) her şeyi silecek sürümüm. Karakter çiftleri bir listede tanımlanır, böylece eşleşen başlangıç ​​/ bitiş karakteri bilinir. Ben değişiklik için "Cc i" ve tüm değişiklik için "Cc a" için eşledim.

Ayrıca, kaldırılan karakterleri daha sonra yapıştırmak için klip kartına kopyalar.

; 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

Bu, Vim'de eksik olduğum bir şeydi ve doğru şekilde zap-to-charkesmedi.

İşte "ci" ve "ca" yı yeniden yaratmaya yönelik mütevazi girişimim:

(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))
)

Normalde, koşul-durum gerekli değildir, çünkü ileri-geri / geriye doğru arama üçüncü (isteğe bağlı) parametresi, arama başarısız olursa ne yapılacağını gösterir. Ancak bir nedenden ötürü, ikinci aramayı ilki için üçüncü parametre olarak yerleştirmek garip davranışlar getirir.


0

Buradaki çözümleri denedim, ama her birini bir şekilde isteyerek buldum, bu yüzden bunu buldum. Başlangıç ​​veya bitiş sınırlayıcısını kabul eder ve sınırlayıcılar için bir çeviri tablosuna ihtiyaç duymamak için yerleşik Emacs işlevlerini kullanır.

(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) 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.