পূর্ববর্তী কমান্ড থেকে zsh সমাপ্তিতে যুক্তি যুক্ত করুন


22

Zsh এ (পাশাপাশি বাশ) আপনি পূর্ববর্তী কমান্ডগুলি থেকে যুক্তি বোঝাতে কিছু ইতিহাস শব্দ বিস্তৃতি ব্যবহার করতে পারেন।

এই উদাহরণটি ইতিহাসের পূর্ববর্তী কমান্ড থেকে !:#প্রসার সহ দ্বিতীয় প্যারামিটারটি প্রাপ্ত দেখায় :

% echo foo bar baz
foo bar baz
% echo !:2
echo bar
bar

আমি প্রায়শই ভুলে যাই যে কোনও নির্দিষ্ট যুক্তিটি কী # প্যারামিটার এবং টাইপটি !:#সবসময় তত দ্রুত হয় না যখন আমি মনে করি এটি কোন যুক্তি। আমি meta-.সর্বশেষ যুক্তিটি প্রতিস্থাপন করতে জানি , তবে কখনও কখনও এটি সর্বশেষ যুক্তিটি আমার পছন্দ হয় না।

আমি zsh টাইপ করছি এমন কোনও কমান্ড সম্পূর্ণ করার পরামর্শ হিসাবে আমি পূর্ববর্তী কমান্ড থেকে যুক্তি যুক্ত করতে চাই।

আমি শেল ফাংশনটি কীভাবে তৈরি করতে পারি তা শেষ কমান্ড থেকে আর্গুমেন্টের অ্যারে (0..N) তৈরি করতে এবং এটি একটি নির্দিষ্ট কমান্ডে আবদ্ধ করতে সক্ষম হয়েছি।

_last_command_args() {
    last_command=$history[$[HISTCMD-1]]
    last_command_array=("${(s/ /)last_command}") 
    _sep_parts last_command_array
}

# trying to get last_command_args to be suggested for any command, this just works for foo
compdef _last_command_args foo

আমি এখানে ট্যাব কীটি টিপলাম ঠিক ফু ফু করার জন্য এটি দেখতে দেখতে এটি দেখতে <TAB>:

% echo bar baz qux
bar baz qux
% foo <TAB>
bar   baz   echo  qux 

"Foo" কমান্ডটি সম্পূর্ণ করার জন্য এটি দুর্দান্ত কাজ করে তবে আমি চাই যে কোনও zsh প্রসারণের ক্ষেত্রে এগুলি বিকল্প হতে পারে। আমি মনে করি জাস্টাইল কমপ্লিট স্টাফগুলির সাথে এটির কিছু করার ছিল, তবে কয়েক ঘন্টা হ্যাক করার পরে আমি বুঝতে পারি যে আমি আমার গভীরতার বাইরে।

Zsh এ যে কোনও কমান্ডের প্রস্তাবিত পরিপূরণ হিসাবে আমি আমার পূর্ববর্তী কমান্ড থেকে যুক্তিগুলি কীভাবে পেতে পারি?

আমি যদি আমার সহায়তা করে তবে আমার সম্পূর্ণ zshrc কমপ্লেস্টল ফাইলটি বিটবাকেটে ভাগ করে নেওয়া হয়েছে that এর প্রচুর অংশ বিভিন্ন উত্স থেকে আঁকছে এবং এর কয়েকটি আমি নিজেই হ্যাক করেছি।

হালনাগাদ:

@ জুলিয়েন নিকোলাউডের উত্তর আমাকে কাছে পেয়েছে, আমি যেখানে পেয়েছি সেখানে আমাকে যেমন পেয়েছে ঠিক তেমন গ্রহণযোগ্য হিসাবে চিহ্নিত করছি।

আমার নির্দিষ্ট কনফিগারেশনের মাধ্যমে, প্রস্তাবিত ব্যবহার করে:

zstyle ':completion:*' completer _last_command_args _complete

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

আমি অনুমান করছি যে সম্পূর্ণরূপে কাজ করার সাথে এর কিছু আছে। আমি মনে করি এটি কেবল প্রথম পদ্ধতি থেকে আউটপুট প্রদর্শন করে যা সফলভাবে ফিরে আসে, তবে কী চলছে তা পুরোপুরি বুঝতে zsh উত্সকে পার্স করতে আমার সমস্যা হচ্ছে। আমি কলটিতে অন্তর্ভুক্ত করার জন্য আমার পদ্ধতিটি সামঞ্জস্য করতে সক্ষম হয়েছি _completeযাতে এটি সর্বশেষ যুক্তি কমান্ডের পাশাপাশি নিয়মিত স্বতঃপূরণ স্টাফ উভয়ই দেখায়। পুরোপুরি বিচ্ছিন্ন নয়, তবে আমার পক্ষে যথেষ্ট কাজ করে।

