কোনও ভিআইএমআরসি ফাইল ভাঁজ করার জন্য কি সেরা অনুশীলন রয়েছে?


21

আমি সম্প্রতি বুঝতে পেরেছি যে আমার vimrcএখন ৪০০ লাইনের বেশি দীর্ঘ (যা আইএমও খুব বেশি করে আমি এটি হ্রাস করার চেষ্টা করব) এবং এটিকে নেভিগেট, পড়া এবং সম্পাদনা করা আরও সহজ করার জন্য আমি ভিমে ভাঁজ করার ধারণাটি অনুসন্ধান করার সিদ্ধান্ত নিয়েছি (যা কোনটি) আমি এর সাথে পরিচিত ছিলাম না)

  • আমি ভাঁজ পদ্ধতিতে সেট করার চেষ্টা করেছি indentকিন্তু ফলাফলটি আমার পছন্দ হয়নি (এটি বেশিরভাগ ক্ষেত্রেই অগোছালো কারণ আমার একটি বড় অংশ vimrcসত্যই ইন্টেন্টেড নয়)।
  • আমিও সেট করার চেষ্টা করেছিলেন foldmethodকরতে exprএবং syntaxকিন্তু আমি কিছুই সঠিকভাবে ভাঁজ পারল না।
  • এখানে diffভাঁজ পদ্ধতি হিসাবে ব্যবহার প্রাসঙ্গিক বলে মনে হয় না। (বা এটি যদি হয় তবে আমি কীভাবে এটি ব্যবহার করব তা বুঝতে পারি না)
  • সুতরাং আপাতত আমি সেই markerপদ্ধতিটি ব্যবহার করছি যা আমাকে "{{{এবং "}}}শোধকগুলিতে ফাইলটিতে "গোলমাল" পাওয়া যায় বলে আমাকে পুরোপুরি সন্তুষ্ট করে না ।

সুতরাং আমি জানতে চাই যে সঠিকভাবে ভাঁজ করা সম্পর্কে সেরা অনুশীলন বা সাধারণ নির্দেশিকা আছে কিনাvimrc

দ্রষ্টব্য 1: আমরা সকলেই জানি যে এসও কোনও ফোরাম নয় এবং এটি ব্যক্তিগত মতামত সংগ্রহের জন্য তৈরি করা হয়নি এবং এটিই আমি খুঁজছি না: অবশ্যই আমার ধারণা কিছু লোকের পছন্দ আছে তবে আমি কেন জানতে চাই চিহ্নিতকারী (উদাহরণস্বরূপ) ইনডেন্ট ব্যবহারের চেয়ে বেশি পঠনযোগ্যতা উন্নত করে।

দ্রষ্টব্য 2: এছাড়াও আমার মূল লক্ষ্যটি আমার vimrcযথাসম্ভব স্পষ্ট করে তোলা যাতে অন্য সর্বোত্তম অনুশীলনগুলি উপস্থিত থাকার জন্য vimrcআমি আগ্রহী এটি সম্পর্কে আগ্রহী।

সম্পাদনা 1: আমার সুনির্দিষ্টভাবে বলা উচিত ছিল যে আমার vimrcইতিমধ্যে বিভাগগুলিতে (এবং কখনও কখনও উপবিভাজন) মূল বিভাগে বিভক্ত

  • সাধারণ বিকল্পসমূহ
  • প্লাগইনস (প্রতিটি প্লাগইন এবং এর কনফিগারেশনের জন্য সাবসেকশন রয়েছে)
  • ম্যাপিং
  • নেভিগেশন (উপধারাও রয়েছে)
  • রঙ
  • ইত্যাদি ...

এবং এই কাঠামোটিই আমাকে ভাঁজ সম্পর্কে ভাবনা তৈরি করেছিল: আমি অনুভব করি যে নির্দিষ্ট বিভাগে আমি আগ্রহী এমন বিভাগটি আউটপুট করতে সক্ষম হলাম এটি বেশ সুবিধাজনক something

