एक गैर-व्हाट्सएप चरित्र तक पहुंचने तक मैं खड़ी कैसे चलती हूं?


27

(सटीक-) इंडेंट कोड वाली एक बहुत लंबी फ़ाइल में, यह कर्सर के ऊपर या नीचे पाठ की एक पंक्ति में सीधे जाने में सहायक हो सकता है जो इंडेंटिंग को परिसीमित करता है।

(ऐसा करने का एक तरीका इंडेंट फोल्मेथोड के माध्यम से हो सकता है, वर्तमान इंडेंट लेवल को फोल्ड करके, जो इंडेंट लेवल को डिलीट करने वाली लाइनों को कर्सर से केवल एक jया kदूर हो सकता है। हालांकि, मुझे ऐसे उदाहरण मिले हैं, जहां परेंट फोल्डिंग नहीं है। मेरी रुचि के इंडेंट पर काम करने में सक्षम है।)

यहाँ एक उदाहरण है, अंडरस्कोर द्वारा चिह्नित कर्सर के साथ _(की परिभाषाओं के बीच दूसरे वर्ण स्तंभ पर ) class Bazzऔर class Qux, लेकिन कल्पना कीजिए कि modules के भीतर पैराग्राफ या लाइनों की संख्या अज्ञात या परिवर्तनशील है:

module Foo
  # lots of code...
end

module Bar
  class Baz
    # ...
  end

  class Bazz
    # lots of code...
  end
 _
  class Qux
    # ...
  end

  class Quux
    # lots of code...
  end
end

... मैं जल्दी से कर्सर oके module Barऊपर कैसे नेविगेट कर सकता हूं , या बहुत अंतिम पंक्ति में कर्सर nके endनीचे? ध्यान दें कि ऊर्ध्वाधर कॉलम में व्हाट्सएप होता है, लेकिन classपरिभाषाओं के बीच दूसरे कॉलम में कोई वर्ण नहीं है ।


2
संबंधित: विम टिप्स विकी vw.wikia.com/wiki/Move_to_next/ पर
alxndr

दबाने वाली छ और फिर दिशा की कुंजी टैब से बच सकती है और रेखाओं पर जा सकती है
सिबिकोडर

1
@ Alxndr के लिंक में समाधान उस स्थिति को छोड़कर अच्छी तरह से काम करता है जहां व्हाट्सएप खराब तरीके से बनाए रखा जाता है (उदाहरण के लिए, यादृच्छिक लाइनें हैं जिनमें केवल व्हाट्सएप है) और आप व्हाट्सएप को अनदेखा करना चाहते हैं। यदि किसी व्यक्ति को उस मामले में चिंता है तो नीचे दिए गए सुपरजेर का समाधान बेहतर है।
nukeguy

जवाबों:


9

इस समारोह के बारे में कैसे?

function FloatUp()
    while line(".") > 1
                \ && (strlen(getline(".")) < col(".")
                \ || getline(".")[col(".") - 1] =~ '\s')
        norm k
    endwhile
endfunction

आप कर सकते हैं nnoremap gU :call FloatUp()<CR>( gU"ऊपर जाएं"), और फिर से आह्वान करें gU

यहाँ एक स्पष्टीकरण है:

  • कोड बार-बार कर्सर (साथ norm k) तब तक चलता रहता है जब तक कि whileस्थिति धारण की जाती है।
  • whileअगर यह पहली पंक्ति (नहीं है हालत रखती है line(".") > 1) और या तो
    • यह रेखा बहुत छोटी है (शायद खाली है); या
    • getline(".")वर्तमान कॉलम में वर्तमान लाइन ( ) का वर्ण [col(".") - 1]व्हाट्सएप है ( =~ '\s'यानी, व्हाट्सएप पैटर्न से मेल खाता है)।

1
यह पूरी तरह से (और जल्दी से) काम करने लगता है, और आसानी से एक FloatDownफ़ंक्शन में भी संशोधित होता है । मेरी .vimrc में यह जाता है, धन्यवाद! github.com/alxndr/dotfiles/commit/0e25a302
alxndr

1
बस पता चला कि यह समाधान दृश्य मोड में काफी काम नहीं करता है (जिस दृश्य मोड के आधार पर थोड़ा अलग व्यवहार है, यह या तो एक ही स्थिति में रहेगा या केवल एक पंक्ति से आगे बढ़ेगा)। वहाँ पर क्या हो रहा है पर कोई संकेत?
अलक्षेंद्र

