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-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.
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-betabá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-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
backward-charhoặc forward-charnế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-backwardvà iy-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-,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-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 .
C-r " C-b.