วิธีการตรวจสอบว่าบัฟเฟอร์กำลังเยี่ยมชมไฟล์?


9

ฉันต้องการตรวจสอบว่าบัฟเฟอร์ (พูด, ปัจจุบัน) บางอย่างกำลังเยี่ยมชมไฟล์หรือไม่ ฉันสามารถพูดได้:

(if (buffer-file-name) ...)

แต่ดูเหมือนจะไม่สง่างามมาก - สิ่งที่ฉันสนใจเป็นเพียงค่าบูลีนไม่ใช่ชื่อจริงของบัฟเฟอร์ที่มีปัญหา หากbuffer-file-nameฟังก์ชั่นนั้นเขียนขึ้นใน Elisp ฉันสามารถดูที่มาของมันเพื่อค้นหาว่ามันใช้อะไร - แต่มันเขียนใน C และในขณะที่ฉันสามารถติดตั้ง Emacs ได้ฉันกลัวว่าจะไม่พบชื่อ elisp สำหรับฟังก์ชั่นที่ตรวจสอบสิ่งที่ฉันหลังจากนั้น

สิ่งที่ฉันต้องการมันคือฉันต้องการสร้างไดเรกทอรีตามชื่อไฟล์บัฟเฟอร์ปัจจุบันและตอนนี้ฉันกำลังทำสิ่งนี้ไม่มากก็น้อย:

(make-directory (if (buffer-file-name) (file-name-base) "default-dir"))

ดังนั้นสิ่งที่เป็นวิธีการ Elisp - สำนวนในการทำเช่นนี้?


2
ไม่แน่ใจว่าทำไมคุณถึงชอบที่จะใช้buffer-file-nameจริงๆมันเป็นวิธีที่ถูกต้อง (ถ้าคุณต้องการจริงๆให้tทำ(and (buffer-file-name) t)แต่นั่นคือ IMO ที่น่าเกลียดกว่า) การนำไปใช้งานคือการอ่านfilenameฟิลด์ของโครงสร้าง C บัฟเฟอร์ซึ่งไม่สามารถเข้าถึงได้โดยตรงจาก Elisp ในท้ายที่สุดมันเป็นเพียงตัวชี้ที่เป็นโมฆะหรือไม่
Sigma

ถ้านี่เป็นวิธีที่ถูกต้องฉันก็สบายดี อย่างที่ฉันพูด - ฉันไม่ทราบว่าการนำ C ไปใช้และสามัญสำนึกบอกว่าการขอชื่อไฟล์เมื่อฉันต้องการทราบว่ามีบางอย่างที่ซ้ำซ้อนหรือไม่
mbork

และฉันก็เห็นด้วยว่ามัน(and (buffer-file-name) t)ดูแปลก ๆ
mbork

หากคุณไม่คิดว่า(if (buffer-file-name) ... )สง่างามคุณจะไม่ได้รับรหัสที่มีความยาวมาก มันน่าเกลียดจากที่นี่เท่านั้น
nispio

คำตอบ:


12

ฉันขอยืนยันว่าการใช้งานของคุณนั้นมีลักษณะเหมือนสำนวนผิดเพี้ยนเนื่องจากชื่อบัฟเฟอร์เป็นค่าบูลีนที่เหมาะสมอย่างสมบูรณ์ในสิทธิ์ของตัวเอง ข้อความจากคู่มือ :

มีความสำคัญต่อการทดสอบความจริงในการแสดงออกถ้า จนถึงตอนนี้เราได้พูดถึง 'จริง' และ 'เท็จ' เป็นค่าของภาคแสดงราวกับว่าพวกเขาเป็นวัตถุ Emacs Lisp ชนิดใหม่ ในความเป็นจริงเท็จ `' nilเป็นเพียงเพื่อนเก่าของเรา สิ่งอื่นใด - อะไรก็ตาม - เป็นจริง

clone-bufferเพื่อส่งเสริมจุดตรวจสอบรหัสสำหรับ ฉันคาดว่าคุณจะเห็นสิ่งต่อไปนี้:

(interactive
 (progn
   (if buffer-file-name
       (error "Cannot clone a file-visiting buffer"))
...

โปรดทราบว่านี่คือการทดสอบการเชื่อมโยงตัวแปรbuffer-file-nameแทนที่จะเรียกใช้ฟังก์ชันโดยไม่มีอาร์กิวเมนต์(buffer-file-name)แต่ทั้งสองควรทำงานเหมือนกันเสมอ


8

คุณสามารถใช้อย่างใดอย่างหนึ่ง(buffer-file-name)(กับอาร์กิวเมนต์บัฟเฟอร์ที่เป็นตัวเลือก) หรือbuffer-file-nameตัวแปรบัฟเฟอร์ท้องถิ่น ทั้งสองประเมินเป็นค่าเดียวกันสำหรับบัฟเฟอร์ที่กำหนด

นั่นเป็นวิธีที่ใช้สำนวนนี้ใน Elisp ดังนั้นรหัสของคุณก็ใช้ได้ หากคุณต้องการอย่างยิ่งที่คุณสามารถทำให้buffer-has-file-pฟังก์ชั่นเสื้อคลุม


ขอบคุณ มีความแตกต่างอย่างมีนัยสำคัญในการเลือกฟังก์ชั่นหรือตัวแปรหรือไม่?
mbork

1
ฉันไม่คิดอย่างนั้น หากคุณจำเป็นต้องระบุอาร์กิวเมนต์ของบัฟเฟอร์ก็(buffer-file-name BUFFER)จะดีกว่าแน่นอน(with-current-buffer BUFFER buffer-file-name)แต่ถ้าอย่างนั้นฉันไม่คิดว่ามันจะเป็นเรื่องที่คุณใช้ (และฟังก์ชั่นเขียนด้วย C ฉันสงสัยว่ามันมีความแตกต่างในประสิทธิภาพ)
phils

3

buffer-file-nameใช้เพียงแค่ ในเสียงกระเพื่อมเรามักจะใช้ไม่nilคุ้มค่าหมายถึงความจริง

ครั้งเดียวที่คุณอาจต้องการหลีกเลี่ยงปัญหานี้คือถ้าฟังก์ชั่นมีราคาแพงหรือมีผลข้างเคียงที่ไม่พึงประสงค์


ฉันเห็น. ฉันรู้ว่าอะไรที่ไม่nilเป็นความจริงฉันแค่คิดโลภชื่อเมื่อฉันเพียงต้องการที่จะทราบว่าใด ๆชื่อที่มีอยู่คือ "ค่าใช้จ่าย" - แต่ดูเหมือนว่ามันไม่ได้เป็น
mbork

1

จากบท "รายการบัฟเฟอร์"ของเอกสาร:

รายการที่ส่งคืนโดยรายการบัฟเฟอร์ถูกสร้างขึ้นโดยเฉพาะ; มันไม่ใช่โครงสร้างข้อมูลของ Emacs ภายในและการแก้ไขมันไม่มีผลกับลำดับของบัฟเฟอร์

ดังนั้นคุณต้องหาวิธีการค้นหาในรายการบัฟเฟอร์สด นี่คือหนึ่ง:

  (if (string-match-p (regexp-quote "My buffer name") (format "%s" (buffer-list)))
      (message "Open")
    (message "Not open"))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.