2012-01-24 66 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