নির্দিষ্ট সিনট্যাক্স অঞ্চলে প্যাটার্নটি কীভাবে অনুসন্ধান করবেন?


10

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


1
আমি মনে করি উত্তরটি হ'ল: একটি নির্দিষ্ট সিনট্যাক্স অঞ্চলে অনুসন্ধান সীমাবদ্ধ করার সহজ উপায় নেই ।
কার্ল ইঙ্গভে লেরভেগ

2
এই ম্যাপিং ব্যবহার synIDattr()কার্সার অধীনে অক্ষরের জন্য সিনট্যাক্স গ্রুপ প্রাপ্ত। আপনি এমন একটি ফাংশন লিখতে পারেন যা অনুসন্ধান সম্পাদন করে (বা করবে normal n) এবং তারপরে synIDattr()এই স্থানে থাকতে হবে বা অনুসন্ধানের অগ্রযাত্রা চালিয়ে যেতে হবে কিনা তা স্থির করে uses
জোয়েটউইডল

@ জোয়েটউইডাল এই জাতীয় ফাংশন সহ উত্তর পোস্ট করার পরে আমি এখনই আপনার মন্তব্যটি দেখেছি। আপনি কি মনে মনে মত এটি?
জাজারবার্গ

@ জাজদারবার্গ হ্যাঁ এটি দারূন কাজ!
জোয়েটউইল

: শুধু সম্পূর্ণতার জন্য (আমি এটি একটি ভাল উত্তর পাওয়া যায়) stackoverflow.com/a/2696143/5000478
VanLaser

উত্তর:


4

এখানে একটি ফাংশন যা আপনি চেষ্টা করতে পারেন। আমি এটি কিছুটা পরীক্ষা করেছি তবে মনে হচ্ছে এটি ঠিক আছে।

function! JJSyntaxSearch(pattern, syntaxitem)
  while search(a:pattern, 'W') > 0
    for id in synstack(line("."),col("."))
      if synIDattr(id,"name") =~? a:syntaxitem
        return line(".")
      endif
    endfor
  endwhile
  return 0
endfunc

command! -nargs=* JJSyntaxSearch call JJSyntaxSearch(<f-args>)

ফাংশনটি ভিমের অনুসন্ধান ফাংশনটিকে একটি লুপে কল করে যতক্ষণ না এটি একটি 'সাধারণ' মিল খুঁজে পায় যা একটি নির্দিষ্ট বাক্য গঠন আইটেমটির সাথে 'যোগ্য' ম্যাচ বা এটি বাফারের শেষের দিকে পৌঁছা পর্যন্ত।

এটি দুটি যুক্তি লাগে। প্রথমটি হ'ল অনুসন্ধানের প্যাটার্ন এবং এটি ভিমের search()ফাংশনে অপরিবর্তিত রয়েছে । দেখুন :help search()কিভাবে যে ফাংশন কাজ করে না। দ্বিতীয় যুক্তিটি সিনট্যাক্স আইটেমের নাম যা আপনি এই ম্যাচগুলিকে ফিল্টার করতে চান। এটি একটি নিদর্শনও হতে পারে এবং কেস-সংবেদনশীল নিয়মিত প্রকাশ হিসাবে তুলনা করা হয়।

গণিত অঞ্চলে 'আলফা' প্যাটার্নটি সন্ধান করতে আপনি করতে পারেন

:JJSyntaxSearch alpha texMathZone.

.শেষে কোনো একক অক্ষর জন্য প্যাটার্ন পরমাণু থাকে, দেখতে :help /.। এর কারণ হল অনেক গণিত জোন সিনট্যাক্স আইটেম বলা হয় texMathZoneA, texMathZoneBইত্যাদি

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

আমি Wপতাকাটির জন্য ব্যবহার করতে পছন্দ করেছি search()কারণ এটি বাফারের শেষদিকে 'মোড়ানো' বাধা দেয়। অন্যথায় ফাংশনটি আটকে যেতে পারে কারণ এটি একই 'সাধারণ' ম্যাচগুলি সন্ধান করতে পারে তবে কোনও 'যোগ্য' ম্যাচ নেই।


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


1

যদি আপনার "গণিত অঞ্চলগুলি" কিছু সিনট্যাক্টিকাল প্যাটার্ন দ্বারা যোগ্য হয়ে থাকে তবে বলুন স্ট্রিং "ম্যাথ", তবে আপনি কমপক্ষে প্যাটার্ন সিকোয়েন্সগুলি ম্যাচিং প্যাটার্নের সাথে একটি লাইন খুঁজে পেতে ব্যবহার করতে পারেন :

:/math//your pattern/

(দ্রষ্টব্য: দুটি নিদর্শন বিভিন্ন লাইনে থাকতে পারে!)

এটি আপনার মিলগুলি অঞ্চলগুলিতে সীমাবদ্ধ করতে পারে না - এর জন্য আপনাকে জোনটির শেষটি সনাক্ত করতে হবে - তবে এটি প্রাথমিক প্যাটার্ন / গণিত / পরে কেবল সেই ম্যাচগুলিই প্রদর্শন করবে। আপনি প্রাক্তন-মোডের ইতিহাস ( : up-arrow enter) ব্যবহার করে পরবর্তী ঘটনাটির জন্য পুনরাবৃত্তি করতে পারেন ।


