Zsh को "सही" कार्यक्षमता बनाने के लिए मेरे वर्तनी-सुधार के फैसले कैसे याद रखें


24

मैंने अपने में सक्षम करके zsh में सुधार (मैं इसे विशेष रूप से इस मुद्दे के कारण स्वतः पूर्णता नहीं कहूंगा) को सक्षम setopt correctकिया है .zshrc

अब, जब मैं dtaeएक टर्मिनल में टाइप करता हूं, मुझे मिलता है:

dtae        
zsh: correct 'dtae' to 'date' [nyae]? y
Tue Mar 31 11:39:31 CEST 2015

इस समय मैं अपने निर्णय को याद रखना चाहूंगा। इसलिए अगली बार जब मैं टाइप करूं तो dtaeयह अपने आप सही हो जाना चाहिए date[1]। हालाँकि, ऐसा नहीं होता है, और zsh फिर से मुझसे पूछ रहा है कि मुझे क्या करना है:

dtae
zsh: correct 'dtae' to 'date' [nyae]?

[१] जब तक कि निश्चित रूप से, उस समय कोई वास्तविक dtaeआदेश या उपनाम मौजूद न हो ।

अद्यतन करें:

मैं zsh के "सही" कार्यक्षमता के आह्वान के साथ स्वचालित रूप से बनाई गई उपनाम युक्त एक कस्टम फ़ाइल बनाने के लिए zsh स्रोत कोड (फ़ाइल utils.c, फ़ंक्शन spckword) को संशोधित करने में कामयाब रहा हूं :

मूल:

if (x == 'y' || x == ' ' || x == '\t') 
{
    *s = dupstring(best);
    if (hist)
    hwrep(best);
}

संशोधित:

if (x == 'y' || x == ' ' || x == '\t')
{
    char *aliaspath = getenv("HOME");
    strcat(aliaspath, "/.zsh_correct_aliases");
    FILE *out = fopen(aliaspath, "ab+");
    fprintf(out, "alias %s=\'", *s);
    *s = dupstring(best);
    fprintf(out, "%s\'\n", *s);
    fclose(out);
    if (hist)
    hwrep(best);
}

निष्पादित करने पर dtae, फ़ाइल में निम्न पंक्ति जोड़ी जाती है ~/.zsh_correct_aliases:

alias dtae='date'

हालाँकि, मैं नहीं जानता कि कैसे नई संशोधित ~/.zsh_correct_aliasesफ़ाइल को इन-प्लेस किया जा सकता है।


1
क्या आप चाहते हैं कि इसे केवल शेल प्रक्रिया जीवनकाल के लिए याद रखा जाए, या वह जानकारी जो फाइलों में संग्रहीत है। क्या याद किया गया यह सुधार वर्तमान में चल रहे सभी मामलों में तुरंत उपलब्ध होना चाहिए? क्या आप याद किया हुआ सुधार चाहते हैं जब dtaeअस्तित्व में आ जाए या अस्थायी रूप से अक्षम हो जाए?
स्टीफन चेज़लस

1
@ StéphaneChazelas 1) एकल फ़ाइल में संग्रहीत सबसे अच्छा होगा। 2) यह एक प्लस होगा, लेकिन सख्ती से जरूरी नहीं। 3) जब तक dtaeमौजूद नहीं है, तब हटा दिया जाता है, अगर / जब dtaeअब परिभाषित नहीं है।
श्रग

3
यह शायद वहाँ एक समर्पित zsh हुक फ़ंक्शन को कॉल करने के लिए अधिक समझ में आता है (जैसे command_not_found_handlerकि रनटाइम के बजाय पार्सिंग समय पर), और फिर zsh कोड में तर्क को लागू करें।
स्टीफन चेज़लस

7
मुझे नहीं लगता कि यह अच्छा अभ्यास माना जाता है ... मुझे लगता है कि यह सही ढंग से टाइप करना सीखने के लिए बहुत अधिक कुशल है।
पेश्के

2
मैं कम से कम इस विशिष्ट उपयोग के लिए उत्सुक हूं, क्यों न ही कोड को उपनामों को .zshrc के अंत में जोड़ दिया जाए, या किसी तरह ऐसा ही किया जाए, लेकिन .zsh_correct_aliases .zshrc में। अस्पष्टता के साथ, कुछ हैशिंग, अस्पष्टता / चर, या बेहतर, सुरक्षा के लिए आवश्यक के रूप में
olaf atchmi

जवाबों:


2

आप अपने कोड को यहां परिभाषित उर्फ ​​पर आधारित कर सकते हैं

HashTable ht = aliastab;
ht->addnode(ht, ztrdup(wrong_value),
            createaliasnode(ztrdup(right_value), 0));

(टेस्ट नहीं हुआ)

और आप source ~/.zsh_correct_aliasesको जोड़ दें .zshrc


संपादित करें : स्रोत के साथ परीक्षण किया गया:

char *aliaspath = getenv("HOME");
strcat(aliaspath, "/.zsh_correct_aliases");

FILE *out = fopen(aliaspath, "ab+");
fprintf(out, "alias %s=\'", *s);

HashTable ht = aliastab;
ht->addnode(ht, ztrdup(*s),
    createaliasnode(ztrdup(best), 0));

*s = dupstring(best);
fprintf(out, "%s\'\n", *s);
fclose(out);
if (hist)
    hwrep(best);

यह देता है:

$ setopt correct 
$ dtea    
zsh: correct 'dtea' to 'date' [nyae]? y
lun. janv.  8 01:03:55 CET 2018  
$ alias  
dtea=date
$ dtea    
lun. janv.  8 01:07:42 CET 2018  

0

आप एक पूर्व-निर्धारित फ़ंक्शन को परिभाषित कर सकते हैं जो स्रोत ~ / .zsh_correct_aliases।

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