vim, वेनिला विम (कोई प्लगइन्स) का उपयोग करके फ़ाइलों के बीच तेज़ी से स्विच करना


103

मैं समझता हूं कि वेनिला विम (प्लगइन्स का उपयोग नहीं करना) के लिए खुद को सीमित करना संपादक की शक्ति को सीमित करता है, लेकिन जैसा कि मैं अलग-अलग मशीनों के बीच स्विच करता हूं, यह अक्सर मेरे वातावरण को हर जगह स्थानांतरित करने के लिए बहुत अधिक परेशानी है। मैं सिर्फ वेनिला विम में रहना चाहता हूं।

कुछ जो मुझे वापस रखता है वह फाइलों के बीच जल्दी से स्विच करने की क्षमता है। मैं (कम से कम विश्वास करते हैं) की एक अच्छी समझ है बफ़र्स , खिड़कियां , टैब , साथ ही netrw ( Vex, Ex, आदि)।

लेकिन Sublime Text जैसे संपादक में , मैं बस टाइप कर सकता हूं ctrl- pऔर तुरंत मैं फ़ाइल में हूं।

मुझे पता है कि मैं खोल के नीचे जा सकता हूं, लेकिन मुझे आश्चर्य है कि अगर कोई अन्य "छिपी हुई" रहस्य हैं, तो फ़ाइल नाम के बजाय केवल फ़ाइल नाम के आधार पर फ़ाइलों के बीच तेजी से स्विच करने के लिए।


2
यह आपके प्रश्न का उत्तर नहीं देता है, लेकिन यह आपको प्लगइन्स का उपयोग करने पर विचार करने के लिए राजी कर सकता है: dudarev.com/blog/keep-vim-settings-and-plugins-in-git-repo
ajwood

मैं व्यक्तिगत रूप से ड्रॉपबॉक्स के साथ अपनी सेटिंग्स को सिंक करता हूं। यह अनाड़ी है लेकिन इसके बारे में सोचने के बिना यह कम या ज्यादा काम करता है। एक प्लगइन जो मैं उपयोग करता हूं और जानता हूं कि आप जो चाहते हैं उसके लिए अच्छी तरह से काम करता है कमांड-टी ( github.com/wincent/Command-T )। Ctrl-P एक विकल्प ( vim.org/scripts/script.php?script_id=3736 ) हो सकता है ।
एफएक्स

1
क्या आपने danielmiessler.com/study/vim देखा है ? उसके पास अपनी विम्स्क + को रखने की बहुत ही स्मार्ट प्रैक्टिस है। उसे गिथब में अपनी जरूरत के सभी प्लग ... एनिमा जहाँ वह जाता है वह उसे क्लोन कर सकता है और वायला कर सकता है, विम बिलकुल वैसा ही है जैसा वह पसंद करता है। शानदार
बॉबॉक्स 6'14

6
@ बोबॉक्स, हजारों लोग ऐसा करते हैं; इसके बारे में कुछ भी असाधारण नहीं है।
रोमेल

जवाबों:


236

निकटतम समकक्ष ( "सबसे करीब", नहीं "सटीक") ST2 के लिए Ctrl+ Pएक प्लगइन कहा जाता है, के लिए तैयार ... मिलता है CtrlP । इसी तरह के अन्य प्लगइन्स हैं जैसे कमांड-टी या फ़ज़ीफ़ाइंडर

मैं CtrlP का उपयोग करता हूं और मुझे यह पसंद है लेकिन मैं "प्लगइन-फ्री" जाने के आपके निर्णय का तहे दिल से समर्थन करता हूं। यह जाने का सबसे आसान तरीका नहीं है, लेकिन यह लंबे समय में भुगतान करेगा।


फाइलें खोलना

फ़ाइल खोलने का सबसे मूल तरीका है :e /path/to/filename। शुक्र है, आपको टैब-पूर्ण और वाइल्डकार्ड मिलते हैं: क्लासिक *और एक विशेष **, जो "किसी भी उपनिर्देशिका" के लिए खड़ा है।

उस सभी को मिलाकर, आप यह कर सकते हैं:

