2012-01-24 15 views
14

Im emacs, मैं वर्तमान बफर द्वारा संदर्भित फ़ाइल पर "स्पर्श" चलाने के लिए चाहता हूं (विशेष रूप से संशोधन समय बदलना चाहता हूं)। फ़ाइलों को बदलने के बाद कुछ परीक्षण चलाने के लिए मैं guard का उपयोग करता हूं, लेकिन कभी-कभी मैं इसे मैन्युअल रूप से आमंत्रित करना चाहता हूं। मुझे तब तक वास्तविक खोल उपयोगिता स्पर्श चलाने की परवाह नहीं है जब तक कि एमटाई सेट हो।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

क्या होगा यदि बफर नाम में रिक्त स्थान हैं? या "आरएम-आरएफ /" के साथ समाप्त होता है? मैं '(शेल-कोट-तर्क (बफर-फ़ाइल-नाम))' – Nemo

+0

का उपयोग करने का सुझाव दूंगा यदि इसमें इसमें रिक्त स्थान हैं तो कुछ उद्धरण करेंगे - मैं इसे जोड़ दूंगा। यदि आप अपनी फाइलों को "; आरएम-आरएफ /" के साथ नाम दे रहे हैं तो आप जो भी प्राप्त करते हैं उसके लायक हैं! :) मुझे इस बारे में याद दिलाता है: http://xkcd.com/327/ –

3

मुझे ऐसा लगता है: एक स्पेस डालें, अंत में मैं फिर से स्थान हटा देता हूं और सहेजता हूं। यह mtime बदलता है।

+2

हाँ, यही वह है जो मैं भी कर रहा हूं, लेकिन – spike

+0

हाँ, यह बहुत कुछ है जो मैं भी करता हूं, लेकिन मैंने एक लिस्प फ़ंक्शन लिखा है जो आपकी मदद करेगा (इस प्रश्न का मेरा जवाब देखें)। –

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

मुझे" शुद्ध "elisp समाधान पसंद है जिसे खोल में कॉल करने की आवश्यकता नहीं है, लेकिन क्या यह दृष्टिकोण केवल टाइमस्टैम्प को बदलता है, या संपूर्ण बफर लिखता है फाइल के लिए? यहां तक ​​कि डाइडर-मोड का टच कमांड स्पर्श कमांड का आह्वान करने के लिए खोल में कॉल करता है। हमें वास्तव में जो चाहिए वह एक elisp फ़ंक्शन है जो Emacs प्रक्रिया से सी में utime() को कॉल करता है। –

+0

@ ग्रेगमैट्स - यह मूल रूप से बफर को "संशोधित" करने के बराबर करता है और फिर इसे सहेजता है (वास्तव में बफर सामग्री को बदले बिना)। – jtahlborn

+1

हाँ, बिल्कुल। इससे बहुत सी आई/ओ हो सकती है अगर कई फाइलों को छुआ जा रहा है क्योंकि पूरी सामग्री को बचाया जा रहा है। उदाहरण के लिए, प्रश्न पूछने वाले को परीक्षण को मजबूर करने के लिए फ़ाइलों को छूने में रुचि है। मैं कल्पना कर सकता हूं कि वह फाइलों के एक समूह को स्वचालित रूप से स्पर्श करने के लिए कुछ elisp लिख सकता है, संभवतः फ़ाइलों का एक बड़ा सेट। तो बस इनोड में mtime को म्यूट करने की बजाय पूरी फ़ाइल लिखना बहुत महत्वपूर्ण हो सकता है। मैं नहीं कह रहा हूं कि आपका दृष्टिकोण गलत है। वास्तव में, यह बाहरी शेल कमांड का आह्वान किए बिना प्लेटफार्म-स्वतंत्र elisp में यह सब वास्तव में अच्छा है। –

6

हो सकता है कि एक कस्टम समारोह की तुलना में अधिक कीस्ट्रोक्स, लेकिन आप C-u M-~ तो C-x C-s के साथ बॉक्स से बाहर कर सकते हैं।

M-~not-modified, जो बफर के संशोधन ध्वज को साफ करता है, जब तक आप इसे एक तर्क (C-u उपसर्ग) है, जो मामले में यह विपरीत है साथ कॉल करने के लिए डिफ़ॉल्ट रूप से बाध्य है। फिर बस बफर को बचाओ।

+1

कूल टिप, @ jtahlborn के उत्तर – spike

+0

@spike पर समान टिप्पणियां, मैंने देखा कि पोस्ट करने के बाद टिप्पणी, और मैं सहमत हूं, स्पर्श बेहतर है। – harpo

संबंधित मुद्दे