ভিএম-তে 2-স্পেস ইনডেন্ট 4-স্পেসে পরিবর্তন করুন


96

আমি ইন্টারনেট থেকে কিছু কোড অনুলিপি করেছি যাতে 2-স্পেস ইনডেন্টিং রয়েছে এবং আমি এটিকে 4-স্পেস ইনডেন্টিংয়ে পরিবর্তন করতে চাই। আমি ভাবছি যদি ভিএম স্ক্রিপ্ট না লিখে কাজটি সম্পাদনের জন্য একটি সংক্ষিপ্ত ভিএম রুটিন থাকে? আমি বর্তমানে এটি একটি HTML ফাইল দিয়ে কীভাবে করছি তা এখানে:

  • একটি ম্যাক্রো রেকর্ড করুন
  • একটি লাইনের শুরুতে যান
  • "<" এর প্রথম উপস্থিতি না হওয়া পর্যন্ত ভিজ্যুয়াল সমস্ত সাদা স্থান নির্বাচন করুন
  • ইয়াঙ্ক এবং সমস্ত সাদা স্থান স্পষ্ট করে (মূলত সেগুলি দ্বিগুণ করার জন্য)
  • ফাইলের শেষে ম্যাক্রো পুনরায় খেলুন

সংক্ষেপে qa0vt<yp<esc>jq

ক্ষতি:

ম্যাক্রো ফাঁকা রেখা বা একটি লাইনের জন্য ব্যর্থ হয় যা "<" দিয়ে শুরু হয় না। এবং এই সমাধানটি নন-এইচটিএমএল ফাইলটিতে কীভাবে প্রসারিত করা যায় তা সম্পর্কে আমার কোনও ধারণা নেই।

উত্তর:


178

ইনডেন্ট পরিবর্তন করার একটি সাধারণ উপায় হ'ল ট্যাবস্টপ পরিবর্তন করে:

আপনার ফাইলটি খালি বাফারে পেস্ট করুন, তারপরে:

:set ts=2 sts=2 noet
:retab!

এটি প্রতি 2 টি স্পেসকে একটি ট্যাব অক্ষরে পরিবর্তন করে, তারপরে:

:set ts=4 sts=4 et
:retab

এটি প্রতি টিএবি 4 টি স্পেসে পরিবর্তন করে।

এই পদ্ধতির সুবিধাটি হ'ল উদাহরণস্বরূপ আপনি 4 থেকে 2 স্পেস থেকে রূপান্তর করতে অন্যদিকেও এটিকে ব্যবহার করতে পারেন।


16
@ জাভিয়ারটি.আমি আসলে এই উত্তরটি বুঝতে খুব সহজ বলে মনে করি। হয়তো এটা আরো স্পষ্ট করে সংক্ষিপ্ত আদেশ নাম তাদের পুরো নাম দিয়ে প্রতিস্থাপন হতে হবে: ts: = tabstop, sts: = softtabstopএবং [no]et: = [no]expandtab
ইয়াওজি

কোন পরিস্থিতিতে retabযুক্তি কার্যকর হবে এবং আমরা কেন এই কাজের জন্য এটি ব্যবহার করতে পারি না?
জোয়েটউইল

@ জোয়েটউইডল যেমনটি আমি বুঝতে পেরেছি, আপনি এটি ব্যবহার করতে পারেন এবং এই উত্তরটি ব্যবহার করে একই প্রভাব অর্জন করতে পারেন :set sts=2 noetএবং :retab! 2সুতরাং এটি কিছুটা খাটো হবে (সম্ভবত কম পাঠযোগ্য হলেও)।
দান বেকার

এই পদ্ধতিটি কেবল লাইনের শুরু না করে স্ট্রিং আক্ষরিক এবং অন্যান্য জায়গাগুলির মধ্যে 2-স্পেসকে 4-স্পেসে পরিবর্তন করে।
নসিটার সেবাদত

4
তাদের সমস্ত একসাথে রাখুন: :set ts=2 sts=2 noet | retab! | set ts=4 sts=4 et | retab!এবং তারপরে @:একই ক্রিয়াটি দ্রুত প্রয়োগ করতে বিভিন্ন ফাইলগুলিতে ব্যবহার করুন ।
এল__

60

এটি :set shiftwidth=4এবং দিয়েও সম্ভব হতে পারে gg=G


