การเติมข้อความอัตโนมัติ Emacs Ruby เกือบจะทำงาน


132

ฉันได้อัปเดตการกำหนดค่า emacs ของฉันด้วยการใช้ Rsense เพื่อให้กล่องแบบเลื่อนลงการเติมข้อความอัตโนมัติปรากฏขึ้นในขณะที่พิมพ์รหัส สิ่งนี้ใช้งานได้ดีในไฟล์ส่วนใหญ่ยกเว้นฉันพบว่าไม่อนุญาตให้ฉันเลือกคำตอบจากตารางเมื่อฉันแก้ไขโค้ดในโครงการ Ruby on rail

นี่คือการตั้งค่าของฉัน: https://github.com/map7/simple_emacs

ฉันใช้สิ่งนี้ภายใต้ Ubuntu 10.04

สำหรับไฟล์สคริปต์ Ruby แบบธรรมดามันใช้งานได้ดี ฉันสามารถเปิดไฟล์ใหม่และพิมพ์

"test".up...

เช่นเดียวกับที่ฉันพิมพ์อักขระ 'p' ในรายการตัวเลือกต่างๆจะปรากฏขึ้นและฉันสามารถขึ้นและลงรายการด้วยปุ่มลูกศรและเลือกหนึ่งตัว (เช่น: ตัวพิมพ์ใหญ่) ด้วยปุ่ม Enter

สิ่งที่ไม่ได้ผลคือเมื่อฉันทำการทดสอบแบบเดียวกันทั้งหมด แต่อยู่ในไดเร็กทอรีฐานของโครงการราง

อัปเดต:

พบว่าปัญหาเกิดจาก (ต้องใช้ 'ราง) ดังนั้นจึงเป็นสิ่งที่อยู่ในปลั๊กอิน emacs-rail ที่การเติมข้อความอัตโนมัติไม่ชอบ

อัปเดต:

มันอยู่ใน emacs-rail -> railway-project.el หากฉันแสดงความคิดเห็นมาโครนี้การเติมข้อความอัตโนมัติจะทำงานมิฉะนั้นจะไม่:

(defmacro* rails-project:with-root ((root) &body body)
  "If you use `rails-project:root' or functions related on it
several times in a block of code, you can optimize your code by
using this macro. Also, blocks of code will be executed only if
rails-root exist.
 (rails-project:with-root (root)
    (foo root)
    (bar (rails-core:file \"some/path\")))
 "
 `(let ((,root (rails-project:root)))
    (when ,root
      (flet ((rails-project:root () ,root))
        ,@body))))

มีใครช่วยอธิบายได้ไหมว่าเหตุใดจึงทำให้การเติมข้อความอัตโนมัติหยุดชะงัก


1
ฟังก์ชันเติมข้อความอัตโนมัติถูกใช้ใน Ruby, C ++, lisp และทุกอย่าง
แผนที่ 7

1
ฉันหมายถึงมาโครที่นี่ใช้ที่ไหน
milkypostman

1
ฉันใช้มาโครรางเป็นหลักเพื่อข้ามไปมาระหว่างไฟล์ต่างๆใน MVC และเริ่ม DB / server / console / etc
แผนที่ 7

1
คุณสามารถดึงโซลูชันของคุณมาตอบและให้ตั๋ว "ใช้งานได้" ได้หรือไม่?
przemo_li

2
przemo_li ฉันต้องการคำตอบสำหรับสิ่งนี้ แต่การเติมข้อความอัตโนมัติยังคงไม่ทำงานเมื่อคุณติดตั้งปลั๊กอิน rails.el และคุณกำลังพยายามเติมข้อความอัตโนมัติภายในไฟล์ซอร์สโค้ดโหมดรอง
แผนที่ 7

คำตอบ:


7

นี่คือความคิด: มาโครผูกfletฟังก์ชัน(rails-project:root)หนึ่งครั้งกับค่าที่(rails-project:root)มีอยู่ก่อนการbodyดำเนินการ (นั่นคือวิธีที่อ้างว่าประสิทธิภาพเพิ่มขึ้น: เห็นได้ชัดว่าด้านนอก(rails-project:root)มีราคาแพงดังนั้นการโทรครั้งเดียวและแคชค่าจึงดูเหมือนเป็นความคิดที่ดี)

น่าเสียดายที่หากมีรหัสอยู่ภายในbodyซึ่งมีผลข้างเคียงที่ตั้งใจจะเปลี่ยนค่าที่(rails-project:root)ส่งคืนก็จะไม่มีผล การเปลี่ยนแปลงนั้นจะมองไม่เห็นแม้แต่รหัสอื่น ๆ ที่เรียกว่าภายในbodyเนื่องจาก Emacs lisp มีการผูกfletชื่อ แบบไดนามิก

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