সম্পাদনা 2:vimrc বেশ কয়েকটি ফাইলে উল্লিখিত মহকুমার উত্তরগুলি বৈধ, তবে ব্যক্তিগত পছন্দ হিসাবে আমি তার চেয়ে ভাঁজ ব্যবহার করব কারণ আমার মনে হয় যে আমার ডটফাইলগুলি সম্বলিত গিট রেপোতে কেবল একটি ফাইল বজায় রাখা সহজ। এটি কেবল একটি ব্যক্তিগত পছন্দ এবং আমি সচেতন যে এই পদ্ধতিটি ব্যবহার করাও সম্ভব তবে আমি ভাঁজ ব্যবহার করতে পছন্দ করব।


আমি মনে করি এটি ব্যবহারের ক্ষেত্রে "{{{সবচেয়ে 'ভিমের মতো' পদ্ধতিটি ব্যবহার করা হয়েছে, সোলারাইজড প্লাগইন এটি ব্যবহার করে এবং যদিও এটি গোলমাল হতে পারে এটি আপনাকে ম্যানুয়াল
ফোল্ডগুলি

উত্তর:


22

আমি আমার নীচে নিম্নলিখিত modelines আছে vimrcযা আমি godlygeek, লেখক থেকে অনুলিপি ট্যাবুলার :

"" vim:fdm=expr:fdl=0
"" vim:fde=getline(v\:lnum)=~'^""'?'>'.(matchend(getline(v\:lnum),'""*')-2)\:'='

এটি 2+ "'গুলি ভাঁজ দিয়ে শুরু করে যে কোনও লাইন তৈরি করবে । আরো "'গভীর ভাঁজ s। এটি আপনাকে প্রয়োজন হলে বিভাগ ভাগ করার অনুমতি দেয়।


আমি এখনই এটি পরীক্ষা করতে পারছি না তবে এটি আমার কাছে একটি আদর্শ সমাধান বলে মনে হচ্ছে! ভাগ করে নেওয়ার জন্য ধন্যবাদ!
স্টাটক্স

কিছু ব্যাখ্যা করে: getline (v: lnum) লাইন নম্বর (v: lnum) দ্বারা প্রদত্ত লাইনের স্ট্রিংটি প্রদান করে; = ~ মানে নিয়মিত প্রকাশের মিল; '^ "" "এর অর্থ সমস্ত লাইন দুটি" s "দিয়ে শুরু হয়; ম্যাচেন্ড (getline (v: lnum),'" "* ') - 2" এর অতিরিক্ত সংখ্যাকে গণনা করে, যার অর্থ "" "স্তর 1," দিয়ে ভাজবে " "" "স্তর 2 এবং এর সাথে ভাঁজ হবে; getline (v: lnum) = ~ '^" "' v: lnum রেখাটি দুটি দিয়ে শুরু হওয়া" বা না "এর উপর নির্ভর করে সত্য বা মিথ্যা প্রত্যাবর্তন করবে; যদি সত্য হয় তবে fde সেট করা হয় >extra number of "(শুরু স্তরটি যা <এই লাইনের পরে সংখ্যায় বসে) বা '='(পূর্ববর্তী লাইনের স্তরটি ব্যবহার করুন), অর্থটি পাওয়া যাবেfold-expr
ভ্যান অ্যাবেল ২

সাম্প্রতিক তেজ আপডেট 8.1.1517) এর পর, আমি হচ্ছি "এই কনফিগারেশন সঙ্গে" modelines প্রক্রিয়াকরণের সময় ত্রুটি সনাক্ত "।
অ্যাপোলো

9

প্রথমে আপনার নিজের বিভাগগুলি .vimrc(সাবলিস্ট এবং সাব-লিস্ট সহ একটি তালিকার মতো) সংজ্ঞায়িত করা এবং আপনার সমস্ত প্লাগইন / সেটিংস / ফাংশনগুলি সম্পর্কিত বিভাগে যুক্ত করা ভাল ধারণা। কাস্টমাইজড ফোল্ডিংয়ের সাথে মিলিত এটি দুর্দান্ত কাজ করতে পারে:

উদাহরণ

উপরের উদাহরণটি এমন সম্ভাব্য বিভাগগুলি দেখায় যা আমার কাঠামোতে সহায়তা করে .vimrc। এটি নিম্নলিখিত কাস্টমাইজড ফোল্ড সেটিংস ব্যবহার করে:

""""""""""""""""""""""""
"  THIS IS A CATEGORY  "
""""""""""""""""""""""""
"" Autofolding .vimrc
" see http://vimcasts.org/episodes/writing-a-custom-fold-expression/
""" defines a foldlevel for each line of code
function! VimFolds(lnum)
  let s:thisline = getline(a:lnum)
  if match(s:thisline, '^"" ') >= 0
    return '>2'
  endif
  if match(s:thisline, '^""" ') >= 0
    return '>3'
  endif
  let s:two_following_lines = 0
  if line(a:lnum) + 2 <= line('$')
    let s:line_1_after = getline(a:lnum+1)
    let s:line_2_after = getline(a:lnum+2)
    let s:two_following_lines = 1
  endif
  if !s:two_following_lines
      return '='
    endif
  else
    if (match(s:thisline, '^"""""') >= 0) &&
       \ (match(s:line_1_after, '^"  ') >= 0) &&
       \ (match(s:line_2_after, '^""""') >= 0)
      return '>1'
    else
      return '='
    endif
  endif
endfunction

""" defines a foldtext
function! VimFoldText()
  " handle special case of normal comment first
  let s:info = '('.string(v:foldend-v:foldstart).' l)'
  if v:foldlevel == 1
    let s:line = ' ◇ '.getline(v:foldstart+1)[3:-2]
  elseif v:foldlevel == 2
    let s:line = '   ●  '.getline(v:foldstart)[3:]
  elseif v:foldlevel == 3
    let s:line = '     ▪ '.getline(v:foldstart)[4:]
  endif
  if strwidth(s:line) > 80 - len(s:info) - 3
    return s:line[:79-len(s:info)-3+len(s:line)-strwidth(s:line)].'...'.s:info
  else
    return s:line.repeat(' ', 80 - strwidth(s:line) - len(s:info)).s:info
  endif
endfunction

""" set foldsettings automatically for vim files
augroup fold_vimrc
  autocmd!
  autocmd FileType vim 
                   \ setlocal foldmethod=expr |
                   \ setlocal foldexpr=VimFolds(v:lnum) |
                   \ setlocal foldtext=VimFoldText() |
     "              \ set foldcolumn=2 foldminlines=2
augroup END

আপনার নিজস্ব বিভাগ এবং উপশ্রেণী বিভাগগুলি সংজ্ঞায়িত করতে নীচের বাক্য গঠনটি ব্যবহার করুন:

