क्या जीआईएम में आने से विम तक बचत करने का कोई तरीका है?


11

मैं विम की दुनिया में नया हूं, और मैं इसे बनाना चाहता हूं ताकि हर बार जब मैं किसी फाइल को सहेजता हूं तो यह संस्करण नियंत्रण के लिए प्रतिबद्ध होता है। क्या यह संभव है?

जवाबों:


4

आप विम के ऑटोकॉमैंड्स का उपयोग कर सकते हैं:

:autocmd BufWritePost * execute '!git add % && git commit -m %'

यह अप्रयुक्त है लेकिन इसे फ़ाइल को जोड़ना चाहिए और इसे प्रतिबद्ध संदेश के रूप में फ़ाइल नाम के साथ करना चाहिए।
आप BufWritePost चाहते हैं क्योंकि यह फ़ाइल लिखे जाने के बाद चालू हो जाती है। मुझे लगता है कि हालांकि बहुत सारे भद्दे या असुरक्षित किनारे मामले हैं।


4

मैं एक विम ऑटोकॉम का उपयोग करता हूं, जिसे मैं अपने .vimrc में रखता हूं। कमांड पहले एक क्रैड चेक करता है जो हम एक गिट डायरेक्टरी में काम कर रहे हैं (एक .it डायरेक्ट्री के अस्तित्व की जाँच करके, या तो वर्तमान डाइरेक्टरी में या उपयोग करके git rev-parse), फिर उपयोग करता है git -a -m %ताकि केवल पहले जोड़ी गई फ़ाइलों का मंचन और प्रतिबद्ध हो। ।

autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'

1
सीएमडी के अंत में एकल उद्धरण याद आ रहा है, ठीक उसके बाद फाई।
एंड्रयू-ड्यूफ्रेसेन

2
यह संस्करण तभी काम करता है जब आप अपने रेपो की मूल निर्देशिका में हों। एक बेहतर समाधान है autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi', एक एसओ उत्तर से
एंड्रयू-डुफ्रेसने

यह मेरे लिए लिनक्स पर काम करता है। किसी भी विचार यह कैसे खिड़कियों पर काम करने के लिए?
user334287

2

आप भगोड़े प्लगइन में देखना चाह सकते हैं , यह विम के लिए एक बहुत शक्तिशाली गिट प्लगइन है। तुम भी सेटअप एक कर सकते हैं autocmdके रूप में donothingsuccessfullyपता चलता है, लेकिन यह पॉप अप है :Gcommitया :Gstatus(जिसमें से आप चेरी Git सूची में जोड़ना परिवर्तन चुन सकते हैं)


1

दूसरों ने जो उत्तर दिए हैं, उन पर निर्माण:

autocmd BufWritePost * execute ':silent ! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m "Auto-commit: saved %"; fi > /dev/null 2>&1'

यह पूरी तरह से पारदर्शी है। आपको "प्रेस एन्टर टू कंटिन्यू" संदेश नहीं मिलेगा (लेकिन अगर काम नहीं किया गया, तो आप यह नहीं जान पाएंगे कि यह विफल हो गया है)।


0

आप निश्चित रूप से इस मैक्रो को सफेद कर सकते हैं या कमांड रीमैपिंग के साथ।

