Làm cách nào để làm cho chức năng chính xác của Zsh, nhớ các quyết định sửa lỗi chính tả của tôi


24

Tôi đã kích hoạt tính năng sửa lỗi (tôi sẽ không gọi nó là tự động sửa lỗi cụ thể vì vấn đề này) trong zsh bằng cách bật setopt correcttrong tôi .zshrc.

Bây giờ, khi tôi gõ dtaevào một thiết bị đầu cuối, tôi nhận được:

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

Tại thời điểm này tôi muốn zsh nhớ quyết định của tôi. Vì vậy, lần sau khi tôi gõ, dtaenó sẽ tự động sửa thành date[1]. Tuy nhiên, điều này không xảy ra và zsh lại hỏi tôi phải làm gì:

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

[1] Trừ khi, tất nhiên, nếu tại thời điểm đó tồn tại một dtaelệnh hoặc bí danh thực sự .

Cập nhật:

Tôi đã quản lý để sửa đổi mã nguồn zsh (tệp utils.c, hàm spckword) để tạo một tệp tùy chỉnh chứa các bí danh được tạo tự động với lời gọi của chức năng "chính xác" của zsh:

nguyên:

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

sửa đổi:

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

Khi thực hiện dtae, dòng sau được thêm vào tệp ~/.zsh_correct_aliases:

alias dtae='date'

Tuy nhiên, tôi không biết làm thế nào để lấy nguồn ~/.zsh_correct_aliasestệp mới được sửa đổi tại chỗ.


1
Bạn có muốn nó chỉ được ghi nhớ trong suốt quá trình shell hoặc thông tin được lưu trữ trong các tệp. Có nên sửa lỗi nhớ ngay lập tức cho tất cả các phiên bản shell hiện đang chạy không? Bạn có muốn xóa hiệu chỉnh đã nhớ khi dtaesinh ra hoặc chỉ bị vô hiệu hóa tạm thời?
Stéphane Chazelas

1
@ StéphaneChazelas 1) Được lưu trữ trong một tệp duy nhất sẽ là tốt nhất. 2) Nó sẽ là một điểm cộng, nhưng không thực sự cần thiết. 3) Xóa cho đến khi dtaetồn tại, sau đó khôi phục nếu / khi dtaekhông được xác định nữa.
shrx

3
Có lẽ sẽ có ý nghĩa hơn khi gọi một hàm hook zsh chuyên dụng ở đó (như một command_not_found_handlernhưng tại thời điểm phân tích cú pháp thay vì thời gian chạy), và sau đó thực hiện logic trong mã zsh.
Stéphane Chazelas

7
Tôi không nghĩ rằng điều này được coi là thực hành tốt ... Tôi cảm thấy việc học cách gõ chính xác sẽ hiệu quả hơn nhiều.
Peschke

2
Tôi chỉ tò mò, với mục đích sử dụng cụ thể này ít nhất, tại sao không chỉ có mã thêm các bí danh vào cuối .zshrc, hoặc bằng cách nào đó làm điều tương tự mà bằng cách trích dẫn .zsh_c chính_aliases vào .zshrc. Che khuất rằng với một số băm, tối nghĩa / biến hoặc tốt hơn, khi cần thiết cho bảo mật
olaf atchmi

Câu trả lời:


2

Bạn có thể căn cứ mã của mình vào bí danh tích hợp được xác định ở đây

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

(không được kiểm tra)

Và thêm source ~/.zsh_correct_aliasescho bạn .zshrc


EDIT : đã thử nghiệm với nguồn:

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

Nó cho:

$ 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

Bạn có thể xác định hàm premd mà nguồn ~ / .zsh_c chính_aliases.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.