ফাঁকা জায়গায় ট্যাবগুলি কীভাবে প্রতিস্থাপন করবেন?


85

পাঠ্য সারিবদ্ধকরণ বজায় রেখে কি ট্যাবগুলিকে স্পেসে রূপান্তর করা সম্ভব?

কেবলমাত্র প্রতিস্থাপন কেবল কার্যকরভাবে কাজ করে যখন কোনও শীর্ষস্থানীয় অক্ষর নেই।


আপনি যদি ভিম-ফ্যাক ইনস্টল করেন তবে আপনি সেখানে একটি অফলাইন উত্তর পেতে পারেন: :h vim-faqএবং অনুসন্ধান করুন /tab characters। মুখস্থ করা ট্যাগ হার্ড :h faq-14.16
হটস্কে

উত্তর:


98

আপনি :retabকমান্ডটি ব্যবহার করতে পারেন । থেকে :help :retab

<Tab>প্রদত্ত নতুন ট্যাবস্টপ মানটি ব্যবহার করে সাদা-স্পেসের নতুন স্ট্রিং সহ শ্বেত-স্থানের সমস্ত ক্রম প্রতিস্থাপন করুন । আপনি যদি কোনও নতুন ট্যাবস্টপ আকার নির্দিষ্ট না করেন বা এটি শূন্য হয়, ভিম এর বর্তমান মান ব্যবহার করে 'tabstop'। [...] 'expandtab'চালু রেখে, ভিম সমস্ত ট্যাবগুলিকে যথাযথ সংখ্যক স্পেস সহ প্রতিস্থাপন করে।

নোট করুন যে কমান্ডটি একটি পরিসীমা গ্রহণ করে, সুতরাং আপনি একটি চাক্ষুষ নির্বাচন করতে পারেন এবং তারপরে কেবলমাত্র :retabনির্বাচিত লাইনগুলি।


কুল! দ্রুত এবং সহজ কাজ করে!
ডেনিসকলোডিন

2
কিভাবে একটি উদাহরণ প্রদান সম্পর্কে?
পেট্র

23

আপনি :retabযেমন ব্যবহার করেছেন তেমন ব্যবহার করতে পারেন , তবে এটি সমস্ত ট্যাবকে স্পেসে বদলে দেবে , কেবলমাত্র লাইনের শুরুতে ট্যাবগুলি নয়

সুতরাং এটি (যেখানে একটি ট্যাব চরিত্রটি রয়েছে):

if :; do
⇥echo "⇥hello"
end

এতে পরিবর্তিত হয় (যেখানে কোনও স্থানের অক্ষর রয়েছে):

if :; do
␣␣echo "␣␣hello"
end

এটি কিছু পরিস্থিতিতে অপ্রত্যাশিত পার্শ্ব-প্রতিক্রিয়া তৈরি করতে পারে এবং ট্যাবগুলিতে স্পেস পরিবর্তন করার সময় এটি আরও বেশি সমস্যা হয়!

সুতরাং, আমি লাইনের শুরুতে কেবল ট্যাব / স্পেসগুলি পরিবর্তন করতে একটি সামান্য ফাংশন লিখেছি :

" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
    let l:spaces = repeat(' ', &tabstop)

    " Replace tabs with spaces
    if a:expandtab
        silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
    " Replace spaces with tabs
    else
        silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
    endif
endfun

এই সংস্করণটির সাহায্যে আপনাকে expandtabফাংশন কলটিতে ম্যানুয়ালি নির্দিষ্ট করতে হবে (উদাহরণস্বরূপ, :call Retab(1)ট্যাবগুলিকে স্পেসে পরিবর্তন করতে), তবে আপনি এটির মতো বর্তমান মানটি &expandtab(যেমন এটি ইতিমধ্যে যেমন রয়েছে তেমন &tabstop) গ্রহণ করতেও এটি পরিবর্তন করতে পারেন :retab। (আমি নিজে এটি নির্দিষ্ট করতে পছন্দ করি)।


6
রয়েছে তাই কোন উত্তর যা শুধুমাত্র লাইনের শুরুতে retabbing জুড়ে। এই ব্যাখ্যাটির স্পষ্টতার কারণে এটি লিঙ্ক করার উপযুক্ত।
jalanb

কারো ব্যাখ্যা গেল কি চিঠি দেয় aমধ্যে if a:expandtabঅর্থ কি?
জন সিজে

এছাড়াও, দেখে মনে হচ্ছে শর্তগুলি বিপরীত হয়েছে (একটি রসিকতা: ডি?)। যদি set expandtabআপনার .vimrc থাকে এবং তারপরে autocmd BufWritePre * :call Retab(&expandtab)- ইনডেন্টেশন ফাঁকা স্থানের পরিবর্তে ট্যাবগুলিতে পরিবর্তিত হবে।
জন সিজে

11

