অ্যাটম বা সাব্লাইম পাঠ্যের অনুরূপ ভিআইএম ভাঁজগুলিকে একটি একক লাইনে সঙ্কুচিত করুন


13

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

ভিমের ইনডেন্ট ভাঁজ (শীর্ষ) বনাম পরমাণুর (নীচে) তুলনা করে নীচের স্ক্রিনশটটি দেখুন:ভিম বনাম অ্যাটম কোড ভাঁজ

ভিম প্রতিটি ভাঁজের জন্য দুটি লাইন উত্সর্গ করে। প্রথম লাইন শিরোনাম হিসাবে কাজ করে, এবং দ্বিতীয় লাইনটি ভাঁজ সম্পর্কে কিছু তথ্য (ভাঁজের ভিতরে রেখার সংখ্যা এবং পাঠ্য) বর্ণনা করে।

পরমাণু কেবল একটি লাইন ব্যবহার করে এবং লম্বার শেষে একটি ছোট চিহ্নিতকারী ব্যবহার করে ভাঁজটি চিহ্নিত করতে বামদিকে লাইন সংখ্যাগুলিতে রঙ যুক্ত হয়। অ্যাটমের ভাঁজ শৈলীতে কম স্ক্রিন রিয়েল এস্টেট ব্যবহার করা হয় তবে এখনও আমার সত্যিকারের সমস্ত তথ্য যোগাযোগ করে।

আমি অ্যাটম ভাঁজ শৈলীর আংশিক। আমার মতে এটি পরিষ্কার এবং আরও সুসংগত বলে মনে হচ্ছে, বিশেষত একাধিক পদ্ধতি বা বৈশিষ্ট্যগুলিকে এক সারিতে তালিকাভুক্ত করার সময় (উপরের স্ক্রিনশটের মতো)।

ভিমে প্রায় পরমাণুর ভাঁজ শৈলীর উপায় আছে কি?


1
আমি মনে করি এটি কারণ আপনার ভাঁজগুলি খোলার বন্ধনীগুলি যুক্ত লাইন দিয়ে শুরু হয় না। ভিম কেবল সেই লাইনে ভাঁজ পাঠ্যটি ব্যবহার করে যেখানে ভাঁজ শুরু হয়। দেখুন, উদাহরণস্বরূপ, কিভাবে বক্রবন্ধনী বসানো এটা সি প্রভাবিত: imgur.com/3h70dPf,wfCLPm7
muru

তবে এটি পাইথন, কোনও ধনুর্বন্ধনী জড়িত না ( from __future__ import braces) ... আপনি কীভাবে ফোল্ডিং কনফিগার করেছেন? এবং আপনি এই কোড স্নিপেট পেস্ট করতে পারেন (বা অন্য যে সমস্যাটি দেখায়)? ভিম একক লাইনে ভাঁজ করে, তবে মুুরুর উল্লেখ অনুসারে, আপনার ভাঁজগুলি দেরিতে একটি লাইন শুরু করে।
মার্টিন টর্নয়েজ

@ কার্পেটসমোকার ধনুর্বন্ধনীগুলি কেবল যেখানে ভাঁজ শুরু হয় তার উদাহরণের জন্য। একই প্রভাবটি দেখা যাবে, বলুন, হাস্কেল।
মারু

@ মাইকহার্ন আমার আগের উত্তরটি সম্পূর্ণ ভুল ছিল। সমস্যার সমাধান অন্তর্ভুক্ত করার জন্য আমি এটি আপডেট করেছি।
ধনী

উত্তর:


12

দুটি লাইন বনাম এক লাইন

ভিমে, ভাঁজের মধ্যে থাকা সমস্ত লাইন একক লাইনে পতিত হবে এবং 'foldtext'বিকল্পটি সেই লাইনগুলির সংক্ষিপ্তসারগুলি নির্ধারণ করে (সাধারণত ড্যাশগুলি, ভাঁজ করা লাইনের সংখ্যা এবং প্রথম (বা সমস্ত) লাইন থেকে সামগ্রী)।