:e **/*foo<Tab>

fooकार्य निर्देशिका के तहत उनके नाम वाली सभी फाइलों को चुनने के लिए या:

:e **/*foo/*bar<Tab>

barकिसी भी उपनिर्देशिका के तहत उनके नाम वाली सभी फाइलों को उसके नाम से चुनने के लिए foo, कहीं भी काम करने वाली निर्देशिका के तहत चुनें।

बेशक, कि के लिए काम करता है :tabe[dit], :sp[lit]और :vs[plit], भी।

उन आदेशों को एक फ़ाइल तक सीमित किया गया है, हालांकि। :nextएकाधिक फ़ाइलों को खोलने के लिए उपयोग करें :

:next **/*.js

और देख लो :help arglist


बफ़र्स के बीच कूदते हुए

:b[uffer] बुनियादी बफर-स्विचिंग कमांड है:

:b4         " switch to buffer number 4
:bn         " switch to next buffer in the buffer list
:bp         " switch to previous buffer in the buffer list
:bf         " switch to first buffer in the buffer list
:bl         " switch to last buffer in the buffer list
:b foo<Tab> " switch by buffer name with tab-completion
:b#         " switch to the alternate file

ध्यान दें कि इनमें से कई कमांड और उनके रिश्तेदार एक गिनती स्वीकार करते हैं।

:lsआदेश आप भरी हुई बफ़र्स की एक सूची से पता चलता है। यह थोड़ा "विशेष" है, हालांकि: बफ़र्स को एक नंबर असाइन किया जाता है जब वे बनाए जाते हैं तो आपके पास एक सूची हो सकती है जो दिखता है जैसे 1 2 5कि आप बफ़र्स हटाते हैं। यह थोड़ा अजीब है, हाँ, और यह एक बफर के लिए स्विच कर रहा है अपनी संख्या से थोड़ा परेशान है। आंशिक नाम :b foo<Tab>या साइकलिंग द्वारा स्विचिंग को प्राथमिकता दें :bn :bp

वैसे भी, यहाँ एक कूल मैपिंग है जो सभी लोड किए गए बफ़र्स को सूचीबद्ध करता है और आपके लिए संकेत को पॉप्युलेट करता है, आपके लिए एक बफर की संख्या टाइप करने और प्रेस करने के लिए इंतजार कर रहा है <enter>:

nnoremap gb :ls<CR>:b<Space>

इस मानचित्रण के साथ, दूसरे बफर पर स्विच करना उतना ही सरल है:

gb
(quickly scanning the list)
3<CR>

या:

gb
(quickly scanning the list)
foo<tab><CR>

यह विचार बिरुई के विम इन्फोग्राफिक्स के संग्रह से ली गई छवि से आया है :

फ्लाइंग बनाम साइकिलिंग

विम में भी <C-^>(या <C-6>कुछ कीबोर्ड पर) है- सामान्य मोड के :b#बराबर- वर्तमान बफ़र और पिछले एक के बीच कूद। यदि आप अक्सर दो बफ़र्स के बीच वैकल्पिक करते हैं, तो इसका उपयोग करें।

सभी बफ़र्स के बारे में पढ़ें :help buffers


घोषणा पर जाएं

एक फ़ाइल के भीतर, आप उपयोग कर सकते हैं gdया gD

एक परियोजना के भीतर, विम का "टैग" फीचर आपका दोस्त है लेकिन आपको ctags या cscope जैसे बाहरी कोड इंडेक्सर की आवश्यकता होगी। सबसे बुनियादी आज्ञाओं हैं :tag fooऔर <C-]>एक विधि नाम पर कर्सर के साथ। दोनों उपकरण अच्छी तरह से विम में एकीकृत हैं: देखें :help tags, :help ctagsऔर :help cscope

इसके लायक होने के लिए, मैं एक परियोजना के भीतर स्थानांतरित करने के लिए बड़े पैमाने पर टैग नेविगेशन का उपयोग करता हूं ( ज्यादातर CtrlP :CtrlPTagऔर :CtrlPBufTagकमांड का उपयोग करके , लेकिन बिट -इन वाले भी) और मेरा पसंदीदा "जेनेरिक" बफर स्विचिंग विधि नाम से है।


आपके कॉन्फिगरेशन को तैनात करना

बहुत सारे विम उपयोगकर्ताओं ने अपने कॉन्फ़िगरेशन को संस्करण नियंत्रण में रखा है जो एक नई मशीन पर अपने स्वयं के कॉन्फ़िगरेशन को स्थापित करने के लिए बहुत तेज और आसान बनाता है । इसके बारे में सोचो।


संपादित करें