আমার কাছে থাকা অন্যান্য জাস্টাইল স্টাফগুলির সাথে আমি ব্যবহৃত পুরো ফাংশনটি এখানে:

# adds the arguments from the last commadn to the autocomplete list
# I wasn't able to get this to work standalone and still print out both regular
# completion plus the last args, but this works well enough.
_complete_plus_last_command_args() {
    last_command=$history[$[HISTCMD-1]]
    last_command_array=("${(s/ /)last_command}") 
    _sep_parts last_command_array
    _complete 
}


_force_rehash() {
  (( CURRENT == 1 )) && rehash
  return 1  # Because we didn't really complete anything
}

zstyle ':completion:::::' completer _force_rehash _complete_plus_last_command_args _approximate 

আমার কাছে অন্যান্য জাস্টাইল লাইনগুলি কাজ করার জন্য এটি প্রয়োজনীয় নয় তবে এটি আমার জন্য কেন কাজ করে তা প্রভাবিত করতে পারে:

zstyle -e ':completion:*:approximate:*' max-errors 'reply=( $(( ($#PREFIX + $#SUFFIX) / 3 )) )'
zstyle ':completion:*:descriptions' format "- %d -"
zstyle ':completion:*:corrections' format "- %d - (errors %e})"
zstyle ':completion:*:default' list-prompt '%S%M matches%s'
zstyle ':completion:*' group-name ''
zstyle ':completion:*:manuals' separate-sections true
zstyle ':completion:*' menu select
zstyle ':completion:*' verbose yes

এখন, আমি যদি সঙ্গে একটি ডিরেক্টরির মধ্যে আছি file1.txtএবং file2.txt, এবং আমার গত কমান্ড ছিল echo foo bar baz, আমি এই স্বয়ংসম্পূর্ণ জন্য পেতে যা আমি কি চেয়েছিলাম:

% ls
bar   baz   echo  foo 
- files -
file1.txt   file2.txt 

2
এটি একটি দর্শনীয় ধারণা
মাইকেল মরোজেক

2
পরিপূরক করতে ^[ .( insert-last-word), আমি পছন্দ করি copy-earlier-word, রেখার শব্দের মধ্যে কোন চক্রটি পৌঁছেছে insert-last-word। আপনার জন্য .zshrc:autoload copy-earlier-word && zle -N copy-earlier-word && bindkey '^[,' copy-earlier-word
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

@ গিলিস ধন্যবাদ! আমি পূর্ণ স্বয়ংক্রিয়তা অর্জন করতে সক্ষম না হলে এটি আমার কার্যকারিতার আরও কাছাকাছি চলে যায়। ~ 80% সময়, এটি যদি সর্বশেষ যুক্তি না হয় তবে এটি আমার দ্বিতীয়বারের মতো শেষ যুক্তি এবং সি- + সি-, বেশ ভাল।
টেড নালিড

উত্তর:


6

আপনি ডিফল্টরূপে ব্যবহৃত পরিপূরণকারীগুলির তালিকায় আপনার সম্পূর্ণটি যুক্ত করতে পারেন:

zstyle ':completion:*' completer _last_command_args _complete

1
যদি কোনও _last_command_argsপরিপূর্ণতা থাকে তবে অন্যগুলি প্রদর্শিত হয় না। আপনি কীভাবে এগুলি স্বাভাবিকের সাথে যুক্ত করবেন?
গিলস 21'6 06 এ 'দুষ্ট হওয়া বন্ধ করুন'

1
উত্তরের জন্য ধন্যবাদ, এটি আমার জন্য কিছু কাজ করার জন্য যথেষ্ট পরিমাণে পেয়েছিল, তাই আমি এটি গ্রহণ করছি। আমি আলাদাভাবে যা করেছি তা উপরের প্রশ্নের আপডেট হিসাবে উল্লেখ করা হয়েছে। আপনার সমাধানটি সর্বশেষ কমান্ড থেকে উভয় আর্গুমেন্টের পাশাপাশি ফাইল, ইত্যাদি সম্পূর্ণ পরিপূর্ণ থেকে প্রিন্ট করে না। আমি _completeআমার তৈরি ফাংশনের ভিতরে রচনা করেছি এবং এটি যেমনটি চেয়েছিল ঠিক তেমন কাজ করে।
টেড নালিড

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