typescript - Finns det ett enkelt sätt att komma åt visningsnamnet (titeln) för varje kommando som listas i JSON-filen för tangentbordsgenvägar?


Jag försöker skriva ett skript som omvandlar användarens kortkommandon till flashkort. Jag vill i princip göra en lista över (kortkommando, åtgärdstitel) för varje kortkommando.

När jag öppnar standardgenvägs-JSON-filen ser jag (tangent, kommando, när) för varje genväg. Till exempel:

{ "key": "escape escape", "command": "workbench.action.exitZenMode", "when": "inZenMode" },

Det här är perfekt, förutom att jag vill att kommandot ska vara mänskligt läsbart. När jag öppnar redigeraren för "Tangentbordsgenväg" listas genvägarna med engelska namn, till exempel:

"Lägg till markör ovanför" - "Ctrl + Alt + Uppåtpil" - "editorTextFocus"

Det här är vad jag vill ha, men jag kan inte exportera dessa.

Jag grävde igenom repot på GitHub. Det ser ut som om kommandona var och en definieras i sin egen fil, och varje har en egenskap som kallas title som innehåller det engelska namnet, men jag kunde inte lista ut hur tangentbordsgenvägsredigeraren får åtkomst till var och en av dessa kommandon och visar deras titel (jag är ingen expert på TypeScript). Vad är det bästa sättet att få en lista över tangentbords kommando engelska namn?

Svar #1

För det första är jag ganska säker på att du faktiskt inte vill ha innehållet i standardinställningarnas JSON-pseudofil. Jag antar att om du vill ha flashcards vill du hjälpa någon att minnas deras tangentbindningar, tillsammans med eventuella anpassningar de har gjort på dem.

Jag vet inte om det är lätt eller scriptbart, men... här går vi (det bästa jag kan komma på just nu):

  1. Aktivera och slå på alla tillägg som bidrar med tangentbindningar som du vill ska vara en del av resultatet. Tillägg har aktiveringshändelser (så de laddas inte om de faktiskt inte behövs).

  2. Öppna VS Code-utvecklingsverktygen (Developer: Toggle Developer Tools i kommandopaletten)

  3. Öppna fliken "Källor" och gå till "Electron Isolated Context" > ".../resources/app" (eller vilken väg till appresurser som helst för din VS Code-installation) > out/vs/workbench/workbench.desktop.main.js.

  4. ctrl/cmd+f och sök efter getKeybindings() { och sätt ett brytpunkt på resultaten. Exempelvis för mig, jag fick två sökresultat och satte brytpunkten här (du kan se något lite annorlunda eftersom detta är minifierad kod):

    getKeybindings() {
        return this.e // <- put breakpoint here
    }
    

    Brytpunkten kommer att visas i en snygg/källkartad (?) vy av koden.

  5. Gå tillbaka till det faktiska VS Code-fönstret och öppna nu tangentbordsgenvägsgränssnittet (Preferences: Open Keyboard Shortcuts i kommandopaletten). Detta bör trigga brytpunkten.

  6. I devtools-fliken "Källor", tryck på knappen "Stega ut ur aktuell funktion" två gånger, vilket bör ta dig till en funktion som heter resolve i keybindingsEditorModel.ts.

  7. Högerklicka på raden som deklarerar const commandsWithDefaultKeybindings och klicka på "Fortsätt hit". Observera att om du faktiskt vill få standardtangenter istället för användartangenter + icke-överskrivna standardtangenter, är det då for-loopen som följer detta som initialiserar de data du vill ha.

  8. I den högra sidopanelen, under avsnittet "Scope", under dess "Local"-avsnitt, leta efter en egenskap hos this som är en array med (förmodligen massor av) saker i. Egenskapsnamnen kommer att vara minifierade. I den ursprungliga källkoden är namnet på det vi letar efter _keybindingItemsSortedByPrecedence. När du hittar det, högerklicka på det och välj "Store object as global variable". Du kommer att se en ny variabel i konsolpanelen, förmodligen med ett namn som temp1.

  9. I konsolen, kör temp1.map(e => ({command:e.commandLabel,keyChord:e.keybindingItem.chords})).filter(e=>e.command!=="") (eller vilken transformation du vill för att få de egenskaper du vill ha och i vilket format du vill) Filtret tar bort mappningar som bara har "" som etikett. Jag tror att dessa mappningar bara är för tangenter som inte är bundna till ett kommando och som bara "infogar" sig själva/gör det normala som de skulle göra i vilken applikation som helst.

  10. högerklicka på resultatet och välj "Kopiera objekt".

  11. Klicka på "fortsätt" i felsökaren

  12. Klistra in innehållet från urklipp var du vill och gör vad du vill med resultatet (det är JSON).

Det här skulle förmodligen vara mycket lättare om det fanns/om jag kunde hitta ett förlängnings-API för att hämta tangentbindningar, men jag tittade och hittade inget. (Kanske missade jag det bara?)

Om du vill filtrera efter källan (vilken som registrerar snabbtangenten), kan du göra det också. Ex. för att filtrera snabbtangenter skrivna av användaren: temp1.filter(e=>e.source==="User") .... För att få en lista över källor, använd new Set(temp1.map(e=>e.source)). Observera att vissa av källorna är objekt istället för strängar (t.ex. objekt om tilläggskällor till skillnad från "System" eller "User").


Om du har något intresse av tillgång till tilläggs-API, se API: Expose list of keybindings #162433. Den är stängd på grund av att den inte fick tillräckligt med stöd från communityn i tid, men du kan försöka igen och försöka få tillräckligt med stöd för den.

Relaterade artiklar