ইন্টারলিভ লাইনে ব্লকগুলি মার্জ করুন


15

আন্তঃবাহিত লাইনের মাধ্যমে দুটি ব্লকের পাঠ্যকে একীভূত করার জন্য কি এখানে একটি উত্সর্গীকৃত উপায় আছে যা এর মধ্য দিয়ে যাবার মতো:

a1
a2
a3
a4
  b1
  b2
  b3
  b4

যে:

a1
  b1
a2
  b2
a3
  b3
a4
  b4

কয়েক আদেশে?

সম্পাদনা : আমি সত্যিই সাতো ক্যাটসুরার সমাধানটি পছন্দ করি, আমি এখানে এটি কীভাবে প্রয়োগ করেছি:

function! Interleave()
    " retrieve last selected area position and size
    let start = line(".")
    execute "normal! gvo\<esc>"
    let end = line(".")
    let [start, end] = sort([start, end], "n")
    let size = (end - start + 1) / 2
    " and interleave!
    for i in range(size - 1)
        execute (start + size + i). 'm' .(start + 2 * i)
    endfor
endfunction

" Select your two contiguous, same-sized blocks, and use it to Interleave ;)
vnoremap <pickYourMap> <esc>:call Interleave()<CR>

এখন আমি কৌতূহলী - আপনার ব্যবহারের ক্ষেত্রে কী? আপনি কি কোনও টিভি সিজনের জন্য সাবটাইটেলগুলি ব্লক-নামকরণ করছেন?
ভ্যানল্যাসার

@ ভ্যানলাসার হাহাহা, আমি নেই। বেশিরভাগ ক্ষেত্রে, আমি কোনও প্রোগ্রাম থেকে চোখের পার্সিং করছি, যা তৈরির ক্রম / তারপরে অবজেক্টগুলির পড়াতে বিলম্বের বিষয়ে আমার ধারাবাহিকতা পরীক্ষা করতে হবে। বিলম্বিত আউটপুট ব্লকগুলিতে আন্তঃলিভিং ব্লকগুলি সম্পর্কিত লাইনগুলি মেলাতে সহজ করে তোলে। লগিং বা বেঞ্চমার্কিংয়ের জন্য বারবার, অনুরূপ নির্দেশাবলীর সাথে আমার কোডগুলির লাইন ইন্টারলিভ করাও দরকার। ম্যাক্রোগুলির সাহায্যে এই নির্দেশাবলী উত্পন্ন করা সহজ, তারপরে তাদের আসল কোড দিয়ে ইন্টারলেভ করা এখন এই ফাংশনটি দিয়ে কেবল
কয়েকটা

1
@ লেগো-লিটো - উত্তরের জন্য ধন্যবাদ! হ্যাঁ, ভিম বেশ বহুমুখী :) আপনার অভিব্যক্তি "আই-পার্সিং" আমাকে scroll-bindingদুটি ভিম উইন্ডোতেও ভাবতে বাধ্য করেছে ।
ভ্যানলিজার

এটি ব্যবহার করতে আমার সমস্যা হচ্ছে, আপনি কীভাবে পরপর দুটি ব্লক নির্বাচন করছেন? তাদের কি সংলগ্ন হওয়া দরকার?
cbcoutinho

@cbcoutinho হ্যাঁ তাদের আছে :) আমি নিশ্চিত নই যে আপনি এগুলি উভয়ই বেছে নিতে পারেন। আমি যে উদাহরণটি দেখিয়েছি, আমি আমার কার্সারটি (বলে) b1রেখেছি, তারপরে আমি vipপুরো খণ্ডটি নির্বাচন করতে হিট করেছি , তারপরে ,itএটি <map-I've-Picked>। এটা কি আপনার পক্ষে কাজ করছে না?
iago-lito

উত্তর:


8

এটি করার কোনও নিবেদিত উপায় নেই (যতদূর আমি জানি), তবে হ্যাঁ, এটি কয়েকটি আদেশ দিয়ে করা যেতে পারে:

function! Interleave(start, end, where)
    if a:start < a:where
        for i in range(0, a:end - a:start)
            execute a:start . 'm' . (a:where + i)
        endfor
    else
        for i in range(a:end - a:start, 0, -1)
            execute a:end . 'm' . (a:where + i)
        endfor
    endif
