ভিম: সাবম্যাক্রোর ত্রুটির পরে ম্যাক্রো চালিয়ে যাবেন?


15

আমি ভিএম ব্যবহার করে কিছু উত্স কোড সুন্দরীকরণের প্রক্রিয়াধীন। {1}

আমি পৃথক পদক্ষেপগুলি সম্পন্ন করে বেশ কয়েকটি ভিম ম্যাক্রোগুলি তৈরি করেছি: পেছনের স্থানটি সরিয়ে {ফেলা, পরে খালি লাইনগুলি সরিয়ে, খালি লাইনগুলি আগে সরিয়ে ফেলা {, এই ধরণের স্টাফ।

এখন, আমি এমন একটি ম্যাক্রো তৈরি করতে চাই যা সমস্ত স্বতন্ত্র ম্যাক্রোকে ক্রমানুসারে কার্যকর করে। যাইহোক, একবার প্রথম পুনরাবৃত্ত ম্যাক্রো সমাপ্ত হয় (কারণ এটি আর কোনও মিল খুঁজে পাবে না -> মিলের ত্রুটি), আমার "মোড়ক" ম্যাক্রোও বন্ধ হয়ে যায়।

একটি সাবম্যাক্রো ত্রুটি উত্পন্ন করার পরে কি ভিম ম্যাক্রো চালিয়ে যাওয়ার কোনও উপায় আছে?

{1} আমি স্বয়ংক্রিয় পুনর্নির্মাণগুলি সম্পর্কে জানি । আমি এগুলি আমার বর্তমান সমস্যাটিতে ব্যবহার করতে পারি। উদাহরণস্বরূপ আমি কেবল উত্স পুনর্নির্মাণের উল্লেখ করেছি। এই উত্সটি বিউটিফায়ার বা সে সম্পর্কে কোনও উত্তর পোস্ট করবেন না । প্রশ্নটি প্রতি সেড কোড পুনরায় ফর্ম্যাটিং সম্পর্কে নয় , তবে ভিম ম্যাক্রোগুলি সম্পর্কে।

উদাহরণ:

  • ম্যাক্রো 1 - ট্রিলিং ট্রেলিং হোয়াইটস্পেস - qw/\s\+$d$@wq
  • ম্যাক্রো 2 - empty এর আগে খালি লাইনগুলি মোছা - qe/\n\n *}dd@eq
  • মোড়ক ম্যাক্রো - রিব্যাবিং, ম্যাক্রো 1, ম্যাক্রো 2 - qr:retab@w@eq

যখন আমি @rমোড়কটি কার্যকর করি - - এটি পুনরায় চালু হবে, তারপরে ম্যাক্রো 1 কার্যকর করুন যতক্ষণ না কোনও পেছনের সাদা জায়গা পাওয়া না যায়, তারপরে সমাপ্ত করুন ( ম্যাক্রো 2 কার্যকর না করে)।

ব্যাখ্যা:

আমি যা খুঁজছি তা হল সাবম্যাক্রোকে কীভাবে কল করা যায় যাতে সেই সাবম্যাক্রো বন্ধ হয়ে গেলে কলিং ম্যাক্রো অবিরত থাকে?

উত্তর:


12

আমি আপনাকে :tryসাবম্যাক্রোর ত্রুটি "শোষণ" করতে ব্যবহার করার পরামর্শ দিচ্ছি ।

এখানে একটি নির্বোধ উদাহরণ:

:let @a='f|dt|@a'
:let @q=':try|exe "norm! @a"|endtry^Mj0@q'
@q

আপনার মোড়ক ম্যাক্রো দেখতে এইরকম কিছু দেখবে:

let @r=':retab^M:try|exe "norm! @w"|endtry|try|exe "norm! @e"|endtry^M'

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

26

যদি ব্যর্থ কমান্ডটি এমন বিকল্প হয় যা এর প্যাটার্নটি খুঁজেছে না, যেমন,

:%s/foo/bar/

fooবাফারে যখন উপস্থিত নেই তখন আপনি eত্রুটিটিকে অগ্রাহ্য করার জন্য পতাকাটি যুক্ত করতে পারেন, যেমন,

:%s/foo/bar/e

দেখা

:help :s_flags

আপনি ভিমকে কিছু থেকে ত্রুটি উপেক্ষা করতে বলতে পারেন: প্রাক্তন কমান্ডগুলির সাথে তাদের পূর্ববর্তী করে :silent!। দেখা

:help :silent


প্রশ্নের উদাহরণ সংযোজন অনুসরণ সম্পাদনা করুন

ম্যাক্রো 1 এবং ম্যাক্রো 2 উভয়ই পুনরাবৃত্ত এবং এগুলির পুনরাবৃত্তি সমাপ্ত করার জন্য কোনও সুস্পষ্ট পদ্ধতি নেই। আমার অনুমান যে সীমাহীন পুনরাবৃত্তির জন্য ভিমের অভ্যন্তরীণ পরীক্ষাগুলির মধ্যে একটি ট্রিগার করা হচ্ছে, যা ত্রুটি সৃষ্টি করে। ম্যাক্রো 1 যদি এই জাতীয় ত্রুটি উত্পন্ন করে থাকে, তবে সেই ত্রুটিটি ঠিক পরে র‍্যাপার ম্যাক্রোর সম্পাদন বন্ধ করে দেবে @w

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

qw:%s/\s\+$//^Mq
qe:%s/\n\n *}/\r}/^Mq

