एक टैब में बफ़र्स के सेट को कैसे बांधें?


14

जब मुझे अलग-अलग परियोजनाओं पर काम करने की आवश्यकता होती है, उसी समय मेरे पास वर्किंग वर्कफ़्लो होता है:

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

अपने बफ़र्स के बीच नेविगेट करने के लिए मैं वास्तव में उपयोग नहीं करता हूं :lsऔर :b [name or number of buffer]इसके बजाय मैंने कुछ सुविधाजनक मैपिंग बनाई जिससे मुझे बफ़र्स के बीच स्विच करने की अनुमति मिली :bnextऔर:bprevious

काम करने का यह तरीका बहुत अच्छा है, लेकिन कुछ मुझे परेशान करता है: बफ़र्स को टैब के बीच साझा किया जाता है।

अगर मैं खोलने file1और file2में tab1और file3में tab2, में अगर tab1मैं कई समय का उपयोग :bnextमैं देखेंगे file3इस टैब जो मैं नहीं करना चाहती है। मैं जो वर्कफ़्लो प्राप्त करना चाहता हूँ वह फोलोइंग है :

  • Vim प्रारंभ करें (मेरा इसमें एक बफर के साथ पहला टैब है): $ vim foo
  • इस टैब में एक बफर जोड़ें: :e bar
  • एक नया टैब खोलें और उस पर स्विच करें: :tabnew
  • इस टैब में एक नया बफर खोलें: :e baz
  • अगर मैं इस बफ़र में रहूँ और बफ़र पर रहूँ :bnextया :bpreviousकरूँ baz(क्योंकि यह इस टैब में एकमात्र है)
  • यदि मैं पिछले टैब में जाता हूं :tabpreviousऔर कई बार निष्पादित करता :bnextहूं तो मैं केवल fooऔर barबफ़र्स के बीच स्विच करूंगा लेकिन नहीं देखूंगाbaz

तो यहाँ मेरा सवाल आता है: क्या बफ़र्स के एक सेट को एक टैब से बाँधना और किसी दूसरे टैब से कुछ बफ़र्स तक पहुँच को रोकना संभव है, जिस पर उनका मतलब है?

नोट: मुझे पता है कि :b [myBuffer]एक टैब में बफर रखने का एक तरीका होगा, लेकिन जब मेरे पास संपादित करने के लिए 3 या 4 फाइलें होंगी तो मुझे ऐसा लगेगा कि मैं बफर नाम लिखने की तुलना में अपने मैपिंग का उपयोग करके वास्तव में तेज़ हूं (भले ही मैं कर सकता हूं बफर नाम से मिलान करने के लिए केवल कुछ अक्षर टाइप करें)


1
यहाँ इस तरह के दृष्टिकोण के समर्थक और चोरों पर प्रकाश डालने वाली एक पुरानी चर्चा है, और इसके बजाय कुछ ऐसा सुझाया गया है जिसका आज अनुवाद किया जा सकता है: एकाधिक विम उदाहरण (प्रति प्रोजेक्ट / बफर सूची) + tmux: vim.1045645.n5.nabble.com/…
वैनलेसर

@VanLaser: लिंक के लिए धन्यवाद यह एक दिलचस्प चर्चा है! जब मैं अपनी निजी मशीन पर होता हूं, तो मैं वास्तव में tmux और विभिन्न विम उदाहरणों को शामिल करता हूं। मेरा प्रश्न इस तथ्य से आता है कि मुझे अपने पेशेवर काम के लिए खिड़कियों का उपयोग करना है और मुझे वास्तव में पसंद नहीं है कि कैसे खिड़कियां संभाला जाए: alt+tab(या इससे भी बदतर माउस) विम के भीतर टैब स्विच करने से बहुत कम आसान लगता है।
statox

1
शायद vim-ctrlspace मदद कर सकता है - यह प्रति टैब बफर सूचियों का विज्ञापन करता है; मैं इसका उपयोग नहीं करता, यद्यपि।
वैनलेसर

जवाबों:


7

