লাইনের ক্রমটি কীভাবে বিপরীত করা যায়?


24

আমি কীভাবে রেখার ক্রমটিকে বিপরীত করতে পারি যাতে প্রথম লাইনটি শেষের দিকে প্রদর্শিত হয় এবং শেষ লাইনটি প্রথম প্রদর্শিত হয়? (বাফার, একটি ঠিকানা সীমা বা একটি লাইনওয়াইজ ভিজ্যুয়াল মোড নির্বাচনের সমস্ত লাইন হতে পারে))

আমি রূপান্তর করতে চাই

rat
ox
tiger
⋮
dog
pig

মধ্যে

pig
dog
⋮
tiger
ox
rat

যেমন একটি বাহ্যিক কমান্ড অবলম্বন না করে tac


এই প্রশ্নে আরও ভাল ট্যাগ জন্য কোন পরামর্শ?
200_সূচী

1
হতে পারে একটি নতুন 'খাঁটি- vi' বা অনুরূপ ট্যাগ? আমি বেশ কয়েকটি প্রশ্ন দেখেছি যা কোনও ট্যাগ থেকে উপকৃত হবে যা কোনও বাহ্যিক সরঞ্জাম জড়িত থাকার আকাঙ্ক্ষাকে নির্দেশ করবে। আমি মেটা সম্পর্কে এটি জিজ্ঞাসা করা উচিত?
জন ও'ম।

1
@ কারপেটস্মোকার (এবং এটি অনুসরণে আগ্রহী অন্য কেউ) ট্যাগ প্রশ্নটি এখন মেটা মেটা.ভি.সটেকেক্সচেঞ্জ
জন ও'ম।

উত্তর:


29

গ্লোবাল শক্তি এখানে কাজ করবে:

:g/^/exe "normal ddggP"

অথবা, আরও সহজভাবে (ধন্যবাদ @ টমমকডো)

:g/^/move 0

প্রথমটি প্রতিটি লাইনের সাথে এবং প্রতিটি লাইনের সাথে মিলবে, এটি মুছুন এবং এটি ফাইলের শীর্ষে আটকে দিন। এটি ফাইলের মধ্য দিয়ে চলে যাওয়ার সাথে সাথে এটি পাঠ্যটিকে বিপরীত করে।

দ্বিতীয়টি একইভাবে প্রতিটি লাইনের সাথে মেলে এবং এটিকে ফাইলের শীর্ষে নিয়ে যায়।

দ্রষ্টব্য: এই দু'টিই পুরো ফাইলটিতে কাজ করে এবং লাইনগুলির একটি উপসেট বিপরীত করতে সঠিকভাবে প্রয়োগ করবে না। একটি পরিসরের মধ্যে কাজ করে এমন একটি সমাধানের জন্য ইনগো কারকাতের উত্তর দেখুন ।

বর্ণনা:

gগ্লোবাল কমান্ড
/^/যে কোনও লাইনের সাথে মেলে যা একটি শুরুর (অর্থাৎ সমস্ত লাইন)
exeনিম্নলিখিত স্ট্রিং
"normalসম্পাদন করে সাধারণ মোড কমান্ডগুলি বর্তমান অবস্থানের উপরে ফাইলের পেস্টের শীর্ষে
ddলাইন
ggসরান
P

move 0 বর্তমান লাইনটি 0 রেখার নীচে নিয়ে যায় (যা এটি পজিশন 1 বা ফাইলের প্রথম লাইনে রাখে)


6
:normalকমান্ডের পরিবর্তে , আমরা প্রাক্তন কমান্ডটি ব্যবহার করতে পারি :move 0, যা রেফারটি বাফারের শুরুতে সরিয়ে দেয়।
tommcdo

1
এছাড়াও :executeযখন কমান্ড পরিবর্তনশীল নির্মিত হবে যেমন প্রয়োজন শুধুমাত্র প্রয়োজনীয় :execute 'normal' g:user_command
tommcdo

@ টমম্যাকডো ভাল পয়েন্ট! আমি ব্যবহার করার অভ্যাস করছি :executeকারণ আমি প্রায়শই বিদ্যমান কমান্ডগুলির পরে পরে অন্যান্য প্রাক্তন কমান্ডগুলি সংযোজন :exeকরি এবং এটি পরে ফিরে haveোকানোর চেয়ে আগেই সেখানে থাকা আমার পক্ষে আরও সুবিধাজনক । দুর্ভাগ্যক্রমে, সেই অভ্যাসটি এই উত্তরটিতে ফাঁস হয়ে গেছে যেখানে এটি এতটা প্রয়োগ হয় না।
জন ও'ম।

1
আমার ব্যবহার সম্পর্কে আরও ব্যাখ্যা :execute: যেহেতু এটি একটি স্ট্রিং নেয়, এটি স্বাভাবিক-মোড কমান্ডগুলি যেখানে শেষ হয় তার জন্য এটি একটি স্পষ্ট চিত্রায়ন প্রদান করে, যদিও আমি স্ট্রিংটি নির্মাণ করছি না, সেক্ষেত্রে আমার চেয়ে ভারসাম্য উদ্ধৃতি চিহ্নগুলি সন্ধান করা আরও সহজ <esc>বা মোডটি শেষ করতে যাই হোক না কেন। আবার এটি ব্যক্তিগত পছন্দ এবং অভ্যাস। :-)
জন ও'ম।

