Instalace
nejnovější verze: 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 |
Ostatní linuxové distribuce (.AppImage) | 3.0.2 |
Cíle projektu
Cílem projektu je vytvořit krásné a rozšiřitelné prostředí pro uživatele rozhraní příkazového řádku, postavené na otevřených webových standardech. Zpočátku se zaměříme především na rychlost, stabilitu a vývoj správného API pro autory rozšíření.
V budoucnu předpokládáme, že komunita přijde s inovativními doplňky, které vylepší to, co by mohlo být nejjednodušším, nejvýkonnějším a nejosvědčenějším rozhraním pro produktivitu.
Rozšíření
Rozšíření jsou k dispozici na npm. Doporučujeme všem, aby do pole keywords
v package.json
zahrnuli hyper
.
$ npm search hyper
Poté upravte .hyper.js
a přidejte jej do plugins
module.exports = { config: { /*... */ }, plugins: };
Hyper
zobrazí se oznámení, když se vaše moduly nainstalují do .hyper_plugins
.
Klíčové mapy
Všechny příkazové klíče lze změnit. Chcete-li je změnit, upravte .hyper.js
a přidejte požadovanou změnu do keymaps
.
Pak Hyper změní výchozí s vaší vlastní změnou.
Příklad: 'window:devtools': 'Cmd+Alt+O'
module.exports = { config: { /*... */ }, keymaps: { 'window:devtools': 'cmd+alt+o' }};
Výchozí mapy kláves:
Konfigurace
Umístění konfigurace
macOS | ~/Library/Application Support/Hyper/.hyper.js |
Windows | $Env:AppData/Hyper/.hyper.js |
Linux | ~/.config/Hyper/.hyper.js |
Pozn: Konfigurace na ~/.hyper.js
je stále podporována, ale bude ignorována, pokud je konfigurace v adresáři aplikace přítomna. V opačném případě bude při prvním spuštění přesunut do adresáře aplikace.
Objekt config
viděný výše v .hyper.js
přiznává následující
Vlastnost | Výchozí | Popis |
updateChannel |
„stable“ | Aktualizační kanál pro příjem aktualizací |
fontSize |
12 | Výchozí velikost v pixelech pro terminál |
fontFamily |
„Menlo, DejaVu Sans Mono, Lucida Console, monospace“ | Rodina písma, která se použije s volitelnými náhradními písmy |
uiFontFamily |
„-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, ….“ | Rodina písma, která se použije pro uživatelské rozhraní s volitelnými zpětnými možnostmi |
fontWeight |
„normální“ | Výchozí váha písma: „normální“ nebo „tučné“ |
fontWeightBold |
„tučné“ | Váha písma pro tučné znaky: „normální“ nebo „tučné“ |
cursorColor |
„rgba(248,28,229,0.8)“ | Barva caretu v terminálu |
cursorAccentColor |
„#000“ | Barva textu pod kurzorem BLOCK |
cursorShape |
„BLOCK“ | Tvar caretu v terminálu. K dispozici jsou tyto možnosti: „BEAM“, „UNDERLINE“, „BLOCK“ |
cursorBlink |
„false“ | Je-li true, bude kurzor blikat |
foregroundColor |
„#fff“ | Barva hlavního textu terminálu |
backgroundColor |
„#000“ | Barva a neprůhlednost pozadí okna a hlavního textu terminálu |
selectionColor |
„rgba(248,28,229,0.3)“ | Barva a krytí pozadí výběru textu v terminálu |
borderColor |
„#333“ | Barva okraje hlavního okna a pásu karet |
css |
„“ | Vlastní CSS pro zahrnutí do hlavního okna |
padding |
„12px 14px“ | Hodnoty paddingu CSS pro prostor kolem každého termínu |
colors |
{ černá: „#000000“, červená: „#ff0000“, … } | Seznam přepisů pro barevnou paletu. Názvy kláves představují „ANSI 16“, které lze všechny vidět ve výchozí konfiguraci. |
shell |
„“ | Cesta k vlastnímu shellu, který se spustí při spuštění nové relace Hyper |
shellArgs |
„“ | Pole argumentů shellu |
env |
{} | Objekt proměnných prostředí, které se nastavují před spuštěním shellu |
windowSize |
Volená šířka/výška nového okna v pixelech | |
scrollback |
1000 | Počet řádků, které mají zůstat ve vyrovnávací paměti terminálu pro rolování |
copyOnSelect |
false | Pokud je true, vybraný text se automaticky zkopíruje do schránky |
quickEdit |
false | Pokud je to pravda, při kliknutí pravým tlačítkem myši se vybraný text zkopíruje nebo vloží, pokud není žádný výběr přítomen (ve výchozím nastavení v systému Windows je to pravda) |
defaultSSHApp |
pravda | Pokud je to pravda, bude Hyper nastaven jako výchozí klient protokolu SSH |
modifierKeys |
{altIsMeta: false} | Změní chování modifikačních kláves tak, aby se chovaly jako meta klávesy |
showHamburgerMenu |
pravda v Linuxu/Windows, false v macOS | Změní viditelnost nabídky hamburger. Dostupné možnosti jsou: true, false |
showWindowControls |
„“ | Změnit polohu/viditelnost ovládacích prvků okna. Dostupné možnosti jsou: true, false, „left“ |
Rozšíření API
Rozšíření jsou univerzální moduly Node.js načítané procesem Electron i vykreslovačem.
Systém rozšíření je navržen na základě kompozice rozhraní API, které používáme k sestavení terminálu: React
komponenty a Redux
akce.
Místo toho, abychom pro každý možný bod přizpůsobení vystavovali vlastní metodu nebo parametr API, umožňujeme vám zachytit a složit každý kousek funkčnosti!
Jediné znalosti, které jsou proto nutné k úspěšnému rozšíření Hyper
, jsou znalosti jeho základních open source knihoven.
Další podrobnosti o vývoji zásuvných modulů najdete v repozitáři Hyper.
Váš modul musí vystavit alespoň jednu z těchto metod:
Metoda | Vyvolává se z | Popis | ||||||
onApp |
Elektron |
Vyvolává se při prvním načtení aplikace. Pokud se zásuvný modul načte znovu, vyvolá se znovu s existující aplikací. Parametry:
|
||||||
onWindow |
Electron |
Vyvolává se při vytvoření každého okna. Pokud se zásuvný modul znovu načte, vyvolá se znovu s existujícími okny. Parametry:
|
||||||
onUnload |
Elektron |
Vyvolá se, když uživatel odstraní zásuvný modul. Parametry:
|
||||||
decorateConfig |
Electron / Renderer |
v0.5.0+. Umožňuje ozdobit uživatelskou konfiguraci. Parametry:
|
||||||
decorateEnv |
Elektron |
v0.7.0+. Umožňuje ozdobit uživatelské prostředí vrácením upraveného objektu prostředí. Parametry:
|
||||||
decorateMenu |
Electron |
Vyvoláno pomocí šablony Parametry:
|
||||||
decorateBrowserOptions |
Electron |
Umožňuje ozdobit možnosti Parametry:
|
||||||
onRendererWindow |
Renderer |
Vyvolává se při prvním nebo následném načtení zásuvného modulu v každém okně. Parametry:
|
||||||
middleware |
Renderer |
Vlastní middleware Redux, který může zachytit jakoukoli akci. Následně vyvoláme |
||||||
reduceUI reduceSessions reduceTermGroups |
Renderer |
Vlastní reduktor pro
|
||||||
getTabsProps |
Renderer |
Předává dolů rekvizity z
|
||||||
getTabProps |
Renderer |
Předává dolů rekvizity z
|
||||||
getTermGroupProps |
Renderer |
Předává dolů rekvizity z
|
||||||
getTermProps |
Renderer |
Předává dolů rekvizity z
|
||||||
mapHyperState mapTermsState mapHeaderState mapNotificationsState |
Renderer |
Vlastní mapovač pro stavové vlastnosti, které dostávají kontejnerové komponenty. Všimněte si, že aby dětské komponenty získaly tyto vlastnosti, musíte je předat dolů pomocí příslušných metod (jako Musí vracet rozšířený objekt předané mapy.
|
||||||
mapHyperDispatch mapTermsDispatch mapHeaderDispatch mapNotificationsDispatch |
Renderer |
Vlastní mapovač vlastností odesílání. Musí vracet rozšířený objekt předané mapy.
|
||||||
decorateHyper decorateNotifications decorateNotification decorateHeader decorateTabs decorateTab decorateTerms decorateTermGroup decorateSplitPane decorateTerm
|
Renderer |
Vyvolává se pomocí Parametry:
|
Načítání modulů
Uživatel může hot-load a hot-reload zásuvných modulů provést stisknutím kombinace Command + R (refresh). Snažte se prosím vytvářet zásuvné moduly, které nevyžadují kompletní restart aplikace, aby fungovaly.
Upozornění
Zásuvné moduly ovlivňující `BrowserWindow` se projeví na nových oknech po hot-reloadu.
V budoucnu bychom to mohli dělat automaticky.
Při vývoji můžete přidat svůj zásuvný modul do .hyper_plugins/local
a pak jej zadat v poli localPlugins
v .hyper.js
. Nové zásuvné moduly načítáme:
- Periodicky (každých několik hodin)
- Při změnách v konfiguračním souboru (
plugins
nebolocalPlugins
) - Když uživatel klikne na Zásuvné moduly > Aktualizovat vše nyní
Proces načítání zahrnuje
- Spuštění
npm prune
anpm install
v.hyper_plugins
. - Spuštění
require.cache
v procesu elektronu i vykreslovače - Vyvolání metod
on*
na stávajících instancích a opětovné vykreslení komponent s čerstvými dekoracemi na místě.
Umístění modulů
macOS | ~/Library/Application Support/Hyper/.hyper_plugins |
Windows | $Env:AppData/Hyper/.hyper_plugins |
Linux | ~/.config/Hyper/.hyper_plugins |
Pozn: zásuvné moduly na ~/.hyper_plugins
jsou stále podporovány, ale budou ignorovány, pokud jsou zásuvné moduly v adresáři aplikace přítomny. V opačném případě budou při prvním spuštění přesunuty do adresáře aplikace.
Poznámka: v hlavním procesu se zásuvné moduly registrují co nejdříve (vypálíme onLoad
). V prohlížeči je na uživateli, aby jejich načítání vyvolal stisknutím kombinace příkazů Command+R. Tímto způsobem dáváme uživateli kontrolu nad načítáním, aby nepřišel o kritickou práci kvůli rozšířením, která resetují stav nebo jej nezachovávají správně.
Dekorace komponent
Dáváme možnost poskytnout komponentu vyššího řádu pro každý kus Hyper
uživatelského rozhraní.
Její struktura je následující:
<Hyper> <Header> <Tabs> <Tab /> ... </Tabs> </Header> <Terms> <TermGroup> <SplitPane> <TermGroup> <Term /> ... </TermGroup> <TermGroup> <Term /> ... </TermGroup> </SplitPane> </TermGroup> </Terms> <Notifications> <Notification /> ... </Notifications></Hyper>
Všechny metody decorate*
obdrží v objektu předaném jako druhý parametr následující odkazy:
React |
Celý jmenný prostor React. |
notify |
Pomocná funkce, která zobrazí oznámení na ploše. Prvním parametrem je název, druhým je volitelné tělo oznámení a třetím je další volitelný parametr, který lze použít k protokolování podrobností do vývojové konzoly. Chcete-li tyto podrobnosti předat, jednoduše zadejte a objekt s vlastností |
Notification |
Komponenta Notification v případě, že ji chcete znovu použít. |
Všechny komponenty akceptují následující dvě vlastnosti, které rozšiřují jejich značení:
customChildren |
Pole Element nebo jedenElement , který se vloží na konec komponenty. |
customChildrenBefore |
Stejná jako výše uvedená vlastnost, ale vložená jako první podřízený prvek (prvky) komponenty. |
Vaše komponenta vyššího řádu může poskytnout vlastnost onDecorated
zdobené komponentě, aby získala odkaz na její instanci.
Vaše komponenta vyššího řádu Term může dodat vlastnost onCursorMove
handler, která se zavolá, když se kurzor přesunul, s parametrem objektu reprezentujícím jeho relativní polohu vůči počátku Term:
x |
Horizontální pozice v pixelech |
y |
Vertikální pozice v pixelech |
width |
Šířka kurzoru v pixelech |
height |
Výška kurzoru v pixelech |
col |
Horizontální pozice ve sloupcích |
row |
Vertikální pozice v řádcích |
Podporujeme zachování kompatibility s ostatními dekorátory. Protože jich lze nastavit mnoho, nepředpokládejte, že ten váš je jediný.
Pokud například předáváte děti, skládejte potenciální existující hodnoty:
render () { const customChildren = Array.from(this.props.customChildren) .concat(<p>My new child</p>); return <Tab {...this.props} customChildren={customChildren} />}
Nebo pokud používáte onDecorated
vlastnost
onDecorated (term) { this.term = term; if (this.props.onDecorated) { this.props.onDecorated(term); }}
Akce a efekty
Všechny akce Reduxu jsou vám k dispozici pro zpracování prostřednictvím vašeho middlewaru a reduktorů. Příklad najdete v referenčním pluginu Hyperpower.
Vedlejší efekty se vyskytují ve dvou základních podobách:
- Některé akce dispečují jiné akce na základě stavu.
- Některé akce provádějí asynchronní práci tak, že komunikují přes RPC kanál s hlavním procesem
Ve všech případech je vedlejší efekt předán jako klíč effect
v akci a později zpracován naším middlewarem.
To znamená, že efekty můžete přepisovat, skládat nebo zcela eliminovat! Jinými slovy, takto můžete měnit výchozí funkčnost nebo chování aplikace.
Jako příklad uveďme akci, kterou používáme pro zvětšení velikosti písma po stisknutí klávesy 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 }); } }); };}
Základní terminál
Hyper
dosahuje velké části své rychlosti a funkčnosti díky výkonu xtermu.js
Další API
Objekty Electron app
jsou rozšířeny o následující vlastnosti:
config |
Objekt Object s blokem config z .hyper.js . |
plugins |
An Object s pomocníky pro zásuvné moduly. |
getWindows |
A Function , který vrátí Set všech otevřených oken. |
createWindow |
A Function , který vytvoří nové okno. Přijímá nepovinný callback , který bude předán jako zpětné volání nového okna init . |
Elektronické BrowserWindow
objekty jsou rozšířeny o následující parametry:
rpc |
An EventEmitter , který umožňuje komunikaci s procesem okna. |
sessions |
A Map objektů Session , které udržují komunikaci s jednotlivými termíny pty. |
Renderovací okna jsou podobně rozšířena o:
rpc |
Objekt EventEmitter , který umožňuje komunikaci s procesem okna. |
store |
Objekt Redux Store . Umožňuje přístup k akcím dispatch nebo čtení globálního stavu pomocí getState . |
Objekt rpc
je symetrický mezi procesem prohlížeče a vykreslovače. API je stejné jako u Node.js s tím rozdílem, že jako parametry připouští pouze jeden objekt:
window.rpc.emit('hi there', { some: 'payload', any: });
Příklad tématu: Hyperyellow
Následující rozšíření jednoduše změní konfiguraci tak, aby přidalo CSS a žluté barvy! Zde je kód.
Témata jsou jednoduše zásuvné moduly! Je potřeba pouze jeden háček, 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; } ` });}
Jména tříd jsem zachytil kontrolou termínu pomocí nástroje Devtools, který můžete spustit z View -> Toggle Developer Tools
. Když tak učiníte, všimněte si, že některé třídy jsou automaticky vygenerovány a následuje za nimi náhodný nonce (např.: term_13hv8io
). Těch si nevšímejte: mění se s každým novým oknem!“
Všimněte si důrazu na pěknou spolupráci s ostatními rozšířeními. Konkrétně vytvoříme nový objekt, rozšíříme pouze klíče, které nás zajímají, a sestavíme CSS tak, aby bylo zachováno nastavení uživatele i ostatních autorů:
return Object.assign({}, config, { css: ` ${config.css || ''} /* your css here */ `});
Příklad rozšíření: Hyperpower
Následující rozšíření vykresluje částice při pohybu caretu:
Projdeme si jeho kód.
Nejprve zachytíme akci Redux SESSION_ADD_DATA
. Úplný seznam akcí najdete v repozitáři.
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); }};
Všimněte si, že akci znovu nevysíláme, což znamená, že nikdy nevytváříme výstup příkazu do terminálu. Místo toho dispatchujeme vlastní akci, kterou uchopíme v uiReducer
a později namapujeme:
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 });};
Poté chceme ozdobit komponentu <Term>
tak, abychom měli přístup k základnímu caretu.
Kontejner <Term>
však není kontejner, na který bychom mohli mapovat rekvizity. Proto použijeme getTermProps
k předání vlastnosti dále dolů:
exports.getTermProps = (uid, parentProps, props) => { return Object.assign(props, { wowMode: parentProps.wowMode });}
Rozšíření pak vrátí komponentu vyššího řádu, která zabalí <Term>
. Všimněte si, že předáváme vlastnost onDecorated
pro přístup k základní komponentě Term a jejímu DOM ref a vlastnost onCursorMove
pro použití Hyper cursor API:
render () { return React.createElement(Term, Object.assign({}, this.props, { onDecorated: this._onDecorated, onCursorMove: this._onCursorMove }));}
.