使用稍有不同的名称保存当前文件


17

我的文件名很长,文件名的一部分是日期和版本号。通常,我想使用几乎相同的名称将文件保存在缓冲区中,只需更改版本号或日期即可。

如果我有一个命令将当前缓冲区的文件名放入kill环中,这样我可以打开一个文件,然后键入C-x C-w(写入文件),用Cy提取当前名称,将其更改并保存,这将容易得多。它。

我在Windows上使用Emacs 24.3,在Linux上使用24.4。由于各种原因,我必须使用不同的文件名而不是git。如果此命令与AUCTeX / LaTeX作为主要模式一起使用,我将感到高兴。


编辑1:

我犯了一个错误:我不想键入C-x C-f(=查找文件),但是C-x C-w({write文件)。我在上面纠正了这个问题。

编辑2:

找到了重复的问题和答案:https : //unix.stackexchange.com/a/45381但是没有更好的答案了!

编辑3:

此处:http ://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Components.html是一个函数,用于选择filname的“非目录”部分:

功能:文件名-非目录文件名

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 2014年

1
@mbork我是律师,写信以及签订合同。比起从头开始,打开给某人的最近一封信,重命名,重新整理内容并开始向同一个人写一封新信的速度要快。但是,对于重命名合同而言,它不能很好地替代简历,但我从未见过使用LaTeX和Git的律师,所以我必须给合同的新版本赋予新的文件名...
Keks Dose

很公平。YASnippet呢?看起来非常适合您的用例。
mbork 2014年

@mbork是的,多年来,我使用的模板是YASnippets。LaTeX,Emacs,orgmode,YASnippets使我的PC比Word和Outlook更可靠。好的,我是在Linux机器上编写的,但是通常的IT服务台确实是您无法期望的:支持Linux而不是Windows。
Keks Dose 2014年

Answers:


23

不需要做所有的事情。

只是:

  1. 仍在原始文件中,单击C-x C-w。系统将提示您输入新文件名。
  2. 点击M-n,将为您插入当前文件名。
  3. 编辑所需内容,然后单击RET将文件保存为该新名称。

您仍将拥有原始文件。如果您想返回到该页面,请使用再次访问它C-x C-f


我浏览了有关文件/保存的Emacs手册,但没有找到这个技巧。你是怎么知道的?大!
Keks Dose 2014年

4
不确定。关于迷你缓冲区提示,这是很普遍的事情。击中Mp会经历历史,击中Mn则为您提供“当前”选项。
马拉巴巴2014年

5
如果您正在使用idoC-f请先执行然后再执行M-n
2014年

1
哇,我从来不知道。谢谢!(对不起,“谢谢,我也是”评论,但这是学习简单但有用的东西的一个很好的例子。Viva la emacs.stackexchange!
Mark Aufflick 2014年

3

复制当前缓冲区中的文件名

这是我从Cameron Desautels的博客中使用的功能,该功能复制当前缓冲区文件名并将其显示在minibuffer中。

 
;; 资料来源:http://camdez.com/blog/2013/11/14/emacs-show-buffer-file-name/
(defun show-copy-buffer-file-name()
  “在微型缓冲区中显示当前文件的完整路径,并将其复制到kill-ring。”
  (互动)
  (让[[文件名(缓冲区文件名))))
    (如果文件名
        (前进
          (消息文件名)
          (杀死新文件名)
      (错误“缓冲区未访问文件”))))

重命名当前缓冲区中的文件名

Magnar Sveen他的一个博客中实现了以下功能,该功能可以方便地一次性重命名当前缓冲区。这不是您要的,但我认为可能与您的用例有关。

;; 资料来源:http://www.whattheemacsd.com/
(defun重命名当前缓冲区文件()
  “重命名当前缓冲区并访问它的文件。”
  (互动)
  (让[{name(buffer-name))
        (文件名(缓冲文件名))
    (如果(不是(和文件名(file-exists -p文件名))))
        (错误“缓冲区'%s'不在访问文件!”名称)
      (让((新名称(读取文件名“新名称:”文件名))))
        (如果(获取缓冲区新名称)
            (错误“名称为'%s'的缓冲区已经存在!”新名称)
          (重命名文件文件名新名称1)
          (重命名缓冲区新名称)
          (访问文件集的新名称)
          (set-buffer-modified-p nil)
          (消息“文件'%s'已成功重命名为'%s'。”
                   名称(文件名-非目录新名称))))))))

Magnar Sveen的解决方案删除了原始文件,之后将只有重命名的文件。这很有用,但我需要保留旧文件以及重命名的文件。Cameron Desautel的功能使用完整路径复制文件名。这与我需要的解决方案非常接近。您知道如何更改此功能,以使其仅溢出文件名而不包含路径吗?但是,非常感谢。
Keks Dose 2014年

1
@KeksDose只是在第一个函数中更改(buffer-file-name)(file-name-nondirectory (buffer-file-name)),以获取没有目录的文件名。
nispio 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.