Как сделать так, чтобы «правильная» функция 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файл на месте.

shrx
источник
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


РЕДАКТИРОВАТЬ : проверено с источником:

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

Вы можете определить функцию precmd, которая содержит ~ / .zsh_correct_aliases.

Уильям Хэй
источник