মনে রাখবেন যে এটি যদি কাজ না করে তবে আপনার একটি মোড সক্ষম থাকতে পারে যা ইন্ডেন্টেশনে কিছু অন্য প্রভাব ফেলে।
ডেভ ক্লার্ক

4
যদিও প্রশ্নটি কোনও সাধারণ সমাধান সম্পর্কে নয়, দয়া করে মনে রাখবেন যে এটি সর্বদা কার্যকর হয় না, বিশেষত পাইথন কোড সহ।
0xc0de

4
gg=Gবহিরাগত মানে কি ? আমি বুঝতে পারি যে gg"1,1 এ যান" এবং এর Gঅর্থ "শেষ লাইনে চলে যান"।
জোনাথন রেইনহার্ট

4
@ জোনাথনরাইনহার্ট =ইনডেন্টিং করেন, তাই এটির অর্থ পাঠ্যের শুরু থেকে শেষ পর্যন্ত ইন্ডেন্ট করা
অ্যালেক্স

এর থেকে আরও ভাল কাজ করেছে %retab, যা স্ট্রিং ল্যাটারালগুলির মধ্যে এমবেড করা স্থানগুলিকে ভুলভাবে রূপান্তর করেছে।
Alnitak

34

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

:%s/^\s*/&&

দ্বিগুণ নেতৃস্থানীয় স্থানের সাথে কেবলমাত্র শীর্ষস্থানীয় স্থান (স্পেস বা ট্যাব) &প্রতিস্থাপন করে ( মিলিত অভিব্যক্তির সাথে প্রতিস্থাপন করা হয়)।


4
এটি সুবিধাজনক কারণ এটি ভিজ্যুয়াল নির্বাচনের সাথে কাজ করে (ভি), কেবল ড্রপ করে %
ট্রেভর রবিনসন

4
আমি এটি পছন্দ করি পাশাপাশি খ / সি এটি আমার মন্তব্যগুলিতে থাকা টেবিলগুলির কোনও ম্যানুয়াল প্রান্তিককরণের সাথে
গোলমাল করে না

@ ট্রেভররোবিনসন শীর্ষ দুটি উত্তর রেঞ্জের ক্ষেত্রেও কাজ করে।
ব্রায়ান ম্যাকচ্যাটন

এটাও হয়েছে অতিরিক্ত লাভ আপনি ব্যবহার করতে এটি প্রসারিত করতে পারে sedএবং একটি ডিরেক্টরির মধ্যে সমস্ত ফাইল এটি প্রয়োগ superuser.com/a/159286/41494
icc97

3

আমি এই নিয়মিত অভিব্যক্তিটি ব্যবহার করেছি (এটি শীর্ষস্থানীয় জায়গাগুলির সংখ্যা দ্বিগুণ করে):

%s;^\(\s\+\);\=repeat(' ', len(submatch(0))*2);g

না %s/\s\+/&&/একই জিনিস করে? বিটিডব্লু, আমি মনে করি gপতাকাটি অপ্রয়োজনীয় (একের জন্য, ^patternপ্রতিটি লাইনে কেবল 1 টি মিল থাকবে , না?)
ডাবলডাউন

'এবং' নির্দেশ করার জন্য ধন্যবাদ। আমি আপনার সাথে সামান্য সংশোধন করেছি কারণ আপনি '^' %s/^\s\+/&&/gকাছাকাছি ভুলে গেছেন ।
cforbish

4
এটি স্প্রোর উত্তরের অনুরূপ তবে আমি উত্তরটির প্রশংসা করি কারণ এটি আপনাকে আরও জটিল কিছু করার দরকার হলে আপনি এটি সহজতর টুইট করতে পারবেন।
স্টেফেন মিম

3

এটি একটি অতি পুরানো প্রশ্ন, তবে সমস্ত উত্তর হ'ল ... ভুল ... পুরো ফাইলটি পুনরায় পাঠানোর জন্য ভিমের একটি খুব সহজ উপায় রয়েছে। এটি করার জন্য নিজের ফাংশন লেখার পরে আমি এটি শিখেছি, তাই আমি একই অজ্ঞতা নৌকায় আছি;)

প্রকার

gg=G

এটি ধরে নিচ্ছে যে আপনার ট্যাবস্টপটি আপনার পছন্দ অনুযায়ী সেট করা আছে (সুতরাং ওপিটির জন্য এটি ts = 4 হবে)

আমি এটি http://vim.wikia.com/wiki/Fix_indentation থেকে শিখেছি , যার উল্লেখ রয়েছে