कुछ महीने पहले, मुझे एक पुरानी मशीन के साथ रिमोट मशीन पर काम करना पड़ा। मैं एक उचित विम स्थापित कर सकता था और अपने स्वयं के प्रिय विन्यास को क्लोन कर सकता था लेकिन मैंने "देखा को तेज" करने के लिए, इस बार प्रकाश यात्रा करने का फैसला किया। मैंने जल्दी से एक न्यूनतावादी का निर्माण .vimrcकिया और आधे भूल गए देशी सुविधाओं के एक जोड़े को फिर से बनाया । उस टमटम के बाद, मैंने तय किया कि CtrlP उतना आवश्यक नहीं है और इससे छुटकारा पा लिया: देशी सुविधाएँ और कस्टम मैपिंग उतनी सेक्सी नहीं हैं, लेकिन वे बहुत निर्भरता के बिना काम पूरा करते हैं।


फाइलों के साथ जुगलबंदी

set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *

:findजैसे ही आप set pathसही रूप में एक महान आदेश है। मेरी सेटिंग्स के साथ, वर्तमान निर्देशिका के अंतर्गत, पुनरावर्ती ,ffoo<Tab>सभी फाइलें fooमिलेंगी। यह त्वरित, सहज और हल्का है। बेशक, मुझे उसी के पूरा होने और वाइल्डकार्ड से लाभ होता है जैसे कि :editऔर दोस्तों के साथ ।

इस प्रक्रिया को और भी तेज़ बनाने के लिए, निम्न मैपिंग मुझे प्रोजेक्ट के संपूर्ण भागों को छोड़ देने और वर्तमान फ़ाइल की निर्देशिका के तहत पुनरावृत्ति करने वाली फ़ाइलों को खोजने की अनुमति देती है:

nnoremap <leader>F :find <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>S :sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>V :vert sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>T :tabfind <C-R>=expand('%:h').'/*'<CR>

चेतावनी! pathविकल्प है अत्यंत शक्तिशाली। मेरे लिए ऊपर .,**मूल्य- आतिशबाजी लेकिन मैं जिन भाषाओं का उपयोग करता हूं उनमें मानक पुस्तकालय नहीं है। उचित मूल्य पर निर्भर करता है आपकी जरूरतों।


भैंस के साथ करतब दिखाने

set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>

ऊपर दिए गए मैपिंग "वाइल्डमेनू" में उपलब्ध बफ़र्स को एक खाली संकेत के साथ सूचीबद्ध करते हैं, जिससे मुझे या तो मेनू को नेविगेट करने या <Tab>कुछ अक्षरों को टाइप <Tab>करने और फिर से सूची को संकीर्ण करने की अनुमति मिलती है । ऊपर फ़ाइल मैपिंग के साथ की तरह, प्रक्रिया त्वरित और लगभग घर्षण-कम है।

nnoremap <PageUp>   :bprevious<CR>
nnoremap <PageDown> :bnext<CR>

वे मैपिंग खुद के लिए बोलते हैं।


टैग्स के साथ जुगलबंदी

nnoremap <leader>j :tjump /

यह मैपिंग पूरे शब्द खोज के बजाय रेगेक्स खोज का उपयोग करता है ताकि मैं ,jba<Tab>टैग खोजने के लिए कर सकूं foobarbaz()

हां, फजी मैचिंग नशे की लत है, लेकिन आप इसके बिना उत्पादक हो सकते हैं। और लागत के एक अंश के लिए।


अधिक संपादित करें

अतिरिक्त सुझावों / चालों की एक जोड़ी ...


Wildmenu विकल्प

"वाइल्डमेनू", के साथ सक्षम set wildmenu, फ़ाइल / बफर नेविगेशन को आसान बनाता है। इसका व्यवहार विकल्पों के एक समूह द्वारा नियंत्रित किया जाता है जो जांच के लायक हैं:

wildmode विम को बताता है कि आप कैसे "वाइल्डमेनू" व्यवहार करना चाहते हैं:

set wildmode=list:full

wildignore सभी cruft को छानता है:

set wildignore=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=tags
set wildignore+=*.tar.*

wildignorecaseआपको fooखोजने और खोजने की अनुमति देता है Foo:

set wildignorecase

फ़ाइल के निशान

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

