บันทึกไฟล์ปัจจุบันด้วยชื่อที่แตกต่างกันเล็กน้อย


17

ไฟล์ของฉันมีชื่อไฟล์ยาวและส่วนหนึ่งของชื่อไฟล์คือวันที่และหมายเลขเวอร์ชัน บ่อยครั้งที่ฉันต้องการบันทึกไฟล์ในบัฟเฟอร์โดยใช้ชื่อเกือบเหมือนกันเพียงแค่เปลี่ยนหมายเลขรุ่นหรือวันที่

นี่จะง่ายกว่านี้ถ้าฉันมีคำสั่งซึ่งใส่ชื่อไฟล์ของบัฟเฟอร์ปัจจุบันลงใน kill ring เพื่อให้ฉันสามารถเปิดไฟล์จากนั้นพิมพ์C-x C-w(เขียนไฟล์) ดึงชื่อปัจจุบันด้วย Cy เปลี่ยนและบันทึก มัน.

ฉันใช้ Emacs 24.3 บน Windows และ 24.4 บน Linux ฉันต้องใช้ชื่อไฟล์ที่แตกต่างกันและไม่ต้องคอมไพล์ด้วยเหตุผลต่าง ๆ ฉันยินดีหากคำสั่งนี้ทำงานกับ AUCTeX / LaTeX เป็นโหมดหลัก


แก้ไข 1:

ฉันทำผิดพลาด: ฉันไม่ต้องการพิมพ์C-x C-f(= ค้นหาไฟล์) แต่C-x C-w(= เขียนไฟล์) ฉันแก้ไขสิ่งนี้แล้ว

แก้ไข 2:

พบคำถามและคำตอบที่ซ้ำกัน: /unix//a/45381แต่ไม่มีคำตอบที่ดีกว่า!

แก้ไข 3:

ที่นี่: http://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Components.htmlเป็นฟังก์ชันซึ่งเลือกส่วน "nondirectory" ของชื่อไฟล์:

ฟังก์ชัน: file-name-nondirectory filename

This function returns the nondirectory part of filename.

          (file-name-nondirectory "lewis/foo")
               ⇒ "foo"
          (file-name-nondirectory "foo")
               ⇒ "foo"
          (file-name-nondirectory "lewis/")
               ⇒ ""

ถ้าฉันรู้แค่เสียงกระเพื่อม ...


โอ้สวัสดีที่นั่น Keks :) ฉันสงสัยในตัวเองหลายครั้งแล้ว ... คำถามที่ดี และ Lisp นั้นง่าย ......
Sean Allred

เพิ่งพบคำถามนี้ ... ไม่อยากรู้: เป็นที่ปรึกษา "เหตุผลหลายประการ" หรือเกี่ยวข้องกับผู้ให้ข้อมูลร่วม ... ใช่หรือไม่
mbork

1
@mbork ฉันเป็นนักกฎหมายและเขียนจดหมายรวมถึงสัญญา การเปิดจดหมายล่าสุดให้กับใครสักคนเปลี่ยนชื่อเป็น erease เนื้อหาและเริ่มเขียนจดหมายใหม่ให้กับบุคคลเดียวกันนั้นเร็วกว่าการเริ่มต้นจากศูนย์ แต่เกี่ยวกับสัญญาการเปลี่ยนชื่อพวกเขาเป็นตัวแทนที่ไม่ดีสำหรับ CVS แต่ฉันไม่เคยพบทนายความคนอื่นที่ใช้ LaTeX และ Git ดังนั้นฉันต้องให้สัญญาใหม่เป็นชื่อไฟล์ใหม่ ...
Keks Dose

ยุติธรรมพอสมควร แล้ว YASnippet ล่ะ ดูเหมือนว่าจะเหมาะกับกรณีการใช้ของคุณ
mbork

@mbork ใช่สำหรับเทมเพลตของฉันฉันใช้ YASnippets มาหลายปีแล้ว LaTeX, Emacs, orgmode, YASnippets ทำให้พีซีของฉันเชื่อถือได้มากกว่า Word และ Outlook ตกลงฉันกำลังเขียนสิ่งนี้บนเครื่อง Linux แต่นั่นเป็นสิ่งที่คุณคาดไม่ถึงจากแผนกช่วยเหลือด้านไอทีตามปกติ: เพื่อสนับสนุน Linux แทนที่จะเป็น Windows
Keks Dose

คำตอบ:


23

ไม่จำเป็นต้องทำทุกอย่าง

เพียง:

  1. C-x C-wยังคงอยู่ในไฟล์ต้นฉบับตี คุณจะถูกขอให้ใส่ชื่อไฟล์ใหม่
  2. กดM-nและชื่อไฟล์ปัจจุบันจะถูกแทรกสำหรับคุณ
  3. แก้ไขสิ่งที่คุณต้องการและกดRETเพื่อบันทึกไฟล์เป็นชื่อใหม่นี้

คุณจะยังคงมีไฟล์ต้นฉบับ หากคุณต้องการกลับไปที่C-x C-fเดิม


ฉันดูในคู่มือของ Emacs เกี่ยวกับไฟล์ / การบันทึก แต่ไม่พบเคล็ดลับนี้ คุณทราบได้อย่างไร ที่ดี!
Keks Dose