3
এটি একটি ব্যাপ্তি বিটিডব্লিউর জন্য কাজ করবে: :9,11g/^/move 8... সর্বশেষ সংখ্যাটি ব্যাপ্তি বিয়োগ 1 এর সূচনা হওয়া দরকার (ইনগোয়ের উত্তর থেকে অভিযোজিত)।
মার্টিন টর্নোইজ

13

এই ওয়ান-লাইনার (আপনার জন্য ~/.vimrc) একটি :Reverseআদেশ নির্দেশ করে; আপনি :globalসরাসরি অংশটি ব্যবহার করতে পারেন , তবে এর বাক্য গঠন :move(যা পুনরায় সীমা শুরুর আগে লাইনগুলি স্থানান্তরিত করে, যার ফলে এটি বিপরীত হয়) মুখস্থ করা সহজ নয়:

:command! -bar -range=% Reverse <line1>,<line2>global/^/m<line1>-1

1
পাঠকদের জন্য এফওয়াইআই হিসাবে, <line1>& <line2>এগুলি একটি পরিসীমাতে এই কাজটি করা প্রয়োজন, যেমন: :7,9Reverse(এগুলি বৈশিষ্ট্যগুলি command, না globalবা নয় move)। সরল :command! -bar -range=% Reverse :global/^/m 0এছাড়াও কাজ করবে, তবে কেবল পুরো বাফার জন্য ...
মার্টিন টর্নয়েজ

6

খাঁটি ভিম:

:g/^/m0

ব্যাখ্যা:

মতে :help multi-repeat, :gএবং এর কাজিন :vএকটি দ্বি-পাস পদ্ধতিতে কাজ করে।

প্রথম পাস :gপ্রতিটি লাইন মিলছে {pattern}, যখন দ্বিতীয় পাস (দৃশ্যত ফাইলটির শুরুতে শুরু করা এবং শেষের দিকে এগিয়ে যাওয়া) সম্পাদন করে [cmd]। উপরের উপরের ব্যবহারগুলি :gলাইনগুলিতে প্রক্রিয়াকরণের ক্রমটির সুবিধা গ্রহণ করে (যা সম্ভবত ঠিক আছে, যদিও সম্ভবত প্রযুক্তিগতভাবে নিশ্চিত নয়)।

এটি প্রতিটি লাইনটিকে প্রথমে চিহ্নিত করে, তারপরে প্রথম চিহ্নিত রেখাকে ফাইলের শীর্ষে নিয়ে যাওয়া, তারপরে দ্বিতীয়টিকে ফাইলের শীর্ষে স্থানান্তরিত করে (লাইনটির উপরে পূর্বে সরানো হয়েছে), তারপরে তৃতীয় চিহ্নিত রেখাটি (আবার আগের সরানো উপরে) লাইন), এবং এই পর্যন্ত ফাইলের শেষ লাইনটি শীর্ষে সরানো না হওয়া পর্যন্ত কার্যকরভাবে ফাইলটিকে বিপরীত করে দেওয়া।

মনে রাখবেন যে :gউপর থেকে নীচে থেকে অন্য কোনও ক্রমে লাইনগুলি প্রক্রিয়া করা থাকলে , এই আদেশটি কার্যকর হবে না।

উত্স: উইম উইকিয়ায় সমস্ত লাইন এবং পাওয়ারের বিপরীতে।

বাহ্যিক কমান্ড ব্যবহার করে কয়েকটি উদাহরণ:

  • tac( জিএনইউ কোর্টিলের অংশ - catবিপরীত):

    :%!tac                                                                                                                                                                                                                                                              
    
  • tail বিএসডি / ওএসএক্সে (পসিক্স-অনুগত নয়):

    :%!tail -r
    

    -r -R বিকল্পটি ইনপুটটিকে রেখার দ্বারা বিপরীত ক্রমে প্রদর্শিত হতে পারে।

    man tarআরও তথ্যের জন্য চেক করুন:

আরও ধারণার জন্য, দেখুন:


2
নয় :g/^/m0হিসাবে একই :g/^/move 0যা জনস উত্তর?
মারু

@ মুরু আমারও তাই মনে হয়, তবে এটি একটি সংক্ষিপ্ত (উইম উইকিয়া অনুসারে) এবং কমান্ড লাইন ব্যবহারের কয়েকটি অতিরিক্ত উদাহরণ সহ আমি আলাদা ব্যাখ্যা যুক্ত করেছি।
কেনোরব

হ্যাঁ, আমি অন্যান্য কমান্ডের কারণে আমি পদক্ষেপ নিয়েছি (আমি পোস্টেও এসেছি tac)। তবে আমি সন্দেহ করি যে উত্তরটি পুনরাবৃত্তি হবার কারণে ডাউনটি ছিল।
মারু

