ใส่ชื่อไฟล์ปัจจุบันใน minibuffer


12

ฉันจะแทรกชื่อไฟล์ของบัฟเฟอร์ไฟล์ที่ใช้งานอยู่ในคำสั่งได้อย่างไร

เมื่อฉันเรียกใช้คำสั่งที่ต้องการชื่อไฟล์ฉันมักจะทำเช่นนั้นจากบัฟเฟอร์ไฟล์และต้องการชื่อของไฟล์นั้นในขณะที่พิมพ์คำสั่งลงใน minibuffer

ฉันกำลังมองหาสมมุติC-xว่าฉันสามารถพิมพ์ในระหว่างการสร้างบรรทัดคำสั่งใน minibuffer

ดังนั้นหากในขณะที่บัฟเฟอร์ปัจจุบันเป็นไฟล์ชื่อLorem Ipsum.txtฉันพิมพ์สิ่งนี้:

M-x grep RET 'foo' SPC C-x … RET

M-xgrepRETของขวัญ minibuffer กระตุ้นสำหรับgrepคำสั่ง ในการตอบสนองฉันพิมพ์อาร์กิวเมนต์รูปแบบ regex ( 'foo') แล้วใส่อาร์กิวเมนต์ชื่อไฟล์ ( C-x) minibuffer นั้นจะจบลงเมื่อ:

grep -nH -e 'foo' 'Lorem Ipsum.txt'

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


3
M-nฉันไม่มีใครแปลกใจที่กล่าวถึง มันใช้งานไม่ได้ทุกที่ แต่ทำงานได้ในหลาย ๆ ที่ นอกจากนี้เนื่องจากคุณกำลัง grepping คุณอาจชอบ lgrep และ rgrep ซึ่งเป็นแบบโต้ตอบได้อีกเล็กน้อยฉันคิดว่า
Malabarba

คำตอบ:


18

คำสั่งใดที่มีอยู่จะได้รับชื่อไฟล์บัฟเฟอร์ปัจจุบันเช่นนี้

น่าเสียดายที่ไม่มีคำสั่งที่พร้อมสำหรับสิ่งนี้ แต่เราสามารถสร้างได้ดังต่อไปนี้:

(defun name-of-the-file ()
  "Gets the name of the file the current buffer is based on."
  (interactive)
  (insert (buffer-file-name (window-buffer (minibuffer-selected-window)))))

ความมหัศจรรย์อยู่ในฟังก์ชั่นหน้าต่างที่เลือกโดย minibuffer มันเป็นสิ่งที่ถูกต้องด้วยการเลือกบัฟเฟอร์สุดท้ายก่อนที่จะเปิดใช้งาน minibuffer มิฉะนั้นการใช้เพียงไฟล์บัฟเฟอร์ชื่อจะไม่ทำให้ชื่อไฟล์ของเราลงใน minibuffer ที่น่าสนใจฟังก์ชั่นเดียวกันสามารถใช้ในบัฟเฟอร์ปกติหรือ minibuffer เพื่อแทรกชื่อไฟล์ ไม่ต้องการการดูแลเป็นพิเศษ

การเชื่อมโยงคีย์เริ่มต้นคืออะไร

ไม่มีเลย แต่คุณสามารถเลือกอันที่สะดวกและกำหนดดังนี้:

(global-set-key (kbd "C-c f") 'name-of-the-file)

ใส่บรรทัดรหัสเสียงกระเพื่อมข้างต้นในไฟล์ init.el ของคุณ

วิธีนี้ใช้ได้ผลในกรณีที่ไม่สำคัญที่สุด แต่ก็ยากที่จะคาดการณ์ว่าความขัดแย้งที่อาจเกิดขึ้นกับโหมดใดก็ตามที่คุณใช้งานอยู่เมื่อเรียกใช้ฟังก์ชันนี้

จะเกิดอะไรขึ้นถ้าบัฟเฟอร์ไม่ได้ไปที่ชื่อไฟล์ที่ถูกต้องเช่นบัฟเฟอร์รอยขีดข่วน? จากนั้นข้อผิดพลาดนี้จะปรากฏในพื้นที่ echo:

name-of-the-file: Wrong type argument: char-or-string-p, nil

การเลือกบัฟเฟอร์ที่ถูกต้องด้วยชื่อไฟล์ที่เหมาะสมก่อนที่จะเรียกใช้ทางลัดจะหลีกเลี่ยงข้อผิดพลาดดังกล่าว

มีวิธีแก้ไขปัญหาอื่น ๆ อีกมากมายเช่นด้านบน แต่ส่วนใหญ่แตกต่างกันในวิธีที่พวกเขาจัดการข้อยกเว้นหรือแทนที่สำหรับความขัดแย้งใด ๆ ตัวอย่างเช่นบางคนใช้โหมดขอเพื่อให้ฟังก์ชันนี้ใช้ได้เฉพาะในบางโหมดเท่านั้น


enable-recursive-minibuffersสำหรับการทำงานฉันคิดว่าหนึ่งต้อง
Dieter.Wilhelm

หากควรใช้คำสั่งใน minibuffer เท่านั้นการเชื่อมต่อไปนี้อาจใช้แทน(define-key minibuffer-local-map (kbd "C-c f") 'name-of-the-file)'. In addition to this useful function I also created the function ชื่อของบัฟเฟอร์ซึ่งฉันผูกไว้กับC-c bที่แทรกชื่อบัฟเฟอร์ปัจจุบัน
Dov Grobgeld

2

เมื่อมีการใช้dired-xแป้นพิมพ์ลัดที่ถูกผูกไว้C-x C-j dired-jumpดังนั้นจากไฟล์ของคุณ buffer คุณจะจบลงที่เส้น dired wที่เหมาะสมและสามารถคัดลอกชื่อไฟล์ด้วย จากนั้นคุณสามารถวางลงในบัฟเฟอร์ขนาดเล็ก

ความเป็นไปได้อีกอย่างที่จะช่วยลดการพิมพ์ชื่อไฟล์คือการทำให้ไฟล์บัฟเฟอร์ mini ของ Emacs มาตรฐานเสร็จสมบูรณ์ เพียงพิมพ์อักขระตัวแรกของชื่อไฟล์แล้วกด TAB


1
คุณสามารถคัดลอกชื่อของไฟล์ในบรรทัด Dired ปัจจุบันเพียงแค่ใช้w(คำสั่งdired-copy-filename-as-kill)
ดึง

-1

คำถามจะขอให้คำสั่ง Emacs ที่มีอยู่ทำเช่นนี้

ตามที่ระบุไว้ก่อนหน้านี้:

น่าเสียดายที่ไม่มีคำสั่งที่พร้อมสำหรับสิ่งนี้

ซึ่งกลายเป็นคำตอบสำหรับคำถามนี้


มีวิธีบรรเทากรณีการใช้งานของคุณและวิธีอื่น ๆ แนะนำวิธีการเข้ารหัส bespoke ดังนั้นฉันคิดว่าคำสั่งของคุณไม่ถูกต้อง คุณไม่ได้ขอให้มาเฉพาะสำหรับการออกจากกล่องวิธี Emacs'!
Dieter.Wilhelm

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