2012-01-24 24 views
14

Im emacs,我想在当前缓冲区引用的文件上运行“touch”(特别是要更改修改时间)。我使用guard在文件更改后运行一些测试,但有时我想手动调用它。只要设置了mtime,我并不在意运行实际的shell实用程序触摸。在emacs中“触摸”当前文件

+2

这不是该问题的重复。我不希望保存文件,我只想更新文件的时间(因此需要触摸,而不是@jtahlborn的纯emacs解决方案) – spike

+1

我希望人们不要在没有仔细阅读的情况下关闭问题。这实际上是一个很好的问题。 – Nemo

回答

7

当然,这里假定您的路径上有一个名为touch的命令。

(defun touch() 
    "updates mtime on the file for the current buffer" 
    (interactive) 
    (shell-command (concat "touch " (shell-quote-argument (buffer-file-name)))) 
    (clear-visited-file-modtime)) 

在dired模式有默认绑定到T触摸命令。该命令不太容易使用,因为它会提示用户输入时间戳。我认为这是非常普遍的,但这不是一种非常方便的方式来完成通常通过“触摸”来实现的目的。

+0

美丽,我不知道如何获取文件名到命令中。 – spike

+2

如果缓冲区名称中有空格,该怎么办?或以“; rm -rf /”结尾?我会建议使用'(shell-quote-argument(buffer-file-name))' – Nemo

+0

如果它有空格,那么一些引号会做 - 我会补充说。如果你用“; rm -rf /”命名你的文件,那么你应该得到你所得到的! :)提醒我这个:http://xkcd.com/327/ –

3

我这样做:插入空格,结束然后我再次删除空间并保存。这改变了mtime。

+2

是的,这就是我正在做的,但必须有一个Emacs的方式 – spike

+0

是的,这几乎是我所做的,但我写了一个lisp函数,可以帮助你(请参阅我对这个问题的回答)。 –

4

这是一个纯粹的emacs的方式来做到这一点:

(defun touch-file() 
    "Force modification of current file, unless already modified." 
    (interactive) 
    (if (and (verify-visited-file-modtime (current-buffer)) 
      (not (buffer-modified-p))) 
     (progn 
     (set-buffer-modified-p t) 
     (save-buffer 0)))) 
+1

我喜欢不需要调用shell的“纯”elisp解决方案,但是这种方法只是改变时间戳,或者写整个缓冲区到文件?即使是直接模式的触摸命令也会调用外壳来调用触摸命令。我们真正需要的是一个elisp函数,它从Emacs进程中调用C中的utime()。 –

+0

@GregMattes - 它基本上等同于“修改”缓冲区,然后保存它(不实际更改缓冲区内容)。 – jtahlborn

+1

是的,确切地说。如果由于整个内容正在被保存而触及很多文件,那么这可能会导致很多I/O。例如,提问者有兴趣触摸文件来强制测试。我可以想象他可能会编写一些elisp来自动触摸一组文件,可能是一大组文件。因此,编写整个文件而不是在inode中更改mtime可能非常重要。我并不是说你的方法是错误的。实际上,在不调用外部shell命令的情况下,将它全部放在独立于平台的elisp上真的很好。 –

6

也许比一个自定义功能按键多,但你可以C-u M-~然后C-x C-s做开箱。

M-~默认绑定到not-modified,它清除该缓冲区的修改标志,除非使用的参数(C-u前缀),在这种情况下它的相反调用它。然后保存缓冲区。

+1

酷评论,@ jtahlborn的回答相同的评论 – spike

+0

@spike,我注意到张贴后的评论,我同意,触摸更好。 – harpo