স্বাভাবিক মোডে, gg = G টাইপ করলে পুরো ফাইলটি পুনরায় পাঠানো হবে। এটি একটি বিশেষ ক্ষেত্রে; = অপারেটর। ঠিক d বা y এর মতোই এটি কার্সার মোশন কমান্ডের সাহায্যে যে কোনও পাঠ্যকে সরিয়ে দেয় on এই ক্ষেত্রে, gg প্রথম লাইনটিতে কার্সারকে অবস্থান করে, তারপরে = G বর্তমান কার্সার অবস্থান থেকে বাফারের শেষের দিকে পুনরায় ইনডেন্ট করে।


4
1. আপনি নীচে সমস্ত পথ নীচে স্ক্রোল করে থাকলে, আপনি একটি উত্তর দেখতে পাবেন জিজি = জি উল্লেখ করে। ২. এটি সবসময় কাজ করে না।
লিম এইচ।

1

অনুরূপ (তবে কিছুটা সহজ) চিত্তবিন্যাসের উত্তরের জন্য, এই রেজেক্সটি শীর্ষস্থানীয় স্থানগুলিকে নকল করবে

:%s/^\( \+\)/\1\1

অথবা আপনি এই অন্যান্য রেজেক্স ব্যবহার করে 2-স্পেসকে 4-স্পেসে রূপান্তর করতে পারেন, একক স্পেস সংরক্ষণ করে (এবং সাধারণভাবে বিজোড় পরিমাণ)

:%s/^\(\(  \)\+\)/\1\1

এটাই,

  • 1 স্পেস ⇢ 1 স্পেস
  • 2 স্পেস ⇢ 4 স্পেস
  • 3 স্পেস ⇢ 5 স্পেস
  • 4 স্পেস ⇢ 8 স্পেস

1

@ স্প্রোর উত্তর ছাড়াও, আমি এটি আমার মধ্যে রেখেছি .vimrc

command! -range=% Format :<line1>,<line2>s/^\s*/&&

শুধু টাইপ করুন :Format

ভিজ্যুয়াল নির্বাচনের সাথে এটি কেবল নির্বাচিত লাইনগুলিকেই ফর্ম্যাট করে।

ভিজ্যুয়াল নির্বাচন ছাড়াই, এটি পুরো ফাইলটি ফর্ম্যাট করে।


0

এটি রেজেক্স ভিত্তিক উত্তরের একটি বৈকল্পিক।

আমার স্থানীয় বিন ডিরেক্টরিতে আমার একটি বাশ স্ক্রিপ্ট রয়েছে যা একটি লাইনের শুরুতে শ্বেত স্পেসের পরিমাণ দ্বিগুণ করবে। ইনপুট স্টিডিন বা কোনও ফাইল হতে পারে:

$ cat ~/bin/dblsp
#!/bin/bash

file=${1--}

while IFS= read -r line; do
    echo "$line" | sed 's/\s*/&&/'
done < <(cat -- "$file")

আমি এটিকে ভিএম এর মধ্যে দৃশ্যত একটি লাইন নির্বাচন করে এবং নিম্নলিখিত আদেশটি জারি করে ব্যবহার করছি:

:'<,'>!dblsp

এটি আমারকে রেজেক্স টাইপ করার (বা মনে রাখার) প্রয়োজন সংরক্ষণ করে।

আমি এটি নীচের মতো মানচিত্রেও ব্যবহার করি:

nnoremap <leader>] `[V`]!dblsp<CR>

যা এটি সম্প্রতি আটকানো পাঠ্যের একটি ব্লকে প্রয়োগ করবে। আমি সাধারণত পেস্ট করার জন্য নীচের মানচিত্রটি ব্যবহার করি:set paste

nnoremap <leader>p :r !xclip -o<CR>

আমার স্বাভাবিক কর্মপ্রবাহটি হ'ল:

  • কোড স্নিপেট নির্বাচন করুন (যেমন এই পৃষ্ঠায় উদাহরণ কোডটি 2 স্পেস তবে আমি চাই 4)
  • পেস্ট কোড স্নিপেট (, পি)
  • ব্যবধান পরিবর্তন করুন (,))

বা অন্য বাফার থেকে পেস্ট করা ইয়াঙ্কড ব্লকগুলিতে সহজভাবে ইনডেন্ট পরিবর্তন করা।

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