আপনার উদাহরণে, ভিমে কেবলমাত্র {...}প্যারামিটার ব্লকটি নিজেই ভাঁজ হয়; উপরের লাইনটি (যা পরামিতি ব্যবহার করে) ভাঁজের অংশ নয়। বিপরীতে, অন্য সম্পাদকটিতে, পরামিতিগুলি ব্যবহার করে সেই লাইনটি ভাঁজটির অন্তর্গত এবং এর ফলটেক্সট (ভিম টার্মিনোলজি ব্যবহার করার জন্য) সেই লাইনটি যুক্ত সংযোক্ত চিহ্নিতকরণের বিষয়বস্তু।

অভিযোজিত

ভিমে, ভাঁজগুলি বিভিন্ন উপায়ে (দেখুন :help fold-methods) তৈরি করা যায় 'filetype'এবং এটি বাফারের উপর নির্ভর করে । ভাঁজটিতে উপরের লাইনটি অন্তর্ভুক্ত করার অসুবিধা তার উপর নির্ভর করে; সঙ্গে পরীক্ষা করুন :setlocal foldmethod?। সঙ্গে ইন্ডেন্ট ভাঁজ, সেখানে কিছুই আপনাকে প্রভাবিত করতে পারেন; আপনাকে অন্য পদ্ধতিতে যেতে হবে। জন্য সিনট্যাক্স ভাঁজ, যে সিনট্যাক্স সংজ্ঞা অভিযোজিত অর্থ হবে, এবং খুব চতুর হতে পারে। কোনও অভিব্যক্তি ব্যবহার করা হলে আপনার ভাগ্য ভাল হবে তবে এর অর্থ এখনও যুক্তি বোঝা এবং পরিবর্তন করা উচিত। (ফাইল টাইপ প্লাগইন লেখক এটিকে প্রভাবিত করার জন্য একটি কনফিগারেশন সরবরাহ করেছেন এমনটি অসম্ভব))

ভাঁজ করা লাইনের সিনট্যাক্স হাইলাইটিং

দুর্ভাগ্যক্রমে এটি মোটেই সম্ভব নয়। ভিম সর্বদা Foldedপুরো ভাঁজ করা লাইনের জন্য হাইলাইট গ্রুপটি ব্যবহার করে। :highlightআপনার কমান্ডের মাধ্যমে আপনি এটি টুইট করতে পারেন ~/.vimrc, তবে বাক্য গঠনের পৃথক পৃথক পৃথকীকরণ হারাবে।


5

ভিম ইতিমধ্যে একক লাইন হিসাবে ভাঁজগুলি প্রদর্শন করে। তবে, ভিমের ভাঁজগুলিতে indent, একই ইনডেন্টযুক্ত সমস্ত লাইন একটি ভাঁজটিতে অন্তর্ভুক্ত করা হয়েছে। সুতরাং আপনার স্ক্রিনশট, লাইন আপনি "হেডার" (যেমন, একটি শুরু হিসাবে উল্লেখ করা হয় collection_base_url) হয় না ভাঁজ মধ্যে।

আপনি ভিমের ব্যবহার করে এটমের ভাঁজের অনুরূপ কিছু অর্জন করতে পারেন foldexpr foldmethod:

" Finds the indent of a line. The indent of a blank line is the indent of the
" first non-blank line above it.
function! FindIndent(line_number, indent_width)
    " Regular expression for a "blank" line
    let regexp_blank = "^\s*$"

    let non_blank_line = a:line_number
    while non_blank_line > 0 && getline(non_blank_line) =~ regexp_blank
        let non_blank_line = non_blank_line - 1
    endwhile
    return indent(non_blank_line) / a:indent_width
endfunction

