Simpan file saat ini dengan nama yang sedikit berbeda

17

File saya memiliki nama file yang panjang dan bagian dari nama file adalah tanggal dan nomor versi. Seringkali saya ingin menyimpan file di buffer menggunakan nama yang hampir sama, cukup ganti nomor versi atau tanggal.

Ini akan jauh lebih mudah, jika saya memiliki perintah yang memasukkan nama file dari buffer saat ini ke dalam kill ring, sehingga saya dapat membuka file, lalu ketik C-x C-w(tulis file), tarik nama saat ini dengan Cy, ubah dan simpan Itu.

Saya menggunakan Emacs 24.3 di Windows dan 24.4 di Linux. Saya harus menggunakan nama file yang berbeda dan tidak git karena berbagai alasan. Saya akan senang jika perintah ini bekerja dengan AUCTeX / LaTeX sebagai mode utama.


Edit 1:

Saya membuat kesalahan: Saya tidak ingin mengetik C-x C-f(= mencari file), tetapi C-x C-w(= menulis file). Saya memperbaiki ini di atas.

Edit 2:

Menemukan pertanyaan dan jawaban duplikat: /unix//a/45381 Tapi tidak ada jawaban yang lebih baik!

Edit 3:

Di sini: http://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Components.html adalah fungsi, yang memilih bagian "nondirectory" dari nama file:

Fungsi: nama file-nama file-non-direktori

This function returns the nondirectory part of filename.

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

Kalau saja aku tahu ...

Keks Dosis
sumber
Oh, halo yang ada di sana :) Saya sebenarnya sudah sering bertanya-tanya dalam hati ... pertanyaan yang bagus. Dan Lisp itu mudah ......
Sean Allred
Baru saja menemukan pertanyaan ini ... Karena penasaran: apakah "berbagai alasan" berhubungan dengan penasihat / rekan penulis ...?
mbork
1
@ mbork Saya seorang pengacara dan menulis surat serta kontrak. Membuka surat baru kepada seseorang, mengganti namanya, memperbaiki konten dan mulai menulis yang baru untuk orang yang sama lebih cepat daripada memulai dari awal. Tetapi mengenai kontrak penggantian nama mereka adalah pengganti yang buruk untuk cvs, tapi saya belum pernah bertemu pengacara lain yang menggunakan LaTeX dan Git, jadi saya harus memberikan versi baru dari kontrak nama file baru ...
Keks Dose
Cukup adil. Bagaimana dengan YASnippet? Tampaknya sangat cocok untuk kasus penggunaan Anda.
mbork
@mbork Ya, untuk templat saya, saya menggunakan YASnippets, sejak bertahun-tahun. LaTeX, Emacs, orgmode, YASnippets membuat PC saya jauh lebih andal daripada Word dan Outlook. OK, saya menulis ini di mesin Linux, tapi itu sesuatu yang Anda benar-benar tidak dapat harapkan dari IT helpdesk yang biasa: untuk mendukung Linux daripada Windows.
Keks Dose

Jawaban:

23

Tidak perlu melakukan semua itu.

Secara sederhana:

  1. Masih di file asli, tekan C-x C-w. Anda akan dimintai nama file baru.
  2. Hit M-n, dan nama file saat ini akan dimasukkan untuk Anda.
  3. Edit apa yang Anda inginkan dan tekan RETuntuk menyimpan file ke nama baru ini.

Anda masih memiliki file aslinya. Jika Anda ingin kembali ke sana, cukup kunjungi lagi bersama C-x C-f.

Malabarba
sumber
Saya telah melihat manual Emacs tentang Files / Saving, tetapi tidak menemukan trik ini. Bagaimana Anda mengetahuinya? Bagus!
Keks Dosis
4
Tidak yakin. Ini adalah hal umum tentang bisikan minibuffer. Memukul Mp melewati sejarah, dan memukul Mn memberi Anda opsi "saat ini".
Malabarba
5
Jika Anda menggunakan ido, lakukan C-fdulu lalu M-n.
Kaushal Modi
1
Wow, saya tidak pernah tahu ini. Terima kasih! (Maaf atas komentar "terima kasih, aku juga", tetapi ini adalah contoh yang bagus untuk mempelajari sesuatu yang sederhana namun bermanfaat. Viva la emacs.stackexchange!
Mark Aufflick
3

Menyalin nama file di buffer saat ini

Ini adalah fungsi yang saya gunakan dari blog Cameron Desautels yang menyalin nama file buffer saat ini dan menampilkannya dalam minibuffer.

 
;; Sumber: http://camdez.com/blog/2013/11/14/emacs-show-buffer-file-name/
(menolak show-copy-buffer-file-name ()
  "Perlihatkan path lengkap ke file saat ini di minibuffer dan juga salin ke kill-ring."
  (interaktif)
  (let ((nama file (nama file buffer))))
    (jika nama file
        (progn
          (nama file pesan)
          (kill-new file-name))
      (kesalahan "Buffer tidak mengunjungi file"))))

Mengganti nama nama file dalam buffer saat ini

Magnar Sveen telah mengimplementasikan fungsi di bawah ini di salah satu blognya yang dengan mudah mengubah nama buffer saat ini dalam sekali jalan. Ini bukan yang Anda minta, tapi saya pikir itu bisa terkait dengan kasus penggunaan Anda.

;; Sumber: http://www.whattheemacsd.com/
(defun rename-current-buffer-file ()
  "Ganti nama buffer saat ini dan ajukan kunjungannya."
  (interaktif)
  (let ((nama (nama penyangga)))
        (nama file (nama file buffer))))
    (jika (bukan (dan nama file (nama file ada-p))))
        (kesalahan "Buffer '% s' tidak mengunjungi nama file!")
      (let ((nama-baru (nama-file-baca "Nama baru:" nama file)))
        (if (get-buffer-new-name)
            (kesalahan "Buffer bernama '% s' sudah ada!" nama baru)
          (ganti nama file nama file nama baru 1)
          (ganti nama-buffer nama-baru)
          (set-visited-file-nama-nama baru)
          (set-buffer-modified-p nil)
          (pesan "File '% s' berhasil diganti namanya menjadi '% s'."
                   nama (nama file-nama-nama-baru))))))))
Kaushal Modi
sumber
Solusi oleh Magnar Sveen menghapus file asli dan hanya akan ada file yang diganti nama setelahnya. Ini berguna, tetapi saya perlu menyimpan file lama dan juga yang namanya diganti. Fungsi oleh Cameron Desautel menyalin nama file dengan seluruh path. Ini cukup dekat dengan solusi yang saya butuhkan. Apakah Anda tahu cara mengubah fungsi ini, sehingga hanya menumpahkan nama file tanpa path? Namun, terima kasih banyak.
Keks Dosis
1
@KeksDose cukup ubah (buffer-file-name)ke (file-name-nondirectory (buffer-file-name))dalam fungsi pertama untuk mendapatkan direktori nama file sans.
nispio