2015-12-24 8 views
8
में विभिन्न परिस्थितियों में \ r के अलग व्यवहार

कहो मैं सिर्फ एक चरित्र 'एस' के साथ एक पंक्ति है, के विभिन्न परिस्थितियों में \n के प्रभाव देखने चलते हैं: N और विम

:s/s/a\nb 
a^@b 
:s/s/a\\nb 
a\nb 
:s/s/a\\\nb 
a\^@b 
:s/s/a\\\\nb 
a\\nb 

:echo "a\nb" 
a 
b 
:echo "a\\nb" 
a\nb 
:echo "a\\\nb" 
a\ 
b 
:echo "a\\\\nb" 
a\\nb 

तो क्यों \n करता है अलग व्यवहार करते हो? तब की हालत substitute()

:echo substitute(" ", " ", "a\nb", "") 
a 
b 
:echo substitute(" ", " ", "a\\nb", "") 
a 
b 
:echo substitute(" ", " ", "a\\\nb", "") 
a 
b 
:echo substitute(" ", " ", "a\\\\nb", "") 
a\nb 

इस बार का उपयोग कर देखते हैं, \n अभी भी "नई पंक्ति" के रूप में व्याख्या की है, लेकिन कैसे बैकस्लैश व्याख्या करने के लिए?

अगला हिस्सा है, का कहना है कि मैं अभी भी सिर्फ एक चरित्र 'एस' के साथ एक पंक्ति है \n के बजाय, \r का अध्ययन किया जा रहा है:

:s/s/a\rb 
a 
b 
:s/s/a\\rb 
a\rb 
:s/s/a\\\rb 
a\ 
b 
:s/s/a\\\\rb 
a\\rb 

\r के प्रभाव :echo "a\nb" में \n तरह है, और बैकस्लैश का नियम वही है।

:echo "a\rb" 
b 
:echo "a\\rb" 
a\rb 
:echo "a\\\rb" 
b\ "This is the most strange case!!! 
:echo "a\\\\rb" 
a\\rb 

\r इस मामले में क्या करता है? और तीसरा सबकेस भी अजनबी है।

:echo substitute(" ", " ", "a\rb", "") 
b 
:echo substitute(" ", " ", "a\\rb", "") 
b 
:echo substitute(" ", " ", "a\\\rb", "") 
b 
:echo substitute(" ", " ", "a\\\\rb", "") 
a\rb 

फिर भी, मैं कैसे अलग संख्या नहीं समझ सकता की बैकस्लैश व्यवहार करते हैं।

मेरा प्रश्न हैं:

  1. क्यों \n या \r व्यवहार अलग ढंग से :substitute के तहत, echo सीधे और substitute()?
  2. substitute() का उपयोग करते समय बैकस्लैश के प्रभाव की विभिन्न संख्याओं को कैसे समझाया जाए?
  3. विम में \n और \r के बीच अंतर क्या हैं?

अनुपूरक 1:

अगर मैं :let s = "a\\\nb" और फिर <C-r>=s बफर में यह देखने के लिए, मैं देख

a\ 
     b 

कैसे यह समझाने के लिए?

उत्तर

2
  1. :echo और substitute() दोनों के लिए, \n एक नई पंक्ति है और \r एक गाड़ी वापसी है। उन्हें वह करना चाहिए जो आप उम्मीद करेंगे। \n कर्सर को अगली पंक्ति (कॉलम 1) पर ले जाता है, और \r कर्सर को कॉलम 1 को उसी पंक्ति में ले जाता है। \r के लिए मुद्रित होने वाला अगला चरित्र पहले प्रिंट वर्ण को ओवरराइट करेगा। (मैं ज्यादातर, substitute() और :echo पर ध्यान केंद्रित कर रहा हूँ :substitute नीचे है)

  2. क्यों गूंज और स्थानापन्न() अलग तरीके से व्यवहार के लिए। आपको समझने की जरूरत है कि स्ट्रिंग की कितनी व्याख्याएं हो रही हैं। इको के लिए केवल एक विकल्प के लिए होता है() दो होते हैं।

    :echo substitute(" ", " ", "a\\\rb", "") 
    b 
    :echo substitute(" ", " ", 'a\\\rb', "") 
    b\ 
    

दूसरा आप गूंज के लिए क्या अपेक्षा की होगी के समान है। डबल कोट्स में स्ट्रिंग्स में :help expr-quote के अनुसार सामग्री बदल गई है। इसका मतलब यह है कि दोनों गूंज और स्थानापन्न एक ही बात करता है, तो स्ट्रिंग केवल एक बार व्याख्या की है (जिसे एकल कोट उपयोग कर रहा है)

"a\\\rb" दूसरे के बाद एक व्याख्या के बाद a\rb के रूप में व्याख्या हो जाता है और उसके बाद a<CR>b देखते हैं। जो मुद्रित होने पर केवल b की ओर जाता है।

  1. \r और \n परिवर्तन जहां वे इस्तेमाल कर रहे हैं पर निर्भर करता है। केवल अंतर :substitute होगा जहां \r प्रतिस्थापन में एक नई लाइन के रूप में उपयोग किया जाता है।

इस मामलों में जहां :substitute और अलग ढंग से व्यवहार substitute(),

:substitue इस प्रकार ^@ रूप

<CR>  split line in two at this point 
       (Type the <CR> as CTRL-V <Enter>)     s<CR> 
    \r   idem            s/\r 
    ... 
    \n   insert a <NL> (<NUL> in the file) 
       (does NOT break the line)       s/\n 

(<NUL> ही है जो एक नई पंक्ति के समान नहीं है में से एक है)

जबकि substitute()

The special meaning is also used inside the third argument {sub} of 
the substitute() function with the following exceptions: 
... 
    - <CR> and \r inserts a carriage-return (CTRL-M). 
... 
+0

बहुत बढ़िया उत्तर! मैं लगभग इसे प्राप्त करता हूँ। विचार करें: गूंज विकल्प ("", "", "एक \\\ आरबी", "") ", एक व्याख्या के बाद' a \\\ आरबी "का अर्थ 'ए \ आरबी'' के रूप में क्यों किया जाता है? क्या यह विकल्प 'विकल्प()' के कारण है? एक व्याख्या के बाद यह एक \^एमबी' नहीं होना चाहिए? – fujianjin6471

+0

@ fujianjin6471 यह है। लेकिन '\^एम' का अर्थ ज्यादातर अनिर्धारित है। ': H/\\ 'से एक बैकस्लैश, जिसके बाद कोई विशेष अर्थ नहीं है, भविष्य के विस्तार के लिए आरक्षित है। वर्तमान में '\^एम' को कैरिज रिटर्न के रूप में व्याख्या किया जाता है। यदि आप बफर में '^ एम' रखते हैं तो आप इसे देख सकते हैं (' ') और फिर'/\^एम' के लिए खोजें। और देखें कि '^ एम 'मिलान हो जाता है। (इस व्यवहार पर निर्भर न करें) – FDinoff

+0

धन्यवाद, लेकिन अगर मैं 's:" a \\\ nb "' और फिर ' = s' को बफर में देखने के लिए, मुझे कुछ वास्तव में अस्पष्ट दिखाई देता है। मैं इसे प्रश्न में दिखाता हूं। – fujianjin6471

संबंधित मुद्दे