কেন ভিম একটি নতুন লাইন যুক্ত করছে? এটি কি কোন সম্মেলন?


22

আমি যদি ভিমটি খুলি এবং টাইপ করি itest<Esc>:wqতবে আমি এমন একটি ফাইল পেয়েছি যাতে ভিমে কোনও নিউলাইন নেই তবে কোডটিতে একটি নতুন লাইন রয়েছে বলে মনে হয়:

$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a                    |test.|
00000005

যদি আমি তেজ খুলুন এবং টাইপ itest<Return><Esc>:wqতারপর আমি এক সম্পর্কে newline আছে একটি ফাইল পেতে তেজ মধ্যে কিন্তু কোডে দুটি নতুন লাইন:

$ rm test.txt
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a 0a                 |test..|
00000006

মনে রাখবেন যে আমি ভিমটি খুলছি -u NONEতাই কোনও স্থানীয় কনফিগারেশন ব্যবহার হচ্ছে না। এটিও আমার পূর্ববর্তী প্রশ্নের সাথে সম্পর্কিত হতে পারে তা নোট করুন ।

এটি আমার সিস্টেম তথ্য:

$ uname -a
Linux awsAlpha 3.2.0-60-virtual #91-Ubuntu SMP Wed Feb 19 04:13:28 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May  4 2012 04:25:35)
Included patches: 1-429
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@

আমি এই সিস্টেমে ঠিক একই আচরণের বিষয়টিও নিশ্চিত করতে পারি:

$ uname -a
Linux bruno 3.5.0-48-generic #72-Ubuntu SMP Mon Mar 10 23:18:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct 26 2012 16:45:33)
Included patches: 1-547
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@

কেন ভিম একটি নতুন লাইন যুক্ত করছে? এটি কি কোন সম্মেলন?

hdউবুন্টু সার্ভারে ইনস্টল করা কমান্ড সম্পর্কে এখানে কিছু স্পষ্টতা রয়েছে :

$ man hd | head -4
HEXDUMP(1)            BSD General Commands Manual            HEXDUMP(1)

NAME
     hexdump, hd — ASCII, decimal, hexadecimal, octal dump

8
এটি একটি সম্মেলন বলে মনে হচ্ছে। আপনি চাইলে এটি কীভাবে অক্ষম করবেন তা এখানেএখানে এর ইতিহাস।
jliv902

উত্তর:


28

ইউনিক্স টেক্সট ফাইলগুলির কনভেনশনটি হ'ল প্রতিটি লাইন একটি নতুন লাইন দ্বারা সমাপ্ত হয় এবং নিউলাইনগুলি লাইন টার্মিনেটর হয়, লাইন বিভাজক নয়।

যখন ভিম কোনও ফাইল হিসাবে বাফার সংরক্ষণ করে, এটি ফাইলের ফর্ম্যাটের জন্য লাইনটির শেষ-লাইন ক্রম সহ প্রতিটি লাইনকে সমাপ্ত করে, যা ইউনিক্সের জন্য একটি নতুন লাইন। দেখা

:help 'fileformat'

আপনি যদি ইউনিক্স পাঠ্য-প্রক্রিয়াকরণ সরঞ্জামগুলি ব্যবহার করেন তবে এই সম্মেলনের সাথে থাকা ভাল। যাইহোক, যদি আপনার কোনও ফাইলের শেষ লাইনের শেষে একটি নতুন লাইন না লাগানোর প্রয়োজন হয় তবে আপনি এটি করতে পারেন। ভিম এই জাতীয় ফাইলগুলিকে "বাইনারি" হিসাবে বিবেচনা করে। দেখা

:help 'binary'
:help edit-binary

1
ওহ এটি আকর্ষণীয় সুতরাং বিখ্যাত besides r \ n বনাম besides n ছাড়াও। উইন্ডোজ লাইন বিভাজক এবং ইউনিক্স লাইন টার্মিনেটর ব্যবহার করে? এবং যে কোথাও নথিভুক্ত করা হয়? আমি জানি যে এটি সংজ্ঞায়িতভাবে সম্ভবত "ইউএসও / আইসিসি 9899: 2011, ইউনিক্সে প্রয়োগ করা হয়েছে, বিভাগ §7.21.2 স্ট্রিমস বলেছেন: একটি পাঠ্য স্ট্রিম হ'ল লাইনগুলিতে রচিত অক্ষরের ক্রমযুক্ত ক্রম, প্রতিটি লাইনে শূন্য বা আরও বেশি অক্ষর যুক্ত একটি সমাপ্তি নতুন লাইন চরিত্র "
বারলপ

