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의 "올바른"기능을 호출하여 자동으로 작성된 별명을 포함하는 사용자 정의 파일을 작성 하도록 zsh 소스 코드 (file utils.c, function 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스폰이 발생하거나 일시적으로 비활성화 된 경우 기억 된 수정 사항을 제거 하시겠습니까?
Stéphane Chazelas

1
@ StéphaneChazelas 1) 하나의 파일로 저장하는 것이 가장 좋습니다. 2) 그것은 플러스 일 것이지만 반드시 필요한 것은 아닙니다. 3) dtae존재할 때까지 제거 된 후 dtae더 이상 정의되지 않은 경우 복원됩니다 .
shrx

3
command_not_found_handler런타임 대신 구문 분석 시간 과 같이 전용 zsh 후크 함수를 호출 한 다음 zsh 코드에서 논리를 구현하는 것이 더 합리적 입니다.
Stéphane Chazelas

7
나는 이것이 좋은 습관이라고 생각하지 않습니다 ... 나는 올바르게 입력하는 방법을 배우는 것이 훨씬 효율적이라고 생각합니다.
Peschke

2
나는이 특정 용도에 대해 적어도 궁금합니다. 코드가 .zshrc의 끝에 별칭을 추가하거나 어쨌든 .zsh_correct_aliases를 .zshrc에 넣는 것처럼 어떻습니까? 보안을 위해 필요에 따라 더 나은 어떤 해시, 무명 / 변수와 그 Obscursing, 또는
atchmi 올라프

답변:


2

여기에 정의 된 내장 별칭을 기반으로 코드를 만들 수 있습니다

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

(검증되지 않은)

그리고 source ~/.zsh_correct_aliases당신에게 추가하십시오.


편집 : 소스로 테스트 :

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  

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.