जब मैंने "vi" टाइप किया, तो स्वचालित रूप से पता लगाएं, लेकिन इसका मतलब "cd" था?


21

दिन में लगभग 5 बार, मैं "vi" टाइप करता हूं जब मेरा मतलब "cd" होता है, और vi में एक डायरेक्टरी खोलना होता है। यह मुझे NUTS बना रहा है। ऐसा लगता है जैसे "vi + निर्देशिका" में टाइप करने पर पता लगाने का एक तरीका होना चाहिए और स्वचालित रूप से इसे "cd + निर्देशिका" में बदल दें। विचार?


1
मैंने एक विकल्प दिया कि आप इंटररेलिंग भी पा सकते हैं ^ ^ (एक है जो आपको समस्या के स्रोत को ठीक करने देता है, जबकि तब तक परेशान होने से बचेगा जब तक ^ ^)
ओलिवियर डुलैक


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

1
केवल थोड़ी मात्रा में मुखरता के साथ: zsh में बदलें। इसे सेट करें ताकि जब आप कोई निर्देशिका नाम टाइप करें तो यह उस निर्देशिका में परिवर्तित हो जाए। प्रत्यय उपनाम का उपयोग करें ताकि जब आप * .sh, * .c, * .config टाइप करें जो भी वह प्रासंगिक फ़ाइल को vi में खोलता है। यहाँ कैविएट निश्चित रूप से है कि आप अपने आप को अपरिचित खोल में "vi" या "cd" छोड़ सकते हैं।
मकिंस्टन

3
यह कैसे होता है?
JFA

जवाबों:


38

इस धारणा के साथ कि आप viनिर्देशिका के साथ अंतिम तर्क के रूप में कहते हैं :

