ট্যাব বনাম স্পেস পছন্দগুলি ভিমে


87

এটি যখন ভার্সন ট্যাবে আসে তখন ভিম খুব সমন্বিত হয় স্থান পছন্দ। আমি এটি যেমন বুঝতে পারি, tabstopসেটিংটি কোনও ট্যাব অক্ষরের প্রস্থকে নির্দেশ করে। shiftwidthসেটিং নির্দিষ্ট কত কলামকে বৃদ্ধি / হ্রাস যখন ব্যবহার <<এবং >>, কমান্ড যেহেতু softtabstopসেটিং প্রভাব হোয়াইটস্পেস পরিমাণ যুক্ত করা যেতে যখন আপনি টিপুন Tabসন্নিবেশ মোডে কী। যদি expandtabচালু থাকে তবে ট্যাব কীটি softtabstopস্থানের অক্ষরের সংখ্যা সন্নিবেশ করায় । স্যুইচড expandtabঅফ থাকা অবস্থায়, Tabকী টিপে টিপ + স্পেস অক্ষরের সাথে সামান্যতম সম্ভাব্য সংখ্যার সন্নিবেশ করায় softtabstop। (আমি ভুল হলে আমাকে সংশোধন করুন।)

এই চূড়ান্ত বিষয়টি আমাকে অবাক করে তোলে: এমন কোনও ব্যবহারিক ক্ষেত্রে রয়েছে যেখানে আপনি চান না shiftwidth == tabstop && tabstop == softtabstop? আমি একজনের কথা ভাবতে পারি না। যতদূর আমি উদ্বিগ্ন, এটি সর্বাধিক সুবিধাজনক হবে যদি আমি এই সমস্ত 3 একই মান হিসাবে সেট করতে পারি, একটি একক কার্যভারে। যেমন কল:

:set stab=4

যা চলমান সমান হবে:

:set tabstop=4 softtabstop=4 shiftwidth=4 

এটি কীভাবে করা যেতে পারে কেউ পরামর্শ দিতে পারে?


হালনাগাদ

জবাব দেওয়া এতদূর থেকে জন্য ধন্যবাদ অত্যধিক পিএইচপি , হবস এবং kaiser.se । পৃথকভাবে প্রতিটি উত্তর দেওয়ার পরিবর্তে, আমি এখানে প্রশ্ন আপডেট করছি।

সফটট্যাবস্টপ উইন্ডোড্যাটেব স্যুইচ অফ

আমি বললাম উপরে যে expandtab সঙ্গে সুইচ বন্ধ, ট্যাব + Space অক্ষরের একটি ক্ষুদ্রতম সম্ভব সংখ্যা ম্যাচ টিপে ট্যাব কী টিপে softtabstop। আমি এর পাশে দাঁড়িয়েছি, তবে আমি মনে করি আমার কী বোঝাতে চাইছিল তা ব্যাখ্যা করা দরকার। আমি কয়েকটি উদাহরণ দিয়ে তা করার চেষ্টা করব। পাশাপাশি অনুসরণ করতে, চালান :set listযাতে আপনি ট্যাব অক্ষর দেখতে পান।

tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab

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

tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab

সন্নিবেশ মোডে, ট্যাব কী টিপলে 1 টি অক্ষরের সাথে আরও 2 টি ফাঁকা স্থান সন্নিবেশ করা হয়। ট্যাব অক্ষরটির প্রস্থ 4 হয়, সুতরাং মোট প্রস্থ 6 হয় এবং এটি 3 টি অক্ষর ব্যবহার করে অর্জিত হয়। দ্বিতীয়বার ট্যাব কী টিপলে দুটি ট্যাব অক্ষর সন্নিবেশ করানো হয় এবং পূর্বে wereোকানো দুটি স্থান সরিয়ে ফেলা হয়। মোট প্রস্থ 12, এবং এটি 3 টি অক্ষর ব্যবহার করে অর্জিত হয়েছে।

এই উভয় উদাহরণে, ভিম সফটটাবস্টপের সাথে মেলে এমন ন্যূনতম সম্ভাব্য সংখ্যক ট্যাব + স্পেস অক্ষর সন্নিবেশ করান।

