.C / .h বাফারগুলি স্যুইচ করা হচ্ছে


8

আমি সাধারণত 2 টি উইন্ডো নিয়ে উল্লম্বভাবে বিভক্ত হয়ে কাজ করি।

যে সমস্যাটি আমি সমাধান করতে চাই তা হ'ল: শিরোনাম </> প্রয়োগকারী ফাইল থেকে সহজেই পিছনে পিছনে ঝাঁপিয়ে পড়ে

আমি ভাগ্য ছাড়া তদন্ত করছি, এটি করার 2 টি উপায়:

  1. বর্তমান উইন্ডোতে বিকল্প ফাইলটি খুলুন : এটি করার অনেকগুলি উপায় রয়েছে তবে আমি আগের মতো ফাইলটি যেখানে ছিল তা মনে রাখার মতো কোনও উপায় খুঁজে পাচ্ছি না (যেমন শিরোনামে লাফিয়ে লাফিয়ে লাফিয়ে লাফিয়ে লাফিয়ে পড়ুন, তবে একই জায়গায় নয়) )।
  2. অন্য উইন্ডোতে বিকল্প ফাইল খুলুন : এটি সঠিকভাবে সংজ্ঞায়িত হয়েছে, যেহেতু আমি কেবল 2 টি উইন্ডো নিয়েই কাজ করি, তবে এটি করার জন্য আমার কাছে ভিএম-জ্ঞানের অভাব রয়েছে।

1
প্রথম ইস্যুটির ইঙ্গিতের জন্য, :h line()(জেনেরিক সমাধান) শেষ দেখুন : "এই অটোকমন্ড কোনও ফাইল খোলার পরে শেষ পরিচিত অবস্থানে চলে যায়, যদি" ​​"চিহ্ন সেট করা থাকে: অউ বুফআরেডপোস্ট * যদি লাইন (" ' \ "")> 1 && লাইন ("'\" ") <= লাইন (" $ ") | উদাহরণ "স্বাভাবিক! g` \" "|
এন্ডিফ

আপনি কি একটি লাফের তালিকা এবং / অথবা ক্রস-ফাইল চিহ্ন ব্যবহার করতে পারবেন না?
ফ্রুগলমনকি


উত্তর:


5

আপনি যা জিজ্ঞাসা করছেন তা অর্জনের জন্য তিনটি প্রধান পদক্ষেপ রয়েছে:

  • বিকল্প ফাইলের নাম পাচ্ছেন
  • পছন্দসই ফাইলটি বর্তমান উইন্ডোতে বা অন্য উইন্ডোতে খোলা হচ্ছে
  • যে ফাইলের মধ্যে কার্সার অবস্থান পুনরুদ্ধার

বিকল্প ফাইলের নাম সন্ধান করতে আপনি বর্তমান ফাইলের নামটি "রুট" এবং "এক্সটেনশান" এ ভাঙ্গতে চান। এটি করার একটি সহজ উপায় হ'ল:

let parts = split(expand("%:p"), "[.]");
let root = parts[0]
let extension = parts[1]

আপনি যদি জানেন যে আপনি কেবল কখনও ফাইল .hএবং .cppফাইলের মধ্যে স্যুইচ করছেন তবে আপনি এক্সটেনশনটি এক থেকে অন্যটিতে সহজেই পরিবর্তন করতে পারবেন:

if extension == "h"
  let extension = "cpp"
else
  let extension = "h"
endif

বিকল্পভাবে, সম্ভাব্য বৈধ বিকল্প এক্সটেনশনগুলিতে পরিচিত এক্সটেনশানগুলির ম্যাপিংয়ের একটি অভিধান তৈরি করুন । বা বর্তমান ফাইলের জন্য সমস্ত সম্ভাব্য বিকল্প globpath()পেতে ব্যবহার করুন:

let alternates = globpath(expand("%:h"), root . ".*")

এবং প্রথমটি বা যা কিছু বেছে নিন। আমি globpathপদ্ধতির পছন্দ করি , কিছু অতিরিক্ত স্মার্ট সহ আমি পরে বর্ণনা করব। একবার আপনি লক্ষ্য এক্সটেনশানটি বেছে নেওয়ার পরে, পূর্ণ টার্গেটের পথটি তৈরি করুন:

let target = root . "." . alternates[whicheverAlternateExtensionYouWant]

এখন আপনি বর্তমান উইন্ডোতে বিকল্প ফাইল খুলতে পারেন:

execute "edit " . target

অথবা winnr()"অন্যান্য উইন্ডো" নম্বর পেতে ব্যবহার করুন ( winnr("#")এটি উইন্ডোটি <C-W>pলাফিয়ে উঠবে, অথবা আপনি যদি জানেন যে এটি আপনার সেটআপের জন্য সর্বদা একই থাকে) এবং এর মতো কিছু করুন:

let window = winnr("#")
execute window . "wincmd w"
execute "edit " . target

এটি আপনাকে বিকল্প ফাইল খোলার জন্য একটি সত্যিকারের প্রাথমিক সমাধান দেয় । উপরোক্ত পদ্ধতির সাথে কয়েকটি ঘাটতি রয়েছে, যেহেতু আমি এটিকে সোজা বলে লিখেছি এবং এটি কিছুটা বন্ধ-কাফ। আমি এমন একটি প্লাগইন লিখেছি যা "আমার পছন্দ মতো" বিকল্প ফাইল স্যুইচ করে (সমস্ত উপলব্ধ globpath()ফলাফলের মধ্য দিয়ে সাইক্লিং করে )। এটি উপরের সরলতার সাথে কিছু সমস্যার সমাধান করে, আপনি যদি আরও অনুসন্ধানে আগ্রহী হন তবে আপনি এর বাস্তবায়নটি পরীক্ষা করতে পারেন।

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

:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif

আমি কেবল এটি বা খুব অনুরূপ কিছু রেখেছি .vimrcযেহেতু আমি সব সময় আচরণকেই পছন্দ করি। আপনি সহজেই কোডটি অন্য কোথাও রেখে দিতে পারেন।


2

আপনি আপনার ফাইলে নিম্নলিখিত কনফিগারেশন সহ একসাথে vim-fswitch প্লাগইন ব্যবহার করতে পারেন .vimrc:

au! BufEnter *.cpp,*.cc,*.c let b:fswitchdst = 'h,hpp'    | let b:fswitchlocs = 'reg:/src/include/,../include,./'
au! BufEnter *.h,*.hpp      let b:fswitchdst = 'cpp,cc,c' | let b:fswitchlocs = 'reg:/include/src/,../src,./'

nmap <silent> <Leader>s :FSHere<cr>

আপনি যদি টাইপ করেন <Leader>(যা \ডিফল্টরূপে) এর পরে sএকটি .hppবা .hফাইলে আসে, প্লাগইনটি মিলবে কিনা .cpp, .ccবা .cফাইল উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখবে :

  • বর্তমান ফাইলের পথে প্রতিস্থাপন includeকরেsrc
  • দেখলেই srcবর্তমান ফাইলটি উপরে ফোল্ডারের
  • বর্তমান ফাইলের ফোল্ডারটি দেখে

আপনার প্রকল্পটি ডকুমেন্টেশনে আরও ভাল ফিট করার জন্য আরও কয়েকটি বিকল্প রয়েছে । এটি আপনাকে কয়েক মিনিট সময় নেবে তবে একবার এটি ঠিক পেলে আপনার এটি পছন্দ করা উচিত। আমি ব্যক্তিগতভাবে এটিকে খুব নমনীয় এবং এক্সটেনসিবল মনে করি এবং এটি বিভিন্ন ধরণের ফাইলের (। এম, .এইচ, .ইনল ইত্যাদি ...) জন্য ঠিক একইভাবে কাজ করে।


1

আপনার .vimrc

" =====[ Remap to change windows quickly ]=============================
:nnoremap <silent> <C-H> :wincmd h<CR>
:nnoremap <silent> <C-J> :wincmd j<CR>
:nnoremap <silent> <C-K> :wincmd k<CR>
:nnoremap <silent> <C-L> :wincmd l<CR>

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