13

मुझे इन चीजों की खोज का उपयोग करना पसंद है, क्योंकि विम के रीजैक्स में उन चीजों की एक पागल राशि होती है जिन्हें आप खोज सकते हैं, जैसे विशिष्ट वर्चुअल कॉलम संख्या, इस मामले में:

nnoremap cd /\%<C-R>=virtcol(".")<CR>v\S<CR>

nnoremap cu ?\%<C-R>=virtcol(".")<CR>v\S<CR>

cdनीचे जाने के लिए और cuऊपर जाने के लिए उपयोग करें । मैं यहां "कॉलम अप" और "कॉलम डाउन" सोच रहा हूं। मुझे लगभग 100% विश्वास है कि ये डिफ़ॉल्ट रूप से नहीं हैं। या अपनी खुद की मैपिंग चुनें।

यह काम करना चाहिए चाहे आप टैब या रिक्त स्थान का उपयोग कर रहे हों या दोनों का।


1
मुझे उन कमांडों को पार्स करने में परेशानी हो रही है। क्या आप उन पर थोड़ा विस्तार करना चाहेंगे?
davidlowryduda

1
/ /? वर्चुअल कॉलम नंबर 'x' में खोज करने के लिए नीचे या ऊपर, \% xv सीमाएँ, इस मामले में 'x' '<CR> = virtcol ("।") <CR>' है जो virtcol कमांड चलाता है और सम्मिलित करता है। वर्चुअल कॉलम नंबर कर्सर अभिव्यक्ति में है, \ _ का मतलब है कि कोई भी गैर-व्हाट्सएप चरित्र।
चाड

1
चाड को समझाने के लिए धन्यवाद। मैं सिर्फ इन्स <CR> को इन्सर्ट मोड या कमांड-लाइन मोड में जोड़ूंगा, जो रजिस्टर की सामग्री को पकड़ता है। =रजिस्टर अभिव्यक्ति रजिस्टर जो जगह में एक अभिव्यक्ति का मूल्यांकन करता है। यह बहुत आसान है, अगर थोड़ा अजीब नहीं है।
सुपरजेर

1
इस दृष्टिकोण का एक नुकसान यह है कि यदि आपने सर्च हाइलाइटिंग किया है, तो आप पाएंगे कि कर्सर के वर्टिकल कॉलम के सभी अक्षर अब "कॉलम अप" आईएनजी या "कॉलम डाउन" आईएनजी के बाद हाइलाइट किए जाते हैं।
alxndr

3
यदि आप अपनी मौजूदा खोज को सुरक्षित रखना चाहते हैं तो आप प्रीपेन्ड :let searchbak=@/<CR>और एपेंड कर सकते हैं :let @/=searchbak<CR>। लेकिन इस बिंदु पर यह लंबे और अप्राप्य की तरह हो रहा है और शायद सिर्फ एक फ़ंक्शन होना चाहिए।
सुपरजेर

7

आप JumpToVerticalOccurrence प्लगइन (डिफ़ॉल्ट मैप टू ]|और [|) का उपयोग कर सकते हैं । ऐसे कुछ और लोग हैं ]V{char}जो काम करते हैं f, लेकिन लंबवत। आप निश्चित रूप से उन्हें आवश्यकतानुसार रीमैप कर सकते हैं।


यदि आप प्लगइन्स का उपयोग नहीं करना चाहते हैं, तो आप उदाहरण के :searchसाथ उपयोग करने का प्रयास कर सकते हैं virtcol(.):

:call search('\%' . virtcol('.') . 'v\S', 'bW')

कहा पे:

  • virtcol('.') आपको वर्तमान कॉलम देता है,
  • \S गैर-व्हाट्सएप के लिए खड़ा है
  • bW पिछड़ी खोज के लिए है

:help searchअधिक जानने के लिए जाँच करें ।

इसका उपयोग करना आसान बनाने के लिए, आप इसे मैप कर सकते हैं, जैसे:

:map <C-k> :call search('\%' . virtcol('.') . 'v\S', 'bW')<CR>
:map <C-j> :call search('\%' . virtcol('.') . 'v\S', 'W')<CR>

