पिछले कमांड से zsh पूरा करने के लिए तर्क जोड़ें


22

Zsh (साथ ही bash) में आप पिछले आदेशों से तर्कों को निरूपित करने के लिए कुछ इतिहास शब्द विस्तार का उपयोग कर सकते हैं।

यह उदाहरण !:#विस्तार के साथ इतिहास में पिछली कमांड से दूसरा पैरामीटर प्राप्त करना दिखाता है :

% 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 

कमांड "फू" को पूरा करने के लिए यह बहुत अच्छा काम करता है, लेकिन मैं चाहूंगा कि ये मेरे द्वारा किए जाने वाले किसी भी zsh विस्तार पर विकल्प हों। मुझे लगता है कि इसे जिस्टल कंपाइलर सामान के साथ कुछ करना है, लेकिन कुछ घंटों तक हैक होने के बाद मुझे एहसास हुआ कि मैं अपनी गहराई से बाहर हूं।

मैं अपनी पिछली कमांड से तर्क कैसे प्राप्त कर सकता हूं क्योंकि zsh में किसी भी कमांड के लिए सुझाव पूर्ण हैं?

अगर मुझे मदद मिलती है तो मैंने अपना पूरा zshrc कॉम्पिटिट फ़ाइल बिटबकेट पर साझा किया है। यह बहुत सारे स्रोतों से भरा हुआ है और इसमें से कुछ को मैंने खुद एक साथ हैक किया है।

अद्यतन करें:

@ जुलिएन निकुलाउड का जवाब मुझे करीब मिला, मैं इसे स्वीकार कर रहा हूं क्योंकि यह मुझे मिला जहां मुझे पाने की जरूरत थी।

मेरे विशेष विन्यास के साथ, सुझाव का उपयोग कर:

zstyle ':completion:*' completer _last_command_args _complete

मेरे लिए काफी काम नहीं किया क्योंकि यह टैब को पूरा करने के लिए केवल अंतिम कमांड से तर्कों की सूची प्रदर्शित करने का कारण बन रहा था (हालांकि यह वास्तव में फ़ाइल नाम के साथ ही पूरा होगा, बस उन्हें प्रदर्शित नहीं करें)। _complete _last_command_argsउल्टा करने का आदेश बदल दिया । यह सामान्य फ़ाइल नाम प्रदर्शित करेगा, लेकिन last_command_args नहीं

मैं अनुमान लगा रहा हूं कि कंपाइलर के काम करने के तरीके से इसका कुछ लेना-देना है। मुझे लगता है कि यह केवल पहली विधि से आउटपुट प्रदर्शित करता है जो सफलतापूर्वक लौटता है, लेकिन मुझे यह समझने में परेशानी हो रही है कि zsh स्रोत को पूरी तरह से समझने में क्या हो रहा है। मैं एक कॉल को शामिल करने के लिए अपनी विधि को ट्वीक करने में सक्षम था _completeताकि यह दोनों अंतिम तर्क आदेशों के साथ-साथ नियमित स्वत: पूर्ण सामान दिखाए। काफी अलग नहीं है, लेकिन मेरे लिए काफी अच्छा काम करता है।

यहाँ मैं अन्य zstyle सामान के साथ इस्तेमाल किया पूरा समारोह है:

# 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 लाइनें मेरे पास हैं, काम करने के लिए यह आवश्यक नहीं है, लेकिन यह मेरे लिए यह काम करता है क्यों प्रभावित कर सकता है:

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
यह एक शानदार विचार है
माइकल Mrozek

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% समय, यदि यह अंतिम तर्क नहीं है, तो यह दूसरा तर्क है जो मुझे चाहिए और C-। + C-, बहुत अच्छा है।
टेड नालेड

जवाबों:


6

आप अपने कंपाइलर को डिफ़ॉल्ट रूप से उपयोग किए गए पूर्णकों की सूची में जोड़ सकते हैं:

zstyle ':completion:*' completer _last_command_args _complete

1
यदि कोई _last_command_argsपूर्णता है, तो अन्य नहीं दिखाए जाते हैं। आप उन्हें सामान्य लोगों के अलावा कैसे प्राप्त करेंगे?
गाइल्स का SO- बुराई पर रोक '21

1
जवाब के लिए धन्यवाद, यह मुझे मेरे लिए काम करने के लिए काफी करीब मिल गया, इसलिए मैं इसे स्वीकार कर रहा हूं। मैंने जो कुछ अलग किया वह उपरोक्त प्रश्न के अद्यतन के रूप में किया गया है। आपके समाधान ने अंतिम कमांड के साथ-साथ फाइलों, आदि के सामान्य तर्क से दोनों तर्कों को नहीं छापा। मैंने अपने द्वारा बनाए _completeगए फ़ंक्शन के अंदर रचना की और यह उसी तरह काम करता है जैसे मैं इसे चाहता था।
टेड नालेड

आप सही हैं, मेरा जवाब सही नहीं है।
निकुंज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.