मुझे हाल ही में यह रत्न किसी और में मिला है ~/.vimrc। जब भी आप बफर को छोड़ते हैं, तो यह कर्सर की सटीक स्थिति में एक फ़ाइल चिह्न बनाता है, ताकि आप जहां भी हों, 'Jनवीनतम जावास्क्रिप्ट बफर में कूद जाए। बहुत बढ़िया।


2
+1। मैं के साथ संयोजन में "किसी भी उपनिर्देशिका" के बारे में पता नहीं था :eलेकिन मैं इसे का उपयोग किया जाएगा एक बहुत अब से। मैं उस काम पर अचंभित हूं जो Ctrl-P में मिला है और इससे बहुत कुछ सीख सकते हैं लेकिन यह मेरे लिए काम नहीं करता है। मुझे यह थोड़ा सुस्त लगा और काम करते समय मेरे विचार की मेरी ट्रेन को बाधित करने के रूप में (मेरी प्रणाली, मेरी सेटिंग्स, अपने आप हो सकती है, लेकिन मैंने जांच नहीं की)
लेवेन कीर्सेमेकर्स

2
**वास्तव में महान है।
रोमेनिल

1
मैं gbमानचित्र के लिए फिर से उत्थान करना पसंद करूंगा । एक और मैं एक बहुत का उपयोग करेंगे। मेरे द्वारा आजमाए गए सभी बफ़र प्लगइन्स (CtrlP, bufExplorer, ...) लगभग उतने तेज़ नहीं हैं जितने (दिए गए हैं, वे अधिक कार्यक्षमता प्रदान करते हैं लेकिन मेरे लिए उनका उपयोग करने के लिए पर्याप्त नहीं हैं)
लेवेन कीर्सेमेकर्स

2
@LievenKeersmaekers, यह वह जगह है जहां से मुझे मिला है और यह वह जगह है जहां से मूर्खतापूर्ण तस्वीर आती है। धन्यवाद बैरुई!
रोमेनिल

4
यह अब तक का सबसे बड़ा जवाब हो सकता है।
क्रेग

5

उत्तर आपकी प्राथमिकताओं और परिस्थितियों पर बहुत कुछ निर्भर करता है। कुछ उदाहरण:

  • यदि यह ज्यादातर दो फाइलें हैं (उदाहरण के लिए सी हेडर और कार्यान्वयन फ़ाइल), <C-^>तो बहुत आसान है। सामान्य तौर पर, वैकल्पिक फ़ाइल एक महत्वपूर्ण अवधारणा है।
  • यदि आप एक बड़े संपादक विंडो का उपयोग करते हैं, तो विंडो :splits विंडो को खोजने से बफर को खोजने की समस्या को चालू कर देती है (एक बार जब आप सभी बफ़र्स खोल चुके हैं)। आप इसे [N]<C-w><C-w>जल्दी से स्विच करने के लिए उपयोग कर सकते हैं ।
  • यदि आप (कुछ) बफर संख्या को याद कर सकते हैं, :[N]b[uffer]और :[N]sb[uffer]कमांड काफी आसान हैं; :lsआपको संख्या बताता है।

प्लगइन्स (या कम से कम कस्टम मैपिंग) चीजों को बहुत सुधार सकते हैं, और vim.org पर इस विषय पर पूरी विविधता है । आपके कॉन्फिगरेशन (Pathogen + GitHub, Dropbox, ...) को वितरित करने के लिए विभिन्न तंत्र हैं, या आप दूरस्थ रूप से सर्वर फ़ाइलों को netrw प्लगइन के माध्यम से संपादित कर सकते हैं जो विम के साथ जहाज करते हैं।


4
संभवतः ctags, cscope, gtags, id और मित्रों का उल्लेख करना उचित होगा। मुझे लगता है कि बहुत उपयोगी होने के लिए अपरकेस के निशान का उपयोग करना चाहिए। वापस जाने के mAलिए मार्क Aऔर `` `` ए`` स्टोर करें । खोजकर्ता के पास कौन से रिटर्न के बारे में जानने के बाद मुझे नेट्रव अधिक उपयोगी लगता है :Rex:b, :eऔर कई अन्य वाइल्डकार्ड जैसे *और ले सकते हैं **:bआदेश एक आंशिक फ़ाइल नाम ले सकते हैं। कि <c-d>या वाइल्डमेनू के साथ आप बहुत दूर मिल सकते हैं। प्लगइन्स के लिए आप कुछ डोमेन का उपयोग कर सकते हैं जैसे कि रेल .vim जो रेल विशिष्ट नेविगेशन कमांड प्रदान करता है या कुछ और सामान्य है जैसे कि CtrlP।
पीटर रिनकर