endfunction

আপনি এটি দিয়ে চালাতে পারেন :call Interleave(5, 8, 1)। প্রথম প্যারামিটার হ'ল প্রথম লাইন, দ্বিতীয়টি শেষ লাইন এবং তৃতীয়টি যেখানে এগুলি সরিয়ে নেওয়া যায়। আপনি কী করছেন তা দেখতে সম্ভবত আপনি লাইন নম্বরগুলি চালু করতে চান ( :set number)।

এটি ধরে নিয়েছে যে ব্লকগুলি ওভারল্যাপ হয় না। ফাংশনটি কীভাবে কাজ করে তা দেখুন :help :moveএবং :help range()তা বুঝতে।

দুটি ব্লক বাছাই করার সম্ভবত আরও ভাল উপায় আছে। চারপাশে ভাসমান একটি প্লাগইন রয়েছে যাতে আপনাকে দুটি ব্লক অদলবদল করতে দেয়। আমি প্লাগইনটির নামটি মনে করতে পারি না তবে লেখক (সম্ভবত বিখ্যাত ড। চিপ?) আমার চেয়ে ইন্টারফেস খুঁজতে আরও চিন্তাভাবনা করেছেন। :)


খুব সুন্দর! আমার কেবলমাত্র দুটি যুক্তি প্রয়োজন কারণ দুটি ব্লকই সুসংগত এবং একই আকারের: startএবং size। একটি হোমব্রু ফাংশন যা একটি নির্বাচন থেকে এই মানগুলি পুনরুদ্ধার করে, এটি কেবল নিখুঁত হবে। আমি এটার উপর কাজ করছি. :)
iago-lito

আকর্ষণীয় ক্রসলিংক ? ;)
iago-lito

13

এখানে আরও একটি বিকল্প রয়েছে:

:g/^a/+4t .
:+,+5d 

প্রথমে বর্তমান লাইনের (4 :h :t) পরে 4 রেখার নীচে রেখাগুলি অনুলিপি করুন এবং পরপর বি লাইনগুলি মুছে দিন ( :h :d)

আরও ভাল এই আদেশ:

 :g/^a//^\s*b/m .

যার অর্থ, প্রতিটি লাইনের জন্য 'বি' দিয়ে শুরু করে পরবর্তী লাইনটি সন্ধান করুন এবং এটি বর্তমান লাইনের নীচে নিয়ে যান।


1
আমি দ্বিতীয় কমান্ডে "E16: অবৈধ পরিসর" পেয়েছি। আমি .+,$dপরিবর্তে চেষ্টা করেছি , এবং এটি (যেমন হয়েছে .+,.+4d) কাজ করেছে।
পিটার লেউরিন

কেন এমনটি হয় তা নিশ্চিত নয়
খ্রিস্টান ব্র্যাব্যান্ড

1
না এটা হয় না। পড়ুন: এইচ: ব্যাপ্তি, আপনি সবসময় কোনও রেজেক্স অনুসন্ধানের পরিবর্তে সরাসরি সংখ্যায়ন ব্যবহার করতে পারেন
খ্রিস্টান ব্র্যাব্যান্ড 18

2
@ iago-lito দ্বিতীয় কৌশলটি সর্বদা কার্যকর হয় তবে আপনাকে /^\s*bঅন্যটিতে পরিবর্তন করতে হবে :range। উদাহরণস্বরূপ: 1 ম ব্লক নির্বাচন করুন, '<,'>g/^/'>+1m.
সম্পাদন করুন

1
@ আইয়াগো-লিটো এটি মূলত খ্রিস্টানদের উত্তরের মতোই। আপনি দৃশ্যত প্রথম ব্লক নির্বাচন করেন, '>+12 য় ব্লকের শুরু চিহ্নিত করে যদি কিছুই হার্ডকোড হয় না ।
ডেডোসদি

3