vi() {
    if [[ -d ${!#} ]]; then
        cd "$@"
    else 
        command vi "$@"
    fi
}

2
@ मुझे लगता है कि यह उन दोनों दुर्लभ मामलों के लिए एकदम सही है, जिन्हें आपने "cd" के बजाय "vi" गलत तरीके से टाइप किया था, जबकि एक ही समय में आप हमेशा "vi" टाइप करना सिखाते हैं;) [अर्थात, मुझे उम्मीद है कि आप अक्सर नहीं करते हैं। एक और सर्वर / मशीन का उपयोग करना होगा जहाँ वह फ़ंक्शन आपको तनाव से बचाने के लिए नहीं होगा ...] [1] उस उत्तर के लिए, हालाँकि, यह वही है जो मैं भी उत्तर देना चाहता था, सिवाय इसके कि मैं "$ {के लिए परीक्षण करूं 1} "[और फिर cd" $ {1} "] के बजाय" $ {! #} "...]
ओलिवियर दुलक

5
@OlivierDulac सहमत - इसी तरह खतरनाक aliasing है rmकरने के लिए rm -iहै, जो कई वितरण में डिफ़ॉल्ट है। मैं आमतौर पर सोचता हूं कि समस्याओं को हल करने का सबसे अच्छा तरीका उपयोगकर्ता को उनके आसपास काम करने के बजाय हल करना है।
क्रिस डाउन

3
@OlivierDulac के उर्फिंग rmसे rm -iआपको अतीत में कुछ परेशानी से बचाया जा सकता है, लेकिन भविष्य में आपको और अधिक परेशानी हो सकती है ...
jlliagre

1
@ अलेक्स वेल, आपने viसवाल में कहा था ...
क्रिस डाउन

2
@ क्रिशरॉन: ${!#}अप्रत्यक्ष रूप से अंतिम तर्क का संदर्भ देता है, और commandकेवल इस उदाहरण में फ़ंक्शन पुनरावृत्ति से बचने के लिए आवश्यक है।
क्रिस डाउन

4

@ChrisDown जवाब के अलावा, यहां एक और दृष्टिकोण है: बाईपास निर्देशिका

इस दृष्टिकोण के साथ, आप कर सकते हैं:

vi ./*

और यह वर्तमान निर्देशिका में सभी फाइलों पर vi शुरू करेगा, भले ही इसमें उप-विभाजक हों, उन उप-विभाजनों को दरकिनार करें

vi() {
  for arg do
    [ -d "$arg" ] || set -- "$@" "$arg"
    shift
  done
  [ "$#" -gt 0 ] && command vi "$@"
}

यह केवल vi, किसी भी तर्क पर, जो निर्देशिका नहीं हैं ... इसलिए यह आपको "cd;" के लिए "vi" का उपयोग करना नहीं सिखाएगा;

और यह vi नहीं कहेगा यदि आपने अभी किया: vi किसी दिन (यानी, cd के बजाय गलत vi)। लेकिन यह स्वचालित रूप से वहाँ तो सीडी नहीं होगा, इसलिए आपको अभी भी याद है कि आपको सीडी ^ ^ टाइप करना होगा

मैंने तर्क सूचियों को बदलने के लिए "संगत" तरीके का उपयोग किया, ताकि यह कई प्लेटफार्मों पर पोर्टेबल हो।


1
नोट:: command something"कुछ" ("कुछ" नाम का उपयोग करके पाया जाने वाला "कुछ" का पहला आदेश शुरू होता है), "कुछ" नामक किसी अन्य उपनाम या फ़ंक्शन के बजाय "$ PATH का उपयोग करते हुए पाया गया"। \somethingकेवल अलियास को दरकिनार करेगा, लेकिन फिर भी यदि यह मौजूद है (और यहां, इसका मतलब है कि फ़ंक्शन "vi" खुद को कॉल करेगा, और लूप)।
ओलिवियर दुलैक

@ क्रिसडाउन: हम एक उपयोगकर्ता के लिए एक सहायता की बात कर रहे हैं, जो मुझे आशा है कि खुद को ^ ^ हैक करने की कोशिश नहीं करेगा। और यह निष्कासन तर्क का एक नया सेट (सेट - ...) सेट करना है, इसलिए यह अपने आप में कम खतरनाक नहीं है
ओलिवियर दुलक

@ स्टेफ़ेनचेज़लस: संपादन के लिए धन्यवाद! मैंने इसे इस तरह से लिखने की कोशिश की, लेकिन मैं असीम रूप से लूपिंग के बारे में चिंतित था [मुझे विश्वास है कि आप इसे लूप नहीं करेंगे, हालांकि!] आंतरिक उपचार शुरू होने से पहले 'arg' का मूल्यांकन किया जा रहा है, और इसलिए इसकी "$ @" सूची 'बचाई' गई है और इससे अधिक पुनरावृत्ति हुई है, और तब भी नहीं बदली है जब तक आंतरिक उपचार "$ @" बदल जाता है?
ओलिवियर दुलारी

1

एक समाधान cdपूरी तरह से उपयोग करना बंद करना है । रखो shopt -s autocdअपने में .bashrcया setopt autocdअपने में .zshrc। फिर किसी भिन्न निर्देशिका में बदलने के लिए, बिना किसी आदेश के निर्देशिका नाम टाइप करें।

viयदि आप किसी फ़ाइल को संपादित करना चाहते हैं, तो टाइप करना न भूलें ।

यदि आप वास्तव में एकल कमांड चाहते हैं कि या तो किसी डायरेक्टरी में बदलाव किया जाए या किसी फाइल को एडिट किया जाए, तो आप इसे फंक्शन बना सकते हैं:

vi () {
  if [ $# -eq 1 ] && [ -d "$1" ]; then
    cd -- "$1"
  else
    command vi "$@"
  fi
}

-6

यूनिक्स में अन्य सुविधा का उपयोग करें। एक बार जब आप उर्फ ​​सीडी को vi करने के लिए, समस्या हल हो जाएगी।


5
... इसका मतलब यह होगा कि viकोई भी मैन्युअल रूप से उर्फ ​​को ओवरराइड किए बिना उपयोग नहीं कर सकता है , जो अत्यधिक अवांछनीय लगता है।
क्रिस डाउन

3
यह जवाब थोड़ा ट्रोलिश के रूप में सामने आता है। यह करता है के रूप में ओपी वे कभी भी एक फ़ाइल पर vi जरूरत निर्दिष्ट नहीं किया मूल सवाल का जवाब,। जवाब, हालांकि कुछ हद तक मजेदार है, निश्चित रूप से उपयोगी नहीं है।
जेरिट

1
@ क्रिसडाउन या यह आपको vimइसके बदले उचित उपयोग करना सिखाएगा ।
केविन

@ केविन विम कई प्रणालियों पर vi से अधिक "उचित" नहीं है, vi वह सभी उपलब्ध है।
क्रिस डाउन

1
@ChrisDown मैं यह जानना बेहतर होगा कि क्या उम्मीद की जाए। यदि आप विम विशेषताओं का उपयोग करने की अपेक्षा करते हैं, तो उपयोग करें vim। यदि यह उपलब्ध नहीं है, तो उपयोग करें viऔर अधिक सीमित सुविधा सेट की अपेक्षा करें।
केविन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.