Gå til hovedindhold

Et lille bidrag til Nushell: når completion også skal kigge på beskrivelsen

Indsendt af Lennart den

Jeg fik for nylig et lille bidrag ind i Nushell — open source-shellet jeg bruger til daglig. Det er en bitte forbedring i hvordan custom completers virker, men den løser en konkret friktion jeg løb ind i hver eneste gang jeg skulle bruge mit eget terminal-værktøj. Her er hvad det handler om.

Problemet

I Nushell kan man skrive sine egne "completers" — små funktioner der foreslår værdier når man trykker tab. En completion har to felter: en value (det der bliver indsat) og en description (det der vises ved siden af). For eksempel en liste over lufthavne:

def "nu-complete airports" [] {
    [
        { value: "LAX", description: "Los Angeles" }
        { value: "JFK", description: "New York — John F. Kennedy" }
        { value: "CPH", description: "København" }
        { value: "LHR", description: "London Heathrow" }
        { value: "NRT", description: "Tokyo Narita" }
    ]
}

Indtil nu matchede Nushell kun mod value. Skrev man LAX<tab> fik man LAX — Los Angeles. Fint. Men hvis man ikke kunne huske IATA-koden og bare skrev Los<tab>, fik man ingenting. Beskrivelsen var dekoration, ikke noget der kunne søges på.

Det er irriterende når det er ens egen hjerne der ikke kan huske at Narita er NRT men sagtens kan huske at det er Tokyo.

Bidraget

Custom completers kan nu vælge at matche brugerens prefix mod både value og description, ved at sætte match_description: true i options:

def "nu-complete airports" [] {
    {
        options: {
            case_sensitive: false,
            completion_algorithm: "substring",
            match_description: true,
        },
        completions: [
            { value: "LAX", description: "Los Angeles" }
            { value: "JFK", description: "New York — John F. Kennedy" }
            { value: "CPH", description: "København" }
            { value: "LHR", description: "London Heathrow" }
            { value: "NRT", description: "Tokyo Narita" }
        ]
    }
}

Med match_description: true slået til kan man nu skrive Tokyo<tab> og få NRT indsat. Eller København<tab> og få CPH. Det indsatte er stadig altid value — beskrivelsen er kun til at finde det rette forslag, ikke til at ende i kommandolinjen.

Hvorfor det er en lille ting med stor effekt

Jeg fandt selv på det fordi jeg har en send.nu-kommando der sender mail til kontakter fra mit adressekartotek. Tidligere skulle jeg huske emailadresserne. Nu kan jeg skrive navnet på modtageren, trykke tab, og få adressen ind:

def "nu-complete recipients" [] {
    {
        options: {
            case_sensitive: false,
            completion_algorithm: fuzzy,
            match_description: true,
        },
        completions: (contacts | each {|c| { value: $c.EMAIL, description: $c.FN }})
    }
}

Hjernen husker mennesker ved navn, ikke ved email-streng. Shellet bør møde hjernen der hvor den er.

Hvad jeg tager med mig

To ting.

For det første: open source er stadig den nemmeste måde at få en konkret irritation væk på. Total tid fra "det her burde virke" til "det her virker i alles installation om et par uger" er overskuelig hvis projektet er velorganiseret — og Nushell er.

For det andet: gode værktøjer møder en der hvor man er. Det er den samme tankegang jeg bruger når jeg rådgiver virksomheder om AI. Et system der kræver at brugeren oversætter sin egen viden til systemets sprog (IATA-koder, kundenumre, interne IDs) før det vil hjælpe, er et system med en designfejl. Lad maskinen lave oversættelsen — den er bedre til det end os.