দ্রষ্টব্য: পূর্ববর্তী vim / vi সংস্করণে আমি সেই পদ্ধতিটি সরাসরি অনুসন্ধান কমান্ড হিসাবে (প্রাক্তন-মোড কমান্ডের বিপরীতে) /math//your pattern/কম টাইপিং এবং nঅ্যান্ড Nকমান্ডগুলির ব্যবহারের সাহায্যে ব্যবহার করতে সক্ষম হয়েছি, তবে আমি নিশ্চিত করতে পারি না এটি আমার বর্তমান ভিএম সংস্করণের জন্য।


1

আপনি যদি fooভিতরে স্ট্রিংটি অনুসন্ধান করছেন $...$বা $$...$$, এটি কাজ করা উচিত:

\$.*\zsfoo

এটি ম্যাচটিকে একটি $চরিত্রের সাথে অ্যাঙ্কর করে তবে কেবল স্ট্রিংটি নির্বাচন করে foo

এটি আসলেই সহজ সমাধান নয়, তবে "গণিত অঞ্চলগুলি" খুঁজে পেতে এবং এর মধ্যে অনুসন্ধান করতে একটি :global+ ব্যবহার করতে পারে :substitute:

:global /\v\\begin\{%(align|alignat|displaymath)\}/ +1,/\\end/-1 s/foo/&/gc

এটি :substituteসার্চ কমান্ডের ভান করে , আপনি পরবর্তী ইভেন্টে যেতে পারেন nএবং এর সাথে প্রস্থান করতে পারেন q। আপনি যদি ভুল করে কোনও প্রতিস্থাপনের বিষয়টি নিশ্চিত করেন তবে কোনও সমস্যা হওয়া উচিত নয়।

আপনি তালিকা ভিতরে সেট করতে হবে %(... )আপনি ব্যবহার গণিত পরিবেশের নামের (সম্পূর্ণ তালিকা একটি বিট প্রবল হল: align|alignat|displaymath|eqnarray|equation|flalign|gather|math|multline|subequations|xalignat|xxalignat)। মনে রাখবেন যে আমি এখানে খুব যাদু ( \v) নিদর্শন ব্যবহার করছি ।

ব্যাখ্যা:

:globalপ্রাক্তন কমান্ড (নির্বাহ :sপ্রতিটি লাইনে) যেখানে প্যাটার্ন ম্যাচ ( :help :global)
/\vএকটি খুব যাদু প্যাটার্ন শুরু ( :h /, :h pattern, :h magic)
\\begin\{একটি আক্ষরিক মেলে \begin{
%(align|alignat|displaymath)ম্যাচের এই শব্দগুলির মধ্যে একটি ( :h /\%(, :h /bar)
\}/একটি আক্ষরিক মেলে }এবং প্যাটার্ন শেষ।

+1,/\\end/-1পরবর্তী পংক্তির (একটি সন্ধান করা রেখা থেকে গণনা :global) সন্ধান প্যাটার্নটি পাওয়া যায় তার আগে একটি রেঞ্জ থাকে /\\end। এই সীমার মধ্যে,

s/foo/&/gcআক্ষরিক প্রতিটি ঘটনাকে অনুসন্ধানের সাথে প্রতিস্থাপন করুন এবং fooনিশ্চিতকরণের পরে ( :h :substitute)


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

@ রবএফ .: বিভিন্ন পরিবেশের মধ্যে এটির মিল পাওয়া বেশ সম্ভব, তবে কেউ এটিকে স্ক্রিপ্ট না করলে এটি সহজ হবে না। তবে, আপনি যদি নিয়মিতভাবে \mathitচলক নামগুলি ব্যবহার করেন তবে তাদের সন্ধান করা আরও সহজ।
পিটার লেউরিন

0

আপনি যদি STRING 'সকাল' ফাইল ভিতরে করুন না অনুসন্ধানের /morningতারপর enterটিপুন nএগিয়ে দিক সরাতে


1
প্রশ্নটি বলেছে যে I would like to search only in "math zones"আপনার পদ্ধতিটি পুরো ফাইলটির জন্য অনুসন্ধান করে এটি কোনও গবেষণা অঞ্চলকে সীমাবদ্ধ করে না।
স্ট্যাটক্স

0

এর জন্য ডেডিকেটেড ফাংশন লেখার বিকল্প নেই। আমি একটি ফাংশন লিখেছি যা আপনার পছন্দ মতো স্ট্রিং অনুসন্ধান করে এবং কেবল তখনই থামিয়ে দেয়:

  1. এটা ম্যাচ শেষ
  2. এখানে ম্যাচ আছে যা গণিতের পরিবেশের মধ্যে রয়েছে (এটি ম্যাচটি থামবে)

আপনি যে স্ট্রিংটি অনুসন্ধান করতে চান তার সাথে আপনি এটি কল করেছেন।

function! Finmath(nextstr)
    while 1
        if search(a:nextstr)==0
            break
        endif
        if searchpairpos('\(', '','\)','n')!=[0,0]
            break
        endif
        if searchpairpos('\[', '','\]','n')!=[0,0]
            break
        endif
        let a = getcurpos() 
        if count(strpart(getline('.'),0,a[2]),'$')%2==1
            break
        endif 
    endwhile 
endfunction

আমি ব্যাকরণ সংক্রান্ত চেকের জন্য অনুরূপ একটি ফাংশন লিখতে চাই যা গণিতের বাইরের ব্যাকরণ ত্রুটিতে কেবল থামে।

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