2012-01-24 7 views
14

Imacacs、私は現在のバッファが参照するファイル(特に変更時刻を変更したい)に "touch"を実行したいと思います。私はguardを使用して、ファイルが変更された後にいくつかのテストを実行しますが、時々手動で呼び出す必要があります。私はmtimeが設定されている限り、実際のシェルユーティリティタッチを実行することは気にしません。emacsの現在のファイルを "タッチ"

+2

これはその質問と重複していません。私はファイルを保存する必要はありません、私はちょうどファイルのmtimeが(したがって、タッチのための必要性は、@ jtahlbornの純粋なemacsソリューションではありません) – spike

+1

私は人々が慎重に読んでいない。これは実際には良い質問です。 – Nemo

答えて

7

もちろん、これはパスにtouchというコマンドがあることを前提としています。変数diredモードで

(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)) 

Tにデフォルトでバインドされたタッチコマンドがあります。このコマンドは、ユーザーにタイムスタンプを要求するため、使い方が簡単ではありません。私はそれが非常に一般的だと思うが、それは典型的には「タッチ」によって意図されていることをするのに非常に便利な方法ではない。カスタム関数より

(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)))) 
+0

美しい、私はコマンドにファイル名を取得する方法がわかりませんでした。 – spike

+2

バッファ名にスペースが含まれているとどうなりますか?または "; rm -rf /"で終わりますか? '(shell-quote-argument(buffer-file-name))'を使用することをお勧めします。 – Nemo

+0

空白がある場合は、引用符で囲みます。あなたが "; rm -rf /"であなたのファイルを命名しているなら、あなたはあなたが得るものに値するでしょう! :)これを思い出させてくれます:http://xkcd.com/327/ –

3

私はこのようにします:スペースを挿入してから、スペースをもう一度削除して保存します。これはmtimeを変更します。

+2

yea、これも私がやっていることですが、emacsの方法が必要です。 – spike

+0

ええ、それは私がやることです。しかし、私はあなたを助けるlisp関数を書いています(この質問に対する私の答えを見てください)。 –

4

はそれを行うには、純粋なEmacsの方法です。

M-~は、あなたはそれが反対の動作をした場合には、引数(C-u接頭辞)、でそれを呼び出さない限り、バッファの変更フラグをクリアnot-modifiedにデフォルトでバインドされています。次に、バッファを保存するだけです。

+1

私はシェルに呼び出す必要のない「純粋な」elispソリューションが好きですが、この方法ではタイムスタンプを変更するだけで、バッファ全体を書き込んでいますファイルに? dired-modeのtouchコマンドでさえ、シェルにtouchコマンドを呼び出すよう呼び出します。本当に必要なのは、EmacsのプロセスからCでutime()を呼び出すelisp関数です。 –

+0

@ GregMattes - 基本的には、バッファを "変更"して保存します(実際にはバッファの内容は変更しません)。 – jtahlborn

+1

うん、まさに。コンテンツ全体が保存されているため、多くのファイルに触れていると、多くのI/Oが発生する可能性があります。たとえば質問質問者は、ファイルに触れてテストを強制することに興味があります。私は、彼がいくつかのファイル、おそらくは大量のファイルのセットに自動的に触れるようなelispを書くかもしれないと想像することができます。だから、iノードでmtimeを変更するのではなく、ファイル全体を書くことは非常に重要です。あなたのアプローチが間違っていると言っているわけではありません。実際には、外部のシェルコマンドを呼び出さずに、プラットフォームに依存しないelispですべてのことを行うことは本当にうれしいです。 –

6

たぶんよりキーストロークができますが、その後、C-u M-~C-x C-sでボックスをこれを行うことができます。ここでは

+1

クールなヒント、@ jtahlbornの回答と同じコメント – spike

+0

@ spike、私は投稿後にそのコメントに気づいた、と私は同意、タッチが良いです。 – harpo

関連する問題