একটি zsh কমান্ড লাইনে সমস্ত উপকরণ সমাধান করুন


12

আমি উপবাসের নেস্ট করেছি এবং কমান্ডটি কার্যকর করার আগে আমি তাদের সবগুলি সমাধান করতে চাই। আমি কেমন করে ঐটি করি?

যদি এমন কোনও ফাংশন থাকে যা কোনও কীগুলির সাথে আবদ্ধ না M-x foobarহয় তবে আমার পক্ষেও তা ঠিক আছে। আমি এমনকি বাইরের কমান্ড ব্যবহার করতে পারে ( type, command, whichযাই হোক না কেন)। আমি থ্রেড থেকে সবকিছু চেষ্টা করেছিলাম কেন "কোন" ব্যবহার করবেন না? তাহলে কী ব্যবহার করবেন? কিন্তু কিছুই কাজ করে না।


2
C-x aকার্সারের অধীনে উপন্যাসটি প্রসারিত করে (ধরে নিবেন আপনি সমাপ্তি সিস্টেমটি ব্যবহার করছেন)।
স্টাফেন চেজেলাস

ঠিক _expand_alias (^Xa): expands the word the cursor is on if it is an alias,। এটি সহায়ক, তবে এখনও এটি একটি আক্ষেপের বিষয় যে ব্যাশে কোনও পুরো লাইনটি প্রসারিত করতে পারে তবে zsh এ নয়।
ওয়েসেন্সএএসএলসৌনসন্ধানঅফস উত্তরগুলি

আমি মনে করি যে একটি বাইন্ডেবল কমান্ড লিখতে পারা সম্ভব _expand_aliasযা সম্পাদনা বাফারটি আর পরিবর্তন না করা অবধি সাহায্য করবে।
ভিনক

উত্তর:


10

মনে রাখবেন যে Ctrl-Alt-E ইন bashকেবলমাত্র এলিয়াসগুলি প্রসারিত করে না। এটি ভেরিয়েবল, কমান্ড সাবস্টিটিউশন (!), প্রসেস সাবস্টিটিউশন (!), পাটিগণিতকে প্রসারিত করে এবং উদ্ধৃতিগুলি সরিয়ে দেয় (এটি ফাইল নাম জেনারেশন (গ্লোব্বিং) বা টিল্ড সম্প্রসারণ করে না)।

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

উদাহরণস্বরূপ:

$ a=';w' b=1
$ alias foo=bar
$ b=2; echo $b $a; cd /tmp/dir && for i do foo $(pwd) <(ls); done

আমি যদি M-C-Eএখানে টিপতে পারি তবে তা আমাকে দেয়:

$ b=2; echo 1 ;w; cd /tmp/dir && for i do foo / /dev/fd/63; done

যা আমাকে পুরোপুরি আলাদা কমান্ড লাইন দেয় (এবং কল্পনা করুন যে আমি যদি উপরের rm -rf *পরিবর্তে থাকতাম তবে কী ঘটত pwd) এবং fooউপনামটি প্রসারিত না করে ।

এর সাথে zshগিলসের নোটটি বাড়তি ফাংশনগুলির অভ্যন্তরে প্রসারিত এলিয়াসগুলিতে তৈরি করতে আপনি করতে পারেন:

expand-aliases() {
  unset 'functions[_expand-aliases]'
  functions[_expand-aliases]=$BUFFER
  (($+functions[_expand-aliases])) &&
    BUFFER=${functions[_expand-aliases]#$'\t'} &&
    CURSOR=$#BUFFER
}

zle -N expand-aliases
bindkey '\e^E' expand-aliases

এটি কেবলমাত্র যদি বর্তমান কমান্ড লাইনটি সিন্ট্যাক্টিকভাবে বৈধ হয় (তবে এটি একটি সিনট্যাক্স পরীক্ষক হিসাবে দ্বিগুণ হয়) কেবলমাত্র আলিয়াসগুলি প্রসারিত করবে।

bashএর এমসিই এর বিপরীতে , এটি এলিয়াসগুলি পুরোপুরি সমাধান করে। উদাহরণস্বরূপ যদি আপনার কাছে থাকে:

$ alias ll='ls -l'; alias ls='ls --color'
$ ll

এতে প্রসারিত হবে:

$ ls --color -l

মনে রাখবেন যে এটি সিনট্যাক্সটিকেও আখ্যায়িত করে তাই জিনিসগুলির মতো:

$ for i (*) cmd $i; foo

এতে পরিবর্তন করা হবে:

$ for i in *
        do
                cmd $i
        done
        foo

এটি বগি। যদি আমার কাছে থাকে alias ls='ls --color'এবং টাইপ C-x aকরে তবে lsআমি পেয়ে যাব: \ls --color(যাতে lsনতুনটি একটি উপ নাম হিসাবে ভুল ব্যাখ্যা করা না যায়)। তবে আপনার সাথে expand-aliases, আমি পেয়েছি ls --color:, ফলাফলটি অস্পষ্ট করে তুলেছে।
ভিঙ্ক

@ ভিঙ্ক ১17, এটি দ্বিধাবিভক্ত নয় যে এটি পুরোরূপে উপনামটি সমাধান করে (সম্মানের সাথে এটি bashসমপরিমাণের তুলনায় কম বগি )। তবে এটি সত্য যদি আপনি এর পরে কমান্ডটি চালনা করেন তবে আপনি আরএফ সম্প্রসারণের আরও একটি রাউন্ড পাবেন (যেমন এর মতো bash), সুতরাং আদর্শিকভাবে আপনি অস্থায়ীভাবে ওরফে প্রসারকে অক্ষম করতে চান, উদাহরণস্বরূপ এটিতে একটি মোড়ানো (){ setopt localoptions noexpandalias; ...; }। মনে রাখবেন আপনি _expand_aliasবগি বলতে পারেন পাশাপাশি চালানোর সময় এটি উপনামটি প্রসারিত করে \ls
স্টাফেন চেজেলাস

@ ভিঙ্ক ১17, যে ব্যাকস্ল্যাশ পালাতে পেরেছিল _expand_aliasতাও সহজে alias 'foo=repeat 3 foo'বা এর মতো বোকা হয়ে যায় alias ls='ls --color'; alias '\ls=echo fooled'। এখানে কোনও নিখুঁত সমাধান নেই।
স্টাফেন চেজেলাস

বিষয়ে _expand_aliasজন্য alias 'foo=repeat 3 foo', আমি একটি বাগ হিসাবে অনুপস্থিত ব্যাকস্ল্যাশ বিবেচনা করবে। এবং alias '\ls=echo fooled'অনুমতি দেওয়া উচিত নয়; এখানে আমি ব্যাশ পছন্দ করেন, যেখানে বলা আছে: bash: alias: '\ls': invalid alias name
ভিঙ্ক

@ ভিঙ্ক ১17, আমি দেখতে পাচ্ছি না যে কীভাবে এটি অন্য কোনও কিছু হিসাবে সীমাবদ্ধতা ছাড়া দেখা যায় bash। আপনি যদি ব্যাকস্ল্যাশ সহ এলিয়াস পছন্দ না করেন তবে সেগুলি ব্যবহার করবেন না তবে আপনি কেন শেলটি তা প্রত্যাখ্যান করতে চান? এলিয়াসগুলি সিএস-এ (যেখানে তারা আসে) কোনও দরিদ্র মানুষের ফাংশন প্রতিস্থাপন করা হয়, বোর্নের মতো শেলগুলিতে, তারা এমন কৌশলগুলি করতে হ্যাক হয় যা ফাংশন দিয়ে করা যায় না, ম্যাক্রো সম্প্রসারণের কিছু ফর্ম যা শেল পার্সারের শুরুর দিকে হুক হয় , এটি কী করতে পারে তা সীমাবদ্ধ করার বিষয়টি আমি দেখতে পাচ্ছি না।
স্টাফেন চেজেলাস

6

যদি আপনি কোনও ফাংশন সংজ্ঞায় কমান্ড লাইনটি স্টাফ করেন এবং তারপরে ফাংশনটি মুদ্রণ করেন তবে উপকরণগুলি প্রসারিত হবে। আপনি স্বাভাবিকীকরণের সাদা স্থানও পাবেন।

% alias foo='bar -1'
% alias bar='qux -2'
% f () foo -3
% which f
f () {
        qux -2 -1 -3
}

এই সমস্তটি একটি ইন্টারেক্টিভ কমান্ডে রাখার জন্য, আপনি একটি জেল উইজেট তৈরি করতে পারেন। functionsঅ্যারেতে কোনও এন্ট্রিতে এর কোডটি স্টফ করে আপনি সরাসরি কোনও ফাংশন সংজ্ঞায়িত করতে পারেন ; আপনি যখন পড়বেন তখন আপনি স্বাভাবিকীকরণের প্রভাব পাবেন।

normalize-command-line () {
  functions[__normalize_command_line_tmp]=$BUFFER
  BUFFER=${${functions[__normalize_command_line_tmp]#$'\t'}//$'\n\t'/$'\n'}
  ((CURSOR == 0 || CURSOR = #BUFFER)
  unset 'functions[__normalize_command_line_tmp]'
}
zle -N normalize-command-line
bindkey  normalize-command-line

আপনি preexecহুক একই নরমালাইজেশন প্রভাব পাবেন । কোনও ফাংশন স্বয়ংক্রিয়ভাবে চালিত হওয়ার সময় উপাধিগুলিও প্রসারিত হয় ( autoload -Uসাধারণত ওরফে প্রসার এড়াতে ব্যবহৃত হয়)।

_expand_aliasযদি এটা উপনাম এর পরিপূরণ ফাংশন কার্সার অধীনে শব্দ বিস্তৃতি ঘটে। এটি aliasesঅ্যারে ব্যবহার করে । এটি পুনরাবৃত্ত হয় না। আপনি আরও সাধারণ জেনারেল ওরফে এক্সপেন্ডার ব্যবহার করে প্রয়োগ করতে পারেন aliasesতবে এটি কিছুটা কঠিন, কারণ যে জায়গাগুলির এলিয়াসগুলি প্রসারিত করা হয়েছে তা শেল সিনট্যাক্সের সাথে নিবিড়ভাবে সংযুক্ত করা হয়েছে fig


2
আমি সর্বদা autoload -Uসহজভাবে ব্যবহার করি কারণ zsh ডকুমেন্টেশন এটির প্রস্তাব দেয় তবে আমি এটি -Uপড়ার আগে পর্যন্ত কখনই বুঝতে পারি নি :) এছাড়াও কেউ আগ্রহী, এক ডাকা যাবে _expand_alias , কমান্ড লাইন মধ্যে আপনার ওরফে টাইপ আঘাত করে সরাসরি কাজ <Esc>, x, minibuffer আরম্ভ করার জন্য, তারপর টাইপ_expand_alias<Enter>
the_velour_fog

2

যদি আপনার অনেক নেস্টেড অভিনব উপাখাগুলি থাকে এবং আপনি নিশ্চিত নন যে zsh আসলে তাদের সাথে কী করছে এবং কোন ক্রমের বিকল্পগুলি কমান্ডে প্রেরণ করা হয় তবে আপনি সর্বদা -xবিকল্পের সাথে zsh শুরু করতে পারেন । এটি কার্যকর হওয়ার সাথে সাথে কমান্ড এবং আর্গুমেন্টগুলি মুদ্রণ করবে।

তবে সচেতন থাকুন যে এই বিকল্পটি ডিবাগিং উদ্দেশ্যে নয় বরং এটি zsh -xবিন্যাসের (মূলত প্রতিটি আপনার ফাংশন / উইজেট / আপনার .zshrc এর প্লাগইন) পরে প্রচুর অব্যর্থ স্টাফগুলি মুদ্রণ করে এবং কমান্ড কার্যকর করার সময় এটি ক্রিয়াগতও হতে পারে, বিশেষত আপনি সংজ্ঞায়িত preexecএবং precmdহুক যদি।

আমার আরও উল্লেখ করা উচিত, এটি কেবলমাত্র সেই আদেশগুলি প্রিন্ট করে যা শেষ পর্যন্ত সম্পাদিত হয় এবং পৃথক কমান্ডগুলি পৃথকভাবে মুদ্রিত হয় তার পরে

alias a='echo a'
alias b='echo b'
alias c='echo c'
alias d='echo d'
a && b || c; d

তুমি দেখবে

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