ভিম !retabকমান্ড সরবরাহ করে যা <Tab>নতুন ট্যাবস্টপ (উদাহরণস্বরূপ :set tabstop=2) প্রদত্ত মানটি ব্যবহার করে হোয়াইট-স্পেসের নতুন স্ট্রিংগুলির সমস্ত সিকোয়েন্সগুলি প্রতিস্থাপন করবে , তবে স্ট্রিংয়ের অভ্যন্তরের সমস্ত ট্যাবগুলি সংশোধন করা যেতে পারে (উদাহরণস্বরূপ একটি সি প্রোগ্রামে, আপনাকে \tএটি এড়াতে ব্যবহার করা উচিত )!

সুতরাং বিকল্পভাবে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করে সমস্ত ট্যাবগুলিকে স্পেসে পরিবর্তন করতে পারেন:

:%s/\t/  /g

বা @ শাহবাজ দ্বারা প্রস্তাবিত হিসাবে :

:%s/^\t\+/ g

সুতরাং ইনডেন্টেশনে ব্যবহৃত ট্যাবগুলি রূপান্তরিত হয়।

ব্যাখ্যা:

  • %সম্পূর্ণ বাফার / ফাইল উপস্থাপন করে ( :help :%)
  • sবিকল্প হিসাবে দাঁড়িয়েছে ( :help sub-replace-special)
  • \t, বা ^Iট্যাব জন্য দাঁড়িয়ে
  • - প্রতি ট্যাব হিসাবে আপনার প্রয়োজন যতগুলি স্পেস ব্যবহার করুন
  • g - মানে বিশ্বব্যাপী, এবং এটি একই লাইনে একাধিক ট্যাব রূপান্তর করবে

তারপর সমগ্র ফাইলের খাঁজ সংশোধন করার, আপনি চেষ্টা করতে পারেন: gg=G। চেক করুন: আরও তথ্যের জন্য খারাপভাবে ইনডেন্ট কোডটি পুনরায় যুক্ত করা

ট্যাবগুলির পরিবর্তে ডিফল্টরূপে স্পেস ব্যবহার করতে, আপনার .vimrcফাইলে নিম্নলিখিত সেটিংস যুক্ত করতে হবে:

set tabstop=2     " (ts) width (in spaces) that a <tab> is displayed as
set expandtab     " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2  " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)

বিকল্প সমাধান ব্যবহার করা হয় tidy


সম্পর্কিত:


1
আমি কমপক্ষে এটি করব %s/^\t\+/ gযাতে ইনডেন্টেশনে ব্যবহৃত ট্যাবগুলি রূপান্তরিত হয়। এছাড়াও, gg=Gপাইথনের মতো ভাষা নিয়ে বিপর্যয়কর হতে পারে।
শাহবাজ

3

ব্যবহার করার চেষ্টা করুন:

expand -t 4 input_filename output_filename

expandট্যাবগুলিকে স্পেসে রূপান্তর করতে একটি কমান্ড-লাইন সরঞ্জাম, যা আপনি শেল থেকে বা এর সাথে চালাতে পারেন :!expand

এটি পসিক্সে রয়েছে তাই এটি বেশিরভাগ সিস্টেমে উপলব্ধ। unexpandউল্টো, উপায়ে করতে হবে।


2
কী expand?
মুড়ু

ফাঁকা জায়গায় ট্যাব অক্ষর অনুলিপি করতে একটি ইনবিল্ট টার্মিনাল কমান্ড প্রসারিত। নিম্নলিখিত লিঙ্কে একটি বিশদ বৈষম্য দয়া করে সন্ধান করুন। computerhope.com/unix/uexpand.htm
অঙ্কিত শাহ

2
এগুলি যদি বাহ্যিক আদেশ হয় তবে আপনার এটি উল্লেখ করা উচিত।
মুড়ু

আরও বিবরণ যুক্ত করা হয়েছে। দয়া করে পর্যালোচনা করুন
অঙ্কিত শাহ

5
আপনি শুধু :%!expand -t 4ভিএম এর ভিতরে করতে পারে । আরও ভাল, আপনি বর্তমান শিফট প্রস্থ বিকল্পটিও ব্যবহার করতে পারেন: :exe '%!expand -t ' . &shiftwidth
এভারগ্রিন

1

সম্পূর্ণতার জন্য, =ইন্ডেন্টেশনগুলি ঠিক করার জন্যও ব্যবহার করা যেতে পারে, আপনি নির্দিষ্ট করার পরে ট্যাবগুলিকে ফাঁকা স্থান দিয়ে প্রতিস্থাপন করা হয়। সাধারণ মোডে, আপনি টাইপ করে এটি করতে পারেন :set expandtab। তারপরে =দুটি উপায়ে ব্যবহার করা যেতে পারে:

  • ভিজ্যুয়াল মোডে, একটি একক =নির্বাচিত কোড ব্লকের ইন্ডেন্টেশনগুলি ঠিক করবে।
  • স্বাভাবিক মোডে, gg=Gপুরো ফাইলটি ঠিক করে দেবে, যেখানে ggকার্সারটি ফাইলের শুরুতে সরিয়ে নিয়ে যায়, তারপরে =প্রয়োগ করা হয় এবং Gকার্সারটিকে ফাইলের শেষের দিকে নিয়ে যায়।

তথ্যসূত্র: লিঙ্ক


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

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