वीआईएम में मार्कडाउन लिखते समय स्वचालित रूप से लाइनों को फिर से खोलना


11

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

डेमो (विकिपीडिया से प्रथम क्रम तर्क लिया गया):

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments. In first-order 
theories, predicates are often associated with sets. In interpreted higher-order 
theories, predicates may be interpreted as sets of sets.

अब तक सब ठीक है। लेकिन जब मैं लेख को संशोधित करता हूं, तो मैं बीच में कुछ जोड़ने का फैसला कर सकता हूं:

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments,
or in which one or both of predicate quantifiers or function quantifiers are permitted.
In first-order theories, predicates are often associated with sets. In interpreted higher-order
theories, predicates may be interpreted as sets of sets.

सूचना पंक्ति 3 वह है जिसे मैं लपेटना चाहता हूं। यदि मैं इसे वीआईएम में करता हूं, तो मुझे मैन्युअल रूप से लाइनों में शामिल होने और पूरे पैराग्राफ को फिर से लिखना होगा।

किसी को भी विचार आया कि वीआईएम को स्वचालित रूप से कैसे बनाया जाए?

जवाबों:


7

और भी सरल: जब भी पाठ डाला या हटाया जाता है, तो अनुच्छेदों के स्वचालित स्वरूपण के aलिए ध्वज 'formatoptions'सक्षम होता है। झंडे :help fo-tableपर विवरण के लिए देखें 'formatoptions'और :help autoformat

:set formatoptions+=a

gqऔर gwउन पंक्तियों को प्रारूपित करेगा जो निम्न गति से आगे बढ़ती हैं।

Formatting is done with one of three methods:
                1. If 'formatexpr' is not empty the expression is
                   evaluated.  This can differ for each buffer.
                2. If 'formatprg' is not empty an external program
                   is used.
                3. Otherwise formatting is done internally.

                In the third case the 'textwidth' option controls the
                length of each formatted line

दोनों के बीच का अंतर यह है कि gqकर्सर को अंतिम स्वरूपित लाइन के पहले गैर-रिक्त स्थान पर छोड़ देगा। gwकर्सर को वापस रख दिया जाएगा जहां यह शुरू हुआ था।

आप आसानी से उस पैरा को आसानी से फिर से खोल सकते हैं जिस पर आपका कर्सर वर्तमान में gwapया पूरे दस्तावेज़ के साथ है gggwG, हालांकि यह आपके कर्सर को अग्रणी के लिए धन्यवाद देगा gg

ऑटोकॉमैंड के साथ, आप अपने आप स्वरूपण हो सकते हैं। यहाँ एक उदाहरण है जो इन्सर्ट मोड को छोड़ते समय वर्तमान पैराग्राफ को प्रारूपित करता है:

augroup myformatting
    autocmd!
    autocmd InsertLeave * normal gwap<CR>
augroup END

अन्य ऑटोकॉमैंड ट्रिगर्स हैं जो आपको आपके लिए बेहतर काम लग सकते हैं। आप के तहत विकल्पों का पता लगा सकते हैं :help autocmd-events। सबसे अधिक प्रासंगिक शायद "विभिन्न" अधीनता के तहत हैं।


एक शब्द: शानदार!
जेसन हू

1

मेरी नजर पड़ती :help 'textwidth'। जैसे ही आप टाइप करेंगे यह स्वचालित रूप से लाइनों को तोड़ देगा। हालाँकि यह काम नहीं करता है यदि आप एक पंक्ति के बीच में संपादन कर रहे हैं।

मैं व्यक्तिगत रूप से छुट्टी textwidthदेना पसंद करता हूं इसलिए मैंने एक ऐसा फ़ंक्शन बनाया जो ऑटो से जुड़ जाएगा और एक पैराग्राफ को विभाजित करेगा। (मूल रूप से ऑटो इसे 80 वर्णों में प्रारूपित करता है) यह इस तरह दिखता है:

function! ParagraphToEightyChars()
   while (len(getline(".")) > 80)
      normal! 0
      " Find the first white-space character before the 81st character.
      call search('\(\%81v.*\)\@<!\s\(.*\s.\{-}\%81v\)\@!', 'c', line('.'))
      " Replace it with a new line.
      exe "normal! r\<CR>"
      " If the next line has words, join it to avoid weird paragraph breaks.
      if (getline(line('.')+1) =~ '\w')
         normal! J
      endif
   endwhile
   " Trim any accidental trailing whitespace
   :s/\s\+$//e
endfunction

जब भी मुझे इसकी आवश्यकता हो, मैं इसे कॉल करने के लिए मैपिंग करूंगा:

nnoremap <silent><A-J> :call ParagraphToEightyChars()<CR>

यह फ़ंक्शन formatoptions+=jrकोड में भी फ़ॉर्मेटिंग टिप्पणियों के लिए बहुत अच्छा काम करता है! बस अपने कर्सर को पहली पंक्ति पर रखें जो कि 80 वर्णों से अधिक लंबा है और फ़ंक्शन को कॉल करता है।

(नोट: मैंने इस फ़ंक्शन को 80 से अधिक की लंबाई करने के लिए सामान्य नहीं बनाया है, लेकिन मुझे लगता है कि आपको केवल 80 और 81 को बदलने की आवश्यकता है यदि आप इसे कुछ और बनाना चाहते हैं)

देखें :help 'textwidth'और :help 'formatoptions'अधिक जानकारी के लिए।


आपके साझा करने के लिए धन्यवाद। जैसा कि मैंने आपके सेटअप की जाँच की है, यह स्वचालित रूप से स्वरूपण नहीं है जैसा कि मैंने टाइप किया है, सही है? यदि हां, तो यह अभी भी एक उप-अपनाने वाला समाधान है, नहीं?
जेसन हू

textwidthजैसे ही आप टाइप करेंगे अपने आप फॉर्मेट हो जाएगा। मेरा कार्य नहीं होगा। जब विम चीजों को लपेटता है तो मैं नियंत्रित करना पसंद करता हूं, इसलिए यह मेरे लिए काम करता है। लेकिन अगर आप विशेष रूप से ए-यू-टाइप फॉर्मेटर की तलाश में हैं, तो हाँ; यह आपके वर्कफ़्लो को बिल्कुल फिट नहीं करता है।
Tumbler41

1

पूर्णता के लिए, मैं प्लगइन-आधारित विकल्प का उल्लेख करना चाहूंगा।

यदि आप ALE जैसी किसी चीज़ का उपयोग करते हैं, जो आपके बफ़र्स को सेव पर एक ब्यूटिफायर के माध्यम से चलाने का समर्थन करती है, तो आप Prettier को अपने कोड को फिर से हैंडल करने दे सकते हैं ।

मैंने इसे पूरा करके इसे पूरा किया ~/.vim/ftplugin/markdown.vim:

let b:ale_fixers = ['prettier', 'remove_trailing_lines', 'trim_whitespace']
let b:ale_javascript_prettier_options = '--prose-wrap always'

... और इसे इसमें डाल रहे हैं ~/.vimrc:

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