যদি আমি এক্সপেনড্যাটেব স্যুইচ অফ দিয়ে কাজ করি তবে আমি নিজেকে অতিরিক্ত দানাদার নিয়ন্ত্রণটি দেখতে চাই না যা ট্যাবস্টপ থেকে আলাদা মূল্যে সফ্টট্যাবস্টপ সেট করে অর্জন করা যায়। এটা এখনও দরকারী আমাকে সেট পাবে জন্য হবে tabstop, softtabstopএবং shiftwidthএকটি কমান্ডের সাথে একই মান।

এক্সটেনড্যাব কি সফটটাবস্টপকে রিডান্ট্যান্ট বানায়?

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

সন্নিবেশ মোডে, ট্যাব কী টিপলে 4 টি স্থান সন্নিবেশ করানো হয়। মুছুন কী টিপলে একক স্থান মুছে যায় - তাই আপনি দুর্ঘটনাক্রমে ট্যাব কীটি চাপলে আপনার 4 বার ব্যাকস্পেস করতে হবে।

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

সন্নিবেশ মোডে, ট্যাব কী টিপলে 4 টি স্থান সন্নিবেশ করানো হয়। ব্যাকস্পেস কী টিপলে 4 স্পেস মুছে যায়।

আমি যদি expandtabস্যুইচড দিয়ে কাজ করছি , আমি ট্যাব কী সন্নিবেশ হিসাবে সমান পরিমাণ শ্বেত স্থান অপসারণ করতে মুছুন কীটি পছন্দ করব। তাই এই ক্ষেত্রে, খুব, আমি মনে করি এটি একই মান নির্ধারণ পাবে দরকারী হবে tabstop, softtabstopএবং shiftwidthএকই সাথে।

একটি শর্টকাট এখনও দরকারী হবে

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

সুতরাং এর মতো কোনও কিছুর জন্য আমার প্রস্তাবিত পরামর্শটি আমার কাছে :set stab=4ভাল লাগছে ।


মনে হচ্ছে এখানে আপনার দুটি পৃথক প্রশ্ন রয়েছে, সম্ভবত আপনার প্রশ্নটিকে দুটি ভাগে ভাগ করা উচিত।
গ্রেগ হিউগিল

তুমি ঠিক বলছো! আমি দ্বিতীয় প্রশ্নটিকে তার নিজস্ব একটি বিষয়ে স্থানান্তরিত করেছি।
নেলস্ট্রোম

4
এটি কোনও প্রশ্নের চেয়ে আরএফইর মতো বলে মনে হচ্ছে। এর মতো, আপনার সম্ভবত ভিআইএম সম্প্রদায়কে প্রস্তাব দেওয়া উচিত: vim.org/commune.php - অথবা কেবল একটি প্যাচ লিখুন। এগুলি ছাড়াও, ভিআইএমের একটি বিস্তৃত ম্যাক্রো সুবিধা রয়েছে যা আপনাকে নতুন ক্রিয়াকলাপ সংজ্ঞায়িত করতে দেয়, তাই সম্ভবত আপনি ম্যাক্রো তৈরি করতে পারবেন যা আপনি যা চান তা করেন।
kdgregory

@nelstrom আপনার প্রশ্নের বিষয়ে, ভিমের is there a practical case where you wouldn't want shiftwidth == tabstop && tabstop == softtabstop?নিজস্ব উত্স কোড ব্যবহার করে set shiftwidth=4 tabstop=8 noexpandtab। হ্যাঁ, একজন সাধারণত চান shiftwidth == softtabstop, তবে মানটি যা tabstopআছে তার থেকে এটি স্বাধীন ।
জামেসান

উত্তর:


56

stabভিমে নিজেই একটি বিকল্প তৈরি করা সহজ হবে না, তবে আমি এই কমান্ডটি / ফাংশনটিকে বেতার দিয়েছি যা আপনি নিজের .vimrc(বা আপনি যদি সুগঠিত থাকেন তবে একটি প্লাগইন ফাইল) ফেলে দিতে পারেন। ব্যবহার করুন :Stabএবং আপনাকে ইনডেন্ট স্তরের জন্য এবং আপনাকে ব্যবহার করা হবে কিনা তা সম্পর্কে অনুরোধ জানানো হবে expandtab। আপনি যদি কোনও নতুন ইনডেন্ট স্তর না দিয়ে এন্টার টিপান তবে এটি কেবলমাত্র বর্তমান সেটিংস মুদ্রণ করবে।

