অনুসন্ধানের নিবন্ধের অভ্যন্তরে একটি লাইন ফিড কেন নাল চরিত্রে এবং কমান্ড লাইনের ক্যারিজ রিটার্নে রূপান্তরিত হয়?


12

আমার যদি নিম্নোক্ত পাঠ্য থাকে:

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>
আপাতদৃষ্টিতে যে কোনও নিয়ন্ত্রণ চরিত্রের জন্য আপনি এটি করতে পারেন।
তবে আমি লক্ষ করেছি যে আমি কোনও বাফারের ভিতরে বা কমান্ড লাইনে একটি আক্ষরিক এলএফ inোকাতে অক্ষম, কারণ যদি আমি টাইপ করি: <C-V><C-J>এটি সন্নিবেশ করানো হয় ^@, পরিবর্তে একটি নাল অক্ষর ^J
এটি কি একই কারণে অনুসন্ধানের নিবন্ধের অভ্যন্তরে কোনও এলএফকে 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 @/ = @", আমি যদি n2 লাইনের পরবর্তী উপস্থিতিটি পেতে স্বাভাবিক মোডে টাইপ করি fooএবং bar, ইতিবাচক মিল পাওয়ার পরিবর্তে আমার নীচের ত্রুটি বার্তাটি থাকে:

E486: Pattern not found: foo^@bar^@

এই লিঙ্কটি ছাড়াও বোঝা যাচ্ছে যে একটি এনএলই একটি স্ট্রিংয়ের সমাপ্তি বোঝায়, অন্যদিকে এলএফ একটি পাঠ্য ফাইলে একটি রেখার প্রান্তকে বোঝায়।

এবং যদি কোনও NUL stored as 10সহায়তা হিসাবে বলে থাকে, যা কোনও এলএফ হিসাবে একই কোড, তবে ভিম কীভাবে 2 এর মধ্যে পার্থক্য করতে সক্ষম?

সম্পাদনা 3 :

সম্ভবত একটি এলএফ এবং একটি এনএইউএল একই দশমিক কোড সহ কোডড রয়েছে 10, যেমন সাহায্য বলেছে। এবং ভিম প্রসঙ্গে 2 টি ধন্যবাদের মধ্যে পার্থক্য তৈরি করে। এটি যদি এমন কোনও চরিত্রের সাথে দেখা যায় যার দশমিক কোডটি 10বাফারে বা কোনও রেজিস্টারে থাকে, সন্ধান এবং কমান্ডের রেজিস্ট্রেশন বাদে, এটি এলএফ হিসাবে ব্যাখ্যা করে।
তবে অনুসন্ধান রেজিস্টারে ( :reg /) এটি এটিকে NUL হিসাবে ব্যাখ্যা করে কারণ একটি অনুসন্ধানের প্রসঙ্গে ভিম কেবল একটি স্ট্রিং অনুসন্ধান করে যেখানে end of line in a fileস্ট্রিং কোনও ফাইল নয় বলে ধারণাটি বোধগম্য হয় না (যা আপনি পারছেন বলে অদ্ভুত এখনও \nঅনুসন্ধান করা প্যাটার্নে পরমাণুটি ব্যবহার করুন , তবে এটি কেবল রেজেক্স ইঞ্জিনের একটি বৈশিষ্ট্য?)। সুতরাং এটি স্বয়ংক্রিয়ভাবে 10NUL হিসাবে ব্যাখ্যা করে কারণ এটি নিকটতম ধারণা ( end of stringend of line)।

এবং একইভাবে, কমান্ড লাইন / কমান্ড রেজিস্টারে ( :reg :) এটি 10কোডটিকে সিআর হিসাবে ব্যাখ্যা করে , কারণ এখানে ধারণার end of line in a fileকোনও ধারণা নেই। নিকটতম ধারণা end of commandতাই তেজ ব্যাখ্যা করে 10, একটি সি আর যেমন কারণ আঘাত Enterশেষ উপায় / কমান্ড চালানো এবং সি আর আঘাত হিসাবে একই Enter, যখন আপনার সাথে একটি আক্ষরিক এক সন্নিবেশ যেহেতু <C-V><Enter>, ^Mপ্রদর্শিত হয়।

যার চরিত্রের কোডটি 10প্রসঙ্গ অনুসারে পরিবর্তিত হয় তার ব্যাখ্যা হতে পারে :

  • একটি বাফারে লাইনের শেষ ( ^J)
  • অনুসন্ধানে স্ট্রিংয়ের শেষ ( ^@)
  • কমান্ড লাইনে কমান্ডের সমাপ্তি ( ^M)

