이맥스는 VIM ci "에 해당합니까?


13

emacs에 VIMs ci "명령과 같은 기능이 있습니까? 기본적으로 따옴표 안에있는 텍스트를 바꾸고 싶습니다.

vim에서 ci) 또는 ci] 또는 ci}를 사용하여 "inner *"를 변경할 수 있습니다.

답변:


19

내 머리 꼭대기에서 가장 가까운 명령은 M-z ""캐릭터의 다음 지점까지 모든 것을 삭제하는 명령입니다 .

또한이 C-M-k일명 전체 괄호 문을 삭제 또는 "균형 잡힌 표현"과 점에서 현재 문자 (즉, 현재의 모드 정의를 기반 등을 인용 문자열을 두 배로하는 "균형 잡힌 표현을 죽일". 그것은 단지 커서 경우 작동 '' '또는'( '등)에 있습니다.


7

Justin의 제안과 마찬가지로 CM-SPACE는 균형 표시, 따옴표 등을 선택하는 "mark-sexp"를 제공하며 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))

그런 다음 delete-between-pair를 원하는 키에 바인딩하십시오. 나를 위해, 나는 Cz i에 묶여있다.


2

VIM의 ci 기능에 대해 잘 모르지만 Emacs regexp replace를 보셨습니까? 정확한 의미론이나 비교하기가 얼마나 쉬운 지 말할 수는 없지만 원하는대로 사용할 것입니다.


emacs regexp replace는 vi : s / regex / replacement /와 동일하며, 원하는 것은 현재 균형 잡힌 표현을 삭제하고 대체하는 키 누르기입니다.
Justin Smith



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

이것은 내가 Vim에서 빠졌고 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))
)

search-forward / search-backward의 세 번째 (선택적) 매개 변수는 검색이 실패 할 경우 수행 할 조치를 나타 내기 때문에 일반적으로 조건 케이스는 필요하지 않습니다. 그러나 어떤 이유로 두 번째 검색을 첫 번째 매개 변수의 세 번째 매개 변수로 배치하면 이상한 동작이 발생합니다.


0

나는 여기서 해결책을 시도했지만 각각 원하는 방식을 찾았으므로 이것을 생각해 냈습니다. 시작 또는 끝 구분 기호를 허용하며 내장 Emacs 함수를 사용하여 구분 기호에 대한 변환 표가 필요하지 않습니다.

(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) 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.