문자열을 탐색하는 데 사용할 키보드 단축키


9

내가 looooong 문자열의 중간에있을 때, 다음과 같이

(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")

바로 가기를 사용하여 첫 번째 "(Emacs- 베타 이후) 직전 바로 건너 뛸 수 있습니까 ?


실제로 대답이 아닙니다 C-r " C-b.
이름

답변:


12

이맥스 25 이상

C-M-u어느 명령을 실행 하길 원하는지 backward-up-list.

한 레벨의 괄호에서 뒤로 이동하십시오. 이 명령은 현재 언어 모드로 정의 된 다른 괄호와 유사한 표현식에서도 작동합니다.

ESCAPE-STRINGS가 대화 형이므로 널이 아닌 경우, 묶는 문자열도 밖으로 이동하십시오.


당신은 그것이 25 일 뿐이라고 언급해야합니다.
abo-abo

@ abo-abo 아닙니다. 24.5.1에서 테스트했습니다. 언제 추가되었는지 확실하지 않지만 누군가 찾을 수 있으면 편집 할 것입니다.
nanny

@ abo-abo 죄송합니다. 맞습니다.
nanny

나는 함께 있어요 Emacs-24.5 -Q문자열,하지만 난 CMU로 받고 있어요 : up-list: Scan error: "Unbalanced parentheses"?
Dieter. 빌헬름

1
@ Dieter.Wilhelm Right : 내 의견과 편집으로 볼 수 있듯이 실수했습니다. Emacs 25 이상에서만 작동합니다.
nanny

3

다음과 같이 할 수 있습니다.

(defun exit-string-backwards ()
  (interactive)
  (goto-char (nth 8 (syntax-ppss))))

에서 Lisp 다운 모드 , 키를 눌러 [임의의 문자열을 종료, 포함하는 목록의 시작 부분으로 이동합니다. 목록이 시작되면를 누르면 다른 부분에 쉽게 도달 할 수 있습니다 (예 :을 Emacs-beta눌러 종료) 2m.


1

이것은 실제로 매우 흥미로운 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로 테스트했다


이것은 오른쪽 가장자리로 가고 OP는 왼쪽 가장자리 앞 지점으로 물었습니다. 리스프 모드가 활성화되지 않으면 어떻게됩니까?
이름

(고토 첨단 별 비교 - 글꼴 얼굴 -1)의 왼쪽 가장자리로 이동, backward-char또는 forward-char당신이 가장자리의 측면에서 커서를 이동합니다.
chen bin

좋아, 좋은 생각이지만 텍스트 모드가 활성화되었을 때 실행하면 포인트가 다음에옵니다 ). 따라서 모드에 따라 코드의 동작이 다릅니다.
이름

flyspell과 동일한 알고리즘을 사용합니다. 따라서 모든 주요 모드를 지원합니다. flyspell 지원
chen bin

0

다양성을 위해 한 가지 더 방법이 있습니다 (더 많이 사용하는 경향이 있습니다). 솔루션은 문자열에만 국한되지 않지만이 사용 사례에서도 작동합니다.

  • 설치 iy-go-to-char(Melpa에서도 사용 가능).
  • 바인딩 iy-go-to-char-backwardiy-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, "다시 한 번 누르면 다음 "문자 발생으로 이동합니다.

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