विम: नई लाइन में ऑटो-टिप्पणी


9

जब मैं एक नई लाइन शुरू करता हूं, तो विम एक टिप्पणी सम्मिलित करता है, क्योंकि मैंने सेट कर दिया है formatoptions=tcroql। उदाहरण के लिए (कर्सर है *):

// this is a comment*

और मारने के बाद <Enter>(मोड डालें) या o(सामान्य मोड) मैं साथ छोड़ दिया गया हूँ:

// this is a comment
// *

लंबी मल्टी-लाइन टिप्पणियां लिखते समय यह सुविधा बहुत आसान है, लेकिन अक्सर मैं केवल एक लाइन टिप्पणी चाहता हूं। अब अगर मैं टिप्पणी श्रृंखला को समाप्त करना चाहता हूं तो मेरे पास कई विकल्प हैं:

  • मारो <Esc>S
  • <BS>तीन बार मारा

इन दोनों ने तीन कीस्ट्रोक्स का वहन किया, <Enter>इस के साथ एक नई लाइन के लिए चार कीस्ट्रोक्स का अर्थ है, जो मुझे लगता है कि बहुत अधिक है। आदर्श रूप में, मैं केवल <Enter>दूसरी बार हिट होना चाहूंगा :

// this is a comment
*

यह महत्वपूर्ण है कि समाधान विभिन्न इंडेंटेशन स्तरों के साथ भी काम करेगा, अर्थात

int main(void) {
    // this is a comment*
}

मारो <Enter>

int main(void) {
    // this is a comment
    // *
}

मारो <Enter>

int main(void) {
    // this is a comment
    *
}

मुझे लगता है कि मैंने कुछ साल पहले कुछ टेक्स्ट एडिटर में इस फीचर को देखा है लेकिन मुझे याद नहीं है कि यह कौन सा था। किसी को एक समाधान के बारे में पता है जो मेरे लिए विम में ऐसा करेगा? अपने स्वयं के समाधान को रोल करने के तरीके के बारे में सही दिशा में संकेत भी बहुत स्वागत करते हैं।


3
आप एक कुंजी-कॉर्ड में स्वचालित रूप से सम्मिलित टिप्पणी मार्कर को हटाने के लिए ctrl-u का उपयोग इन्सर्ट मोड में कर सकते हैं।
इटन रीसनर

1
@EtanReisner यह वास्तव में बेहतर है, लेकिन फिर भी मेरे लिए एक बहुत ही महत्वपूर्ण है क्योंकि यह इस तरह का एक आम उपयोग मामला है :)
पैट्रिक ऑस्सिटी

आपने सुझाव दिया कि आप जो व्यवहार चाहते थे उसे पाने के लिए फिर से प्रवेश करने में सक्षम होना चाहते थे लेकिन ctrl-u बहुत ज्यादा है? आप स्वचालित रूप से आपके लिए ctrl-u प्रदर्शन करने के लिए इन्सर्ट मोड में <Enter> <Enter> डालने का प्रयास कर सकते हैं, लेकिन यदि आप कभी भी प्रवेश करते हैं तो देरी हो सकती है <Enter> बस एक बार (बिना किसी चीज को हिट किए)।
इटन रीसनर

अच्छी तरह से इसके अलावा, यह केवल ट्रिगर होना चाहिए अगर टिप्पणी की गई रेखा खाली है। <Enter> मारते समय ध्यान देने योग्य देरी भी अस्वीकार्य है।
पैट्रिक ऑस्सिटी

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

जवाबों:


4

इसे इस्तेमाल करे:

function! EnterEnter()
  if getline(".") =~ '^\s*\(//\|#\|"\)\s*$'
    return "\<C-u>"
  else
    return "\<CR>"
  endif
endfunction

imap <expr> <CR> EnterEnter()

धन्यवाद बहुत अच्छा लग रहा है! कोशिश करेंगे कि कब घर पहुंचूं। क्या आप टिप्पणी मार्कर भाषा से स्वतंत्र रूप से मेल खाने के लिए रेगेक्स का विस्तार करने का एक तरीका जानते हैं? जानकारी सिंटैक्स फ़ाइलों या कुछ और में होनी चाहिए। शायद मैं इसके लिए वाक्यविन्यास सुविधा का लाभ उठा सकता हूं ...
पैट्रिक ऑस्सिटी

मेरा मतलब है कि C में यह // और / * और * (
बहुस्तरीय

जाहिर है, यह फ़ंक्शन सामान्य नहीं है। देखें :h 'comment'और :h format-comment'
रोमेनल

क्लासिक के अलावा #रूबी और "विम्सस्क्रिप्ट के साथ काम करने के लिए संशोधित फ़ंक्शन //। यह वास्तव *में सी-स्टाइल बहुस्तरीय टिप्पणियों के लिए कुछ भी करने का कोई मतलब नहीं है क्योंकि इसे वैसे भी समाप्त होना चाहिए*/
रोमेनिल

हम्म, शायद <CR><CR>
बहुस्तरीय

3

मैंने विम के से रेगेक्स उत्पन्न करके मनमानी भाषाओं के साथ काम करने के लिए @ रोमेनिल के उत्तर को बढ़ाया &commentstring:

function! s:IsOnlyComment(getlineArg)
  let commentRegex='^\s*'.substitute(&commentstring,'%s','\\s*','').'$'
  return strlen(matchstr(getline(a:getlineArg), commentRegex)) > 0
endfunction

function! SmartEnter()
  if s:IsOnlyComment('.')
    return "\<Esc>S"
  else
    return "\<CR>"
  endif
endfunction

inoremap <expr> <CR> SmartEnter()

हालाँकि, मैं बिल्कुल भी रिमैप नहीं कर सकता <CR>, यह काम नहीं करेगा। अभी के लिए, मैं <CR><CR>इस मुद्दे को हल होने तक उपयोग करता हूं ।


1
क्यों <Esc>S? <C-u>इन्सर्ट मोड को छोड़े बिना वही करता है। वैसे भी, मेरे पास एक कस्टम फंक्शन था जो चीजों का एक गुच्छा था <CR>और SmartEnter()मैंने अपना उत्तर ;-); इसके अलावा, मुझे यकीन नहीं है कि &commentstringयह सही विकल्प है क्योंकि इसमें आम तौर पर केवल एक रूप होता है और यह "अलंकृत" या "ब्लॉकवाइज" ( /*%s*/सी में, //%sजावास्क्रिप्ट, आदि) हो सकता है।
रोमेनियल

2

R को 'formatoptions' से निकालें। यही वह विकल्प है। इसे बंद करने का मतलब होगा कि आप कभी भी ऐसा नहीं कर पाएंगे कि आपके लिए इसका मतलब है कि आपको प्रमुख टिप्पणी मार्करों को जोड़ना होगा जब आप वास्तव में उन्हें चाहते हैं, लेकिन यह ट्रेडऑफ़ है।


2
मैं वास्तव में चाहता हूं कि मेरे लिए टिप्पणी मार्करों को जोड़ दें, मुझे यह पसंद है। लेकिन मैं भी टिप्पणी से बाहर निकलने का एक त्वरित तरीका चाहता हूं। यद्यपि आपके उत्तर के लिए धन्यवाद।
पैट्रिक ऑस्सिटी

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