वैकल्पिक रूप से, अगर आपके कोड कोष्ठक में शामिल है, उपयोग %उन्हें मिलान (उदाहरण के बीच कूद करने {, }, [, ], आदि) या पूरे पैरा कूदता है (का उपयोग {, }के साथ Shiftआवश्यक हो तो)।


लिंक / सूत्रों:


से :h search(): wसाधन wrap around the end of the fileऔर Wसाधन don't wrap around the end of the file। लेकिन आपने उन्हें दूसरे पर एक साथ क्यों रखा :map?
जेयर लोपेज

@JairLopez सही, wवहाँ नहीं होना चाहिए, इसलिए मैंने इसे हटा दिया है, धन्यवाद। संभवतः मैं गति कुंजियों के अर्थ से भ्रमित था।
kenorb

3

मैं इस व्यवहार को प्रदान करने के लिए विम-इंडेंट-ऑब्जेक्ट प्लगइन के एक संशोधित संस्करण का उपयोग करता हूं । मेरे संशोधन यहाँ देखे जा सकते हैं

यह मुझे [iवर्तमान इंडेंट स्तर की शुरुआत में ]iजाने और अंत तक जाने के लिए मैप करने की अनुमति देता है ।


2

यह बिल्कुल वैसा नहीं है जैसा आपने पूछा है क्योंकि यह ऊर्ध्वाधर गति नहीं है, लेकिन कुछ ऐसा ही है, तेज है, और आपके लिए काफी अच्छा हो सकता है क्योंकि आप 2 पैराग्राफ आगे बढ़ रहे हैं {{:। यह आपको लाइन से ठीक पहले ले जाएगा module Bar


2
कल्पना करें कि कर्सर और उसके शीर्ष-स्तरीय moduleलाइन के बीच एक अज्ञात संख्या में लाइनें और / या पैराग्राफ हैं । (विशेष रूप से, यह स्थिति तब पैदा हुई जब मैं हाल ही में सटीक इंडेंटेशन, लेकिन कोई खाली लाइनें नहीं, और एक मॉड्यूल की परिभाषा के बाहरी संदर्भ को खोजने की कोशिश कर रहा है, के साथ कई हजार लाइनों लंबी-तृतीय कोड कोड नेविगेट कर रहा था।)
20

पैराग्राफों द्वारा कूदना मेरे घूमने का पसंदीदा तरीका है, लेकिन यह एक विकल्प नहीं था: पूरी फाइल एक "पैराग्राफ" थी।
अलक्षेंद्र

2

jeetsukumaran / vim-indentwise इंडेंटेड ब्लॉक के सापेक्ष, निरपेक्ष या ब्लॉक-स्कोप आंदोलनों के लिए अच्छी तरह से काम करता है।


1

मैं उस के लिए अपने स्वयं के प्लगइन Move_until_char_changes.vim का उपयोग करता हूं ।

मैं यह करने के लिए नक्शे gKऔर gJ

यह वर्तमान कॉलम (सिर्फ व्हाट्सएप) में एक ही चरित्र के साथ कई लाइनों पर कूद जाएगा, जो बार-बार तार के साथ लॉगफाइल्स या SQL डंप में उपयोगी हो सकता है।

डिफ़ॉल्ट रूप से यह पहले "खोज" वर्ण को चुनने से पहले, एक पंक्ति को आगे बढ़ाता है।

यह विजुअल मोड में काम करता है बशर्ते आप इसे दो बार इस्तेमाल करने की कोशिश न करें, और आप लिनेविज़ या ब्लॉकवाइज़ विज़ुअल मोड में नहीं हैं ... (स्वागत है)!


1

जब से मैं इसे यहाँ एक जवाब के रूप नहीं दिख रहा है ( संपादित सिर्फ देखा है कि superjer बहुत कुछ इसी तरह का उल्लेख किया)। आप बस / या कर सकते हैं? खोज।

उदाहरण के लिए, आप इस तरह से दूसरे कॉलम में एक गैर व्हाट्सएप चरित्र के लिए नीचे की ओर खोज सकते हैं:

/\%2v\S

ब्रेकडाउन है:

/    "search downward (use ? for upward movement)
\%2v "for the following char in the 2nd virtual column
\S   "any non white space character

फिर आप खोज को दोहराने के लिए सामान्य ऑपरेटरों का उपयोग कर सकते हैं।

विषय पर अधिक जानकारी के लिए देखें :help \%cऔर :help \%v

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