2012-01-24 13 views
14

Im emacs, chcę uruchomić "dotknąć" pliku wskazanego przez bieżący bufor (w szczególności chcesz zmienić czas modyfikacji). Używam guard do uruchamiania niektórych testów po zmianie plików, ale czasami chcę wywołać je ręcznie. Nie dbam o to, aby uruchamiać rzeczywiste działanie powłoki, dopóki ustawiony jest mtime."Dotknij" bieżącego pliku w emacs

+2

To nie jest duplikat tego pytania. Nie chcę, aby plik został zapisany, chcę tylko zaktualizować plik mtime (stąd potrzeba dotyku, a nie czystego rozwiązania @jtahlborn) – spike

+1

Chciałbym, żeby ludzie nie zamykali pytań bez uważnego ich czytania . To właściwie dobre pytanie. – Nemo

Odpowiedz

7

Oczywiście zakłada się, że na swojej ścieżce masz polecenie o nazwie 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)) 

W trybie diodowym istnieje domyślne polecenie dotykowe o numerze T. To polecenie nie jest jednak tak łatwe w użyciu, ponieważ monituje użytkownika o znacznik czasu. Przypuszczam, że jest to bardzo ogólne, ale nie jest to bardzo wygodny sposób robienia tego, co zazwyczaj jest zamierzone przez "dotyk".

+0

piękne, nie byłem pewien, jak uzyskać nazwę pliku do polecenia. – spike

+2

Co się stanie, jeśli nazwa bufora zawiera spacje? Lub kończy się na "; rm -rf /"? Sugerowałbym użycie '(shell-quote-argument (nazwa-pliku-bufora))' – Nemo

+0

Jeśli zawiera spacje, to zrobią to cytaty - dodam to. Jeśli nazywasz swoje pliki za pomocą "; rm -rf /", to zasługujesz na to, co dostałeś! :) Przypomina mi to: http://xkcd.com/327/ –

3

Robię to w ten sposób: wstaw spację, koniec, a następnie ponownie usuwam spację i zapisuję. To zmienia mtime.

+2

Tak, ja też to robię, ale musi istnieć sposób emacs – spike

+0

tak, to jest dokładnie to, co robię, ale napisałem funkcję seplenienia, która pomoże ci (zobacz moją odpowiedź na to pytanie). –

4

Oto emacs czysty sposób to zrobić:

(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

Podoba mi się" czyste "rozwiązanie elisp, które nie wymaga wywoływania do powłoki, ale robi to po prostu zmienia znacznik czasu lub zapisuje cały bufor do pliku? Nawet polecenie dotykowe trybu diody wywołuje w powłoce polecenie wywołania dotyku. Naprawdę potrzebujemy funkcji elisp, która wywołuje utime() w C z procesu Emacsa. –

+0

@GregMattes - w zasadzie robi odpowiednik "modyfikacji" bufora, a następnie zapisania go (bez faktycznej zmiany zawartości bufora). – jtahlborn

+1

Tak, dokładnie. To może spowodować wiele operacji wejścia/wyjścia, jeśli wiele plików jest dotykanych, ponieważ cała zawartość jest zapisywana. Na przykład pytający pytający jest zainteresowany dotykaniem plików, aby wymusić testowanie. Mogę sobie wyobrazić, że mógłby napisać jakiś eliksir, aby automatycznie dotknąć zestawu plików, być może dużego zbioru plików. Zatem zapisanie całego pliku zamiast zwykłego mutowania mtime w i-węźle może być bardzo znaczące. Nie mówię, że twoje podejście jest złe. Właściwie to jest naprawdę fajnie mieć wszystko w niezależnym od platformy elispie bez wywoływania zewnętrznego polecenia powłoki. –

6

może więcej klawiszy niż niestandardowej funkcji, ale można to zrobić z pola z C-u M-~ następnie C-x C-s.

M-~ jest związana domyślnie not-modified, który podaje modyfikacji flagę bufora, chyba że nazywasz go z argumentem (C-u prefiksem), w którym to przypadku nie odwrotnie. Następnie po prostu zapisz bufor.

+1

Ostra końcówka, te same komentarze, co w odpowiedzi @ jtahlborn – spike

+0

@spike, zauważyłem, że komentarz po wysłaniu, i zgadzam się, dotyk jest lepszy. – harpo

Powiązane problemy