2
কখনও কখনও NULL স্ট্রিংগুলি পরিচালনা করে এমন অন্তর্নিহিত সি ফাংশনের কারণে অপ্রত্যাশিত অক্ষরের ঘটনা ঘটে থাকে । সি আপনি যে সংযুক্ত স্ট্রিংকে প্রক্রিয়াজাত করেন তার এই ব্যাখ্যাটি ব্যাখ্যা করে যে অভ্যন্তরীণ সি এর সাথে স্ট্রিংগুলি সীমিত করে NULLNULLএর পাঠ্যে খুব কমই দেখা যায় যে এটিকে এ উদ্দেশ্যে এটি একটি ভাল চরিত্র হিসাবে তৈরি করে। এর পরিণতি হ'ল যদি সি প্রোগ্রাম (ভিআইএম) কোনও "খালি" স্ট্রিংটি অভ্যন্তরীণ সি ফাংশনে স্থান দেওয়ার চেষ্টা করে
the_velour_fog

2
উদাহরণস্বরূপ someFunction(arg1, "")যেখানে আরগ 2 ছিল "" "উদ্ধৃতিগুলির মধ্যে থাকা আইটেমটি, যা আক্ষরিক অর্থে কিছুই নয় - একটি" খালি "a আপনি কিভাবে এই জন্য চেক করবে - কিন্তু এটি একটি সম্ভাব্য কারণ হিসাবে মনে আসে।
the_velour_fog

1
এছাড়াও আলোচনা \rএবং \nপার্থক্য:substitute দেখুন ।
জামেসান

উত্তর:


4

প্রথম, এই খুব বিস্তৃত এবং চিন্তাশীল পোস্টের জন্য আপনাকে ধন্যবাদ।