"এই সব আপনার .vimrc বা একটি প্লাগইন ফাইলে রাখুন
আদেশ! -নার্গস = * স্ট্যাব কল স্ট্যাব ()
ফাংশন! ছুরিকাঘাত ()
  আসুন l: ট্যাবস্টপ = 1 * ইনপুট ('শিফটউইথ সেট করুন' ')

  যদি l: ট্যাবস্টপ> 0
    "আমরা কি এক্সটেনড্যাবও চাই?
    আসুন l: প্রসারণযোগ্য = নিশ্চিত করুন ('সেট এক্সপেনডট্যাব?', "& হ্যাঁ \ n & না Cancel n & বাতিল করুন")
    যদি l: প্রসারিত ট্যাব == 3
      "গর্ভপাত?
      প্রত্যাবর্তন
    শেষ যদি

    & l: sts = l: ট্যাবস্টপ দিন
    & l: ts = l: ট্যাবস্টপ দিন
    & l: sw = l: ট্যাবস্টপ দিন

    যদি l: প্রসারিত ট্যাব == 1
      সেটলোকাল প্রসারিত ট্যাব
    অন্য
      setlocal noexpandtab
    শেষ যদি
  শেষ যদি

  "নির্বাচিত বিকল্পগুলি দেখান
  চেষ্টা করুন
    ইচোহাল মোডএমএসজি
    ইকন 'সেট ট্যাবস্টপ ='
    ইকোহল প্রশ্ন
    ইকন ও এল: টিএস
    ইচোহাল মোডএমএসজি
    ইকন 'শিফটউইথ ='
    ইকোহল প্রশ্ন
    ইকন ও এল: র
    ইচোহাল মোডএমএসজি
    প্রতিধ্বনি 'sts ='
    ইকোহল প্রশ্ন
    ইকন ও এল: এসটিএস ''। (& এল: এট? '': 'না')
    ইচোহাল মোডএমএসজি
    ইকন 'এক্সপ্রেডট্যাব'
  শেষ পর্যন্ত
    ইকোহল কিছুই নয়
  অন্তর্নিহিত
সমাপ্তি

4
স্ক্রিপ্টের জন্য ধন্যবাদ! এটি আমার চেয়েও বেশি কাজ করেছে - আমি মনে করি যে আমি এর থেকে প্রসারিত ট্যাব রেখে যেতে পছন্দ করব - তবে আমি এটিকে সহজেই আমার পছন্দ অনুসারে কাস্টমাইজ করতে পারি। আপনি আমাকে ভিমস্ক্রিপ্টে একটি ছোট ক্র্যাশ কোর্স সরবরাহ করেছেন, তাই আমি খুব কৃতজ্ঞ। 100 পয়েন্টের অনুগ্রহ আপনার!
নেলস্ট্রোম

9

এটি ভাইমস্ক্রিপ্ট লেখার আমার প্রথম চেষ্টা, তবে এখানে যায়:

function! Stab(value)
    let &shiftwidth  = a:value
    let &softtabstop = a:value
    let &tabstop     = a:value
endfunc

যদি আমি এটি আমার .vimrc ফাইলটিতে রাখি তবে আমি এটি চালিয়ে কল করতে পারি :call Stab(X), যেখানে এক্স পছন্দসই ট্যাব প্রস্থ। এটি আপাতত পর্যাপ্ত সমাধান, তবে যদি কেউ কল করা আরও সহজ করার কোনও উপায় প্রস্তাব করতে পারে তবে আমি কৃতজ্ঞ হব।

আমি একটি ফাংশনও তৈরি করেছি যা দ্রুত বর্তমান সেটিংসের সংক্ষিপ্তসার জানায়, যা আমি সিটিটিএল-ট্যাবে ম্যাপ করেছি:

nmap <C-Tab> :call TabParams()<CR>
function! TabParams()
    echo "tabstop:     ".&tabstop
    echo "shiftwidth:  ".&shiftwidth
    echo "softtabstop: ".&softtabstop
endfunc

ঠিক আছে, আমি এই উত্তরের জন্য 100 পয়েন্টের অনুগ্রহ রেখেছি এবং এখন আমি অর্ধেক নিজেই এটি সমাধান করেছি। আমি নিজের উত্তরটি গ্রহণ করতে পারি কিনা তা নিশ্চিত নই ...


হ্যাঁ, তবে আপনি যদি সত্যিই এটি চান তবে এটি এখনও ঠিক আছে।
ডেভপ্যারিলো

4
আপনি সম্ভবত স্থানীয় সংস্করণগুলি সেট করতে লেট & এল: শিফটউইথ ইত্যাদি ব্যবহার করতে চাইবেন।
সিস্টেমপারাডক্স

7

আপনি সম্পাদনা মোডে এছাড়াও ব্যবহার করতে পারেন Ctrl-Tইন্ডেন্ট প্রয়োজন এবং Ctrl-Ddeindent দ্বারা সেট হিসাবে পরবর্তী খাঁজ স্তর shiftwidth, নির্বিশেষে tabstop, softtabstopবা expandtabসেটিংস। ভিম আপনাকে ডান কলামে আনতে স্বয়ংক্রিয়ভাবে স্পেস বা ট্যাবগুলি সরিয়ে ফেলবে।

আপনি যদি এই আদেশগুলি Tab/ পরিবর্তে ইনডেন্টেশন নিয়ন্ত্রণ করতে ব্যবহার করেন তবে আপনাকে এই Backspaceসমস্ত ট্যাব সেটিংস একসাথে ফিট করার বিষয়ে চিন্তা করতে হবে না এবং সর্বদা সঠিক ইনডেন্টেশন স্তরে পৌঁছাতে হবে।


3

যদি expandtabসেট করা থাকে (যত বেশি পিএইচপি পয়েন্ট আউট), softtabstopঅপ্রয়োজনীয় হয়ে যায়। আপনি যে কারণে shiftwidthআলাদা করতে পারেন তার একমাত্র কারণ tabstopহ'ল কোনও অদ্ভুত অভ্যাসটি পূরণ করা; উদাহরণস্বরূপ, আপনি চার স্পেস ইনডেন্ট ব্যবহার করেন তবে আপনি tabআটটি স্পেস সন্নিবেশ করতে পছন্দ করেন ।

যদি expandtabসেট না করা থাকে তবে জিনিসগুলি ফাজির হয়ে ওঠে। আপনি যদি চান যে আপনার কোডটি catভিআইএম-তে যেমন একইরকম এবং অ-ভিআইএম সম্পাদকদের সাথে দেখা যায় তবে tabstopসর্বদা 8 এ সেট করা উচিত; এই ক্ষেত্রে আপনি softtabstopএবং shiftwidthউভয় আপনার পছন্দসই ইনডেন্ট স্তরে সেট করতে হবে । যদি আপনি তার পরিবর্তে ফাইলের প্রতিটি "শারীরিক ট্যাব" একটি ইনডেন্ট স্তর উপস্থাপন করেন তবে আপনি সেট করতে tabstopএবং shiftwidthআপনার পছন্দসই ইনডেন্ট স্তরটিতে রেখে softtabstopশূন্যে চলে যাবেন (এটির সমান সেট করা tabstopযদি আপনি পরিবর্তন করেন তবে tabstopএটি সিঙ্কের বাইরে চলে যাবে, যদিও শূন্যের অর্থ "দয়া করে এটিকে উপেক্ষা করুন")।


4
আমি এটি ভুল বলে মনে করি কারণ কেবলমাত্র softtabstopসঠিক মান সেট করা থাকলে ব্যাকস্পেস একটি ফাঁক করা ইনডেন্ট মুছে ফেলবে যেন এটি কোনও ট্যাব। এটি বুদ্ধিমান ব্যবহারের জন্য প্রয়োজনীয়
u0b34a0f6ae

2

আপনার বোঝাপড়াটি ভুল softtabstopএবং expandtabভুল - সুতরাং stabআপনার প্রস্তাবিত বিকল্পটি খুব কার্যকর হবে না।

expandtabযখন তোমার জন্য ট্যাব পরিবর্তে স্পেস ব্যবহার করতে চান জন্য সবকিছু । আপনি সেট করেন তাহলে expandtab, তারপর তেজ উপেক্ষা করে softtabstopবিকল্প এবং ব্যবহারসমূহ tabstopএবং shiftwidthকত স্পেস সন্নিবেশ করতে কাজ করার।

softtabstop আপনি যখন এটি ব্যবহার করতে চান কেবল তখনই ট্যাব এবং স্পেসগুলির মিশ্রণটি জরিমানা নিয়ন্ত্রণ (2 বা 4 স্পেস) দিয়ে ইনডেন্ট করতে দেয়, যখন ট্যাব প্রস্থকে একটি উচ্চ মানের (সাধারণত 8) রাখা হয়, যাতে পাঠ্যটি অন্যান্য অ্যাপ্লিকেশনে প্রদর্শিত হয় । সেটিং softtabstop=tabstopকোনও কাজ সম্পাদন করে না কারণ ভিম সর্বদা ইনডেন্টিংয়ের জন্য ট্যাব ব্যবহার করবে।

আপডেট: যেমন কাইজার.সে উল্লেখ করেছে যে আপনি যদি ব্যবহার করছেন তবে আপনার যদি ভিমকে একাধিক স্পেস ব্যাকস্পেসে রাখতে চান তবে সেগুলি আপনাকে একটি ট্যাব হিসাবে expandtabসেট softtabstopকরতে হবে।


আপনি যখন ঠিক বলেছেন tabstopএবং সেট softtabstopহয়ে যাওয়ার সময় অনেকগুলি একটি ভেরিয়েবল হয়ে উঠছেন extpandtab, আমি মনে করি আপনি অগ্রাধিকারের ভিত্তিতে ভুল। কেবল এটি চেষ্টা করুন: ts=8 sts=4 etট্যাব সেট এবং টিপুন; কার্সারটি পাঁচটি কলামে থাকবে এবং চারটি স্পেস সন্নিবেশ করা হবে ঠিক যেমন আপনি সেট করেছিলেন ts=4 sts=0 et
hobbs

4
আমি মনে করি এটি ভুল কারণ কেবলমাত্র softtabstopসঠিক মান সেট করা থাকলে ব্যাকস্পেস একটি ফাঁক করা ইনডেন্ট মুছে ফেলবে যেন এটি কোনও ট্যাব। এটি বুদ্ধিমান ব্যবহারের জন্য প্রয়োজনীয়
u0b34a0f6ae

2

আপনি কি আপনার সাদা স্পেস সেটিংসটি এত তাড়াতাড়ি পরিবর্তন করছেন যে এটি পরিচালনা করার জন্য আপনার সত্যিই কোনও ফাংশন প্রয়োজন? আপনি যদি অনেকটা ট্যাবস্টপ নিয়ে গণ্ডগোল করছেন এবং এক্সপেনডেট্যাবও সেট করছেন, আপনি বিভিন্ন মানের সাথে ফাইলগুলি পরিবর্তন করার সাথে সাথে আপনি সম্ভবত সময়ের সাথে জড়িত হতে চলেছেন stab। আজ আমি ব্যবহার করছি :call stab (4), আগামীকাল এটি :call stab (2)এবং গত সপ্তাহে এটি ছিল :call stab (8)। আপনি এটি লিখলেও এমনটি মনে হচ্ছে, আপনি শীঘ্রই এটি ব্যবহার বন্ধ করবেন।

যদি আপনি সর্বদা একই মানকে ছুরিকাঘাতের উদ্দেশ্যে যাওয়ার পরিকল্পনা করেন তবে কেন কেবল আপনার গ্লোবাল সেটিংস সম্পাদনা করবেন না? ভিমে:

:e $MYVIMRC

এবং নিম্নলিখিত যোগ করুন:

set tabstop=4
set shiftwidth=4  "tabs are 4 spaces wide (default = 8)
set expandtab     "Convert tabs to spaces

এইভাবে আমার .vimrc সেটআপ হয়।


1

একটি দরকারী বিকল্প softtabstop=-1যা এটির মান সেট করে shiftwidth
আপনি shiftwidth0 তেও সেট করতে পারেন , সেই ক্ষেত্রে tabstopমানটি ব্যবহৃত হবে।

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