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?
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?
Câu trả lời:
Bạn muốn C-M-u
chạ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.
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"
?
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-beta
báo chí 2m.
Đâ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áibackward-up-list
khô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
backward-char
hoặc forward-char
nếu bạn di chuyển con trỏ ra khỏi cạnh.
)
. 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.
Đâ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.
iy-go-to-char
(cũng có sẵn trên Melpa).iy-go-to-char-backward
và iy-go-to-char
rà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-,
và 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-backward
và 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-char
và 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 .
C-r " C-b
.