কিছু পরীক্ষার পরে, আমি এই সিদ্ধান্তে পৌঁছেছি:

  1. : নিয়ন্ত্রণ অক্ষর ক্যারেট স্বরলিপি ব্যবহার প্রদর্শন করা হয় ^Mজন্য <CR>(গাড়ি ফেরত) এবং ^Jজন্য <LF>(লাইন ফীড)। বাফারগুলিতে, <EOL>(লাইনের শেষ অংশ) নতুন স্ক্রীন লাইন হিসাবে প্রদর্শিত হয় এবং এন্টার কী সহ ইনপুট হয়। <EOL>বাফার ফাইল ফরম্যাট উপর নির্ভর করে: <EOL> = <CR>|<LF>|<CR><LF>জন্য mac|unix|dosযথাক্রমে।

  2. বাফার সম্পাদনা করার সময়, ফাইল ফর্ম্যাটটি সর্বদা সেট থাকে। খোলা বাফারের ফাইল ফর্ম্যাটটি পরিবর্তন করতে, আপনি নিম্নলিখিত কমান্ডটি রূপান্তর করতে পারেন <EOL>:

    :set f[ile]f[ormat]=mac|unix|dos
    

    রূপান্তর ছাড়াও <EOL>, এই কম্যান্ডের ধর্মান্তরিত <LF>করার <CR>যখন থেকে ফাইল ফরম্যাট পরিবর্তন macকরার জন্য unix|dos, এবং বিপরীতভাবে, <CR>করতে <LF>যখন থেকে ফাইল ফরম্যাট পরিবর্তন unix|dosকরার জন্য mac। বাফারের আসল বাইটগুলি দেখতে, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন যা সুবিধাজনক হেক্সাডেসিমাল সম্পাদক xxd ব্যবহার করে বাফারের পাঠ্য উপস্থাপনাটিকে তার হেক্সাডেসিমাল উপস্থাপনায় রূপান্তরিত করে:

    :%!xxd
    
  3. রেজিস্টার (কমান্ড দিয়ে দেখিয়েছেন ইন :reg[isters]বা :di[splay]), <EOL>সবসময় প্রদর্শিত হিসাবে ^J(কিন্তু সব না ^Jহয় <EOL>বাফার ফাইল ফরম্যাট নির্বিশেষে)। তবে <EOL>হয় সঞ্চিত হিসাবে তারা উচিত। নিবন্ধগুলিতে অন্যদের (যা ) অন্যের থেকে দৃশ্যমান বাস্তবের ^J(যা হ'ল <LF>) আলাদা করার জন্য, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন যা নিয়ন্ত্রণ অক্ষরের ক্যারেট স্বরলিপি পরিবর্তে হেক্সাডেসিমাল মানগুলি প্রদর্শন করে :^J<EOL><EOL>

    :set d[ispla]y=uhex
    
  4. অনুসন্ধান নিদর্শন এবং প্রতিস্থাপনের স্ট্রিংগুলিতে:

    \r = newline different from <EOL> (<CR> if <EOL> = <CR><LF>|<LF>, <LF> if <EOL> = <CR>)
    \n = <EOL>
    
  5. সব জায়গায়:

    <C-V><C-M>|<C-V><EOL> = newline different from <EOL>
    <C-V><C-J> = <NUL>
    

    এ থেকে জানা যায় কখন ফাইলটি ফরম্যাট dos, এটা ইনপুট করা অসম্ভব <LF>সাল থেকে <EOL> = <CR><LF>এবং <C-V><C-M>|<C-V><EOL> = <CR>

  6. প্রতিস্থাপনের স্ট্রিংগুলিতে:

    • থেকে আলাদা NEWLINE <EOL>হয় ব্যাখ্যা হিসাবে <EOL>;

    • <EOL>হিসাবে ব্যাখ্যা করা হয় <NUL>

    সুতরাং, ৪ অনুযায়ী, :%s[ubstitute]/\r/\r/gপ্রতিটি নতুনলাইন <EOL>বাফারের সাথে আলাদা করে প্রতিস্থাপন করে <EOL>, যখন বাফারের :%s[ubstitute]/\n/\n/gপ্রত্যেককে প্রতিস্থাপন করে ।<EOL><NUL>

  7. অনুসন্ধান রেজিস্টার ইন /কমান্ড রেজিস্টার :, <EOL>হয় রূপান্তরিত করতে

    • <EOL>যখন রেজিস্টার থেকে /<C-R>{register}বা :<C-R>{register}যথাক্রমে সন্নিবেশ করা হয় তখন নিউলাইনটি আলাদা ;

    • <NUL>যখন রেজিস্ট্রার সহ :let @/=@{register}বা :let @:=@{register}যথাক্রমে inোকানো হয়।

  8. বাফারে প্রয়োগ করা থেকে সম্পর্কে newline বিভিন্ন <EOL>করছে রূপান্তরিত করতে <EOL>হলে রেজিস্টার ব্যবহার থেকে ঢোকানো i<C-R>{register}

অনুসন্ধানের নিবন্ধের অভ্যন্তরে একটি লাইন ফিড কেন নাল চরিত্রে এবং কমান্ড লাইনের ক্যারিজ রিটার্নে রূপান্তরিত হয়?

<LF>নামবিহীন নিবন্ধ "থেকে অন্য রেজিস্টারগুলিতে অনুলিপি করার আগে , আপনাকে ইনপুট <LF>করে নিবন্ধে রাখতে হবে "। যদি ফাইল ফর্ম্যাট হয় unix, আপনি yyখালি লাইনে ব্যবহার করে এটি করতে পারেন ; যদি ফাইল ফর্ম্যাট হয় mac, আপনি এটি ব্যবহার করে তা করতে পারেন i<C-V><C-M><Esc>yl; যদি ফাইল ফর্ম্যাট হয় তবে dosআপনি ইনপুট করতে পারবেন না <LF>(সিএফ। 5)।

এখন থেকে আপনার বক্তব্যটি আংশিকভাবে ভুল

  • আপনি <LF>রেজিস্টার থেকে "অনুসন্ধান রেজিস্টার /এবং কমান্ড রেজিস্টারে অনুলিপি করার জন্য একই পদ্ধতি ব্যবহার করবেন না :। আপনি এই ব্যবহার :let @/=@"রেজিস্টার মধ্যে অনুলিপি করার জন্য /এবং :<C-R>"রেজিস্টার মধ্যে অনুলিপি করার জন্য :। ব্যবহার /<C-R>"এবং :<C-R>"যথাক্রমে <CR>উভয় ক্ষেত্রে একই ফলাফল ( ) দেবে;

  • <LF>আপনার দুটি পৃথক অনুলিপি পদ্ধতির সাথে এর রূপান্তরগুলি তখনই ঘটে যখন ফাইল ফর্ম্যাট থাকে unix। যদি তা না হয় mac, <LF>হয় না যখন রেজিস্টার অনুলিপি রূপান্তরিত /বা রেজিস্টার :, এবং যদি তা না হয় dosআপনি এমনকি ইনপুট করতে পারেন না <LF>

সঠিক বিবৃতি 7. দ্বারা দেওয়া হয়েছে তবে আমি এর পিছনে কারণগুলি জানি না।


এটি বুঝতে এত অসুবিধা কেন ... আমি এসও এবং ভিএম-এসই এবং ভিআইএম সহায়তা সম্পর্কিত বেশ কয়েকটি পোস্টের মাধ্যমে গবেষণা করেছি, তবে সম্পূর্ণরূপে সুসংগত নয় এবং এখনও বিভ্রান্ত হয়েছি।
ভায়োলেপ্টরিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.