Cara membuat zsh "benar" berfungsi mengingat keputusan koreksi ejaan saya

24

Saya telah mengaktifkan koreksi (saya tidak akan menyebutnya koreksi otomatis khusus karena masalah ini) di zsh dengan memungkinkan setopt correctdi saya .zshrc.

Sekarang, ketika saya mengetik dtaeterminal, saya mendapatkan:

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

Pada titik ini saya ingin zsh mengingat keputusan saya. Jadi pada saat saya mengetiknya dtaesecara otomatis harus benar ke date[1]. Namun, ini tidak terjadi, dan zsh kembali bertanya kepada saya apa yang harus dilakukan:

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

[1] Kecuali, tentu saja, jika pada saat itu ada dtaeperintah atau alias yang sebenarnya .

Memperbarui:

Saya telah berhasil memodifikasi kode sumber zsh (file utils.c, fungsi spckword) untuk membuat file khusus yang berisi alias yang dibuat secara otomatis dengan pemanggilan fungsi "benar" zsh:

asli:

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

diubah:

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

Setelah mengeksekusi dtae, baris berikut ditambahkan ke file ~/.zsh_correct_aliases:

alias dtae='date'

Namun, saya tidak tahu bagaimana cara mencari file yang baru dimodifikasi ~/.zsh_correct_aliasesdi tempat.

shrx
sumber
1
Apakah Anda ingin itu diingat hanya untuk seumur hidup proses shell, atau informasi itu disimpan dalam file. Haruskah koreksi yang diingat itu segera tersedia untuk semua instance shell yang sedang berjalan? Apakah Anda ingin koreksi yang diingat dihapus ketika dtaemuncul atau hanya dinonaktifkan sementara?
Stéphane Chazelas
1
@ StéphaneChazelas 1) Disimpan dalam satu file akan lebih baik. 2) Ini akan menjadi nilai tambah, tetapi tidak sepenuhnya diperlukan. 3) Dihapus sampai dtaeada, kemudian diaktifkan kembali jika / saat dtaetidak ditentukan lagi.
shrx
3
Mungkin lebih masuk akal untuk memanggil fungsi kait zsh khusus di sana (seperti command_not_found_handlerwaktu parsing alih-alih runtime), dan kemudian mengimplementasikan logika dalam kode zsh.
Stéphane Chazelas
7
Saya tidak berpikir ini dianggap praktik yang baik ... Saya merasa jauh lebih efisien untuk belajar mengetik dengan benar.
Peschke
2
Saya hanya ingin tahu, untuk penggunaan spesifik ini setidaknya, mengapa tidak hanya memiliki kode menambahkan alias ke akhir .zshrc, atau entah bagaimana melakukan hal yang sama tetapi dengan memasukkan .zsh_correct_aliases ke .zshrc Mengaburkan bahwa dengan beberapa hashing, ketidakjelasan / variabel, atau lebih baik, seperti yang diperlukan untuk keamanan
olaf atchmi

Jawaban:

2

Anda bisa mendasarkan kode Anda pada alias bawaan yang ditentukan di sini

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

(tidak diuji)

Dan tambahkan source ~/.zsh_correct_aliaseske Anda .zshrc


EDIT : diuji dengan sumber:

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

Memberikan:

$ 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  
Tristan Gouge
sumber
0

Anda dapat mendefinisikan fungsi precmd yang menghasilkan ~ / .zsh_correct_aliases.

William Hay
sumber