प्रति पंक्ति एक वाक्य के साथ काम करने के लिए विम की स्थापना कैसे करें?


17

मैं वर्तमान में बहुत सादा पाठ लिख रहा हूँ (और पैराग्राफ में न्यूनतम प्रारूपण के साथ LaTeX), और यह अच्छा होगा यदि मैं प्रत्येक वाक्य (सादगी के लिए, '', '' द्वारा समाप्त पाठ को रखने के लिए विम सेट कर सकता हूं)। , या '?'; यह एक समाप्ति विराम चिह्न है जिसके बाद एक स्थान है ताकि दशमलव संख्याओं पर टूटने से बचा जा सके) अपनी पंक्ति में ताकि VCS भिन्न हो और अधिक उपयोगी होगा।

न्यूनतम रूप से; मैं gqपाठ को प्रारूपित करना चाहूंगा :

He lay flat on the brown, pine-needled floor of the forest, his chin on his
folded arms, and high overhead the wind blew in the tops of the pine trees.
The mountainside sloped gently where he lay; but below it was steep and he
could see the dark of the oiled road winding through the pass. There was a
stream alongside the road and far down the pass he saw a mill beside the
stream and the falling water of the dam, white in the summer sunlight. 

सेवा:

He lay flat on the brown, pine-needled floor of the forest, his chin on his folded arms, and high overhead the wind blew in the tops of the pine trees.
The mountainside sloped gently where he lay; but below it was steep and he could see the dark of the oiled road winding through the pass.
There was a stream alongside the road and far down the pass he saw a mill beside the stream and the falling water of the dam, white in the summer sunlight.

लेकिन यह अच्छा होगा यदि विम इस फॉर्मेटिंग को मैं भी टाइप करता हूं (जैसे कि यह टेक्स्ट रिफ्लेक्स के साथ होता है)। क्या यह संभव है?

मेरा वर्तमान समाधान एक पैराग्राफ के साथ जुड़ना है J, फिर चलाएं :'<,'>s/\. /.\r/gजो बहुत अच्छा है क्योंकि इसमें कुछ विस्मयादिबोधक और प्रश्न चिह्न हैं, लेकिन यह बेहतर होगा अगर मैं gq को थोड़ा और बेहतर बना सकूं।

जवाबों:


23

'formatexpr'विकल्प

आप 'formatexpr'विकल्प का उपयोग करके इसे प्राप्त कर सकते हैं । मदद से:

अभिव्यक्ति जिसका मूल्यांकन gq ऑपरेटर या स्वचालित स्वरूपण के लिए लाइनों की एक श्रेणी को प्रारूपित करने के लिए किया जाता है (देखें '' formatoptions ')। जब यह विकल्प खाली हो जाता है, तो 'formatprg' का उपयोग किया जाता है।

पाठ को सम्मिलित करते समय और 'formatexpr'प्रयोग gqकरते समय अपनी सही ढंग से सेटिंग करना दोनों काम करेगा ।

एक साधारण उदाहरण

यहाँ एक सरल VimScript फ़ंक्शन और संबंधित 'formatexpr'मान है जो काम करना चाहिए। मैंने इसे सभी किनारे के मामलों में परीक्षण नहीं किया है, लेकिन इसने मेरे सरल परीक्षणों के लिए अच्छी तरह से काम किया है।

function! MyFormatExpr(start, end)
    silent execute a:start.','.a:end.'s/[.!?]\zs /\r/g'
endfunction

set formatexpr=MyFormatExpr(v:lnum,v:lnum+v:count-1)

व्याख्या

अभिव्यक्ति फ़ंक्शन के लिए एक कॉल है MyFormatExpr(), जो शुरू और समाप्त होने वाली लाइनों में गुजर रहा है, जिस पर प्रारूपण लागू किया जाएगा। इन पंक्तियों की गणना स्वचालित रूप से आबादी वाले चर v:lnum(स्वरूपित होने वाली पहली पंक्ति) और v:count( स्वरूपित की जाने वाली लाइनों की संख्या ) का उपयोग करके की जाती है ।

MyFormatExpr()समारोह एक निर्माण करती :substituteरेंज में पारित कर दिया साथ आदेश, और एक अंत के वाक्य विराम चिह्न के बाद एक खाली स्थान के बदल देता है ( ., !, या ?एक नई पंक्ति के साथ) ( \r)।

चेतावनियां

  • MyFormatExpr()समारोह प्रमुख खरोज की रक्षा नहीं करता है। इसे ठीक करने के लिए कुछ और परिष्कृत तर्क की आवश्यकता होगी।
  • अन्य किनारे मामले हो सकते हैं जहां यह अलग हो जाता है। इसे एक टेस्ट ड्राइव दें और आवश्यकतानुसार ट्विक करें!

ओह, यह पूरी तरह से जाने का रास्ता है, मेरे जवाब को अनदेखा करें
सुकिमा

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

यह उदाहरण के लिए विभाजन करता है e.g. blah, और Blah et al. 2018जो थोड़ा कष्टप्रद है। आप पैटर्न को अन-मैच कर सकते हैं जैसे कुछ 's/\(e\.g\|\<al\)\@<![.!?]\zs /\r/g'। जिन चीजों को आप विभाजित नहीं करना चाहते हैं, उनसे बचने के लिए पहले समूह में बस अधिक पैटर्न जोड़ें। अन्यथा, यह सुपर उपयोगी है, धन्यवाद। मैं gqपहले भर में नहीं आया था , और gqipपाठ को प्रारूपित करने के लिए सुपर उपयोगी है जो सह-लेखक के पाठ संपादकों ने मंगाई है।
n

क्या इस व्यवहार को डिफ़ॉल्ट व्यवहार में जोड़ने का कोई तरीका है? मैं किसी दिए गए पाठ की चौड़ाई पर, साथ ही वाक्यों के अंत में विभाजन करने में सक्षम होना चाहूंगा ..
naught101

1

वैसे आप कुछ नक्शे और ऑटोकॉमैंड सेटअप कर सकते हैं:

function! AddSentenceMaps()
  imap .<Space> .<CR>
  imap !<Space> !<CR>
  imap ?<Space> ?<CR>
  exec "nmap gq vipJ:s/\\([.!?]\\)\\s\\+/\\1\\r/g<CR>"
endfunction

autocmd Filetype customtxt call AddSentenceMaps()

फिर बस फ़ाइल प्रकार को कस्टमटेक्स्ट पर सेट करें या AddSentenceMapsफ़ंक्शन को मैन्युअल रूप से कॉल करें ।


0

मैं इस मुद्दे के बारे में अपने विचार जोड़ना चाहता हूं। आमतौर पर लोग इस तरह की सुविधा चाहते हैं कि लिपटी हुई रेखाओं पर कूदने के कारण जब लोग कोड के माध्यम से नेविगेट करते हैं jऔर kआदेश देते हैं जो विम का डिफ़ॉल्ट व्यवहार है। लिपटे लाइनों के माध्यम से नेविगेशन के लिए मैं उपयोग करता हूं gj- नीचे जाएं और gk- ऊपर जाएं। इसके अलावा जी-उपसर्ग समकक्षों पर रीमैप मानक jऔर kकमांड होने की संभावना है, लेकिन आईएमएचओ यह ओवरकिल होगा।


या की कि remaping करने के लिए एक कुंजी है jऔर kकरने के लिए gjऔर gkआप यह चाहते जब ;-)
एंथोनी

0

यह रिफॉर्मेटिंग के बारे में आपके विशिष्ट प्रश्न का जवाब नहीं देता है, लेकिन 'सेट लाइनब्रेक' के साथ 'सेट रैप' संपादन लंबी लाइनों को बहुत अधिक सुखद बना सकता है। लिपटे लाइनों के भीतर नेविगेट करने के लिए इसे gj और gk के साथ मिलाएं। मैं क्रमशः ऊपर और नीचे तीर को gj और gk पर मैप करता हूं ताकि मेरे पास वास्तविक लाइनों या दृश्य लाइनों को ऊपर और नीचे ले जाने के बीच एक विकल्प हो। जैसे गृह के लिए बुद्धिमान / अंत से g0 / g $।

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