4
ไม่แน่ใจ. มันเป็นเรื่องทั่วไปเกี่ยวกับ minibuffer แจ้ง Hitting Mp ต้องผ่านประวัติและการกดปุ่ม Mn จะทำให้คุณมีตัวเลือก "ปัจจุบัน"
Malabarba

5
หากคุณกำลังใช้idoทำครั้งแรกแล้วC-f M-n
Kaushal Modi

1
ว้าวฉันไม่เคยรู้เรื่องนี้เลย ขอบคุณ! (ขออภัยสำหรับความคิดเห็น "ขอบคุณฉันเหมือนกัน" แต่นี่เป็นตัวอย่างที่ดีของการเรียนรู้สิ่งที่ง่าย แต่มีประโยชน์ Viva la emacs.stackexchange!
Mark Aufflick

3

การคัดลอกชื่อไฟล์ในบัฟเฟอร์ปัจจุบัน

นี่คือฟังก์ชั่นที่ฉันใช้จากบล็อกของ Cameron Desautelsที่คัดลอกชื่อไฟล์บัฟเฟอร์ปัจจุบันและแสดงใน minibuffer

 
;; ที่มา: http://camdez.com/blog/2013/11/14/emacs-show-buffer-file-name/
(defun show-copy-buffer-file-name ()
  "แสดงพา ธ เต็มไปยังไฟล์ปัจจุบันใน minibuffer และคัดลอกไปยัง kill-ring"
  (เชิงโต้ตอบ)
  (ให้ ((ชื่อไฟล์ (บัฟเฟอร์ไฟล์ชื่อ)))
    (ถ้าชื่อไฟล์
        (progn
          (ข้อความชื่อไฟล์ข้อความ)
          (ฆ่าชื่อไฟล์ใหม่))
      (ข้อผิดพลาด "บัฟเฟอร์ไม่เข้าชมไฟล์")))

การเปลี่ยนชื่อไฟล์ในบัฟเฟอร์ปัจจุบัน

Magnar Sveenได้ใช้ฟังก์ชั่นด้านล่างในหนึ่งในบล็อกของเขาที่เปลี่ยนชื่อบัฟเฟอร์ปัจจุบันในครั้งเดียว นี่ไม่ใช่สิ่งที่คุณขอ แต่ฉันคิดว่ามันอาจเกี่ยวข้องกับกรณีการใช้งานของคุณ

;; ที่มา: http://www.whattheemacsd.com/
(defun เปลี่ยนชื่อ-current-buffer-file ()
  "เปลี่ยนชื่อบัฟเฟอร์ปัจจุบันและไฟล์ที่กำลังเข้าชม"
  (เชิงโต้ตอบ)
  (let ((ชื่อ (บัฟเฟอร์ชื่อ))
        (ชื่อไฟล์ (บัฟเฟอร์ไฟล์ชื่อ)))
    (ถ้า (ไม่ใช่ (และ (ชื่อไฟล์ (ไฟล์มีอยู่ -p ชื่อไฟล์)))
        (ข้อผิดพลาด "ชื่อบัฟเฟอร์ '% s' ไม่ได้เข้าชมไฟล์!")
      (ให้ ((ชื่อใหม่ (อ่านไฟล์ชื่อ "ชื่อใหม่:" ชื่อไฟล์)))
        (ถ้า (รับบัฟเฟอร์ชื่อใหม่)
            (ข้อผิดพลาด "บัฟเฟอร์ชื่อ '% s' มีอยู่แล้ว!" ชื่อใหม่)
          (เปลี่ยนชื่อไฟล์ไฟล์ชื่อใหม่ 1)
          (เปลี่ยนชื่อบัฟเฟอร์ใหม่ชื่อ)
          (ชื่อไฟล์ใหม่ชื่อชุด)
          (set-buffer-modified-p ไม่มีศูนย์)
          (ข้อความ "ไฟล์ '% s' เปลี่ยนชื่อเป็น '% s' สำเร็จแล้ว"
                   ชื่อ (ชื่อไฟล์ชื่อไดเรกทอรีใหม่)))))

วิธีการแก้ปัญหาโดย Magnar Sveen ลบไฟล์ต้นฉบับและจะมีการเปลี่ยนชื่อไฟล์ในภายหลังเท่านั้น นี่เป็นประโยชน์ แต่ฉันต้องการเก็บไฟล์เก่าไว้เช่นเดียวกับที่เปลี่ยนชื่อ ฟังก์ชั่นโดย Cameron Desautel คัดลอกชื่อไฟล์พร้อมทั้งเส้นทาง นี่ค่อนข้างใกล้กับโซลูชันที่ฉันต้องการ คุณรู้วิธีการเปลี่ยนฟังก์ชั่นนี้หรือไม่เพื่อที่จะทำให้ชื่อไฟล์ไม่มีเส้นทางเท่านั้น อย่างไรก็ตามขอบคุณมาก
Keks Dose

1
@KeksDose เพียงเปลี่ยน(buffer-file-name)เป็น(file-name-nondirectory (buffer-file-name))ในฟังก์ชั่นแรกที่จะได้รับไดเรกทอรีชื่อไฟล์ Sans
nispio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.