দ্রুত অনুসন্ধান, একটি সি ++ ফাংশনে সীমাবদ্ধ


13

আমি বরং একটি বড় সি ++ প্রকল্পে কাজ করি। এর প্রতিষ্ঠানের আরও হতাশাজনক দিকগুলির মধ্যে একটি হ'ল হাস্যকর আকারের বড় ফাইলগুলির মধ্যে রাখা খুব বড় ফাংশন।

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

(আমি সিটি্যাগগুলি ইনস্টল করেছি এবং ট্যাগবার ব্যবহার করি ... যা এটির জন্য সহায়ক হতে পারে)

উত্তর:


9

আমি এটি কিভাবে করব তা এখানে। এটি আপনার যুক্ত করুন.vimrc

vnoremap if [[O][

ব্যাখ্যা: ভ্যানোরেম্যাপ মানে আপনি ভিজ্যুয়াল মোডে থাকাকালীন বাম হাতের ifডানদিকে মানচিত্র [[mO][করুন। ifমানে ফাংশন , যদিও আপনি চাইলে এটির নাম পরিবর্তন করতে পারেন। [[ফাংশনটির শুরুতে লাফ দেয়। Oআপনার চাক্ষুষভাবে নির্বাচিত পাঠ্যের অন্য প্রান্তে ][চলে যায় এবং তারপরে ফাংশনের শেষে চলে যায়।

সুতরাং, আপনি যদি কোনও ফাংশন সন্ধান করতে চান তবে এখন আপনি এর সাথে ভিজ্যুয়াল মোডে প্রবেশ vকরুন এবং এর সাথে পুরো ফাংশনটি নির্বাচন করুন if। এবার ভিজ্যুয়াল মোডে প্রস্থান করুন <esc>এবং এর মাধ্যমে অনুসন্ধান করুন /\%V\%Vপূর্ববর্তী নির্বাচিত পাঠ্যে আপনার অনুসন্ধানকে সীমাবদ্ধ করে। আপনি যদি আঘাত <esc>/\%Vকরতে না চান তবে আপনি এটিতে যুক্ত করতে পারেন .vimrc:

vnoremap / <esc>/\%V

তারপরে, আপনার কীস্ট্রোকের ক্রমটি দেখতে এমন হবে:

vif/foo<enter>

এবং এটি বর্তমান ফাংশনে ফু এর সমস্ত উপস্থিতি খুঁজে পাবে।


এই পদ্ধতির একমাত্র নেতিবাচক দিকটি হ'ল এটি উভয়টির শুরুর এবং বন্ধ বন্ধনীগুলি 0 ইন্ডেন্টেশন আশা করে। আপনি যদি নিয়মিতভাবে কোড সহ কাজ করেন যা এর নেই

int foo() {
    bar()
}

তাহলে এই আরও জটিল জটিল সংস্করণটি কাজ করবে:

vnoremap if ][ma%O'a

এটি কেবল বন্ধনী বন্ধনীটি 0 টি ইনডেন্টেশন আশা করে। যদি খোলার ব্রেসগুলির ইনডেন্ট থাকে তবে এটি এখনও কাজ করে, যদিও এটি একটি চিহ্ন নেয়। আপনি যদি নিয়মিতভাবে 'a' চিহ্ন ব্যবহার করেন তবে আপনি এটিকে সরাতে পারেন

vnoremap if ][mb%O'b
vnoremap if ][mc%O'c
...

হায় এটি সি ++ ফাংশনগুলির সাথে ভালভাবে কাজ করে না। সি ফাংশনগুলির বিপরীতে, তারা ইন্ডেন্টেড হওয়ার সম্ভাবনা রয়েছে (এটি তাদের শ্রেণীর সংজ্ঞায় বর্ণিত ইনলাইন সদস্যদের ফাংশনগুলির সাথে, এবং নেমস্পেসের মধ্যে ফাংশনগুলির ডিফল্ট ইনডেন্টেশন সহ)। তবে ctags সহ প্রাপ্ত ফাংশন সংজ্ঞা সীমার জন্য আপনার ধারণাটি তৈরি করা যেতে পারে। আমি lh#dev#find_function_boundaries
lh

3
চমৎকার পন্থা। আপনি যদি নির্ভরযোগ্যভাবে ফাংশনের শীর্ষ লাইনটি খুঁজে পেতে পারেন, তবে আপনি নীচে লাইনে পৌঁছতে {ব্যবহার %করতে পারেন এবং তারপরে ব্যবহার করতে পারেন । আপনি কীভাবে সি ++ এ ফাংশনটি শুরু করতে পারেন তা নিশ্চিত নন তবে জাভাস্ক্রিপ্টের জন্য এটি ঠিক কাজ করে:vnoremap if <Esc>?^\s*function<CR>v/{<CR>%o
জোয়েটউইডল

1
আপনার শেষ সম্পাদনা সম্পর্কিত। CTRL-]কার্সারের নিচে ট্যাগটিতে লাফ দেয়। বর্তমান ফাংশন শুরুর দিকে নয়। এটি সাহায্য করবে না।
লুক হার্মিটে

নতুন সম্পাদনা সম্পর্কিত। এটি এত সহজ নয়। ভিমটি বর্তমান ফাংশনটি জানতে অসুবিধা হয়। এটির যদি তথ্য থাকে তবে এর জন্য ctags সহায়তা লাগবে না। (Ctags থেকে) তথ্য পাওয়ার একমাত্র উপায় হ'ল ctags দ্বারা উত্পাদিত জাম্প-টু- ডিক্লোরেশন কমান্ডগুলি বিশ্লেষণ করা । এই কমান্ডগুলি থাকলে :linenumber, আমার প্লাগ ইনটিতে আমি যা করতে পারি তা ভিম করতে পারে। তবে কোনও গ্যারান্টি নেই, এবং এই আদেশগুলি পরিবর্তে অনুসন্ধান করা যেতে পারে /pattern- বর্তমানের ফাংশনটি কোনটির সাথে মিলছে তা জানতে ভিম সমস্ত নিদর্শনগুলি পরীক্ষা করতে পারে না OW I ফাংশন
লুস হার্মিটে 26'16

6

ডিজে ম্যাকমেহেমের সমাধান আমাকে নিজের লেখার জন্য অনুপ্রাণিত করেছিল যা সিটি্যাগগুলিতে এবং ম্যাচের উপর নির্ভর করে ফাংশন সীমানার সঠিক বিশ্লেষণ করতে।

ইতিমধ্যে বেশ কয়েকটি বছর lh-dev এবং lh-ট্যাগ দ্বারা কঠিন অংশটি করা হয়েছে :

  • বর্তমান ফাইলটি সঠিক বিকল্পগুলির সাথে ctags এর মাধ্যমে পার্স করা হয়েছে
  • আমরা ট্যাগ্স ডাটাবেসে সমস্ত ফাংশন সংজ্ঞা খুঁজছি যা বর্তমান ফাইলের জন্য প্রাপ্ত ট্যাগগুলিতে সীমাবদ্ধ
  • ডিবিকে ধন্যবাদ, আমাদের সকল ফাংশনের জন্য স্টার্ট লাইন নম্বর রয়েছে (ভাল templateএবং inlineঅংশটি সিটি্যাগ দ্বারা মিস করা যেতে পারে)
  • একটি সাধারণ পুনরাবৃত্ত অনুসন্ধান সহ (একটি বাইনারি অনুসন্ধান করা যেতে পারে, তবে ভাল, ফাইলগুলি "সংক্ষিপ্ত" বলে মনে করা হয়), বর্তমান ফাংশনের শুরুটি পাওয়া গেছে
  • এবং ম্যাচইট প্লাগইনকে ধন্যবাদ, এর চূড়ান্ত লাইনটিও পাওয়া গেছে - আমি দেখতে পাচ্ছি যে সার্বজনীন ctags এমন একটি endক্ষেত্র অফার করছে যা সি, সি ++, পাইথন এবং ভিমের সাথে ব্যবহার করা যেতে পারে যা কোনও ফাংশনের শেষ সন্ধান করতেও ব্যবহৃত হতে পারে।

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

সুতরাং আমি এখন দুটি নতুন ম্যাপিং সংজ্ঞা দিচ্ছি: ভিজ্যুয়াল মোড ম্যাপিং এবং অপারেটর-মুলতুবি মোড ম্যাপিং:

onoremap <silent> if :<c-u>call lh#dev#_select_current_function()<cr>
xnoremap <silent> if :<c-u>call lh#dev#_select_current_function()<cr><esc>gv

যা নির্ভর করে:

function! lh#dev#_select_current_function() abort
  let fn = lh#dev#find_function_boundaries(line('.'))
  exe fn.lines[0]
  normal! v
  exe fn.lines[1]
endfunction

আমি আপনাকে কয়েকশ লাইনের কোড অফ করে রেখেছি lh#dev#find_function_boundaries()

এবং ডিজে ম্যাকমেহেমের ম্যাপিংয়ের জন্য ধন্যবাদ

" Note that my vim settings requires two backslashes here instead of one
vnoremap / <esc>/\\%V

আমরা বর্তমান ফাংশনটি vif/patternঅনুসন্ধান করতে একটি করতে পারি pattern

আমরা এর সাথে ফাংশনগুলি মুছে ফেলতে পারি dif, তাদের সাথে ইঙ্ক করা yifইত্যাদি can

বাস্তববাদী সি ++ ফাংশনে প্রয়োগ করার সময় এটি দেখতে কেমন লাগে তা এখানে (উদাহরণস্বরূপ 0 টি ইন্ডেন্ট করা হয়নি):স্ক্রিনকাস্ট: সি ++ ফাংশন নির্বাচন করুন


4

কোনও ক্রিয়াকলাপের শুরু এবং শেষ সন্ধান করা কঠিন হতে পারে, বিশেষত কোনও functionশব্দবিহীন ভাষায় ... এবং অনেকগুলি বিরোধী ইনডেন্ট শৈলী।

যদি আপনার ফাংশনটি তার নিজস্ব লাইনে একাকী বন্ধনীয় বন্ধনী দিয়ে শেষ হয় ( এখানে তালিকাভুক্ত 13 টি শৈলীর মধ্যে 10 হিসাবে ), আপনি দৃশ্যত এটি এর মতো কিছু দিয়ে নির্বাচন করতে পারেন:

xnoremap if /^\s*}<CR><Esc>V%

সেখান থেকে fooআপনার ফাংশনটির মধ্যে অনুসন্ধান করা কেবলমাত্র একটি বিষয়:

:'<,'>g/foo/#

এগুলি একসাথে রেখে আমরা একটি দুর্দান্ত ম্যাপিং পেতে পারি:

xnoremap if /^\s*}<CR><Esc>V%
nmap <key> vif:g//#<Left><Left>

ফাংশন অনুসন্ধান

এটি বলেছিল, ভিজ্যুয়াল মোড ম্যাপিং সম্ভবত কোনও whileবা সহজেই বোকা বানানো ifহবে তাই এটি সম্ভবত কিছুটা পোলিশিংয়ের দ্বারা উপকৃত হবে। এছাড়াও, ভিজ্যুয়াল নির্বাচন রাখা খুব ভাল ধারণা নাও হতে পারে ...


এটি এটি পেতে পারে এটি পরবর্তী ব্লকটি নির্বাচন করে। এটা সব সময়ে কাজ করে না একবার আপনি যোগ if, for, while, ইত্যাদি
জেমস

3

একটি অসম্পূর্ণ সমাধান ভাঁজ ব্যবহার করা হয় । সব ভাঁজ করুন:

set foldmethod=syntax
set foldlevel=0
set foldminlines=0

ভিমকে অনুসন্ধান ফলাফলের জন্য ভাঁজ অঞ্চলগুলি না খোলার জন্য বলুন:

set foldopen-=search

এবং তারপরে প্রশ্নে ফাংশনটির ভাঁজটি খুলুন ( zO)।

এখন, ভাঁজ অঞ্চলে অনুসন্ধান করা পাঠ্যের জন্য সমস্ত হিট ফলাফল একবার ভিমকে ভাঁজ লাইনে ঝাঁপিয়ে দেবে, তারপরে পরবর্তী আঘাতের দিকে এগিয়ে যাবে।

উদাহরণস্বরূপ, নীচের ক্ষেত্রে:

এখানে চিত্র বর্ণনা লিখুন

ভাঁজ ফাংশনটির অনেকগুলি ব্যবহার রয়েছে size, তবে সেই ফাংশনের nপ্রতিটি ব্যবহারকে আমাকে নেতৃত্ব দেবে না size


3

অন্য উপায়:

  • লক্ষ্য ফাংশন সন্ধানের জন্য ctags ইত্যাদি ব্যবহার করুন, সেখানে যান
  • কার্সারটি ফাংশন বডির ভিতরে নিয়ে যান
  • ওসিও মাঙ্গার অনুসন্ধান অপারেটরটি ( ভিএম -অপারেটর-ব্যবহারকারীর উপর নির্ভর করে ) কেবলমাত্র বর্তমান ব্লকের ভিতরে অনুসন্ধান করতে ব্যবহার করুন । উদাহরণ:

    " configure the plugin (once, vimrc):
     map g/ <Plug>(operator-search)
    
    " 1. use ctags etc. to jump to the beginning of the target function;
    " 2. move cursor inside the function definition, then:
    g/i{
    

... এখন আপনি প্রদত্ত প্রম্পটে আপনার অনুসন্ধান শব্দটি প্রবেশ করতে পারেন; nকীভাবে অনুসন্ধানের ফলাফলগুলি বর্তমানে সরবরাহিত গতি / পাঠ্য-অবজেক্টের মধ্যে সীমাবদ্ধ তা দেখতে আঘাত করুন । যেহেতু এটি একটি ভিম (অর্থাত্ কমপোজেবল) অপারেটর, যদি আপনার কোনও ভাল ফাংশন পাঠ্য-অবজেক্ট থাকে, আপনাকে অনুসন্ধানের আগে সংজ্ঞা বডির ভিতরে যাওয়ার দরকার নেই, তবে সরাসরি স্মিথিং g/ifবা অনুরূপ ব্যবহার করুন।

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