তবে উইন্ডোজ একটি লাইন বিভাজক ব্যবহার করে কোথায় এটি নথিভুক্ত?
বার্লোপ

2

ভিম এমন কিছু যোগ করছে না যা আপনি নিজে সেখানে রাখেন নি।

একটি "সম্পর্কে newline" চরিত্র না একটি "নতুন লাইন" এবং উভয় উদাহরণ পুরোপুরি স্বাভাবিক আছেন:

  • প্রথমটিতে, ফাইলটিতে কেবল একটি লাইন থাকে যাতে আপনি একটি "নিউলাইন" অক্ষর পান,
  • দ্বিতীয়টিতে, ফাইলটিতে দুটি লাইন রয়েছে যাতে আপনি দুটি "নিউলাইন" অক্ষর পান।

2
এটি নতুন লাইন যুক্ত করে। এটি নিম্নলিখিত হিসাবে printf "\x41" > /tmp/test.txtপরীক্ষা করুন :, তারপরে এটির সাথে কেবলমাত্র 'এক' অক্ষর রয়েছে তা পরীক্ষা করুন xxd /tmp/test.txt। এখন vim /tmp/test.txt<ENTER>:wq। দুটি বাইট রয়েছে এমন ফাইলটি দেখতে আবার চেক করুন: 'এ \ n'।
রুসলান

লাইনগুলি একটি নতুন লাইনের চরিত্রের সাথে শেষ হয়। আপনার একটি লাইন রয়েছে সুতরাং আপনার একটি নতুন লাইন অক্ষর রয়েছে।
রোমেনেল

ঠিক আছে, এখানের পরে printfআমার কোনও সুগঠিত "লাইন" ছিল না। ভিমের পরে আমার একটা আছে। সুতরাং, এটি এমন কিছু যুক্ত করে যা আমি সেখানে রাখি না।
রুসলান

printfআপনি সংযোজন না করে আপনি কী লাইন নন \n। একটি টেক্সট এডিটর, ডিফল্টরূপে লাইনের তেজ পুলিশ এবং হচ্ছে কোনো ফাইল সন্নিবেশ টেক্সট হয় যদি না আপনি স্পষ্টভাবে তেজ বলুন যে না খুব অন্তত একটি লাইন এ, উপর।
রোমেনেল

2

একচেটিয়া পাঠ্য ফাইলগুলি একাধিক কারণে খারাপ; এখানে এমন একটি যা আমি এখনও উল্লেখ করি নি:

হাইপোটিটিকাল ওয়ার্ল্ডে যেখানে ট্র্যাকিং করা নতুন লাইন ছাড়া পাঠ্য ফাইলগুলি গ্রহণযোগ্য, সেখানে 0 লাইনযুক্ত ফাইল এবং 1 ফাঁকা লাইন থাকা ফাইলের মধ্যে কোনও পার্থক্য থাকবে না। তারা উভয়ই একটি 0-বাইট ফাইল দ্বারা প্রতিনিধিত্ব করতে চাই।

কোনও ফাইলের মধ্যে কতগুলি লাইন রয়েছে তা সিদ্ধান্ত নিতে অক্ষমতা খারাপ হবে।


নন-ইউনিক্স সিস্টেমে পাঠ্য ফাইলগুলিতে শূন্য বা আরও সম্পূর্ণ লাইন থাকে, এবং শূন্য বা আরও বেশি অক্ষরের একটি অসম্পূর্ণ লাইন থাকে। খালি ফাইলটিতে ফাঁকা লাইন থাকে না; এটিতে শূন্য সম্পূর্ণ লাইন এবং শূন্য অক্ষরের একটি আংশিক রেখা রয়েছে। অস্পষ্টতা কোথায়?
সুপারক্যাট