@PeterRincker: अंकों के बारे में उल्लेख करने के लिए +1। मैं अंक के साथ एक उत्तर का निर्माण करने का सुझाव देता हूं।
हेलब्रेडर

<C - ^> और [N] <Cw> <Cw> का क्या अर्थ है?
जोश डेसमंड

5

कभी-कभी फाइलों की सूची के माध्यम से क्रमिक रूप से जाना भी आसान होता है (जैसे, अगर आपने कुछ vim *.phpफाइलें एक साथ खोलना पसंद किया है )। तो फिर तुम उपयोग कर सकते हैं :n[ext](और साथ ही :prev[ious], :fir[st]और :la[st]) नेविगेशन (क्या अन्य उत्तर में सुझाव दिया गया था के अलावा) के लिए।


4

आप बिना किसी प्लग इन के कमांड लाइन पर वाइल्डकार्ड टैब पूरा कर सकते हैं। जैसे

:e src/**/foo*<tab>

आपको निर्देशिका ट्री में ./src के अंतर्गत 'foo' से शुरू होने वाली सभी फ़ाइलों के माध्यम से साइकिल चलाने देगा और जिसे आप संपादित करना चाहते हैं उसे चुनें।

यदि आपने फ़ाइल को पहले ही संपादित कर लिया है और यह अभी भी एक बफर में है तो आप इसके साथ स्विच कर सकते हैं:

:b foo<tab>

जो रास्ते में 'फू' के साथ सभी बफर्स ​​के माध्यम से साइकिल चलाएगा। आपको मनचाहा व्यवहार प्राप्त करने के लिए वाइल्डमोड और वाइल्डमेनू विकल्प सेट करने की आवश्यकता हो सकती है। मेरे पास है

wildmode=longest:full
wildmenu

मेरे .vimrc में।


2

यदि आप फ़ाइल नाम पर हैं और उस फ़ाइल पर कूदना चाहते हैं, gfतो यह आपके लिए करेगा। मुझे ctags का उपयोग करना भी पसंद है , जो एक प्लगइन नहीं है; आप केवल टैग बनाते हैं और आसानी से अपने कोडबेस के आसपास कूद सकते हैं।


1

यदि आप vim एडिटर में फाइलों के बीच स्विच करना चाहते हैं, तो कृपया नीचे उत्तर देखें

Escएडिट मोड से बाहर निकलने के लिए पहली प्रेस की ।

फिर :eकरंट फाइल पाथ चेक करने के लिए टाइप करें।

यदि आप किसी अन्य फ़ाइल पर जाना चाहते हैं, तो इसका :e /path-of-file.txt/उपयोग करके आप स्विच करने में सक्षम हैं।

यदि आप पिछली फ़ाइल पर जाना चाहते हैं, तो :e#पिछली फ़ाइल पथ पर जाएँ।


0

मेरे पास विम के साथ भी यही मुद्दा था।

आखिरी चीज जो मैं चाहता हूं कि किसी कार्य के लिए प्लगइन्स पर निर्भर होना चाहिए जैसे फ़ाइल स्विचिंग।

मैंने निम्नलिखित पंक्तियों को इसमें जोड़ा .vimrc

set path+=**
set wildmenu

और बम! :find any/filename/in/any/folder/जब तक vim प्रोजेक्ट के रूट डायरेक्टरी में है तब तक मैं कर सकता हूं । टैब का काम पूरा करता है। वाइल्डकार्ड काम करते हैं!

एक बार फाइलें पहले से ही खोली जाती हैं, और पृष्ठभूमि में एक टन बफ़र्स होते हैं (आप :lsसभी बफ़र्स को देखने के लिए उपयोग कर सकते हैं ), :b any/file <TAB>सभी बफ़र्स के लिए फ़ज़ी खोज चल रही है और आवश्यक फ़ाइल पर कूद जाएगी। यदि यह अद्वितीय नहीं है , तो टैब का वाइल्डमेनू होगा (इसलिए 2 लाइन इन .vimrc) जिसे टैब के साथ चुना जा सकता है।

मेरा जवाब इस भयानक वीडियो से आ रहा है
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489
इसमें और भी तरकीबें हैं और मैं इसे देखने की सलाह देता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.