""""""""""""""
"  Category  "
""""""""""""""
"" Subcategory
""" Subsubcategory
" Just a comment, gets ignored no matter where

শীর্ষ স্তরের বিভাগ সত্যিই সহজ যদি আপনি ব্যবহার করে নির্মিত যাবে তেজ-স্নিপেট (সঙ্গে যেমন UltiSnips ): শুধু প্রসারিত boxবা bboxতেজ-স্নিপেট (লেখ দ্বারা উপলব্ধ স্নিপেট boxবা bboxএবং ট্রিগার প্রসারিত প্রেস)।

ভাঁজ টগল করতে দু'বার স্পেস টিপে আরও দ্রুত খোলা এবং বন্ধ করা:

let mapleader = "\<space>"
" Toggle folds
nnoremap <silent> <leader><Space> @=(foldlevel('.')?'za':"\<Space>")<CR>
vnoremap <leader><space> zf

এইভাবে আপনার একটি সুসংগঠিত রয়েছে .vimrcযা সহজেই নেভিগেট করা যায়।


চমৎকার অ্যানিমেটেড জিআইএফ জন্য +1 :) শুধু কৌতূহল, টাইপ করা কীগুলি প্রদর্শন করতে আপনি কী ব্যবহার করেছেন?
এম মন্টু

@ এম মন্টু: আমি স্ক্রীনকি কীগুলি প্রদর্শন করতে এবং এটি রেকর্ড করার জন্য জিটিকে-রেকর্ডমাইডেস্কটপ ব্যবহার করেছি (উভয় দেবিয়ান রেপোতে)। 5fps সহ একটি 45 সেকেন্ডের ক্লিপগুলি একটি এমআইবি এর চেয়ে কম হয়। তারপরে অনলাইনে এটিকে একটি জিআইএফ-তে রূপান্তরিত করুন (চিত্রটির গুণমানটি নিখুঁত হওয়ার আগেই এখানে বিকৃতিগুলি এসেছিল)।
cbaumhardt

7

আমি আমার প্রাথমিকটি vimrcবেশ কয়েকটি অন্যান্য শ্রেণীবদ্ধ ফাইলগুলির লিঙ্ক হিসাবে ব্যবহার করি , প্রতিটি সোর্সিংয়ের পাশাপাশি চলে যায়, যেমন একটি ফাইলের ভিম অপশন, অন্যটিতে প্লাগইন সেটিংস।

"--- Vim Options
source ~/.vim/config/vim_options.vim

"--- Here Be Functions!
" (need to be sourced before stuff that uses 'em)
runtime! functions/*.vim

"--- Key Mapping
source ~/.vim/config/key_mapping.vim

"--- Folding
source ~/.vim/config/folding.vim

"--- Autocmds
source ~/.vim/config/autocmds.vim

"--- We Are Plugged In!
source ~/.vim/config/plugins.vim

" vim: ft=vim fdm=marker

ওপি প্রশ্নের আরও প্রত্যক্ষ উত্তর হিসাবে, আমি চিহ্নিতকারী পদ্ধতিটি ব্যবহার করি তবে বেশিরভাগ অংশে ফাঁক দিয়ে ডানদিকে এবং পৃথক পৃথক পৃথক বিভাগের ব্যবহার করি। যদিও আমি প্রতিটি প্লাগইন আলাদাভাবে করি।


আমি আমার প্রশ্নের সুনির্দিষ্ট কথাটি ভুলে গেছি: আমি vimrcবিভিন্ন ফাইলগুলিতে "আলাদা" করার অনুরাগী নই কারণ (আইএমও) এটি জটিলতা বাড়ায় এবং এটি বজায় রাখা আরও কঠিন করে তোলে। ভাঁজ সম্পর্কে "" ফাঁক দিয়ে ডানদিকে রেখে "বলতে কী বোঝ?
স্টাটক্স

আমি বলতে চাইছি " {{{সেখানে যতগুলি স্পেস রয়েছে textwidthতাই আপনার চিহ্নিতকারীগুলি ডান প্রান্তের কাছে রয়েছে। আমার কাছে ভাঁজ.ভিম ফাইলটিতে একটি ব্যক্তিগতকৃত ফোল্ডটেক্সট ফাংশনও রয়েছে। আমি পৃথক ফাইল পছন্দ করি যাতে প্রতিশ্রুতিবদ্ধতার জন্য আমার গিট রেপো কেবলমাত্র একটি নির্দিষ্ট ধরণের মোড।
কমেটসং

7

আপনি বলতে পারেন যে "সেরা অনুশীলন" প্রাথমিকভাবে মতামতের বিষয়, :) তবে দুটি পদ্ধতির রয়েছে যা (1) সুস্পষ্ট ধারণা দেয়, এবং (2) সমস্ত কনফিগার ফাইলগুলিতে প্রয়োগ করা যেতে পারে, কেবল ভিমের নয়: যৌক্তিক বিভাগগুলি দ্বারা ভাঁজ করা এবং সাবসেকশনগুলি (বা আরও গভীরতর, যদি আপনি সাহসী বোধ করেন) এবং আপনার কনফিগারটিকে কয়েকটি ছোট ফাইলগুলিতে বিভক্ত করে :sourceসেগুলি তৈরি করে।

আমি ব্যক্তিগতভাবে ভাঁজকে পছন্দ করি কারণ এটি জিনিসগুলিকে অ্যাক্সেস করা সহজ করে, তবুও আমাকে বাছাইয়ের জন্য কিছু স্তরক্রম দেয় giving autocmdঅভ্যন্তরীণ স্তরে ভাঁজ ফাংশন এবং গুলিগুলিও একটি ভাল ধারণা, যেহেতু এগুলি "প্রাকৃতিক" যৌক্তিক ইউনিট তৈরি করে। markerভাঁজ এই সমস্তটির জন্য সর্বাধিক অর্থপূর্ণ, কারণ লজিক্যাল শ্রেণিবিন্যাসগুলি প্রয়োজনীয়ভাবে ইনডেন্ট স্তরগুলিতে বা সিনট্যাক্স হাইলাইটিংয়ের মধ্যে প্রতিফলিত হয় না। আমি আরও বাড়িয়েছি foldcolumn, যা আমি যেখানে আছি তার ভিজ্যুয়াল ইঙ্গিত দেয়:

# vim: filetype=vim foldmethod=marker foldlevel=0 foldcolumn=3

পার্শ্ব নোটে, এই foldtextফাংশনটি (ড্রু নিল, আইআইআরসি-র অনুরূপ ফাংশনটির একটি পরিবর্তন) আমার কাছে ডিফল্টের চেয়ে বেশি বোঝায়:

function! MyFoldText()
    let line = getline(v:foldstart)

    let nucolwidth = &foldcolumn + &number * &numberwidth
    let windowwidth = winwidth(0) - nucolwidth - 3
    let foldedlinecount = v:foldend - v:foldstart

    " expand tabs into spaces
    let chunks = split(line, "\t", 1)
    let line = join(map(chunks[:-2], 'v:val . repeat(" ", &tabstop - strwidth(v:val) % &tabstop)'), '') . chunks[-1]

    let line = strpart(line, 0, windowwidth - 2 - len(foldedlinecount))
    let fillcharcount = windowwidth - len(line) - len(foldedlinecount) - 1
    return line . '...' . repeat(' ', fillcharcount) . foldedlinecount . ' '
endfunction
set foldtext=MyFoldText()

অন্যান্য পদ্ধতির সাথে, ফাইলগুলি বিভক্ত করুন, প্রধান সমস্যাগুলি জিনিসগুলি সন্ধান করা এবং একটি ফাইল থেকে অন্য ফাইলটিতে স্যুইচ করা। উভয়কে সম্বোধনের খুব সুন্দর উপায় হ'ল সিআরটিএলএসএফ , সিটিআরএলপি বা অনুরূপ প্লাগইন ব্যবহার করা । তবে আপনি সম্ভবত এর মধ্যে যে কোনও একটি ইতিমধ্যে ব্যবহার করছেন।


সুতরাং আপনি সঙ্গে যান marker। প্রকৃতপক্ষে কাস্টমাইজ foldcolumnকরা একটি দুর্দান্ত জিনিস, আমি দেখব কোন মানটি আমার প্রয়োজনের সাথে সবচেয়ে ভাল ফিট করে। এছাড়াও আমি বিভক্ত ফাইলগুলিতে আপনার দৃষ্টিভঙ্গিটি ভাগ করি তবে আমি জানতাম না যে CtrlSFআমি এতে খুব খুশি হলেও আমি এটি একবার দেখব CtrlP
স্ট্যাটক্স

এছাড়াও আপনি কীভাবে কাস্টম ভাঁজ পদ্ধতি ব্যবহার করবেন তা ব্যাখ্যা করতে পারেন? আমি সেট fdmকরার চেষ্টা করেছি foldtextএবং MyFoldText()মনে হচ্ছে এটি এটি ব্যবহার করার সঠিক উপায় নয়।
স্ট্যাটক্স

@statox CtrlSFসঙ্গে ভাল কাজ করে AG বা ACK , যা মূলত বিশেষ করছে সংস্করণ grepfoldtextকোনও কাস্টম ভাঁজ পদ্ধতি নয়, তবে ভাঁজযুক্ত পাঠ্যটির চেহারা পরিবর্তনের জন্য একটি ফাংশন। আমার স্নিপেট শো শেষ লাইনটি কিভাবে এটি ব্যবহৃত হয়: set foldtext=MyFoldText()
lcd047

2

বেসিক সেরা অনুশীলন:

  • বিভাগগুলিতে বিভক্ত করুন:

    • প্লাগইন
    • সেটিংস
    • Rebinds
  • প্রতিটি বিভাগ / পুনঃতফসিল মন্তব্য

  • (আপনার .vimrcবা _vimrcগিথুবকে ব্যাকআপ করুন )

শুধু আমার ব্যক্তিগত পছন্দ। যদিও এত সাহায্য না।


আমি ব্যক্তিগতভাবে ভাঁজ ব্যবহার করি না, এবং আপনার প্রয়োজন হবে না। কেবলমাত্র আপনার ভিআরসিআরকে সংগঠিত করুন এবং এটি সব ভাল হওয়া উচিত।
গুস্তাভ ব্লোমকভিস্ট

আমার ভিএমআরসিটি ইতিমধ্যে বিভাগে (সাধারণ বিকল্পগুলি, প্লাগইনস, ম্যাপিংস, নেভিগেশন, রঙ ইত্যাদি) মধ্যে সংগঠিত। কোনও বিভাগ (বা উপশক্তি) ভাঁজ করতে সক্ষম হবার বিষয়টি আসলে আপনি যা সম্পাদনা করছেন / সন্ধান করছেন তার দিকে ফোকাস দেওয়া ভাল।
স্ট্যাটক্স

ঠিক আছে. খারাপ উত্তরের জন্য দুঃখিত।
গুস্তাভ ব্লমকভিস্ট

এটি কোনও খারাপ উত্তর নয় এবং
বিশদভাবে

2

@ পিটারআরঙ্কার এর উত্তরে অনুপ্রাণিত হয়ে , আমি এটিএক্স স্টাইলের শিরোনামগুলি ব্যবহার করার জন্য নিম্নলিখিতটি তৈরি করেছি। এটি আপনার শেষে যুক্ত করুন.vimrc

"# Folding

" Fold with ATX style headers - "# is H1, "## is H2, and so on
" vim:fdm=expr:fdl=0
" vim:fde=getline(v\:lnum)=~'^"#'?'>'.(matchend(getline(v\:lnum),'"#*')-1)\:'='

1

আমার মতো বড় ফাংশন যদি থাকে তবে আপনি নিজের ফাংশনগুলি ভাঁজ করতে এটি ব্যবহার করতে পারেন:

fun! MyFoldLevel(linenum)
    if ! exists('w:nextline')
        let w:nextline = 0
        let w:insideafun = 0
    endif

    if w:nextline == 1
        let w:nextline = 0
        let w:insideafun = 0
    endif

    let l:line = getline(a:linenum)

    if l:line =~# '^[[:space:]]*fun'
        let w:insideafun = 1
        return '>1'
    elseif l:line =~# '^[[:space:]]*endf'
        let w:nextline = 1
        return '<1'
    endif

    if w:insideafun == 1
        return 1
    else
        return 0
    endif
endfun

এবং আপনার ভিএমআরসি-তে এই মডেলিনটি যুক্ত করুন:

" vim:fde=MyFoldLevel(v\:lnum):fdm=expr:

0

@ পিটার রিঙ্কার এবং @ গো 2 নুলের ধারণাটি প্রসারিত করা হচ্ছে। আপনি যদি ভিম মডেলিনে ভাঁজ বিকল্পগুলি সেট করতে না চান। ভাঁজ পদ্ধতি এবং ভাঁজ এক্সপ্রেশন সেট করতে আপনি নীচের অটোমেড ব্যবহার করতে পারেন।

augroup vim_folding
    autocmd!
    autocmd FileType vim set foldmethod=expr foldlevel=0
    " note that double quote in foldexpr has to be escaped with backslash
    autocmd FileType vim set foldexpr=getline(v:lnum)=~'^\"#'?'>'.(matchend(getline(v:lnum),'\"#*')-1):'='
augroup END

এটি নিয়মিত ভিআইএম কমান্ড হিসাবে কাজ করার জন্য মূল উত্তরটি তৈরি করার জন্য আমি ছোট ছোট পরিবর্তন করেছি (কোলন থেকে পালানোর দরকার নেই, তবে ডাবল উদ্ধৃতিটি এড়ানো দরকার)।

আপনি যদি দীর্ঘ foldexprস্ট্রিং পছন্দ না করেন তবে আমরা তার জন্য একটি ফাংশন সংজ্ঞায়িত করতে পারি:

function! VimFolds(lnum)
    let s:cur_line = getline(a:lnum)

    if s:cur_line =~ '^"#'
        return '>' . (matchend(s:cur_line, '"#*')-1)
    else
        return '='
    endif

endfunction

তারপর সম্পর্কে autocmd লাইন প্রতিস্থাপন foldexprকরতে

autocmd FileType vim set foldexpr=VimFolds(v:lnum)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.