จะรับชื่อไฟล์บัฟเฟอร์ปัจจุบันเป็น emacs ได้อย่างไร


19

หนึ่งในคุณสมบัติหลักที่ฉันพลาดเกี่ยวกับ Vim คือมันมักจะบันทึกชื่อไฟล์ของไฟล์ปัจจุบันใน%บัฟเฟอร์ ( ข้อมูลเพิ่มเติม ) ที่อนุญาตให้เรียกใช้คำสั่งได้อย่างง่ายดายเช่น:

;; compile current file
:! gcc %
;; source current file (useful when I'm editing .vimrc
:source %
;; get the size of current file
:! du -sh %
;; etc, etc...

ฉันต้องการที่จะมีฟังก์ชั่นที่คล้ายกันภายใต้emacs(รุ่น 24 หากที่สร้างความแตกต่างใด ๆ ) คือมีวิธีที่ง่ายในการแทรกชื่อของไฟล์ที่เปิดในบัฟเฟอร์ปัจจุบัน

ตัวอย่างของสิ่งที่ฉันต้องการจะทำ

ที่นี่ฉันอธิบายกรณีการใช้งานพื้นฐานบางอย่างเพื่ออธิบายได้ดีขึ้นเมื่อฉันรู้สึกว่าจำเป็นต้องใช้ทางลัด

  1. รวบรวม: เมื่อฉันป้อนM-x compileemacs ขอให้ฉันคำสั่งรวบรวม ฉันต้องการเข้าร่วมgcc (current-buffer)ได้อย่างง่ายดาย

  2. โหลดไฟล์: เมื่อฉันแก้ไขไฟล์. emacs ของฉันฉันต้องการโหลดทันทีเพื่อทดสอบการเปลี่ยนแปลง วิธีที่ฉันทำคือM-x load-fileจากนั้นฉันสะกดชื่อออกมา. e m a c sเสมอ ฉันต้องการทางลัด

  3. เปิดตัวกระบวนการภายนอก: ฉันให้du -shเป็นตัวอย่างเพียงเพื่อแสดงให้เห็นว่าฉันต้องการทางลัดที่จะสามารถใช้ได้เมื่อฉันรันคำสั่งเชลล์ด้วยM-!

สิ่งที่ฉันพบจนถึง

  • คำถามนี้ที่นี่ใน U&L คำตอบที่ให้โดยทั่วไปแล้วจะแสดงตำแหน่งที่จะค้นหาชื่อไฟล์ของบัฟเฟอร์เพื่อให้สามารถเพิ่มไปยัง kill-ring ได้ มันไม่ใช่สิ่งที่ฉันกำลังมองหาฉันไม่ต้องการฆ่าชื่อไฟล์ด้วยตนเองก่อนที่จะใช้ (วิธีแก้ปัญหาที่อธิบายไว้ในคำตอบทั้งสองนั้นดูเหมือนจะไม่ทำงานอย่างราบรื่นใน emacs ของฉันและต้องการการกดแป้นเพิ่มเติมทำให้พวกเขาเจ็บปวดเล็กน้อย)

แก้ไข : เล็กน้อยไม่เกี่ยวข้องโดยฉันพบว่าทำไมโซลูชั่นเหล่านี้ใช้งานไม่ได้ ฉันเปิดใช้งาน IDO ได้ดีขึ้นหรือแย่ลง

  • (current-buffer)ฟังก์ชั่นที่อธิบายไว้ในคู่มือการใช้งานไม่กลับมาชื่อของแฟ้มในบัฟเฟอร์ปัจจุบัน แต่ไม่มีที่ไหนในตัวอย่างที่ผมให้ไว้ข้างต้นฉันประเมินรหัส Elisp มีวิธีแทรกผลลัพธ์ของการประเมินผลของฟังก์ชั่นนี้ในบัฟเฟอร์ (ขนาดเล็ก) และเชื่อมโยงทางลัดนี้หรือไม่?

ฉันผิดที่คิดแบบนี้

ขณะนี้ฉันกำลังเรียนรู้การใช้ emacs (ใช้เวลาไม่กี่เดือนจริง ๆ ) หลังจากใช้ Vim มาหลายปี ฉันต้องการหลีกเลี่ยงกับดักที่คาดเดาได้โดยใช้ emacs-in-a-Vim-way หากคุณรู้สึกว่าสิ่งที่ฉันขอไม่มากemacs-yและควรมีวิธีที่ดีกว่านี้ (สะอาดกว่านี้) โปรดพูดถึงมันในคำตอบของคุณ


เกี่ยวกับชื่อไฟล์ใน. emacs ให้ใส่(global-set-key (kbd "C-i") buffer-file-name)หากคุณต้องการให้เป็น Ctrl + I เกี่ยวกับ. emacs M-x load-file RETทำในสิ่งที่คุณต้องการ; คุณไม่จำเป็นต้องเขียนอะไรเลย
Emanuel Berg

2
ขั้นตอนการทำงานนี้ไม่สอดคล้องกับ Emacs ได้ดีมากเนื่องจากพรอมต์ทั้งหมดที่บรรทัดล่างสุดของหน้าต่างอยู่ในบัฟเฟอร์ใน Emacs (เรียกว่า minibuffer) ดังนั้นหากคุณเรียกใช้(buffer-file-name)ขณะที่คุณพิมพ์ใน minibuffer คุณจะได้รับnilเพราะ(current-buffer)เป็น minibuffer คุณสามารถสลับบัฟเฟอร์ขณะอยู่ใน minibuffer ได้เช่นกันดังนั้นจึงยากที่จะติดตามว่าบัฟเฟอร์ใดเป็นสิ่งที่คุณคิดว่าบัฟเฟอร์ปัจจุบันตามเวลาที่บัฟเฟอร์ปัจจุบันตามที่ Emacs เห็นมันเป็น minibuffer
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


11

คุณสามารถใส่ฟังก์ชั่นดังนี้ลงใน. emacs ของคุณและผูกมันไว้กับปุ่มใด ๆ ที่คุณชอบ

(defun insert-file-name ()
  "Insert the full path file name into the current buffer."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

ดูคำถามนี้ด้วยเหมือนกัน


4

ความแตกต่างเล็กน้อยในคำตอบของ @ easybคือการคัดลอกพา ธ ไปยังแหวนสังหารของคุณแทนที่จะวางลงในบัฟเฟอร์ของคุณ (มีประโยชน์สำหรับไฟล์แบบอ่านอย่างเดียว):

(defun filename ()   
    "Copy the full path of the current buffer."  
    (interactive)  
    (kill-new (buffer-file-name (window-buffer (minibuffer-selected-window)))))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.