Installation
seneste version: 3.0.2
64-bit | |
macOS (.app) | 3.0.2 |
Windows (.exe) | 3.0.2 |
Debian (.deb) | 3.0.2 |
Fedora (.rpm) | 3.0.2 |
Andre Linux-distroer (.AppImage) | 3.0.2 |
Projektets mål
Målet med projektet er at skabe en smuk og udvidelig oplevelse for brugere af kommandolinjeinterface, bygget på åbne webstandarder. I begyndelsen vil vores fokus primært være omkring hastighed, stabilitet og udvikling af den korrekte API for udvidelsesforfattere.
I fremtiden forventer vi, at fællesskabet vil komme med innovative tilføjelser for at forbedre, hvad der kunne være den enkleste, mest kraftfulde og velafprøvede grænseflade til produktivitet.
Udvidelser
Udvidelser er tilgængelige på npm. Vi opfordrer alle til at inkludere hyper
i keywords
feltet i package.json
.
$ npm search hyper
Derpå redigerer du .hyper.js
og tilføjer det til plugins
module.exports = { config: { /*... */ }, plugins: };
Hyper
vil vise en meddelelse, når dine moduler er installeret til .hyper_plugins
.
Keymaps
Alle kommandonøgler kan ændres. For at ændre dem skal du redigere .hyper.js
og tilføje din ønskede ændring til keymaps
.
Derefter vil Hyper ændre standarden med din brugerdefinerede ændring.
Eksempel: 'window:devtools': 'Cmd+Alt+O'
module.exports = { config: { /*... */ }, keymaps: { 'window:devtools': 'cmd+alt+o' }};
Default keymaps:
Konfiguration
Konfigurationssted
macOS | ~/Library/Application Support/Hyper/.hyper.js |
Windows | $Env:AppData/Hyper/.hyper.js |
Linux | ~/.config/Hyper/.hyper.js |
Note: config på ~/.hyper.js
understøttes stadig, men vil blive ignoreret, hvis config i programmappen er til stede. Ellers vil den blive flyttet til programmappen ved første kørsel.
Det config
objekt, der ses ovenfor i .hyper.js
, indrømmer følgende
Property | Default | Description | |
updateChannel |
“stable” | Af opdateringskanalen, der skal modtage opdateringer fra | |
fontSize |
12 | Den standardstørrelse i pixel for terminalen | |
fontFamily |
“Menlo, DejaVu Sans Mono, Lucida Console, monospace” | Den skrifttypefamilie, der skal bruges med valgfrie fallbacks | |
uiFontFamily |
“-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, …” | Den skrifttypefamilie, der skal bruges til brugergrænsefladen med valgfrie fallbacks | |
fontWeight |
“normal” | Den standard skrifttypevægt: “normal” eller “fed” | |
fontWeightBold |
“fed” | Den skrifttypevægt for fede tegn: “normal” eller “fed” | |
cursorColor |
“rgba(248,28,229,229,0.8)” | Farven på caret i terminalen | |
cursorAccentColor |
“#000” | Tekstfarven under BLOCK-markøren | |
cursorShape |
“BLOCK” | Formen på caret i terminalen. De tilgængelige indstillinger er: ‘BEAM’, ‘UNDERLINE’, ‘BLOCK’ | |
cursorBlink |
“false” | Hvis det er sandt, vil markøren blinke | |
foregroundColor |
“#fff” | Farven på hovedteksten i terminalen | |
backgroundColor |
“#000” | Farven og opaciteten af vinduets og hovedterminalens baggrund | |
selectionColor |
“rgba(248,28,229,0.3)” | Baggrundsfarve/opacitet for tekstvalget i terminalen | |
borderColor |
“#333” | Farven på hovedvinduets kant og fanebjælken | |
css |
“” | Brugerdefineret CSS, der skal medtages i hovedvinduet | |
padding |
“12px 14px” | CSS-paddingværdier for mellemrummet omkring hvert udtryk | |
colors |
{ black: “#000000”, red: “#ff0000”, … } | En liste over tilsidesættelser for farvepaletten. Navnene på tasterne repræsenterer “ANSI 16”, som alle kan ses i standardkonfigurationen. | |
shell |
“” | En sti til en brugerdefineret shell, der skal køres, når Hyper starter en ny session | |
shellArgs |
“” | En række shell-argumenter | |
env |
{} | {} | Et objekt af miljøvariabler, der skal indstilles, før starte shell |
windowSize |
Den standard bredde/højde i pixels for et nyt vindue | ||
scrollback |
1000 | Antal rækker, der skal bevares i terminalbuffer til rulning | |
copyOnSelect |
false | Hvis sandt, markeret tekst kopieres automatisk til udklipsholderen | |
quickEdit |
false | Hvis det er sandt, ved højreklik vil markeret tekst blive kopieret eller indsat, hvis der ikke er noget valg (sandt som standard på Windows) | |
defaultSSHApp |
true | Hvis sandt, vil Hyper blive indstillet som standardprotokolklient for SSH | |
modifierKeys |
{altIsMeta: false} | Ændrer adfærd for modificeringstaster, så de fungerer som metataster | |
showHamburgerMenu |
true på Linux/Windows, false på macOS | Ændrer synligheden af hamburgermenuen. De tilgængelige indstillinger er: true, false | |
showWindowControls |
“” | Ændrer positionen/synligheden af vindueskontrollerne. Tilgængelige indstillinger er: true, false, “left” |
Udvidelses-API
Udvidelser er universelle Node.js-moduler, der indlæses af både Electron og rendererprocessen.
Udvidelsessystemet er designet omkring sammensætning af de API’er, som vi bruger til at bygge terminalen: React
komponenter og Redux
handlinger.
I stedet for at udsætte en brugerdefineret API-metode eller parameter for hvert muligt tilpasningspunkt, giver vi dig mulighed for at opsnappe og sammensætte hver eneste funktionalitet!
Den eneste viden, der derfor kræves for at udvide Hyper
med succes, er den viden om de underliggende open source-biblioteker.
Du kan finde yderligere oplysninger om plugin-udvikling i Hyper-repositoriet.
Dit modul skal eksponere mindst en af disse metoder:
Method | Invoked from | Description | |||||||
onApp |
Electron |
Invoked when the app first loads. Hvis et plugin genindlæses, påkaldes det igen med den eksisterende app. Parametre:
|
|||||||
onWindow |
Electron |
Iværksættes, når hvert vindue oprettes. Hvis et plugin genindlæses, bliver det påberåbt igen med de eksisterende vinduer. Parametre:
|
|||||||
onUnload |
Elektron |
Invokeres, når et plugin fjernes af brugeren. Parametre:
|
|||||||
decorateConfig |
Electron / Renderer |
v0.5.0+. Giver dig mulighed for at dekorere brugerens konfiguration. Parametre:
|
|||||||
decorateEnv |
Electron |
v0.7.0+. Gør det muligt at udsmykke brugerens miljø ved at returnere et ændret miljøobjekt. Parametre:
|
|||||||
decorateMenu |
Electron |
Iværksættes med Electron’s Parametre:
|
|||||||
decorateBrowserOptions |
Electron |
Giver mulighed for at dekorere Electron’s Parametre:
|
|||||||
onRendererWindow |
Renderer |
Iværksættes, når et plugin først indlæses eller efterfølgende genindlæses i hvert vindue. Parametre:
|
|||||||
middleware |
Renderer |
En brugerdefineret Redux middleware, der kan opsnappe enhver handling. Efterfølgende påkalder vi |
|||||||
reduceUI reduceSessions reduceTermGroups |
Renderer |
En brugerdefineret reducer for
|
|||||||
getTabsProps |
Renderer |
Giver props videre fra
|
|||||||
getTabProps |
Renderer |
Giver props ned fra
|
|||||||
getTermGroupProps |
Renderer |
Giver props ned fra
|
|||||||
getTermProps |
Renderer |
Giver props ned fra
|
|||||||
mapHyperState mapTermsState mapHeaderState
|
Renderer |
En brugerdefineret mapper for de tilstandsegenskaber, som containerkomponenter modtager. Bemærk, at for at børnekomponenter kan få disse egenskaber, skal du videregive dem med de tilsvarende metoder (som Måtte returnere et udvidet objekt af det overdragne map.
|
|||||||
mapHyperDispatch mapTermsDispatch mapHeaderDispatch mapNotificationsDispatch |
Renderer |
En brugerdefineret mapper for dispatch-egenskaberne. Skal returnere et udvidet objekt af det overdragne map.
|
|||||||
decorateHyper decorateNotifications decorateNotification decorateHeader decorateTabs decorateTab decorateTerms decorateTermGroup decorateSplitPane decorateTerm
|
Renderer |
Invokeret med Parametre:
|
Modulindlæsning
Brugeren kan hot-loade og hot-reloade plugins ved at trykke på Command + R (refresh). Du bedes bestræbe dig på at lave plugins, der ikke kræver en fuldstændig genstart af programmet for at virke.
Mærk
Plugins, der påvirker `BrowserWindow`, vil have effekt på nye vinduer efter hot-reload.
I fremtiden vil vi måske gøre dette automatisk.
Når du udvikler, kan du tilføje dit plugin til .hyper_plugins/local
og derefter angive det under localPlugins
-arrayet i .hyper.js
. Vi indlæser nye plugins:
- Periodisk (med få timers mellemrum)
- Når der foretages ændringer i konfigurationsfilen (
plugins
ellerlocalPlugins
) - Når brugeren klikker på Plugins > Opdater alle nu
Processen med genindlæsning involverer
- Kørsel af
npm prune
ognpm install
i.hyper_plugins
. - Kørsel af
require.cache
i både electron- og rendererprocessen - Invocation af
on*
-metoder på de eksisterende instanser og gengivelse af komponenter med de friske dekorationer på plads.
Plugins placering
macOS | ~/Library/Application Support/Hyper/.hyper_plugins |
Windows | $Env:AppData/Hyper/.hyper_plugins |
Linux | ~/.config/Hyper/.hyper_plugins |
Note: plugins på ~/.hyper_plugins
understøttes stadig, men vil blive ignoreret, hvis plugins i programmappen er til stede. Ellers vil de blive flyttet til programmappen ved første kørsel.
Note: På hovedprocessen registreres plugins så hurtigt som muligt (vi fyrer onLoad
). På browseren er det op til brugeren at udløse deres indlæsning ved at trykke på command+R. Vi giver brugeren kontrol over indlæsningen på denne måde for at forhindre, at de mister kritisk arbejde på grund af udvidelser, der nulstiller tilstanden eller ikke bevarer den korrekt.
Dekorering af komponenter
Vi giver dig mulighed for at levere en komponent af højere orden til hvert stykke af Hyper
brugergrænsefladen.
Denne struktur er som følger:
<Hyper> <Header> <Tabs> <Tab /> ... </Tabs> </Header> <Terms> <TermGroup> <SplitPane> <TermGroup> <Term /> ... </TermGroup> <TermGroup> <Term /> ... </TermGroup> </SplitPane> </TermGroup> </Terms> <Notifications> <Notification /> ... </Notifications></Hyper>
Alle decorate*
metoder modtager følgende referencer i et objekt, der overgives som den anden parameter:
React |
Hele React-navneområdet. |
notify |
En hjælpefunktion, der viser en skrivebordsmeddelelse. Den første parameter er titlen, den anden er den valgfrie meddelelsestekst, og den tredje er en anden valgfri parameter, som kan bruges til at logge oplysninger til udviklingskonsollen. For at videregive disse oplysninger skal du blot angive et objekt med en |
Notification |
Den Notification -komponent, hvis du vil genbruge den. |
Alle komponenterne accepterer følgende to egenskaber til at udvide deres markup:
customChildren |
En array af Element eller en enkeltElement til at indsætte i bunden af komponenten. |
customChildrenBefore |
Det samme som ovenstående egenskab, men indsættes som komponentens første børneelement(er). |
Din komponent af højere orden kan levere en onDecorated
egenskab til den dekorerede komponent for at få en reference til dens instans.
Din Term-komponent af højere orden kan levere en onCursorMove
handler-egenskab, der kaldes, når markøren er flyttet, med en objektparameter, der repræsenterer dens relative position i forhold til Term-oprindelsen:
x |
Horisontal position i pixels |
y |
Vertikal position i pixels |
width |
Cursorbredde i pixels |
height |
Cursorhøjde i pixels |
col |
Horisontal position i kolonner |
row |
Vertikal position i rækker |
Vi opfordrer dig til at bevare kompatibiliteten med andre dekoratorer. Da mange kan indstilles, skal du ikke antage, at din er den eneste.
For eksempel, hvis du videregiver børn, skal du sammensætte potentielle eksisterende værdier:
render () { const customChildren = Array.from(this.props.customChildren) .concat(<p>My new child</p>); return <Tab {...this.props} customChildren={customChildren} />}
Og hvis du bruger onDecorated
property
onDecorated (term) { this.term = term; if (this.props.onDecorated) { this.props.onDecorated(term); }}
Aktioner og effekter
Alle Redux-aktioner er tilgængelige, så du kan håndtere dem via din middleware og reducerer. Du kan finde et eksempel i Hyperpower-referenceplugin’et.
Sideeffekter forekommer i to grundlæggende former:
- Nogle handlinger afsender andre handlinger baseret på tilstand.
- Nogle handlinger udfører asynkront arbejde ved at kommunikere over RPC-kanalen til hovedprocessen
I alle tilfælde overføres sideeffekten som effect
-nøglen i handlingen og håndteres senere af vores middleware.
Det betyder, at du kan overstyre, sammensætte eller helt fjerne effekter! Med andre ord er det sådan, du kan ændre appens standardfunktionalitet eller -adfærd.
Som eksempel kan du overveje den handling, vi bruger til at øge skriftstørrelsen, når du trykker på Command+=
:
export function increaseFontSize () { return (dispatch, getState) => { dispatch({ type: UI_FONT_SIZE_INCR, effect () { const state = getState(); const old = state.ui.fontSizeOverride || state.ui.fontSize; const value = old + 1; dispatch({ type: UI_FONT_SIZE_SET, value }); } }); };}
Den underliggende terminal
Hyper
opnår en stor del af sin hastighed og funktionalitet takket være xterm’s kraft.js
Tilføjede API’er
Electron app
-objekterne er udvidet med følgende egenskaber:
config |
En Object med config -blokken fra .hyper.js . |
plugins |
En Object med hjælpere til plugins. |
getWindows |
En Function , der returnerer en Set over alle de åbne vinduer. |
createWindow |
En Function , der opretter et nyt vindue. Accepterer en valgfri callback , der vil blive overgivet som det nye vindues init callback. |
Elektron BrowserWindow
-objekter udvides med følgende parametre:
rpc |
En EventEmitter , der giver mulighed for kommunikation med vinduesprocessen. |
sessions |
En Map af Session objekter, der holder kommunikationen med hver term pty.. |
Renderer vinduer er på samme måde udvidet med:
rpc |
En EventEmitter , der giver mulighed for kommunikation med vinduesprocessen. |
store |
Det Redux Store objekt. Det giver adgang til dispatch handlinger eller læser den globale tilstand med getState . |
Det rpc
objekt er symmetrisk mellem browser og rendererproces. API’et er det samme som Node.js, med den undtagelse, at det kun tillader et enkelt objekt som sine parametre kun:
window.rpc.emit('hi there', { some: 'payload', any: });
Eksempel på tema: Hyperyellow
Den følgende udvidelse ændrer blot konfigurationen for at tilføje CSS og gule farver! Her er koden.
Temaer er simpelthen plugins! Der er kun brug for én hook, decorateConfig
:
exports.decorateConfig = (config) => { return Object.assign({}, config, { borderColor: 'yellow', cursorColor: 'yellow', css: ` ${config.css || ''} .tabs_nav .tabs_list .tab_text { color: yellow; } .tabs_nav .tabs_title { color: yellow; } ` });}
Jeg fik fat i klassens navne ved at inspicere udtrykket med Devtools, som du kan udløse fra View -> Toggle Developer Tools
. Når du gør det, skal du bemærke, at nogle klasser genereres automatisk og efterfølges af en tilfældig nonce (f.eks.: term_13hv8io
). Ignorer dem: de ændres med hvert nyt vindue!
Bemærk, at der lægges vægt på at spille pænt sammen med andre udvidelser. Konkret opretter vi et nyt objekt, udvider kun de nøgler, vi er interesseret i, og vi sammensætter CSS’en for at bevare brugerens indstilling og andre forfatteres indstilling:
return Object.assign({}, config, { css: ` ${config.css || ''} /* your css here */ `});
Eksempel på udvidelse: Hyperpower
Følgende udvidelse renderer partikler, når caretten bevæger sig:
Lad os gå gennem dens kode.
Først opsnapper vi Redux-aktionen SESSION_ADD_DATA
. Du kan finde den fulde liste over handlinger i repositoriet.
exports.middleware = (store) => (next) => (action) => { if ('SESSION_ADD_DATA' === action.type) { const { data } = action; if (/bash: wow: command not found/.test(data)) { store.dispatch({ type: 'WOW_MODE_TOGGLE' }); } else { next(action); } } else { next(action); }};
Bemærk, at vi ikke re-dispatcherer handlingen, hvilket betyder, at vi aldrig gengiver kommandosignalet til terminalen. I stedet afsender vi en egen handling, som vi griber i uiReducer
og senere mapper:
exports.reduceUI = (state, action) => { switch (action.type) { case 'WOW_MODE_TOGGLE': return state.set('wowMode', !state.wowMode); } return state;};exports.mapTermsState = (state, map) => { return Object.assign(map, { wowMode: state.ui.wowMode });};
Vi ønsker derefter at dekorere <Term>
-komponenten, så vi kan få adgang til den underliggende caret.
Men <Term>
er ikke en container, som vi kan mappe rekvisitter til. Så vi bruger getTermProps
til at videregive egenskaben længere nede:
exports.getTermProps = (uid, parentProps, props) => { return Object.assign(props, { wowMode: parentProps.wowMode });}
Udvidelsen returnerer derefter en komponent af højere orden til at indpakke <Term>
. Bemærk, at vi videregiver onDecorated
egenskaben for at få adgang til basiskomponenten Term og dens DOM-ref, og onCursorMove
egenskaben for at bruge Hyper cursor API:
render () { return React.createElement(Term, Object.assign({}, this.props, { onDecorated: this._onDecorated, onCursorMove: this._onCursorMove }));}