আমি সচেতন যে tacওপি দ্বারা উল্লেখ করা হয়েছিল, তবে অন্যান্য সমস্ত অনুরূপ প্রশ্ন যাইহোক এটির সদৃশ হবে, সুতরাং এটি আবার উল্লেখ করা ভাল। জন এই মন্তব্যটি @ টমকডো মন্তব্য থেকে নিয়েছিলেন, আমি এটি প্রথমে ডেরমাইকের কাছ থেকে নিয়েছি , তবে আমি মনে করি তিনি এটি কেবল উইকিয়া থেকে নিয়েছেন , তাই আমি উইম উইকিয়াকে ক্রেডিট দিয়েছি, সুতরাং এটি সম্পূর্ণরূপে সদৃশ নয় কারণ ব্যাখ্যাটি সম্পূর্ণ আলাদা।
কেনারব

এটি আরও মূল্য যুক্ত করে, কারণ এটি যথাযথ ব্যাখ্যা সহ আরও সংক্ষিপ্ত সংস্করণ এবং আমি সঠিক উত্সগুলিও জমা দিচ্ছি। শেল কমান্ড ব্যবহার করা খুব সহজ এবং সুবিধাজনক। লোকেরা যদি রাজি না হয় তবে তারা কেবল ভোট-ডাউন করতে পারে, কোনও বড় বিষয় নয়।
কেনারব

6

ক্রিয়ামূলক VimL এর চেতনায়:

:call setline(1, reverse(getline(1, line('$'))))
  • getline(1, line('$'))বাফারে সমস্ত লাইনের একটি তালিকা ফেরত দেয়। '$'এটি একটি বিশেষ যুক্তি line()যা বাফারের শেষ লাইনটি নির্দেশ করে।
  • reverse(...)ইনপুট তালিকার বিপরীতে, জায়গায়। reverse(copy(...))ইনপুট তালিকাটি সংশোধন করা উচিত না হলে একটি ব্যবহার করতে হবে।
  • setline(1, ...)দ্বিতীয় আর্গুমেন্টের সাথে নির্দিষ্ট রেখাকে প্রতিস্থাপন করে। যখন দ্বিতীয় আর্গুমেন্ট একটি তালিকা হয়, তালিকার দৈর্ঘ্যের সমান সংখ্যক রেখাগুলিকে তালিকার সামগ্রীর সাথে প্রতিস্থাপন করা হয়।

আপনি যদি চান তবে আপনি একটি কমান্ডও নির্ধারণ করতে পারেন যা একটি ব্যাপ্তি নেয় (ডিফল্ট %পুরো বাফার)

:command! -bar -range=% Reverse call setline(<line1>, reverse(getline(<line1>, <line2>)))

1
আমি এই উত্তরটি পছন্দ করি। এটি অন্যান্য উত্তরগুলির কমান্ডের hlsearchমতো স্টাফগুলিকে (যদি সক্ষম করা থাকে) হাইলাইট করে না :g/... পারফরম্যান্স সম্ভবত আরও খারাপ, যদিও? যেহেতু এটি getline(1, line('$'))স্মৃতিতে পুরো বাফার পায়। reverse()জায়গাটিতে রয়েছে বলে মনে হচ্ছে, যাতে এরকম স্মৃতি খুব কম হওয়া উচিত ...
মার্টিন টর্নয়েজ

3

প্রতি ভিম ডকুমেন্টেশন usr_12.txt - চতুর কৌশল

12.4 বিপরীত লাইন ক্রম

:globalকমান্ড সঙ্গে মিলিত হতে পারে :move, প্রথম লাইন আগে সব লাইন সরাতে একটি বিপরীত ফাইল ফলে কমান্ড। আদেশটি হ'ল:

:global/^/m 0

সংক্ষিপ্ত:

:g/^/m 0

^রেগুলার এক্সপ্রেশন লাইন (এমনকি যদি লাইন ফাঁকা) শুরুতে সাথে মেলে। :moveকমান্ড পৌরাণিক zeroth লাইন পরে ম্যাচিং লাইন চলে আসে তাই বর্তমান ম্যাচিং লাইন ফাইলের প্রথম লাইন হয়ে যায়। যেহেতু :globalকমান্ডটি পরিবর্তনশীল লাইন সংখ্যা দ্বারা বিভ্রান্ত হয় না, :globalফাইলের বাকী সমস্ত রেখার সাথে মিলিয়ে এগিয়ে যায় এবং প্রতিটিকে প্রথম হিসাবে রাখে।

এটি বিভিন্ন লাইনের কাজ করে। প্রথমে প্রথম লাইনের উপরে যান এবং এটি দিয়ে চিহ্নিত করুন mt। তারপরে কার্সারটি রেঞ্জের শেষ লাইনে নিয়ে যান এবং টাইপ করুন:

:'t+1,.g/^/m 't

1

আপেক্ষিক সংখ্যা ব্যবহার করে। অনুচ্ছেদ 13 লাইনে শুরু হয় এবং আরও 4 টি লাইন স্প্যাম করে

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