যেখানে ^Mআপনার এন্টার বা রিটার্ন কী টাইপ করা। আমি আপনার র‍্যাপার ম্যাক্রোতে সেগুলি একসাথে পরীক্ষা করি নি, তবে আমি মনে করি আপনি যে কোনও ভুল করেছেন তা আপনি ঠিক করতে সক্ষম হবেন।


এটি আমার ক্ষেত্রে কোনও বিকল্প নয়, একটি সাধারণ সন্ধান (যেমন, /foo)। যদিও :silent!প্রকৃতপক্ষে পুনরাবৃত্ত সাবম্যাক্রো মোড়ক ম্যাক্রো বন্ধ না করার কৌশলটি করেছিল, এখন সাবম্যাক্রো মোটেও শেষ করে না ... এবং আমি সন্দেহ করি যে এটি আবার কোনওভাবে শেষ করা আবার মোড়কের ম্যাক্রোটিকেও আবার শেষ করে দেবে। মনে হচ্ছে আমি আটকে গেছি। : - \
দেবসোলার

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

একটি উদাহরণ যুক্ত।
দেবসোলার

2

আমার জন্য যা কাজ করেছে তা ছিল পিটার রিনকার এবং @garyjohn উত্তরগুলির সংমিশ্রণ। আলাদাভাবে আমি কেবল অদ্ভুত বিষয়গুলি পেতে থাকি।

nnoremap <leader>rt :silent! %s/\s\+$//e<CR>
let @r='\rt'
let @t=':try|silent! exe "norm! @r"|endtry|w^M'

আমি মনে করি silent!<leader>rtএবং তাদের মধ্যবর্তী নল অক্ষর endtryএবং wকী ছিল - শুধু পরে লাইন বিরতি থাকার endtryব্যর্থ হয়েছে। tryএইগুলি কাজ করেছিল যখন আমি কেবল সেগুলিতে প্রবেশ করব, কিন্তু যখন ম্যাক্রো হিসাবে চালানো হবে তখন অনুসন্ধানের পাঠ্য সম্পর্কে ত্রুটিটি পাওয়া যায়নি raised


1

যখন আমি অনেক ফাইলের মধ্যে পুনরাবৃত্তিযোগ্য টাস্ক করার দরকার হয় তখন আমি নিয়মিতভাবে ফ্লাইটে ম্যাক্রো তৈরি করি। আমার ক্ষেত্রে, আমি ভিআইএম এ এনআরডিট্রি ( http://www.vim.org/scriptts/script.php?script_id=1658 ) ইনস্টল করেছি, যা একটি vsplitউইন্ডো তৈরি করে এবং বামদিকে, আমার কাছে সমস্ত ফাইলের একটি তালিকা রয়েছে বর্তমান ডিরেক্টরি একটি উদাহরণে, আমাকে MY_TESTফাইলের স্ট্রিংয়ের প্রথম উদাহরণটি খুঁজে বের করতে হবে এবং তারপরে উপস্থিত থাকলে উপস্থিত একটি উপসর্গটি CUSTOM_PREFIX-সেই লাইন থেকে লেবেলযুক্ত ফাইলটিকে সংরক্ষণ করুন, তারপরে পরবর্তীটিতে যান।

বর্তমান ডিরেক্টরিটিতে প্রায় 2000 টি ফাইলগুলিতে আমার এই ম্যাক্রো কীভাবে কাজ করবে তা এখানে রয়েছে। আমি এটি করার জন্য একটি বাশ স্ক্রিপ্ট লিখতে পারি, তবে এটি আমার ক্ষেত্রে এটি ভিআইএমের চেয়ে দ্রুত। +-এর মানে কি টেপা হচ্ছে একসঙ্গে

# Start recording a macro sequence to register 'A'

q,a

# Search silently for the string "MY_TEST"; DO NOT report an error
# if the string could not be found.
:silent! /MY_TEST


# Replace, on just the current line, the string "CUSTOM_PREFIX-", with
# nothing (ie: delete it), and suppress any warning messages if the
# string could not be found on the current line.
:s/CUSTOM_PREFIX-//e


# Now issue some UI commands. CTRL-W then and arrow key lets you hope
# between tabs/splits/windows within vim.

CTRL+ W,

# Scroll down to the next file in the list in NERDtree



# Open the next file

ENTER

# End the macro

q

# Run the macro a thousand times in VIM

1000 @,,a

আশাকরি এটা সাহায্য করবে!

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