내가 looooong 문자열의 중간에있을 때, 다음과 같이
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
바로 가기를 사용하여 첫 번째 "
(Emacs- 베타 이후) 직전 바로 건너 뛸 수 있습니까 ?
내가 looooong 문자열의 중간에있을 때, 다음과 같이
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
바로 가기를 사용하여 첫 번째 "
(Emacs- 베타 이후) 직전 바로 건너 뛸 수 있습니까 ?
답변:
C-M-u
어느 명령을 실행 하길 원하는지 backward-up-list
.
한 레벨의 괄호에서 뒤로 이동하십시오. 이 명령은 현재 언어 모드로 정의 된 다른 괄호와 유사한 표현식에서도 작동합니다.
ESCAPE-STRINGS가 대화 형이므로 널이 아닌 경우, 묶는 문자열도 밖으로 이동하십시오.
Emacs-24.5 -Q
문자열,하지만 난 CMU로 받고 있어요 : up-list: Scan error: "Unbalanced parentheses"
?
다음과 같이 할 수 있습니다.
(defun exit-string-backwards ()
(interactive)
(goto-char (nth 8 (syntax-ppss))))
에서 Lisp 다운 모드 , 키를 눌러
[임의의 문자열을 종료, 포함하는 목록의 시작 부분으로 이동합니다. 목록이 시작되면를 누르면 다른 부분에 쉽게 도달 할 수 있습니다 (예 :을 Emacs-beta
눌러 종료) 2m.
이것은 실제로 매우 흥미로운 Emacs Lisp 프로그래밍 질문입니다. 커서 아래의 문자가 문자열의 일부가 아닌 것을 알 때까지 forward-char 또는 reverse-char를 유지할 수 있습니다.
글꼴을 사용하여 문자가 문자열 안에 있는지 여부를 결정할 수 있습니다. 이것은 플라이 스펠에서 배운 위대한 트릭입니다. 이론적으로는 완벽하지는 않지만 실제로 는 Emacs23, Emacs24, Emacs25에서 거의 모든 프로그래밍 언어의 주요 모드와 작동합니다 .
다음은 완전한 코드입니다.
(defun font-face-is-similar (f1 f2)
(let (rlt)
;; (message "f1=%s f2=%s" f1 f2)
;; in emacs-lisp-mode, the '^' from "^abde" has list of faces:
;; (font-lock-negation-char-face font-lock-string-face)
(if (listp f1) (setq f1 (nth 1 f1)))
(if (listp f2) (setq f2 (nth 1 f2)))
(if (eq f1 f2) (setq rlt t)
;; C++ comment has different font face for limit and content
;; f1 or f2 could be a function object because of rainbow mode
(if (and (string-match "-comment-" (format "%s" f1)) (string-match "-comment-" (format "%s" f2)))
(setq rlt t)))
rlt))
(defun goto-edge-by-comparing-font-face (&optional step)
"Goto either the begin or end of string/comment/whatever.
If step is -1, go backward."
(interactive "P")
(let ((cf (get-text-property (point) 'face))
(p (point))
rlt
found
end)
(unless step (setq step 1)) ;default value
(setq end (if (> step 0) (point-max) (point-min)))
(while (and (not found) (not (= end p)))
(if (not (font-face-is-similar (get-text-property p 'face) cf))
(setq found t)
(setq p (+ p step))))
(if found (setq rlt (- p step))
(setq rlt p))
;; (message "rlt=%s found=%s" rlt found)
(goto-char rlt)))
용법:
(goto-edge-by-comparing-font-face 1)
오른쪽 가장자리로 (goto-edge-by-comparing-font-face -1)
이동, 왼쪽 가장자리로 이동backward-up-list
에 기반한 일반 명령으로 설계 되었기 때문에 사용자의 관점에서 신뢰할 수 없습니다 scan-sexps
. 예를 들어 if (true) { return 'hello world'; }
js2-mode의 코드 {
에서는 첫 번째 작은 따옴표 문자 대신 문자로 초점을 이동합니다 . printf("hello world")
C ++ 모드의 코드 에서는 작동하지 않습니다. 나는 Emacs 24.5로 테스트했다
backward-char
또는 forward-char
당신이 가장자리의 측면에서 커서를 이동합니다.
)
. 따라서 모드에 따라 코드의 동작이 다릅니다.
다양성을 위해 한 가지 더 방법이 있습니다 (더 많이 사용하는 경향이 있습니다). 솔루션은 문자열에만 국한되지 않지만이 사용 사례에서도 작동합니다.
iy-go-to-char
(Melpa에서도 사용 가능).iy-go-to-char-backward
및 iy-go-to-char
원하는 바인딩. 이 설명 iy-go-to-char-backward
을 위해 C-c C-,
and iy-go-to-char
에 바인딩한다고 가정 해 봅시다 C-c C-.
.이제 문자열 안에 있으면을 호출 iy-go-to-char-backward
하고 입력하십시오 "
.
그것은 다음과 같습니다 C-c C-, "
. (기본값)으로 iy-go-to-char-continue-when-repeating
설정 한 경우 t
, "
다시 한 번 누르면 "
그 이전 의 문자 발생으로 이동합니다.
문자열 안에 있고 문자열의 끝으로 가고 싶다면을 호출 iy-go-to-char
하고 입력하십시오 "
.
그것은 다음과 같습니다 C-c C-. "
. (기본값)으로 iy-go-to-char-continue-when-repeating
설정 한 경우 t
, "
다시 한 번 누르면 다음 "
문자 발생으로 이동합니다.
C-r " C-b
.