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:

app Aplikace Electron.
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:

window Elektron BrowserWindow.
onUnload Elektron

Vyvolá se, když uživatel odstraní zásuvný modul.

Parametry:

app Aplikace Electron.
decorateConfig Electron / Renderer

v0.5.0+. Umožňuje ozdobit uživatelskou konfiguraci.
Použitelné pro tvorbu témat nebo vlastních parametrů zásuvného modulu.

Parametry:

config Objekt config
decorateEnv Elektron

v0.7.0+. Umožňuje ozdobit uživatelské prostředí vrácením upraveného objektu prostředí.

Parametry:

environment Objekt environment
decorateMenu Electron

Vyvoláno pomocí šablony MenuElectron. Pokud se zásuvný modul znovu načte, zavolá se znovu a nabídka se obnoví.

Parametry:

menu Objekt šablony menu
decorateBrowserOptions Electron

Umožňuje ozdobit možnosti BrowserWindow Electronu při vytváření nového okna.

Parametry:

options Objekt BrowserWindow možností.
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:

window Objekt okna
middleware Renderer

Vlastní middleware Redux, který může zachytit jakoukoli akci. Následně vyvoláme thunkmiddleware, což znamená, že váš middleware můženext thunky.

reduceUI
reduceSessions
reduceTermGroups
Renderer

Vlastní reduktor pro ui, sessions nebo termgroups stavový tvar.

.

state Stavový objekt Redux
action Objekt akce
getTabsProps Renderer

Předává dolů rekvizity z <Tabs>do komponenty <Header>. Musí vrátit složený objekt props.

parentProps Props tvoří nadřazenou komponentu.
props Stávající vlastnosti, které budou předány komponentě.
getTabProps Renderer

Předává dolů rekvizity z <Tab>do komponenty <Tabs>. Musí vrátit složený objekt props.

uid Tabulka / Term uid
parentProps Props form the parent component.
props Stávající vlastnosti, které budou předány komponentě.
getTermGroupProps Renderer

Předává dolů rekvizity z <Terms>do komponenty <TermGroup>. Musí vrátit složený objekt props.

uid TermGroup uid
parentProps Props tvoří nadřazenou komponentu.
props Stávající vlastnosti, které budou předány komponentě.
getTermProps Renderer

Předává dolů rekvizity z <TermGroup>do komponenty <Term>. Musí vrátit složený objekt props.

uid Term uid
parentProps Props tvoří nadřazenou komponentu.
props Stávající vlastnosti, které budou předány komponentě.
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 getTermProps).

Musí vracet rozšířený objekt předané mapy.

state Globální stav Redux
map Stávající mapa vlastností, která bude předána komponentě.
mapHyperDispatch
mapTermsDispatch
mapHeaderDispatch
mapNotificationsDispatch
Renderer

Vlastní mapovač vlastností odesílání. Musí vracet rozšířený objekt předané mapy.

dispatch Dispečerská funkce Redux
map Existující mapa vlastností, která bude předána komponentě.
decorateHyper
decorateNotifications
decorateNotificationdecorateHeader
decorateTabs
decorateTabdecorateTerms
decorateTermGroup
decorateSplitPane
decorateTerm
Renderer

Vyvolává se pomocí React Componentk dekorování. Musí vrátit komponentu vyššího řádu.

Parametry:

Hyper Konstruktor React Component.
env Kolekce užitečných odkazů na moduly pro sestavování komponent. Viz níže

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 nebo localPlugins)
  • Když uživatel klikne na Zásuvné moduly > Aktualizovat vše nyní

Proces načítání zahrnuje

  • Spuštění npm prune a npm 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í error obsahující informace, které se mají protokolovat.

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 onDecoratedzdobené komponentě, aby získala odkaz na její instanci.

Vaše komponenta vyššího řádu Term může dodat vlastnost onCursorMovehandler, 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 Mapobjektů 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 uiReducera 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 }));}

.

admin

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.

lg