সেডের সাথে Zsh স্ব-পরিপূর্ণ ফাংশন


1

আমি একটি জেডএসএইচ স্ব-পরিপূর্ণ ফাংশন লেখার জন্য সংগ্রাম করছি। আমার লক্ষ্য স্বয়ংসম্পূর্ণ করতে হয় ta's এবং tkএর তালিকাভুক্ত প্রকল্পগুলোতে প্রথম আর্গুমেন্ট tmux list-sessionsএবং tmuxinator list

আমার এখন পর্যন্ত যা আছে তা এখানে:

tmux list-sessions ফলাফলগুলি এমন দেখায় যা ফলাফলগুলি দেখায়:

dotfiles: 1 windows (created Tue Apr 15 21:54:51 2014) [123x48]
goodbye: 1 windows (created Tue Apr 15 21:51:34 2014) [123x48]
hello: 1 windows (created Tue Apr 15 21:42:03 2014) [123x48]

tmuxinator list আউটপুট:

tmuxinator projects:
dotfiles           landonschropp.com

এখানে আমার প্রচেষ্টা:

tmux-list-sessions-autofill() {

  # get the tmux and tmuxinator sessions
  TMUX_SESSIONS=$( tmux list-sessions | cut -d: -f1 )
  TMUXINATOR_SESSIONS=$( tmuxinator list | tail -n +2 | gsed -e 's/\s\+/\n/g' )

  # remove duplicates
  SESSIONS=$( echo "$TMUX_SESSIONS\n$TMUXINATOR_SESSIONS" | sort | uniq )

  # set the autocomplete values
  reply=( $(echo $SESSIONS) )
}

compctl -K tmux-list-sessions-autofill ta
compctl -K tmux-list-sessions-autofill tk
  • tmux list-sessions | cut -d: -f1 প্রকল্পের নাম বাদে সবকিছু সরিয়ে দেয়।
  • tmuxinator list | tail -n +2 | gsed -e 's/\s\+/\n/g' প্রথম লাইনটি সরিয়ে দেয় এবং হোয়াইটস্পেসকে নতুন লাইনের সাথে প্রতিস্থাপন করে।
  • echo "$TMUX_SESSIONS\n$TMUXINATOR_SESSIONS" | sort | uniq সদৃশ লাইনগুলি সরিয়ে দেয়।
  • আমি ব্যবহার করছি gsedকারণ আমি ওএস এক্স এ এবং sedকিছুটা চতুর।

আমার ফাংশনটি কাজ করে তবে এটি সত্যিই ধীর। আমি শেল স্ক্রিপ্টিং আভিজাত্য, তাই আমি নিশ্চিত যে এটি সম্পাদন করার আরও কার্যকর উপায় আছে। আমার বাধা কোথায় এবং আমি কীভাবে এটি ঠিক করতে পারি?


আপনি কি এই রায়টি দুটি আদেশ tmux list-sessionsএবং tmuxinator listবিলম্ব কারণ হতে পারে? আমি আগ্রহী time tmuxinator list, time tmuxinator list | tail -n +2এবং time tmuxinator list | tail -n +2 | gsed -e 's/\s\+/\n/g'। অ্যানালগ কমান্ডের সাহায্যে আপনি বিলম্বটি যদি একটি কমান্ডের কারণে ঘটে থাকে বা যদি এটির ফলাফল কেবলমাত্র হয় তবে আপনি এটি অনুসরণ করতে পারেন।
এমপি

ওহ, বাহ, আমি টাইম কমান্ড সম্পর্কে জানতাম না। যে বেশ শান্ত. আমি প্রতিটি কমান্ড 5 বার চালিয়েছি এবং ফলাফলটির গড় গড়েছি। time tmux list-sessions0.716 সেকেন্ডে 0.05 সেকেন্ড time tmuxinator listনিয়েছে। time tmuxinator list | tail -n +2এবং time tmuxinator list | tail -n +2 | gsed -e 's/\s\+/\n/g'উল্লেখযোগ্য বিলম্ব যোগ করেনি। আমার ধারণা আমি এর জন্য tmuxinator এ একটি সমস্যা খুলব। সাহায্যের জন্য ধন্যবাদ!
ল্যান্ডনস্ক্রপ

খুশি, আপনি বাধা পেয়েছেন। আমি একটি উত্তর লিখেছি যা সেশনের তালিকাগুলি বিশ্লেষণের জন্য কেবল বিল্টিন zsh ক্ষমতা ব্যবহার করে। আপনি zsh এর শক্তি ব্যবহার করতে চান, তাই না ?! ;)
এমপি

উত্তর:


2
  1. বিলম্বটি সন্ধান করতে আপনি বিল্টিন কমান্ডটি ব্যবহার করতে পারেন timeযা কোনও পাইপে সমস্ত কমান্ডের অবদানের তালিকা দিতে পারে:

    zsh% time sleep 2 | date | sleep 1
    sleep 2  0.00s user 0.00s system 0% cpu 2.003 total
    date  0.00s user 0.00s system 0% cpu 0.004 total
    sleep 1  0.00s user 0.00s system 0% cpu 1.004 total
  2. (আপনার মন্তব্য অনুসারে) এটি বাহ্যিক কমান্ড tmuxinator list যা লক্ষণীয় বিলম্বের কারণ, আপনি তবুও আপনার সমাপ্তির কার্যটি অনুকূল করতে পারেন। আপনি বহিরাগত কমান্ড অনেক (ব্যবহৃত sed, cutআউটপুট পার্স করতে, ...)। এখানে আমি এমন একটি পদ্ধতির দেখাব যা কেবল zsh এর অন্তর্নির্মিত ক্ষমতা ব্যবহার করে।

    tmux-list-sessions-autofill() {
      local -aU SESSIONS
      SESSIONS=("${(@)${(f)$(tmux list-sessions)}/:*/}")
      SESSIONS+=("${(@)${(f)$(tmuxinator list-sessions)}[2,-1]/[ $'\t']*/}")
      reply=(${(i)SESSIONS})
    }

    এটি প্রথম নজরে জটিল মনে হতে পারে, তবে একবার আপনি এটি ব্যবহার করতে শুরু করলে zsh এর প্যারামিটার সম্প্রসারণ খুব শক্তিশালী। উপর থেকে নিচে:

    • local -aUএকটি স্থানীয় প্যারামিটার ঘোষণা করে SESSIONSযা একটি অ্যারে ( a) এবং U অ্যারের মানগুলিকে অনন্য রাখে+ +
    • প্রথমে সেশনগুলি tmux list-sessionsথেকে ভিতরে থেকে বাইরের দিকে ব্যাখ্যা করুন:
      • $(tmux list-sessions) বাহ্যিক কমান্ডের আউটপুট পায়
      • ${(f)$(tmux list-sessions)} ফলাফল বিভক্ত \n
      • ${(@)${(f)$(tmux list-sessions)}/:*/}প্রতিটি অ্যারে উপাদান ( (@)) চালিত করে এবং অনুসন্ধান ও প্রতিস্থাপন করে /from/to, অর্থাত্ প্রথম কিছুই পরিবর্তন করে এবং এর পরেও কিছু অপসারণ করে।
      • এখন, $SESSIONSঅন্তর্ভুক্ত করা হবে (dotfiles goodbye hello)print -l $SESSIONS একক লাইনে প্রতিটি অ্যারে উপাদান মুদ্রণ করতে ব্যবহার করুন ।
    • পরবর্তী, tmuxinator listএই সংযোজনগুলির সাথে প্রায় একই পদ্ধতি :
      • শেষ উপাদানটির দ্বিতীয় থেকে দ্বিতীয়টি ব্যবহার করুন ( [2,-1])
      • spaceএবং tab( $'\t') অন্তর্ভুক্ত সমস্ত কিছু মুছে ফেলুন everything
      • অ্যারেতে এই উপাদানগুলি ( +=) যুক্ত করুনSESSIONS
    • অবশেষে, SESSIONSঅ্যারে বাছাই করা কেস-সংবেদনশীলকে ফিরিয়ে দিন(i)

এই সমস্ত বিস্তৃতি ${parameter}শর্টহ্যান্ড স্বরলিপি পরিবর্তে দীর্ঘতর, সাধারণ ফর্ম ব্যবহার করে $parameterman zshexpnসিনট্যাক্স এবং স্কলড প্যারামিটার এক্সপেনশন ফ্ল্যাগগুলির (যেমন (f)) আরও অনেক বেশি ভাল ব্যাখ্যা দেখুন ।


+ মতে বার্ট স্কেফেরU পতাকা কারণে প্রয়োজন হয় না সমাপ্তির কোড অনন্য সম্পূর্ণকরণ তার অভ্যন্তরীণ তালিকা করে তোলে, তাই এটা সত্যিই যখন সেগুলি কেবল সমাপ্তির জন্য ব্যবহার আগাম বিন্যাসগুলি থেকে অপ্রয়োজনীয় এন্ট্রি অপসারণ করতে সাহায্য করে না।


এটা সত্যিই দারুন! সব লিখতে সময় দেওয়ার জন্য আপনাকে অনেক ধন্যবাদ। এটি সত্যই সহায়ক।
ল্যান্ডনশ্রপ্প

@ ল্যান্ডনশ্রপপ আরে, অতিরিক্ত অনুদানের জন্য অনেক ধন্যবাদ :), যদিও এটি প্রয়োজন ছিল না - আমি আপনাকে খুশি করেছিলাম যে আমি আপনাকে কিছু ক্লু দিতে পারি।
এমপি এমপি

এটি প্রয়োজনীয় নাও হতে পারে তবে আমার মনে হয়েছিল আপনি সাহায্যের পথে চলে গেছেন এবং আমি ধন্যবাদ বলতে চাই wanted :)
ল্যান্ডনশ্রপ্প

-1

এখানে অন্য বিকল্প :)

tmux-list-sessions-autofill() {
    reply=( `tmux list-sessions | sed "s/:.*//g"` );
}

===== সম্পাদনা =====

সুতরাং আমি আমার উত্তরটি এখানে সংশোধন করছি, @ নেট ওয়ার্কিংপিংপিনের মন্তব্যের প্রতিক্রিয়াতে।

@ ল্যান্ডনস্ক্রপের মূল পোস্টে আপনার tmux-list-sessions-autofill()ফাংশনটি কেবল এতে পরিবর্তন করা উচিত :

tmux-list-sessions-autofill() {
    reply=( `tmux list-sessions -F '#{session_name}'` ); 
}

লক্ষ্য করুন যে আমার মূল পোস্টে, আমি sedসেশনের নামগুলি ছাড়াও অন্য কোনও তথ্য মুছতে ব্যবহার করছি। কিন্তু এবার আমি একজন ব্যবহার করছি -Fআমার যুক্তি, যা বলে tmuxকরতে শুধুমাত্র অধিবেশন নাম মুদ্রণ এবং অন্য কোন তথ্য লাফালাফি।

এটি আমার পক্ষে দুর্দান্ত কাজ করে। আশা করি এটি যথেষ্ট স্পষ্ট।


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