แป้นพิมพ์ลัดใดที่จะใช้สำหรับการนำทางออกจากสตริง


9

เมื่อฉันอยู่กลางสตริง looooong ดังต่อไปนี้

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

ฉันสามารถข้ามมันไปได้ก่อน"ทางลัดแรก(หลังจาก Emacs-beta) ได้หรือไม่?


C-r " C-bไม่ได้จริงๆคำตอบ
ชื่อ

คำตอบ:


12

Emacs 25 หรือใหม่กว่า

คุณต้องการที่จะทำงานคำสั่งC-M-ubackward-up-list

เลื่อนถอยหลังออกจากวงเล็บหนึ่งระดับ คำสั่งนี้จะทำงานกับนิพจน์เหมือนวงเล็บอื่น ๆ ที่กำหนดโดยโหมดภาษาปัจจุบัน

หาก ESCAPE-STRINGS ไม่ใช่ค่าศูนย์ (เนื่องจากเป็นแบบโต้ตอบ) ให้ย้ายออกจากสตริงที่ล้อมรอบด้วย


คุณควรพูดถึงว่ามันเป็น 25 เท่านั้น
abo-abo

@ abo-abo ไม่ใช่: ฉันเพิ่งทดสอบใน 24.5.1 ฉันไม่แน่ใจว่ามันจะถูกเพิ่มเมื่อใด แต่ถ้ามีใครสามารถค้นหาได้ฉันจะแก้ไขมัน
พี่เลี้ยง

@ abo-abo โอ๊ะโอขออภัยคุณถูกต้อง
พี่เลี้ยง

ฉันกับEmacs-24.5 -Qในสตริง แต่ฉันได้รับกับมหาวิทยาลัยเชียงใหม่: up-list: Scan error: "Unbalanced parentheses"?
Dieter.Wilhelm

1
@ Dieter.Wilhelm ถูกต้อง: ตามที่คุณเห็นความคิดเห็นและการแก้ไขของฉันฉันถูกเข้าใจผิด มันจะทำงานใน Emacs 25 หรือใหม่กว่าเท่านั้น
พี่เลี้ยง

3

มันเป็นไปได้เช่นนี้:

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

ในโหมด lispy การกด [จะนำคุณไปยังจุดเริ่มต้นของรายการที่มีอยู่ออกจากสตริงใด ๆ เมื่อคุณอยู่ในช่วงเริ่มต้นของรายการคุณสามารถเข้าถึงส่วนอื่น ๆ ได้อย่างง่ายดายเช่นการได้รับการสิ้นสุดของการกดEmacs-beta2m


1

นี่เป็นคำถามการเขียนโปรแกรม 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-listscan-sexpsไม่น่าเชื่อถือมากจากจุดที่ผู้ใช้มุมมองเพราะมันออกแบบมาเป็นคำสั่งทั่วไปขึ้นอยู่กับ ตัวอย่างเช่นสำหรับรหัสif (true) { return 'hello world'; }ในโหมด js2 มันจะย้ายโฟกัสไปที่{ตัวละครแทนที่จะเป็นตัวอักษรคำพูดเดี่ยวครั้งแรก สำหรับรหัสprintf("hello world")ในโหมด c ++ มันจะไม่ทำงาน ฉันทดสอบด้วย Emacs 24.5


นี่ไปที่ขอบด้านขวา OP ได้ขอไปยังจุดที่อยู่ก่อนขอบด้านซ้าย เกิดอะไรขึ้นถ้าโหมดเสียงกระเพื่อมไม่ได้เปิดใช้งาน?
ชื่อ

(goto-edge-by-compar-font-face -1) ไปที่ขอบด้านซ้ายbackward-charหรือforward-charหากคุณเลื่อนเคอร์เซอร์ออกด้านข้างของขอบ
เฉินถัง

ตกลงความคิดที่ดี )แต่ถ้าคุณใช้มันเมื่อโหมดข้อความถูกเปิดใช้งานจุดไปหลังจาก ดังนั้นขึ้นอยู่กับโหมดรหัสของคุณมีพฤติกรรมที่แตกต่างกัน
ชื่อ

มันใช้อัลกอริทึมเช่นเดียวกับ flyspell ดังนั้นจึงรองรับโหมดสำคัญทั้งหมด flyspell สนับสนุน
เฉินถัง

0

นี่เป็นอีกวิธีหนึ่ง (ซึ่งฉันมักจะใช้มากกว่า) เพื่อความหลากหลาย การแก้ปัญหาไม่ได้เฉพาะเจาะจงกับสตริง แต่มันใช้ได้กับกรณีการใช้งานนี้เช่นกัน

  • ติดตั้ง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-charC-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.