เมื่อฉันอยู่กลางสตริง looooong ดังต่อไปนี้
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
ฉันสามารถข้ามมันไปได้ก่อน"
ทางลัดแรก(หลังจาก Emacs-beta) ได้หรือไม่?
เมื่อฉันอยู่กลางสตริง looooong ดังต่อไปนี้
(setq Emacs-beta "Which keyboard shortcut to use for navigating out of a string")
ฉันสามารถข้ามมันไปได้ก่อน"
ทางลัดแรก(หลังจาก Emacs-beta) ได้หรือไม่?
คำตอบ:
คุณต้องการที่จะทำงานคำสั่งC-M-u
backward-up-list
เลื่อนถอยหลังออกจากวงเล็บหนึ่งระดับ คำสั่งนี้จะทำงานกับนิพจน์เหมือนวงเล็บอื่น ๆ ที่กำหนดโดยโหมดภาษาปัจจุบัน
หาก ESCAPE-STRINGS ไม่ใช่ค่าศูนย์ (เนื่องจากเป็นแบบโต้ตอบ) ให้ย้ายออกจากสตริงที่ล้อมรอบด้วย
Emacs-24.5 -Q
ในสตริง แต่ฉันได้รับกับมหาวิทยาลัยเชียงใหม่: up-list: Scan error: "Unbalanced parentheses"
?
มันเป็นไปได้เช่นนี้:
(defun exit-string-backwards ()
(interactive)
(goto-char (nth 8 (syntax-ppss))))
ในโหมด lispy การกด
[จะนำคุณไปยังจุดเริ่มต้นของรายการที่มีอยู่ออกจากสตริงใด ๆ เมื่อคุณอยู่ในช่วงเริ่มต้นของรายการคุณสามารถเข้าถึงส่วนอื่น ๆ ได้อย่างง่ายดายเช่นการได้รับการสิ้นสุดของการกดEmacs-beta
2m
นี่เป็นคำถามการเขียนโปรแกรม Emacs Lisp ที่น่าสนใจมาก เราสามารถเก็บไปข้างหน้า - ถ่านหรือย้อนกลับ - ถ่านจนกว่าเราจะพบว่าตัวละครภายใต้เคอร์เซอร์ไม่ได้เป็นส่วนหนึ่งของสตริง
คุณสามารถใช้หน้าตัวอักษรเพื่อตัดสินใจว่าตัวละครนั้นอยู่ในสายอักขระหรือไม่ นี่เป็นเคล็ดลับที่ดีที่ฉันได้เรียนรู้จาก flyspell ในทางทฤษฎีมันไม่สมบูรณ์ แต่ในโลกแห่งความจริงมันทำงานร่วมกับเกือบโหมดที่สำคัญการเขียนโปรแกรมภาษาใด ๆ บน 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 มันจะย้ายโฟกัสไปที่{
ตัวละครแทนที่จะเป็นตัวอักษรคำพูดเดี่ยวครั้งแรก สำหรับรหัส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-,
และจะ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
ไม่ได้จริงๆคำตอบ