Як зробити «правильну» функцію zsh запам’ятати мої рішення щодо виправлення орфографії


24

Я ввімкнув виправлення (я би не назвав це автокорекцією спеціально через цю проблему) в zsh, включивши setopt correctв моєму.zshrc .

Тепер, коли я набираю dtaeтермінал, я отримую:

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

У цей момент я хотів би zsh запам'ятати своє рішення. Тож наступного разу, коли я dtaeйого ввожу, він повинен автоматично виправитись date[1]. Однак цього не відбувається, і zsh знову запитує мене, що робити:

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

[1] Якщо, звичайно, якщо на той час існує фактична dtaeкоманда чи псевдонім.

Оновлення:

Мені вдалося змінити вихідний код zsh (файл utils.c, функцію spckword), щоб створити власний файл, що містить псевдоніми, автоматично створені з викликом "правильної" функціональності zsh:

оригінал:

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більше не визначено.
shrx

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


EDIT : перевірено джерелом:

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  

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.