আপনি যদি ম্যাক্রোগুলি এবং চিহ্নগুলি নিয়ে কিছুটা আনন্দ করতে চান তবে আপনি এই জাতীয় কিছু চেষ্টা করতে পারেন:

  • প্রথম একটি চিহ্ন (এখানে রাখুন aধারণকারী লাইনে) a1সঙ্গেma

  • ধারণকারী লাইনে যান b1এবং এটি দিয়ে চিহ্নিত করুনmb

  • আপনি যে রেজিস্টারটি চান তাতে ম্যাক্রো রেকর্ডিং শুরু করুন (এখানে রেজিস্টার করুন q)qq

  • আপনার ম্যাক্রোতে ফোলিং Inোকান: ddmb'apjma'b

  • এর সাথে ম্যাক্রো রেকর্ডিং বন্ধ করুন q

  • এটি খেলতে সময় দেওয়ার সংখ্যাটি X@qকোথায় Xতা প্রয়োজন ততবার খেলুন ।

ম্যাক্রোর বিস্তারিত জানার জন্য:

dd mb 'a p j ma 'b
 |  |  | | |    |
 |  |  | | |    go back to line marked `b`
 |  |  | | |
 |  |  | | move of one line and replace the mark `a`
 |  |  | insert the deleted line under the line marked `a`
 |  |  go to line marked `a`
 |  mark the future line to move with `b`
 delete the line to move

সম্পাদনা হিসাবে লাগো-lito মন্তব্য নেই এই পদ্ধতি চিহ্ন এবং বাফার মুছে ফেলা হবে এটা mentionned।

  • চিহ্নগুলির জন্য আমি এটি একটি আসল সমস্যা মনে করি না: আমি খুব কমই একটি বাফারে সমস্ত 26 টি চিহ্ন ব্যবহার করি এবং আমি মনে করি যে বেশিরভাগ সময় 2 টি বিনামূল্যে চিহ্ন খুঁজে পেতে পারে।

  • বাফারের জন্য এটি একটি অস্থায়ী ভেরিয়েবলে সংরক্ষণ করা সম্ভব: ম্যাক্রো রেকর্ড করার আগে :let saveReg=getreg('"')রেজিস্টারটি সংরক্ষণ করতে ব্যবহার করুন এবং একবার কাজটি করা হয়ে গেলে :call setreg('"', saveReg)রেজিস্টারটিকে তার আগের অবস্থায় ফিরে পেতে ব্যবহার করুন ।

যাইহোক আমাকে অবশ্যই স্বীকার করতে হবে যে এই সমাধানটি কেবলমাত্র দ্রুত কাজ এবং অনুকূল নয়: আমার মতে ক্রাইস্তানের উত্তরটি সর্বোত্তম এবং এটি গ্রহণ করা উচিত কারণ এটি বাফার এবং চিহ্নগুলিতে গোলমাল করে না, ব্যবহারকারীকে তৈরি করতে বাধ্য করে না একটি ফাংশন এবং গ্লোবাল কমান্ডের শক্তি দেখায়।


মজাদার. দুর্ভাগ্যক্রমে, এটি চিহ্ন এবং
নিবন্ধগুলির

@ লেগো-লিটো: সত্যই এটি চিহ্ন এবং বাফারগুলিকে ওভাররাইট করে। চিহ্নগুলির জন্য আমি কখনই আমার বাফারগুলিতে সমস্ত 26 টি চিহ্ন ব্যবহার করি না তাই আমি মনে করি না যে এটি আসলেই একটি সমস্যা। বাফারগুলির জন্য এটি আরও বেশি সমস্যা হতে পারে বলে আমি মনে করি আপনি প্রায়শই একটি অব্যবহৃত বাফার খুঁজে পেতে পারেন বা যদি আপনি সত্যিই না পারেন তবে একটি অস্থায়ী পরিবর্তনশীল এবং ফাংশনগুলি ব্যবহার করুন getreg()এবং setreg()আপনার বাফারটি সংরক্ষণ করুন। তবে আমি সম্মত হই যে এটি কোনও অনুকূল সমাধান নয় :-)
স্টাটক্স

1

আমি সবেমাত্র অন্য একটি অনুরূপ প্রশ্ন দেখেছি এবং এর সমাধানটি নিয়ে গঠিত:

মাঝের প্লাস একটিতে ঝাঁপুন:

Mj

এবং চালান:

:,$g/./exe 'm' 2*line('.')-line('$')-1

আকর্ষণীয় :) সাবধান যে এটি আপনার পুরো ফাইলটি আন্তঃলিপ্ত করে, এবং কেবলমাত্র নির্বাচিত অনুচ্ছেদে নয়!
iago-lito
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.