" 'foldexpr' for Atom-style indent folding
function! AtomStyleFolding(line_number)
    let indent_width = &shiftwidth

    " Find current indent
    let indent = FindIndent(a:line_number, indent_width)

    " Now find the indent of the next line
    let indent_below = FindIndent(a:line_number + 1, indent_width)

    " Calculate indent level
    if indent_below > indent
        return indent_below
    elseif indent_below < indent
        return "<" . indent
    else
        return indent
    endif
endfunction

set foldexpr=AtomStyleFolding(v:lnum)
set foldmethod=expr

এটি নীচের মত একটি ভাঁজ এক্সপ্রেশন (দেখুন :help fold-expr) সংজ্ঞায়িত করে:

  • তাত্ক্ষণিকভাবে ইন্ডেন্টড লাইনের আগের লাইনের জন্য, এটি নিম্নলিখিত ব্লকের ইন্ডেন্টেশনটি দেয়।
  • ইন্ডেন্টেড লাইনের জন্য এটি ইনডেন্টেশনটি দেয়। (শিফট প্রস্থ দ্বারা বিভক্ত তাই প্রতিটি ইন্ডেন্টেশন স্তর স্তর দ্বারা 1 ফেরত মান বৃদ্ধি করে)
  • ইনডেন্টেড লাইনের ব্লকের শেষে লাইনগুলির জন্য, এটি একটি স্ট্রিং প্রদান করে "<N", যেখানে এন ইনডেন্টে সেট করা আছে। এটি ভিমকে বলে যে স্তর N এর একটি ভাঁজ সেই লাইনে শেষ হয়।

হালনাগাদ

@ অ্যালেক্সেন্ডার মন্তব্যগুলিতে জিজ্ঞাসা করেছেন যে রুবের আউটডেনটেডগুলি endভাঁজগুলির মধ্যে অন্তর্ভুক্ত করার জন্য এটি বাড়ানো সম্ভব কিনা কিনা । আপনি " Calculate indent levelনিম্নলিখিতটি দিয়ে বিভাগটি প্রতিস্থাপন করে শুরু করতে পারেন :

if indent_below > indent
    return indent_below
elseif getline(a:line_number) =~ '^\s*end\s*$'
    return "<" . (indent + 1)
else
    return indent
endif

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


দুর্দান্ত পন্থা। এই উত্তরটি endকোনও ব্লক শেষ করার জন্য তার রুবেলকে হ্যান্ডেল করার জন্য কী সাধারণ করা যেতে পারে ?
অ্যালেক্সান্ডার

1
@ অ্যালেক্সান্ডার আমার উত্তরটি কিছু আলোচনা করে সম্পাদনা করেছি।
ধনী

@ রিচ: আমি সাবলাইম পাঠ্য ভাঁজটিও দেখতে পাই যা কেবলমাত্র একটি ভাঁজযুক্ত ...টেক্সট ব্লকের প্রতীক হিসাবে লাইনটির শেষে একটি চিহ্ন দেখায় এবং ভিএম হিসাবে যেমন টেক্সট ব্লকের পুরো প্রথম লাইনটি হাইলাইট করার চেয়ে কম বিভ্রান্তি তৈরি করে। আমি আপনার উপরের ভাটটিকে ভিএম এর ডিফল্ট ফোল্ড আচরণ দিয়ে চেষ্টা করেছি, সহজ কাজ করে না। অজগর দিয়ে টেক্সট ব্লকের প্রথম লাইনে একটি চিহ্ন দেবে এমন ফোল্ডটি কীভাবে থাকবে? আমি একটি নতুন প্রশ্ন খুলতে হবে? আমি কেবল আবার আপনার ভাঁজটি পরীক্ষা করেছি, এটি প্রকৃতপক্ষে ইনডেন্ট লাইনের সাথে খুব ভালভাবে কাজ করে। সুপার ধন্যবাদ
Tuyen Pham

এটা চমৎকার! আমি এমন কিছু সন্ধান করছিলাম যা ভাঁজের মতো org- মোড করে এবং এটি অনেক সাহায্য করে!
priomsrb
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.