এই "আংশিক লাইন" একটি অপ্রীতিকর ধারণা। আপনি এক যে কোন জায়গায় ফাইলের শেষে ছাড়া অন্য থাকতে পারে না, এবং আপনি সেই একটি ফাইল করতে পারবেন না না একটি "আংশিক লাইন 'আছে। এটি ফাইলটি সংক্ষেপণে আরও বিরতি যুক্ত করে - এমনকি যদি আপনি ফাইলগুলির মধ্যে একটি নতুন লাইন সন্নিবেশিত করেন তবে আপনি এমন কিছু দিয়ে শেষ করেন যা শব্দার্থগতভাবে ফাইলের মূল জোড়ার সমতুল্য হয় না (কারণ 2 টি ফাইলের সাথে আপনার 2 টি আংশিক লাইন ছিল এবং সেগুলির মধ্যে একটি কিছু হয়ে গেছে ভিন্ন।) একটি অবহেলা প্রস্তাব।

উভয় ফাইলের সম্পূর্ণ লাইন থাকে এমন ক্ষেত্রে সাধারণত কনটেনেটিং ফাইলগুলি প্রথমের শেষে কোনও আংশিক রেখার কারণ হয়ে দাঁড়াবে (সাধারণত কখনও কখনও সম্পূর্ণ লাইন থাকে না এমন ফাইলগুলিকে সংমিশ্রণে কার্যকর হতে পারে) ), তবে এটি যা তা তাই। আংশিক লাইনের সাথে সমাপ্ত টেক্সট ফাইলগুলি তৈরি করতে ইউনিক্স নিষেধ করে না এবং আমি বিশ্বাস করি যে এই জাতীয় ফাইলগুলি এমএসডিওএসের মতো আচরণ করবে conc পার্থক্যটি আমি মনে করি যে ডস ভিত্তিক অনেক সম্পাদক
historতিহাসিকভাবে

... যা পুরানোটির সাথে বিট-অভিন্ন (পিসি-রাইটের প্রারম্ভিক সংস্করণগুলির নিবন্ধিত ব্যবহারকারীগণকে এটি কার্যকর করার যোগ্য একটি অনুলিপি খোলার জন্য, ওভাররাইট মোডে স্যুইচ করতে, একটি নির্দিষ্ট স্ট্রিং সন্ধান করার জন্য এবং এটির সাথে প্রতিস্থাপনের জন্য নির্দেশ দেওয়া হয়েছিল ক্রমিক সংখ্যা!). ফাইলগুলি সংরক্ষণের সময় নতুন লাইনের সাথে শেষ করতে বাধ্য করা সেই সীমাবদ্ধতা লঙ্ঘন করবে।
সুপারক্যাট

2

Vim 8.0 এখন fixeolবিকল্পের সাথে এটি সরবরাহ করে । বিশেষত:

:set nofixeol

তারপরে ফাইলটি ইতিমধ্যে একটি না থাকলে চূড়ান্ত লাইনের শেষে ভিম কোনও অনুসরণযোগ্য নিউলাইন অক্ষর যুক্ত করবে না

এটি কোনও ফাইল টাইপ প্লাগইন বা সম্ভবত আপনারও যেতে পারে .vimrc

(এটি এর উন্নতি :set binaryকারণ এটি কেবল চূড়ান্ত লাইন-ব্রেকের চরিত্রকেই প্রভাবিত করে, যেখানে binaryঅন্যান্য আচরণগুলির একটি গুচ্ছও পরিবর্তিত হয়, যা আপনি সম্ভবত বাইনারি ফাইল সম্পাদনা না করে আপনি সম্ভবত চান না))

একটি নতুন তৈরি করা ফাইলের ডিফল্টরূপে এখনও একটি অনুসরণযোগ্য লাইন-ব্রেক অক্ষর থাকবে। আপনি এটি পরিবর্তন করতে পারেন (এবং এমন একটি ফাইল স্যুইচ করতে পারেন যা ইতিমধ্যে একটি চূড়ান্ত নিউলাইন রয়েছে যার কাছে এটি না থাকার জন্য) অতিরিক্তভাবে করে:

:set noeol

আপনি যে ফাইলটি পরিবর্তন করতে চান তার জন্য এটি নির্দিষ্ট করে রাখতে হবে: একটি বাফারে কোনও ফাইল লোড করা সর্বদা eolফাইলের বর্তমান অবস্থার সাথে মেলে।


1

'J' কমান্ড ব্যবহার করে আপনি সমস্ত লাইনকে একটিতে যুক্ত করতে পারেন।

আপনিও যদি শেষ লাইনে এলএফ বা সিআরএলএফ অপসারণ করতে চান তবে vi এ নিম্নলিখিতটি করুন।

$ vi file
:set binary
:set noeol
:w!
:f          look for [noeol] on the status line
:q
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.