เลื่อนแบบฟอร์มขึ้นและลงในโหมด paredit


13

ฉันใช้การแก้ไขโครงสร้างของเคอร์เซอร์ (โหมดเหมือน paredit สำหรับ Intellij และ Cursive) และฉันพบว่ามีคำสั่งที่ดีที่เรียกว่าแบบฟอร์มเลื่อนขึ้น (และลง)

เลื่อนแบบฟอร์มนี้ขึ้น ( |คือประเด็น):

(+ 1 |(+ 2 3) 4) => (+ (+ 2 3) 1 4)

และรูปแบบการย้ายลงคล้ายกัน:

(+ 1 |(+ 2 3) 4) => (+ 1 4 (+ 2 3))

เป็นไปได้ไหมที่จะทำสิ่งนี้ใน Emacs paredit-mode? ฉันคิดว่ามันไม่ได้อยู่ในชุด paredit พื้นฐาน (อย่างน้อยก็ไม่ได้อธิบายไว้ในแผ่นโกงนี้


ดี ตอนนี้เป็นการผ่าตัดที่ฉันเห็นว่าตัวเองกำลังทำอยู่
PythonNut

2
FWIW อย่างน้อยสำหรับตัวอย่างสองตัวอย่างที่คุณแสดงล้วนC-M-tทำในสิ่งเดียวกัน แต่ฉันคิดว่าสิ่งที่คุณหมายถึงคือรูปแบบเดียวกันยังคงถูกย้ายมากกว่าที่จะมีการแลกเปลี่ยนความคืบหน้าไปสู่เซ็กส์คู่ต่อไป
Drew

คำตอบ:


13

ตามที่ @Drew แนะนำC-M-tทำสิ่งที่คุณต้องการ กฎเป็นเช่นนี้

  • ใส่จุดตรงกลางของสอง sexps
  • กดC-M-t(ซึ่งทำงานtranspose-sexp)
  • sexp ซ้ายถูกย้ายเสมอไปทางขวาพร้อมกับจุด สิ่งนี้สำคัญมากไม่เช่นนั้นคุณจะสับสนไม่จบ

หรือคุณอาจคิดว่านี่ไม่ใช่การย้าย แต่เพื่อก้าวไปข้างหน้าคุณต้องวางจุดหลัง sexp ที่คุณต้องการย้าย

อย่างไรก็ตามมีสิ่งหนึ่งที่สะดวกสบายนั่นคือเมื่อคุณต้องการโอนย้าย sexp ด้านซ้ายไปข้างหลังคุณใช้สิ่งเดียวกันC-M-tแต่ให้มาพร้อมกับอาร์กิวเมนต์คำนำหน้าเชิงลบและสิ่งนี้ไม่สะดวก ปัญหาก็คือว่าจุดจะไม่ติดตามย้อนหลังย้ายsexp ซ้าย เพื่อแก้ปัญหานี้เราได้สร้างเวอร์ชันย้อนกลับของtranspose-sexps:

(defun reverse-transpose-sexps (arg)
  (interactive "*p")
  (transpose-sexps (- arg))
  ;; when transpose-sexps can no longer transpose, it throws an error and code
  ;; below this line won't be executed. So, we don't have to worry about side
  ;; effects of backward-sexp and forward-sexp.
  (backward-sexp (1+ arg))
  (forward-sexp 1))

จากนั้นผูกติดกับC-M-yที่อยู่ถัดจากC-M-tและว่างใน Emacs เริ่มต้น

(global-set-key (kbd "C-M-y") 'reverse-tranpose-sexps)

นี่คือตัวอย่าง; คุณจะสังเกตเห็นว่า(MY-SEXP1)อยู่ทางซ้ายตลอดเวลาที่จะเดินหน้า / ถอยหลัง:

ป้อนคำอธิบายรูปภาพที่นี่


5

มันเป็นไปได้ที่จะทำกับlispyparedit-modeซึ่งเป็นรูปแบบขั้นสูงของ

สำหรับกรณีการใช้งานของคุณ:

  • w ขยับขึ้น
  • s เลื่อนลง

สิ่งเดียวคือเคอร์เซอร์จะต้องอยู่ที่ตำแหน่งซึ่งเป็นตัวอย่างของคุณ:

(+ 1 |(+ 2 3) 4)

คุณยังสามารถย้าย sexps หลาย ๆ ตัวพร้อมกันwและsถ้าคุณทำเครื่องหมายภูมิภาคด้วย ดูเอกสารประกอบสำหรับข้อมูลเพิ่มเติม


;; มีวิธีใช้เพียงสองคำสั่งเหล่านี้หรือไม่ ;; ฉันดูเหมือนจะหลวม "M-left" และ "M-right" เมื่อทำเช่นนั้น: `(add-hook 'clojure-mode-hook (lambda () (lispy-mode 1) (local-set-key (kbd" M - <up> ") 'lispy-move-up) (local-set-key (kbd" M- <down> ")' lispy-down-down)))`
nha

1

นี่คือคำสั่งอื่น (จากไลบรารีmisc-cmds.el) ที่ทำสิ่งที่คุณร้องขอ เพียงแค่ผูกมันไว้กับคีย์เดียว ( C-M-tหรืออะไรก็ตาม) ใช้เพื่อย้าย sexp ทั้งไปข้างหน้าและข้างหลังซ้ำ ๆ

คำนำหน้าเชิงลบแย้ง transwards ย้อนหลังเช่นtranspose-sexpแต่ก็ยังปล่อยให้จุดพร้อมที่จะทำอีกขนย้ายย้อนหลัง และเมื่อทำซ้ำคำนำหน้าเชิงลบแย้งเพียงแค่พลิกทิศทาง

ดังนั้นหากคุณผูกคำสั่งให้พูดC-oแล้วย้าย sexp ที่อยู่ทางซ้ายของจุดไปทางขวาสามครั้งจากนั้นไปทางซ้ายสองครั้งจากนั้นไปทางขวาหนึ่งครั้งC-o C-o C-o C-- C-o C-o C-- C-o

คำนำหน้าตัวเลข arg มีผลเฉพาะกับการใช้งานครั้งแรกเท่านั้นคือไม่ใช่เมื่อทำซ้ำ - เมื่อทำซ้ำการเคลื่อนไหวจะเป็น sexp ครั้งละหนึ่งครั้ง

(defun reversible-transpose-sexps (arg)
  "Reversible and repeatable `transpose-sexp'.
Like `transpose-sexps', but:
 1. Leaves point after the moved sexp.
 2. When repeated, a negative prefix arg flips the direction."
  (interactive "p")
  (when (eq last-command 'rev-transp-sexps-back) (setq arg  (- arg)))
  (transpose-sexps arg)
  (unless (natnump arg)
    (when (or (> emacs-major-version 24)
              (and (= emacs-major-version 24)  (> emacs-minor-version 3)))
      (backward-sexp (abs arg)) (skip-syntax-backward " ."))
    (setq this-command  'rev-transp-sexps-back)))

(หมายเหตุ: พฤติกรรมของการtranspose-sexpsเปลี่ยนแปลงใน 24.4 ดังนั้นการทดสอบเวอร์ชันที่นี่ก่อนหน้า 24.4 จุดสิ้นสุดลงในตำแหน่งที่ถูกต้องเพื่อดำเนินการต่อ (เช่นทำซ้ำ) เริ่มต้นด้วย 24.4 จุดอยู่ในตำแหน่งที่ไม่ถูกต้องสำหรับสิ่งนั้น การถดถอยหรือเพิ่มคุณสมบัติที่มีประโยชน์หรือแก้ไขข้อผิดพลาดบางอย่างน่าจะอยู่ในสายตาของคนดู ;-) ฉันได้ยื่นข้อผิดพลาด Emacs # 20698เพียงแค่ตอนนี้)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.