Mhh, मुझे वहाँ कोई प्लगइन नहीं मिला, लेकिन आप इसे स्वयं लिख सकते हैं। इसके लिए आपको vimscript सीखने की आवश्यकता है। मैंने केवल उस कार्यक्षमता को लागू किया है जिसे आप एक टैब में बफ़र्स के बीच स्विच कर सकते हैं (अभी तक कोई विलोपन नहीं)। आप इसे अपने vimrc में कॉपी कर सकते हैं:

if !exists("g:WindowBufManager") 
  let g:WindowBufManager= {}
endif

function! StoreBufTab()
  if !has_key(g:WindowBufManager, tabpagenr())
    let  g:WindowBufManager[tabpagenr()] = []
  endif

  " add the new buffer to our explorer
  if index(g:WindowBufManager[tabpagenr()], bufname("%")) == -1 && bufname("%") != ""
    call add (g:WindowBufManager[tabpagenr()],bufname("%"))
  endif
endfunction

function! WindowBufManagerNext() 
  " find the next index of the buffer
  let s = index(g:WindowBufManager[tabpagenr()], bufname("%"))
  if (s!= -1)
    let s = (s +1) % len(g:WindowBufManager[tabpagenr()])
    execute 'b ' . g:WindowBufManager[tabpagenr()][s]
  endif
endfunction

augroup WindowBufManagerGroup
  autocmd! BufEnter * call StoreBufTab()
augroup END

अपना vimrc बंद करें और इसे फिर से खोलें। अगला बफर खोजने के लिए बस का उपयोग करें

:call WindowBufManagerNext()

या अपनी खुद की कमांड या मैपिंग को परिभाषित करें। यह तब तक काम करेगा जब तक आप टैब या बफर को बंद या डिलीट नहीं करते। यह कई बफ़र्स के लिए भी काम नहीं करेगा। उन विशेषताओं को जोड़ने के लिए कुछ और काम करने की आवश्यकता होगी, लेकिन यह निश्चित रूप से उल्लेखनीय है।


मुझे न तो कोई प्लगइन मिला और न ही मैं ऐसा करने के लिए बिल्ट-इन फीचर की उम्मीद कर रहा था, लेकिन ऐसा लगता है कि आप सही हैं कि शायद मुझे खुद से ऐसा करना पड़ेगा। आपके कोड के लिए धन्यवाद, मैं इसका उपयोग कर सकता हूँ इसका एक आधार है एक पूर्ण प्लगइन विकसित करना।
statox

6

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

दूसरी ओर "तर्क", एक खिड़की के लिए स्थानीय हो सकते हैं ताकि वे "बफ़र्स" (शब्द के सख्त अर्थ में) की तुलना में आपके वर्कफ़्लो में अधिक उपयोगी हो सकें:

$ vim file1 file2
:tabnew
:argl file3 file4 file5
:n
:n
gt
:n
gt
:N
and so on…

तर्क बफ़र्स की तरह लचीले नहीं हैं, लेकिन वे आपके वर्कफ़्लो के लिए अधिक भरोसेमंद आधार प्रदान कर सकते हैं।

लेकिन प्रत्येक परियोजना में अपने स्वयं के विम उदाहरण पर काम करना मेरे विचार में एकमात्र व्यावहारिक समाधान है।


मैं इस विचार से सहमत हूं कि अलग-अलग विम इंस्टेंस का उपयोग करना बेहतर है जब मैं इसे टर्मिनल में उपयोग कर सकता हूं, जैसा कि मैंने एक और टिप्पणी में कहा है कि मुझे अपने पेशेवर कंप्यूटर पर विंडोज़ का उपयोग करना है और जीवीएम इंस्टेंसेस के बीच स्विच करना इस ओएस के साथ बट में दर्द है । मैं उन तर्कों पर एक नज़र डालूंगा, जिनका मैंने पहले कभी उपयोग नहीं किया है और यह एक अच्छा समाधान हो सकता है, धन्यवाद!
statox

2

इसलिए, कुछ देरी के साथ, मुझे लगता है कि मुझे एक संतोषजनक (कम से कम मेरे लिए!) उत्तर मिल सकता है। आपको शौगो के दो प्लग इन की आवश्यकता होगी:

और वर्तमान टैब :lsसे केवल बफ़र्स को देखने (और चुनने) के बजाय उपयोग करने के लिए एक त्वरित पहुंच मानचित्र ।