শিরোনাম এবং উত্সের মধ্যে দ্রুত স্যুইচ করার জন্য আমি vim-scripts/a.vimএখানে পেয়েছি: https://github.com/vim-scriptts/a.vim , :Aটগল করতে আদেশটি ব্যবহার করুন ।

পার্শ্ব দ্রষ্টব্য => আপনি যদি টিএমউক্স ব্যবহার করেন তবে আপনি ভিএম বা এনভিআইএম উইন্ডো এবং টার্মিনালের মধ্যে নির্বিঘ্নে ঝাঁপ দিতে https://github.com/christoomey/vim-tmux-navigator ব্যবহার করতে পারেন ।


1

আমি কেবল আমার সুপার দ্রুত এবং নোংরা সংস্করণটি ভাগ করব ...

আমার ম্যাপিংস সেট আপ করুন; Alt-o একই উইন্ডোতে সম্পর্কিত ফাইলটি খুলবে, Alt-shift-o একটি বিভাজনে খোলে ...

nnoremap <A-o> :call EditRelatedFile()<CR>
nnoremap <A-O> :call SplitRelatedFile()<CR>

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

function! GetRelatedFileList()
    " This function may be overloaded in a site-specific vimrc.
    let l:thisPath = expand("%:p:r") . '.*'
    let l:files = glob(l:thisPath)

    return split(l:files, '[\r\n]\+')
endfunction

আমার .vimrc সেটআপটি মাঝে মাঝে ক্লায়েন্টের জন্য বিশেষায়িত হয়; কারও কারও কাছে উত্স রয়েছে এবং পৃথক ফোল্ডার স্তরক্রমের অন্তর্ভুক্ত রয়েছে, কারও কারও সাথে এটি রয়েছে together ডিফল্টরূপে আমি ধরে নিই যে তারা সবাই নিকটে রয়েছে তবে যদি আমাকে শিকার করতে হয় তবে আমি এইটির মতো একটি প্রতিস্থাপন ফাংশন সরবরাহ করব।

" Override the basic GetRelatedFileList coming from vimrc.
function! GetRelatedFileList()
    let l:thisDir = expand("%:p:h:t")
    if (l:thisDir ==? "src") || (l:thisDir ==? "include")
        let l:thisPath = expand("%:p:h:h")
        let l:searchPaths = l:thisPath.'/include,' . l:thisPath.'/src'
        let l:thisBase = expand("%:t:r") . '.*'
        let l:files = globpath(l:searchPaths, l:thisBase)
    else
        let l:thisPath = expand("%:p:r") . '.*'
        let l:files = glob(l:thisPath)
    endif

    return split(l:files, '[\r\n]\+')
endfunction

তারপরে আমি বর্তমান বাফারের ফাইলটি সন্ধান করতে ফাইলগুলির সেই তালিকাটি দেখি এবং তালিকার পরবর্তী একটিতে যাই। এটি প্রায়শই .cpp / .h জোড়া হিসাবে সহজ হয় না, প্রায়শই আমার অন্যান্য জিনিসগুলি বিবেচনা করা দরকার।

function! GetNextRelatedFile()
    let l:fileList = GetRelatedFileList()

    let l:thisFile = expand("%:p")
    let l:index = index(l:fileList, l:thisFile) + 1

    if l:index >= len(l:fileList)
        let l:index = 0
    endif

    return l:fileList[l:index]
endfunction

এবং তারপরে অবশেষে দুটি ফাংশন যা হয় বর্তমান উইন্ডোতে খোলে বা একটি বিভাজন ঘটে ...

function! EditRelatedFile()
    let l:file = GetNextRelatedFile()
    execute "edit" l:file
endfunction

আমার বিভাজন সংস্করণ সর্বদা .cpp এবং .c ফাইলগুলিকে নীচে বিভক্তিতে রাখে, অন্যথায় বিভাজন ডিফল্ট (যা আমার ক্ষেত্রে উপরে)।

function! SplitRelatedFile()
    let l:file = GetNextRelatedFile()
    let l:ext = fnamemodify(l:file, ":e")
    if (l:ext ==? "cpp") || (l:ext ==? "c")
        execute "below split" l:file
    else
        execute "split" l:file
    endif
endfunction
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.