답변:
예! Emacs의 VIMs ci "명령과 동등한 기능은 ... ci":-)
http://www.emacswiki.org/emacs-de/Vimpulse
이 질문에 방금 넘어졌습니다. 여기 나를 위해 일한 맞춤형 솔루션이 있습니다.
(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에 묶여있다.
VIM의 ci 기능에 대해 잘 모르지만 Emacs regexp replace를 보셨습니까? 정확한 의미론이나 비교하기가 얼마나 쉬운 지 말할 수는 없지만 원하는대로 사용할 것입니다.
Magnars (EmacsRocks 사이트의 저자)는이 플러그인을 작성하여 원하는 것을 정확하게 수행했습니다.
https://github.com/magnars/change-inner.el
분명히 이블 모드를 사용할 수도 있습니다.
다음은 일치하는 문자 쌍 내 (또는 포함)를 모두 삭제하는 내 버전입니다. 문자 쌍은 일치하는 시작 / 종료 문자를 알 수 있도록 목록에 정의됩니다. 변경하려면 "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)
이것은 내가 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의 세 번째 (선택적) 매개 변수는 검색이 실패 할 경우 수행 할 조치를 나타 내기 때문에 일반적으로 조건 케이스는 필요하지 않습니다. 그러나 어떤 이유로 두 번째 검색을 첫 번째 매개 변수의 세 번째 매개 변수로 배치하면 이상한 동작이 발생합니다.
나는 여기서 해결책을 시도했지만 각각 원하는 방식을 찾았으므로 이것을 생각해 냈습니다. 시작 또는 끝 구분 기호를 허용하며 내장 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)