उदाहरण के लिए, कुछ इस तरह:

nnoremap <leader>b :<C-u>Unite buffer_tab -no-split<CR>

एकजुट - प्रति टैब बफ़र्स

अब आप वर्तमान की टैब बफर सूची ( j, k), एक का चयन करें ( CRरद्द करें q), "इनपुट" (डालें) मोड के माध्यम से स्थानांतरित कर सकते हैं कुछ अक्षर टाइप करके बफर चयन को जल्दी से फ़िल्टर करें, या यहां तक Tabकि कार्रवाई सूची खोलने के लिए मारा जाए। वर्तमान चयनित आइटम के लिए (जैसे वर्तमान सक्रिय एक से ऊपर बफर खोलने के लिए ) - संक्षेप में, आप जेनेरिक "यूनाइट" तरीके से कार्य करते हैं।

(यह भी देखें :h unite_default_key_mappingsऔर सामान्य रूप से एकजुट मदद करें)।


और अब अंतिम (अभी तक वैकल्पिक) चाल के लिए। Changecmd के साथ , आप अपना स्वयं का, टैब-वार सक्षम, lsकमांड (उपरोक्त यूनाइट कार्यक्षमता के आधार पर) बना सकते हैं:

:command! LS Unite buffer_tab -no-split
:AlterCommand ls LS

... और हर बार जब आप हिट करते हैं :ls, तो विम वास्तव में आपके बजाय आपकी कमांड चलाएगा ।

नोट आप भी जरूरत है कि नहीं :bnया :bp, के बाद से टैब के बफ़र्स देखने और चयन अब एक ही आदेश है।


मैं इस समाधान की भी कोशिश करूँगा। फिलहाल मैं टिप्पणी में VanLaser द्वारा उल्लिखित ctrl-space की कोशिश कर रहा हूं, जो बहुत अच्छा है। मैं देखूंगा कि कौन सा समाधान सबसे सुविधाजनक है। साथ ही +1 जो कि बहुत अच्छा है, बदलकर प्लगइन के लिए!
statox

2

मैं टिप्पणी नहीं कर सकता क्योंकि मेरा खाता उस बारे में नया है, लेकिन ctrl-space के लिए ++++ 1 क्षमा करें।

मुझे उस समय तक बेच दिया गया जब मैंने इसे मदद से आधा कर दिया। Ctrlspace इस तरह की एक संरचना है:

workspaces --> contain tabs --> contain buffers

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

आप अपने टैब को भी नाम दे सकते हैं। यदि यह पर्याप्त नहीं है, तो आप बहुत आसानी से कार्यशील निर्देशिकाओं को बदल सकते हैं और उन निर्देशिकाओं के लिए बुकमार्क बना सकते हैं जिन्हें आप अक्सर उपयोग करते हैं।

यदि आप इसका उपयोग करते हैं तो निडरट्री के साथ अच्छी तरह से इंटरफेस करता है (हालांकि ईमानदारी से आप शायद ऐसा महसूस भी नहीं करेंगे कि आपको ctrlspace के साथ एक सप्ताह के बाद इसकी आवश्यकता है)


इस उपयोग के मामले पर विचार करें:

आपके पास एक प्रोजेक्ट है। इसमें पेड़ लगाना शामिल है। फलों के पेड़ और पैसे के पेड़ हैं। मनी ट्री में डॉलर और सेंट होते हैं जबकि फलों के पेड़ों में सेब और संतरे होते हैं।

इस उदाहरण में सेब, संतरे, डॉलर और सेंट सभी "बफ़र" हैं।

Ctrlspace आपको एक "टैब" में सेब और संतरे अलग करने देता है जिसे आप "फल" लेबल कर सकते हैं - यह लेबल आपकी विंडो के शीर्ष पर टैग लाइन में दिखाई देगा। इसी तरह, डॉलर और सेंट एक "पैसे" टैब में जाते हैं।

"ट्री" कार्यक्षेत्र इस पूरे कॉन्फ़िगरेशन को बचाता है और आपको इसे खोलने के तुरंत बाद किसी भी समय एक्सेस करने देता है।


