Sử dụng phím tắt nào để điều hướng ra khỏi chuỗi


9

Khi tôi ở giữa một chuỗi looooong, như sau

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

Tôi có thể bỏ qua nó, ngay trước lần đầu tiên "(sau Emacs-beta) bằng một phím tắt không?


Không thực sự là một câu trả lời C-r " C-b.
Tên

Câu trả lời:


12

Emacs 25 hoặc mới hơn

Bạn muốn C-M-uchạy lệnh backward-up-list.

Di chuyển lùi ra khỏi một cấp của dấu ngoặc đơn. Lệnh này cũng sẽ hoạt động trên các biểu thức giống dấu ngoặc đơn khác được xác định bởi chế độ ngôn ngữ hiện tại.

Nếu ESCAPE-STRINGS không phải là con số không (vì nó tương tác với nhau), hãy chuyển ra khỏi các chuỗi kèm theo.


Bạn nên đề cập rằng nó chỉ 25.
abo-abo

@ abo-abo Không phải: Tôi vừa thử nó vào 24.5.1. Tôi không chắc chắn khi nó được thêm vào, nhưng nếu ai đó có thể tìm ra tôi sẽ chỉnh sửa nó.
mẫu

@ abo-abo Rất tiếc, tôi xin lỗi, bạn đã đúng.
mẫu

Tôi đang Emacs-24.5 -Qở trong một chuỗi, nhưng tôi nhận được với CMu : up-list: Scan error: "Unbalanced parentheses"?
Dieter.Wilmus 21/07/2015

1
@ Dieter.Wilmus Phải: như bạn có thể thấy bằng nhận xét và chỉnh sửa của mình, tôi đã nhầm. Nó sẽ chỉ hoạt động trong Emacs 25 hoặc mới hơn.
mẫu

3

Nó có thể thực hiện được như thế này:

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

Trong chế độ lispy , nhấn [sẽ đưa bạn đến đầu danh sách chứa, thoát khỏi bất kỳ chuỗi nào. Khi bạn ở đầu danh sách, bạn có thể dễ dàng tiếp cận các phần khác để đến cuối Emacs-betabáo chí 2m.


1

Đây thực sự là một câu hỏi lập trình Emps Lisp rất thú vị. Chúng ta có thể tiếp tục chuyển tiếp hoặc char lùi cho đến khi tìm thấy ký tự dưới con trỏ không phải là một phần của chuỗi.

Bạn có thể sử dụng mặt phông chữ để quyết định xem ký tự có nằm trong chuỗi không. Đây là một mẹo hay mà tôi học được từ flyspell. Về lý thuyết, nó không hoàn hảo, nhưng trong thế giới thực, nó hoạt động với hầu hết các chế độ chính của ngôn ngữ lập trình trên Emacs23, Emacs24, Emacs25 .

Đây là mã hoàn chỉnh:

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

Sử dụng:

  • (goto-edge-by-comparing-font-face 1)đi đến cạnh phải, (goto-edge-by-comparing-font-face -1)đi đến cạnh trái
  • nó không phụ thuộc vào bất kỳ chế độ chính cụ thể nào, bạn có thể sử dụng nó ở bất kỳ đâu trong bất kỳ ngôn ngữ nào

backward-up-listkhông đáng tin cậy theo quan điểm của người dùng vì nó được thiết kế như một lệnh chung dựa trên scan-sexps. Ví dụ, đối với mã if (true) { return 'hello world'; }ở chế độ js2, nó sẽ di chuyển tiêu điểm sang {ký tự thay vì ký tự trích dẫn đơn đầu tiên. Đối với mã printf("hello world")ở chế độ c ++, nó sẽ không hoạt động. Tôi đã thử nghiệm với Emacs 24.5


Điều này đi đến cạnh phải, OP đã yêu cầu điểm trước cạnh trái. Nếu chế độ lisp không được kích hoạt thì sao?
Tên

(goto-edge-by-so-font-face -1) đi đến cạnh trái backward-charhoặc forward-charnếu bạn di chuyển con trỏ ra khỏi cạnh.
chen bin

Ok, ý tưởng hay, nhưng nếu bạn chạy nó khi chế độ văn bản được kích hoạt, các điểm sẽ đi sau ). Vì vậy, tùy thuộc vào các chế độ, mã của bạn có các hành vi khác nhau.
Tên

Nó sử dụng thuật toán tương tự như flyspell. Vì vậy, nó hỗ trợ tất cả các chế độ chính hỗ trợ flyspell
chen bin

0

Đây là một cách nữa (mà tôi có xu hướng sử dụng nhiều hơn) chỉ để đa dạng. Giải pháp không dành riêng cho chuỗi nhưng nó cũng hoạt động cho trường hợp sử dụng này.

  • Cài đặt iy-go-to-char(cũng có sẵn trên Melpa).
  • Ràng buộc iy-go-to-char-backwardiy-go-to-charràng buộc ưa thích của bạn. Vì lợi ích của lời giải thích này, chúng ta hãy nói rằng bạn bị ràng buộc iy-go-to-char-backwardđể C-c C-,iy-go-to-charđể C-c C-..
  • Bây giờ nếu bạn ở trong chuỗi, bạn sẽ gọi iy-go-to-char-backwardvà gõ ".

    Điều đó sẽ trông như thế C-c C-, ". Nếu bạn đã iy-go-to-char-continue-when-repeatingđặt thành t(mặc định), nhấn "một lần nữa sẽ đưa bạn đến một "lần xuất hiện trước đó, v.v.

  • Nếu bạn ở trong chuỗi và nếu bây giờ bạn muốn đi đến cuối chuỗi, bạn sẽ gọi iy-go-to-charvà gõ ".

    Điều đó sẽ trông như thế C-c C-. ". Nếu bạn đã iy-go-to-char-continue-when-repeatingđặt thành t(mặc định), nhấn "một lần nữa sẽ đưa bạn đến "lần xuất hiện tiếp theo .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.