( Https://stackoverflow.com/questions/117150/can-i-re-map-commands-in-vim चेक करें )

मुझे यकीन नहीं है कि यह एक अच्छा विकल्प है। मैं अब के लिए git में कुशल नहीं हूँ और मुझे पता है कि यह कभी-कभी svn से अलग है। लेकिन मैं svn के साथ यह ऑटो कमिट नहीं करूंगा। कमिटमेंट को सार्थक करने की जरूरत है और नियमित समय पर कुछ बचत करने की नहीं।

आप आम तौर पर प्रतिबद्ध करते हैं क्योंकि आपने एक फ़ंक्शन जोड़ा, एक बग तय किया, ... सिर्फ इसलिए नहीं कि आपने एक फ़ाइल पर काम किया। आप गैर संकलित परियोजना या अधूरे कार्य के साथ समाप्त नहीं होंगे।


यह सच है, लेकिन मैं यह भी चाहता हूं कि एक रात की स्क्रिप्ट हो जो ऐसी फ़ाइलों को स्थानांतरित करती है जो "सेव-ऑन-कमिट" रेपो से "सार्थक परिवर्तन" रेपो में सफलतापूर्वक संकलित करती हैं।
gonzo.floyd

खैर, यह पूरी तरह से Git के साथ एक बुरा विचार नहीं है। "बार-बार कमिट करना" एक आदर्श वाक्य की तरह है। यह इस तरह से भी बेहतर काम करता है, क्योंकि आप कई डेवलपर्स और न्यूनतम मुद्दों के साथ एक ही फाइल पर समवर्ती रूप से काम कर सकते हैं। यह विम के सेव मैकेनिज्म में हुक करने के लिए काफी उपयोगी होगा।
पैराग्राफर

Git में वर्कफ़्लोज़, सबवर्सन से मौलिक रूप से भिन्न हो सकते हैं। आप svn में ऐसा कभी नहीं कर सकते क्योंकि यह अपमानजनक होगा, लेकिन यह पूरी तरह से वैध उपयोग में है। उदाहरण के लिए किसी प्रकार का एक परीक्षण एकीकरण सर्वर एक परीक्षण शाखा को झुका सकता है। सेव पर ऑटो-कमिट तब काफी उपयोगी हो जाता है। जब आप इस बिंदु पर पहुंचते हैं कि कुछ काम कर रहा है, तो आप एक सार्थक संदेश के साथ सभी गतिविधि को एक ही प्रतिबद्ध में स्क्वैश करने के लिए git rebase का उपयोग करेंगे, फिर अपनी devel शाखा में विलय कर देंगे। यदि यह डरावना या जटिल लगता है, तो यह केवल इसलिए है क्योंकि आप गैर-वितरित स्रोत vcs की सीमाओं के लिए अनुकूलित हैं।
कालेब

0

मुझे पता है कि यह सवाल पुराना है और यह स्पष्ट रूप से आत्म-प्रचार है, लेकिन मैंने एक विम प्लगइन लिखा है जो विशिष्ट विम autocmdघटनाओं के बाद चलाने के लिए कुछ शेल स्क्रिप्ट को ट्रिगर करेगा । उदाहरण के लिए, .bufwritepost.vimhook.shहर बार BufWritePostकमांड को निकाल दिया जाता है , नाम की स्क्रिप्ट (सिंक्रोनस) चलाई जाएगी। फिर आप आसानी से उस स्क्रिप्ट के अंदर गिट कमिट करने के लिए जो भी तर्क चाहते हैं, शामिल कर सकते हैं। प्लगइन इन लिपियों के विशिष्ट नामकरण सम्मेलनों को मानता है और "हुक" लिपियों का भी समर्थन करता है जो केवल कुछ नामों से मेल खाने वाली फाइलों पर ट्रिगर होती हैं या कुछ एक्सटेंशन होती हैं।

पूरी जानकारी: https://github.com/ahw/vim-hooks


0

मैं इस समस्या पर अपनी रिपोर्ट दर्ज करना चाहता हूं।

मेरे पास vimrc.vimएक git रिपॉजिटरी में है ( $VIMCONFबूटस्ट्रैप .vimrc के साथ), और <Leader>veनए टैब में vimrc खोलने के लिए मैप किया गया ("vim edit")। यह वर्तमान कार्यशील निर्देशिका को प्रभावित नहीं करता है।

इसलिए यदि मैं vimrc.vimअपने vim git रिपॉजिटरी के बाहर एक अलग निर्देशिका में शुरू किए गए vim से संपादित करता हूं , तो निक एडवर्ड्स द्वारा जिस दृष्टिकोण पर चर्चा की गई थी, वह विफल हो जाएगा। मेरी हैक निम्नलिखित है (विंडोज़ और लिनक्स के लिए)

if has('win32')
    " The git command has to be passed to git. So we need to call bash.exe.
    autocmd BufEnter *vimrc.vim silent! lcd %:p:h
    autocmd BufWritePost *vimrc.vim if expand('<amatch>') =~ substitute(expand('$VIMCONF\vimrc.vim'), '\', '/', "g") | execute '! git add % & git commit -m %' | endif
else " Linux
    autocmd BufWritePost *vimrc.vim
        \ if expand('<amatch>') =~ expand($VIMCONF)."/vimrc.vim" |
        \ let tempdir = getcwd() | execute 'cd' fnameescape(expand('<amatch>:h')) | 
        \ execute '! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m % ; fi' |
        \ execute 'cd' fnameescape(tempdir) |
        \ endif
endif

स्पष्टीकरण:

  1. खिड़कियों के लिए, मैं निर्देशिका को vimrc फ़ाइल स्थान में बदल देता हूं। यह सबसे अच्छा नहीं है, और मैं बाद में लिनक्स के समान हो सकता है। इसे बहुत गंभीर न लें, लेकिन आप इसे एक मार्गदर्शक के रूप में उपयोग करना चाह सकते हैं। gitपथ में होना चाहिए (यानी आपको टाइप करने git <ENTER>में सक्षम होना चाहिए cmd.exe)
  2. लिनक्स के लिए, मैं पहले जांचता हूं कि मैं सही vimrc.vim का संपादन कर रहा हूं
  3. वर्तमान कार्य निर्देशिका को सहेजें tempdir
  4. निर्देशिका को vimrc.vim फ़ाइल में बदलें
  5. कर कमिट
  6. पिछली कार्य निर्देशिका पर वापस लौटें
  7. मैं मैन्युअल रूप से परिवर्तन में परिवर्तन करता हूं

टिप्पणियाँ:

  1. कमांड को "जंजीर" के साथ किया जा सकता है |। यदि कोई भी आदेश विफल हो जाता है तो श्रृंखला निरस्त हो जाएगी। कई लाइनों को तोड़ने के लिए अगली पंक्ति के साथ शुरू करें \
  2. इसे ftplugin फ़ाइलों तक बढ़ाया जा सकता है। आपके फिल्टर होंगे *.vimऔरexpand($VIMCONF)."/ftplugin/"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.