अब जब कि मैं इसके अस्तित्व से अवगत हूं, मैं वास्तव में इस प्लगइन के बिना ऑब्जेक्ट ओरिएंटेड डेवलपमेंट करने की कल्पना नहीं कर सकता। बस के मामले में, यहाँ लिंक है: https://github.com/szw/vim-ctrlspace


2

इसलिए अंत में मेरी समस्या को हल करने के लिए अपना खुद का प्लगइन बनाने का फैसला किया, यह जीथब पर उपलब्ध है ।

मैंने @ philolo1 के विचार का उपयोग किया और इसे पूरा करने की कोशिश की, जिस समय मैं इस उत्तर को लिख रहा हूं यह अभी भी प्रगति पर है।

संपादित करें मैं अब अपने वर्कफ़्लो के रूप में प्लगइन को विकसित नहीं कर रहा हूँ और मुझे एहसास हुआ कि एक टैब से बफ़र्स को बाँधने से यह समस्या हल करती है।


प्लगइन बफ़र्स को टैब से बांधता है: जब उपयोगकर्ता एक बफर खोलता है, तो यह स्वचालित रूप से टैब में "संग्रहीत" होता है और इसे दूसरे टैब पर एक्सेस नहीं किया जा सकता है।

स्थापना "प्लगइन प्रबंधक के अनुकूल" होनी चाहिए (कम से कम यह विम-प्लग और वुंडल के साथ अच्छी तरह से काम करता है )

कुछ मुख्य विशेषताएं हैं:

  • स्वचालित रूप से बफ़र्स के बंधन को संभालें (उपयोगकर्ता उन्हें खोल सकता है जैसा उसने पहले किया था)
  • :NextBufऔर :PrevBufकी जगह :bnऔर :bNटैब के अनुरूप राज्य रखने के लिए
  • :ListBufबफ़र्स को समान रूप से सूचीबद्ध करने की अनुमति देता है ताकि :lsवे टैब में अलग हो जाएं और एक संकेत उपयोगकर्ता को आसानी से देख सकें कि वह वर्तमान में किस टैब में है।
  • :ChangeBuf एक बफर नंबर या एक बफर नाम को बफर के बदलने और टैब के परिवर्तन को स्वचालित रूप से स्वीकार करें
  • एक बफर को बंद करने के साथ किया जाता है :CloseBuf
  • एक टैब बंद करने के साथ किया जाता है :CloseTab

अन्य कार्यों के लिए उपयोगकर्ता का उपयोग करने में सक्षम होना चाहिए अंतर्निहित सुविधाओं (जैसे :tabopen, :tabnext, आदि ...)

प्रत्येक आदेशों के लिए कुछ डिफ़ॉल्ट मैपिंग प्रदान की जाती हैं और उन्हें आसानी let g:betterTabsVim_map_keys = 0से आपके द्वारा जोड़कर अक्षम किया जा सकता है .vimrc

मैंने एक स्पष्ट सहायता फ़ाइल बनाने की भी कोशिश की ( :h betterTabs.txt): यह अभी तक पूरी नहीं हुई है, लेकिन उपयोगकर्ताओं को प्लगइन का उपयोग करने के लिए न्यूनतम खोजना चाहिए।

मुझे अभी भी यह सुनिश्चित करने के लिए बहुत सारे परीक्षण करने हैं कि प्लगइन किसी भी मूल व्यवहार को गड़बड़ नहीं करता है।

अंत में अगर कोई मदद करना चाहता है तो यह हमेशा संभव है कि जीथूब पेज पर मुद्दों को बनाएं या पुल अनुरोध बनाएं।


1

इस प्लगइन की जाँच करें। यह मुझे लगता है कि यह आपकी आवश्यकताओं के अनुरूप है। https://github.com/szw/vim-ctrlspace


वास्तव में वैनलेसर ने टिप्पणियों में इसका उल्लेख किया है और मैंने इसे पहले बिल्कुल करीब से नहीं देखा था, लेकिन यह वास्तव में अच्छा लग रहा है, मैं इसे अभी कुछ दिनों से कोशिश कर रहा हूं।
स्टेटॉक्स stat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.