วิธีทำให้ฟังก์ชัน 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เกิดการมีอยู่หรือเพิ่งปิดการใช้งานชั่วคราว?
Stéphane Chazelas

1
@ StéphaneChazelas 1) การจัดเก็บในไฟล์เดียวจะดีที่สุด 2) มันจะเป็นข้อดี แต่ไม่จำเป็นอย่างเคร่งครัด 3) ลบออกจนกว่าจะdtaeมีอยู่จากนั้นเรียกคืนหาก / เมื่อdtaeไม่ได้ถูกกำหนดอีกต่อไป
ยัก

3
มันอาจจะเหมาะสมกว่าที่จะเรียกฟังก์ชั่น zsh hook เฉพาะที่นั่น (เช่นcommand_not_found_handlerแต่ในเวลาในการแยกวิเคราะห์แทนที่จะรันไทม์) แล้วใช้ตรรกะในโค้ด zsh
Stéphane Chazelas

7
ฉันไม่คิดว่านี่เป็นการปฏิบัติที่ดี ... ฉันรู้สึกว่ามันมีประสิทธิภาพมากขึ้นในการเรียนรู้วิธีพิมพ์อย่างถูกต้อง
Peschke

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  

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.