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
^[ .
( insert-last-word
), मुझे पसंद है copy-earlier-word
, जो रेखा के शब्दों के बीच चक्र तक पहुंच गया insert-last-word
। आपके लिए .zshrc
:autoload copy-earlier-word && zle -N copy-earlier-word && bindkey '^[,' copy-earlier-word