यदि मेरे पास निम्न पाठ है:
foo
bar
मैं नेत्रहीन इसे चुनता हूं और इसे कॉपी करता हूं।
पाठ अब अनाम रजिस्टर में संग्रहीत है "
और यहां इसकी सामग्री (आउटपुट :reg "
) है:
"" foo^Jbar^J
इस चार्ट के अनुसार , ऐसा लगता ^J
है कि एक लाइन फ़ीड के लिए कैरेट नोटेशन है।
यदि मैं रजिस्टर में अनाम कोड को डुप्लिकेट करना चाहता हूं a
: :let @a = @"
यहां इसकी सामग्री (आउटपुट :reg a
) है:
"a foo^Jbar^J
यह नहीं बदला।
यदि मैं अब इसे टाइप करके खोज रजिस्टर में डुप्लिकेट करता हूं :let @/ = @"
, तो यहां इसकी सामग्री (आउटपुट :reg /
) है:
"/ foo^@bar^@
पिछले चार्ट के अनुसार, ऐसा लगता ^@
है कि यह अशक्त चरित्र के लिए सबसे महत्वपूर्ण संकेत है।
खोज रजिस्टर (लेकिन a
रजिस्टर नहीं ) के अंदर एक पंक्ति फ़ीड स्वचालित रूप से एक अशक्त चरित्र में क्यों बदल जाती है ?
यदि मैं कमांड लाइन पर (या बाद में एक खोज के अंदर /
) अनाम कोड सम्मिलित करता हूं :<C-R>"
, तो यहां यह लिखा है:
:foo^Mbar^M
अंतिम चार्ट के अनुसार, ^M
कैरिज रिटर्न के लिए कैरेट नोटेशन प्रतीत होता है।
एक पंक्ति फ़ीड स्वचालित रूप से कैरिज रिटर्न में कमांड लाइन में क्यों परिवर्तित हो जाती है?
संपादित करें :
आमतौर पर आप टाइप करके शाब्दिक नियंत्रण वर्ण सम्मिलित कर सकते हैं:
<C-V><C-{character in caret notation}>
उदाहरण के लिए, आप <C-R>
टाइप करके एक शाब्दिक सम्मिलित कर सकते हैं <C-V><C-R>
।
आप इसे किसी भी नियंत्रण चरित्र के लिए कर सकते हैं।
हालाँकि मैंने देखा है कि मैं एक बफर के अंदर या कमांड लाइन पर शाब्दिक LF सम्मिलित करने में असमर्थ हूँ, क्योंकि अगर मैं टाइप <C-V><C-J>
करता हूँ: तो यह सम्मिलित करता है ^@
, इसके बजाय एक अशक्त वर्ण ^J
।
क्या यह उसी कारण से है, जिससे LF सर्च रजिस्टर के अंदर NUL में बदल जाता है?
2 संपादित करें :
में :h key-notation
, हम इसे पढ़ सकते हैं:
<Nul> zero CTRL-@ 0 (stored as 10) <Nul>
<NL> linefeed CTRL-J 10 (used for <Nul>)
stored as 10
पहली पंक्ति पर और भाग used for <Nul>
दूसरी पंक्ति पर संकेत दे सकती हैं कि वहाँ एक वामो और एक NUL के बीच ओवरलैप के कुछ प्रकार है कि, और वे एक ही बात के रूप में व्याख्या की जा सकती है। लेकिन वे एक ही चीज नहीं हो सकते हैं, क्योंकि पिछली कमांड को निष्पादित करने के बाद :let @/ = @"
, अगर मैं n
2 लाइनों की अगली घटना के लिए सामान्य मोड में टाइप करता हूं foo
और bar
, सकारात्मक मिलान प्राप्त करने के बजाय, मेरे पास निम्न त्रुटि संदेश है:
E486: Pattern not found: foo^@bar^@
इस लिंक के अलावा एक एनयूएल एक स्ट्रिंग के अंत को दर्शाता है, जबकि एक एलएफ एक पाठ फ़ाइल में एक पंक्ति के अंत को दर्शाता है।
और अगर एक एनयूएल stored as 10
मदद के रूप में कहता है, जो कि एलएफ के लिए समान कोड है, तो विम 2 के बीच अंतर कैसे कर सकता है?
संपादित करें 3 :
शायद LF और NUL को एक ही दशमलव कोड के साथ कोडित किया जाता है 10
, जैसा कि सहायता कहती है। और विम संदर्भ के लिए 2 धन्यवाद के बीच अंतर करता है। यदि यह एक ऐसे पात्र से मिलता है, जिसका दशमलव कोड 10
बफर या किसी रजिस्टर में है, तो खोज और कमांड रजिस्टर के अलावा, यह इसे LF के रूप में व्याख्या करता है।
लेकिन खोज रजिस्टर में ( :reg /
) इसे एनयूएल के रूप में व्याख्या करता है क्योंकि एक खोज के संदर्भ में, विम केवल एक स्ट्रिंग की खोज करता है, जहां की अवधारणा का end of line in a file
कोई मतलब नहीं है क्योंकि एक स्ट्रिंग एक फ़ाइल नहीं है (जो कि अजीब है क्योंकि आप कर सकते हैं अभी भी \n
खोजे गए पैटर्न में परमाणु का उपयोग करें , लेकिन शायद यह केवल रेगेक्स इंजन की एक विशेषता है?)। तो यह स्वतः 10
एनयूएल के रूप में व्याख्या करता है क्योंकि यह निकटतम अवधारणा ( end of string
ts end of line
) है।
और इसी तरह, कमांड लाइन / कमांड रजिस्टर पर ( :reg :
) यह 10
एक सीआर के रूप में कोड की व्याख्या करता है , क्योंकि यहां अवधारणा की end of line in a file
भावना नहीं है। निकटतम अवधारणा end of command
इसलिए है कि विम 10
एक सीआर के रूप में व्याख्या करता है, क्योंकि हिटिंग Enter
एक कमांड को समाप्त / निष्पादित करने का तरीका है और सीआर एक हिटिंग के समान है Enter
, जब आप एक शाब्दिक के साथ सम्मिलित करते हैं <C-V><Enter>
, ^M
तो प्रदर्शित किया जाता है।
हो सकता है कि चरित्र की व्याख्या जिसका कोड 10
संदर्भ के अनुसार परिवर्तन हो:
- एक बफर में लाइन का अंत (
^J
) - एक खोज में स्ट्रिंग का अंत (
^@
) - कमांड लाइन पर कमांड का अंत (
^M
)
someFunction(arg1, "")
जहाँ arg 2 था, ""
अर्थात "उद्धरण के बीच की वस्तु, जो कि शाब्दिक रूप से कुछ भी नहीं है - एक" खाली "। एक NULL दिखाई दे सकता है, क्योंकि यह अंतर्निहित सी कार्यान्वयन द्वारा" जोड़ा गया "था क्योंकि यह स्ट्रिंग को सीमांकित करता है। मुझे नहीं पता। आप इसके लिए कैसे जाँच करेंगे - लेकिन यह एक संभावित कारण के रूप में ध्यान में आता है।
\r
और \n
अंतर:substitute
भी देखें ।
NULL
वर्णों की घटना अंतर्निहित सी फ़ंक्शन के कारण होती है जो तारों को संभाल रही है। यह इस बात की व्याख्या करता है कि आप कैसे सी प्रक्रियाओं को तार से जोड़ते हैं, जो यह बताता है कि आंतरिक रूप से सी एक के साथ तार का परिसीमन करता हैNULL
।NULL
पाठ में शायद ही कभी पर्याप्त होता है कि यह इस उद्देश्य के लिए एक अच्छा चरित्र बनाता है। इसका एक परिणाम यह है कि यदि C प्रोग्राम (vim) ने "खाली" स्ट्रिंग को आंतरिक C फ़ंक्शन में पास करने की कोशिश की