Zsh'ın “doğru” işlevselliği nasıl yazım düzeltme kararlarımı hatırlatacağım


24

(Ben demezdim düzeltme sağladı otomatik olarak düzeltilmesi etkinleştirerek zsh içinde bu sorun nedeniyle özellikle) setopt correctskinTenimde .zshrc.

Şimdi dtaebir terminal yazdığımda şunu alıyorum:

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

Bu noktada zsh'ın kararımı hatırlamasını istiyorum. Bu yüzden bir dahaki sefere ben dtaeotomatik olarak date[1] 'e düzeltmelidir . Ancak, bu olmaz ve zsh yine ne yapacağımı soruyor:

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

[1] Tabii ki, eğer o zaman eğer gerçek bir dtaekomut veya diğer isim yoksa.

Güncelleştirme:

Zsh'nin "doğru" işlevselliğinin çağrılmasıyla otomatik olarak oluşturulan takma adları içeren özel bir dosya oluşturmak için zsh kaynak kodunu (dosya utils.c, işlev spckword) değiştirmeyi başardım :

orijinal:

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

değiştirilmiş:

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);
}

Çalıştırmanın ardından dtae, aşağıdaki satır dosyaya eklenir ~/.zsh_correct_aliases:

alias dtae='date'

Ancak, yeni değiştirilen ~/.zsh_correct_aliasesdosyayı yerinde nasıl kaynaklayacağımı bilmiyorum .


1
Yalnızca kabuk işlemi ömrü boyunca mı yoksa dosyalarda saklanan bilgiler için mi hatırlanmasını istiyorsunuz? Bu hatırlanan düzeltmenin şu anda çalışan tüm kabuk örnekleri için hemen kullanılabilir olması gerekir mi? dtaeUnutulan düzeltmenin ortaya çıkması veya geçici olarak devre dışı bırakılması durumunda kaldırılmasını mı istiyorsunuz ?
Stéphane Chazelas

1
@ StéphaneChazelas 1) Tek bir dosyada saklanmak en iyisidir. 2) Bir artı olurdu, ama kesinlikle gerekli değil. 3) Var olana kadar kaldırıldı dtae, daha sonra / ne zaman dtaetanımlanmadıysa eski durumuna getirildi .
shrx

3
Orada özel bir zsh hook işlevi çağırmak daha uygun olacaktır command_not_found_handler(çalışma zamanı yerine, ancak ayrıştırma zamanında) ve sonra mantığı zsh kodunda uygulayın.
Stéphane Chazelas

7
Bunun iyi bir uygulama olduğunu düşünmüyorum ... Doğru yazmayı öğrenmenin çok daha verimli olduğunu düşünüyorum.
Peschke

2
En azından bu özel kullanım için merak ediyorum, neden sadece kodun .zshrc'nin sonuna takma adlar eklemesini sağlamıyorsunuz, ya da bir şekilde de aynı şeyi yapmak yerine .zsh_correct_aliases. Güvenlik için gerektiğinde bazı karmaşa, gizlilik / değişkenlerle veya daha
iyisiyle, gizlenmesi

Yanıtlar:


2

Kodunuzu burada tanımlanan yerleşik takma isme dayandırabilirsiniz

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

(test edilmedi)

Ve source ~/.zsh_correct_aliasessize .zshrc ekleyin


EDIT : kaynak ile test edilmiştir:

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);

O verir:

$ 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 'ı besleyen bir precmd işlevi tanımlayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.