Telepítés

legújabb verzió: 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
Egyéb Linux disztrók (.AppImage) 3.0.2

Projekt céljai

A projekt célja egy szép és bővíthető, nyílt webes szabványokra épülő felhasználói élmény létrehozása a parancssori felület felhasználói számára. Kezdetben elsősorban a sebességre, a stabilitásra és a megfelelő API fejlesztésére összpontosítunk a kiterjesztések szerzői számára.

A jövőben arra számítunk, hogy a közösség innovatív kiegészítésekkel fog előállni, hogy továbbfejlesszük a termelékenység talán legegyszerűbb, legerősebb és legjobban tesztelt felületét.

Kiterjesztések

A kiterjesztések elérhetőek az npm-en. Mindenkit arra bátorítunk, hogy a keywordsmezőbe a package.json-ben írja be a hyper-öt.

$ npm search hyper

Az .hyper.js szerkesztése és a plugins

module.exports = { config: { /*... */ }, plugins: };

Hyper hozzáadása után a .hyper_plugins-ban megjelenik egy értesítés, amikor a modulok telepítése megtörténik.

Keymaps

Minden parancskulcs módosítható. A módosításukhoz szerkessze a .hyper.js és adja hozzá a kívánt módosítást a keymaps.

Ezután a Hyper megváltoztatja az alapértelmezettet az egyéni módosítással.

Példa: 'window:devtools': 'Cmd+Alt+O'

module.exports = { config: { /*... */ }, keymaps: { 'window:devtools': 'cmd+alt+o' }};

Alapértelmezett billentyűkártyák:

Konfiguráció

Konfiguráció helye

macOS ~/Library/Application Support/Hyper/.hyper.js
Windows $Env:AppData/Hyper/.hyper.js
Linux ~/.config/Hyper/.hyper.js

Figyelem! A ~/.hyper.js alatti config továbbra is támogatott, de figyelmen kívül marad, ha a config az alkalmazáskönyvtárban van. Ellenkező esetben az első futtatáskor átkerül az alkalmazáskönyvtárba.

A fentebb .hyper.js-ban látható config objektum a következőket ismeri el

.

.

.

.

Property Default Description
updateChannel “stabil” A frissítési csatorna, amelyről frissítéseket fogad
fontSize 12 A terminál alapértelmezett mérete pixelben
fontFamily “Menlo, DejaVu Sans Mono, Lucida Console, monospace” A használandó betűtípuscsalád opcionális tartalékokkal
uiFontFamily “-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, …” A használandó betűcsalád a felhasználói felülethez, opcionális tartalékokkal
fontWeight “normal” Az alapértelmezett betűsúly: “normal” vagy “bold”
fontWeightBold “bold” A betűsúly a vastag karakterekhez: “
cursorColor “rgba(248,28,229,0.8)” A caret színe a terminálban
cursorAccentColor “#000” A szöveg színe BLOCK kurzor alatt
cursorShape “BLOCK” A caret alakja a terminálban. A rendelkezésre álló lehetőségek a következők:
cursorBlink “false” Ha igaz, a kurzor villogni fog
foregroundColor “#fff” A terminál fő szövegének színe
backgroundColor “#000” Az ablak és a terminál fő hátterének színe és átlátszatlansága
selectionColor “rgba(248,28,229,0.3)” A terminálban lévő szövegkijelölés háttérszíne/áttetszősége
borderColor “#333” A főablak keretének és a tabulátor sávjának színe
css “” A főablakba beépítendő egyéni CSS
padding “12px 14px” CSS kitöltési értékek az egyes kifejezések körüli térhez
colors { black: “#000000”, red: “#ff0000”, … } A színpaletta felülbírálatainak listája. A billentyűk nevei az “ANSI 16”-ot képviselik, amelyek mindegyike az alapértelmezett konfigurációban látható.
shell “” A Hyper új munkamenet indításakor futtatandó egyéni shell elérési útja
shellArgs “” A shell argumentumainak tömbje
env {} A környezeti változók objektuma, amelyeket be kell állítani, mielőtt a program elindul. shell indítása előtt
windowSize Az új ablak alapértelmezett szélessége/magassága pixelben
scrollback 1000 A görgetéshez a terminálpufferben megőrzendő sorok száma
copyOnSelect false Ha igaz, a kiválasztott szöveg automatikusan átmásolódik a vágólapra
quickEdit false Ha igaz, jobb egérgombbal történő kattintásra a kijelölt szöveg másolásra kerül, vagy beillesztésre, ha nincs kijelölés (Windowson alapértelmezés szerint igaz)
defaultSSHApp igaz Ha igaz, a Hyper lesz beállítva az SSH alapértelmezett protokollkliensének
modifierKeys {altIsMeta: false} A módosító billentyűk viselkedésének megváltoztatása, hogy meta billentyűként viselkedjenek
showHamburgerMenu igaz Linux/Windows esetén, hamis macOS esetén A hamburger menü láthatóságának megváltoztatása. A rendelkezésre álló lehetőségek: true, false
showWindowControls “” Az ablakvezérlők pozíciójának/látványosságának módosítása. A rendelkezésre álló opciók: true, false, “left”

Bővítmények API

A bővítmények univerzális Node.js modulok, amelyeket az Electron és a renderelő folyamat egyaránt betölt.

A bővítményrendszer a terminál felépítéséhez használt API-k kompozíciójára épül: React komponensek és Redux akciók.

Ahelyett, hogy minden lehetséges testreszabási ponthoz egyéni API-metódust vagy paramétert tárnánk fel, lehetővé tesszük, hogy a funkcionalitás minden egyes bitjét elfogjuk és összeállítsuk!

Az egyetlen tudás, ami ezért szükséges a Hyper sikeres bővítéséhez, az a mögöttes nyílt forráskódú könyvtárak ismerete.

A Hyper adattárban további részleteket talál a bővítményfejlesztésről.

A modulodnak legalább egy ilyen metódust ki kell tennie:

Módszer Invoked from Description
onApp Electron

Invoked when the app first loads. Ha a bővítmény újratöltődik, a meglévő alkalmazással újra meghívásra kerül.

Paraméterek:

app Az elektron alkalmazás.
onWindow Elektron

Minden ablak létrehozásakor meghívódik. Ha egy bővítmény újratöltődik, akkor a meglévő ablakokkal újra meghívódik.

Paraméterek:

window Elektron BrowserWindow.
onUnload Elektron

Elhívódik, ha egy bővítményt a felhasználó eltávolít.

Paraméterek:

app Az Elektron alkalmazás.
decorateConfig Electron / Renderer

v0.5.0+. Lehetővé teszi a felhasználói konfiguráció díszítését.
Hasznos a témák kialakításához vagy a plugin egyéni paramétereihez.

Paraméterek:

config A config objektum
decorateEnv Elektron

v0.7.0+. Lehetővé teszi a felhasználói környezet díszítését egy módosított környezeti objektum visszaadásával.

Paraméterek:

environment A environment objektum
decorateMenu Electron

Az Electron Menu sablonjával hívható elő. Ha a plugin újratöltődik, újra meghívódik, és a menü frissül.

Paraméterek:

menu A menüsablon objektum
decorateBrowserOptions Electron

Az Electron BrowserWindow opcióinak díszítését teszi lehetővé új ablak létrehozásakor.

Paraméterek:

options A BrowserWindow opciók objektum.
onRendererWindow Renderer

A plugin első betöltésekor vagy későbbi újratöltésekor minden ablakban meghívódik.

Paraméterek:

window Az ablakobjektum
middleware Renderer

Egy egyedi Redux middleware, amely bármilyen műveletet képes elfogni. Ezt követően meghívjuk a thunkmiddleware-t, ami azt jelenti, hogy a middleware képesnext thunks.

reduceUI
reduceSessions
reduceTermGroups
Renderer

Egy egyéni reduktor a ui, sessions vagy termgroups állapotformához.

.

state A Redux állapotobjektum
action Az akcióobjektum
getTabsProps Renderer

A <Tabs>komponens kellékeit továbbítja a <Header> komponensnek. Vissza kell adnia az összeállított props objektumot.

parentProps Props a szülő komponensből.
props A meglévő tulajdonságok, amelyeket átad a komponensnek.
getTabProps Renderer

A <Tab>ból származó kellékeket adja át a <Tabs> komponensnek. Vissza kell adnia az összeállított kellékobjektumot.

uid Tab / Term uid
parentProps Props form the parent component.
props A meglévő tulajdonságok, amelyek átadásra kerülnek a komponensnek.
getTermGroupProps Renderer

Átadja a <Terms>ből származó kellékeket a <TermGroup> komponensnek. Vissza kell adnia az összeállított props objektumot.

uid TermGroup uid
parentProps Props form the parent component.
props A meglévő tulajdonságok, amelyek átadásra kerülnek a komponensnek.
getTermProps Renderer

Átadja a <TermGroup>ból a <Term> komponensnek a kellékeket. Vissza kell adnia az összeállított props objektumot.

uid Term uid
parentProps Props form the parent component.
props A meglévő tulajdonságok, amelyeket átad a komponensnek.
mapHyperState
mapTermsState
mapHeaderState
mapNotificationsState
Renderer

Egyedi leképező a konténer komponensek által kapott állapotjellemzőkhöz. Vegyük figyelembe, hogy ahhoz, hogy a gyermekkomponensek megkapják ezeket a tulajdonságokat, a megfelelő metódusokkal (például getTermProps) kell átadni őket.

Az átadott leképező kiterjesztett objektumát kell visszaadnia.

state A Redux globális állapot
map A meglévő tulajdonságtérkép, amelyet a komponensnek átadunk.
mapHyperDispatch
mapTermsDispatch
mapHeaderDispatch
mapNotificationsDispatch
Renderer

Egy egyéni leképező a küldési tulajdonságokhoz. Az átadott térkép kiterjesztett objektumát kell visszaadnia.

dispatch A Redux dispatch függvény
map A komponensnek átadandó tulajdonságok meglévő térképét.
decorateHyper
decorateNotifications
decorateNotificationdecorateHeader
decorateTabs
decorateTabdecorateTerms
decorateTermGroup
decorateSplitPane
decorateTerm
Renderer

Az React Componentdíszítéssel való meghívás. Egy magasabb rendű komponenst kell visszaadnia.

Paraméterek:

Hyper A React Componentkonstruktor.
env A komponensek építéséhez hasznos modulhivatkozások gyűjteménye. Lásd alább

Modulok betöltése

A felhasználó a Command + R (frissítés) billentyűkombináció megnyomásával tudja a bővítményeket gyors- és visszatölteni. Kérjük, törekedjen arra, hogy olyan pluginokat készítsen, amelyek működéséhez nem szükséges az alkalmazás teljes újraindítása.

Figyelem

A `BrowserWindow`-t érintő pluginok a hot-reload után az új ablakokra is hatással lesznek.

A jövőben ezt talán automatikusan megtesszük.

A fejlesztés során a pluginját hozzáadhatja a .hyper_plugins/local-hoz, majd a localPlugins tömb alatt a .hyper.js-ban megadhatja. Új bővítményeket töltünk be:

  • Periódikusan (néhány óránként)
  • Amikor a konfigurációs fájlban (plugins vagy localPlugins)
  • Amikor a felhasználó a Plugins > Update all now

Az újratöltés folyamata magában foglalja

  • A npm prune és npm install futtatását a .hyper_plugins-ban.
  • A require.cache futtatása mind az elektronban, mind a renderelési folyamatban
  • A on* metódusok meghívása a meglévő példányokon és a komponensek újrarendezése a friss díszítésekkel a helyükön.

Plugins helye

.

macOS ~/Library/Application Support/Hyper/.hyper_plugins
Windows $Env:AppData/Hyper/.hyper_plugins
Linux ~/.config/Hyper/.hyper_plugins

Figyelem! A ~/.hyper_plugins alatti pluginek továbbra is támogatottak, de figyelmen kívül maradnak, ha az alkalmazáskönyvtárban lévő pluginek jelen vannak. Ellenkező esetben az első futtatáskor átkerülnek az alkalmazáskönyvtárba.

Megjegyzés: a főfolyamaton a pluginek a lehető leghamarabb regisztrálásra kerülnek (onLoad tüzelünk). A böngészőn a felhasználó feladata, hogy a command+R billentyűkombináció megnyomásával indítsa el a betöltésüket. Azért adjuk ily módon a felhasználó kezébe a betöltés irányítását, hogy megakadályozzuk, hogy kritikus munkát veszítsen az állapotot visszaállító vagy azt nem megfelelően megőrző bővítmények miatt.

Komponensek díszítése

Megadjuk a lehetőséget, hogy a Hyper felhasználói felület minden darabjához egy magasabb rendű komponenst adjunk.
Szerkezete a következő:

<Hyper> <Header> <Tabs> <Tab /> ... </Tabs> </Header> <Terms> <TermGroup> <SplitPane> <TermGroup> <Term /> ... </TermGroup> <TermGroup> <Term /> ... </TermGroup> </SplitPane> </TermGroup> </Terms> <Notifications> <Notification /> ... </Notifications></Hyper>

Minden decorate* metódus a következő hivatkozásokat kapja a második paraméterként átadott objektumban:

React A teljes React névtér.
notify

Egy segédfüggvény, amely egy asztali értesítést jelenít meg. Az első paraméter a cím, a második az értesítés opcionális teste, a harmadik pedig egy másik opcionális paraméter, amellyel a fejlesztői konzolra naplózhatunk részleteket.

A részletek átadásához egyszerűen adjunk meg egy objektumot és egy error tulajdonságot, amely tartalmazza a naplózandó információkat.

Notification A Notification komponens, ha újra szeretnénk használni.

Minden komponens elfogadja a következő két tulajdonságot a jelölésük bővítéséhez:

customChildren Egy Element tömb vagy egyetlenElement, amelyet a komponens aljára kell beszúrni.
customChildrenBefore A fenti tulajdonsággal megegyező, de a komponens első gyermekelemeként (elemeiként) beszúrva.

A magasabb rendű komponens megadhat egy onDecoratedtulajdonságot a díszített komponensnek, hogy hivatkozást kapjon a példányára.

A Term magasabb rendű komponensed megadhat egy onCursorMovehandler tulajdonságot, amelyet akkor kell meghívni, amikor a kurzor elmozdult egy objektumparaméterrel, amely a Term origóhoz viszonyított relatív pozícióját mutatja:

.

x Horizontális pozíció pixelben
y Vertikális pozíció pixelben
width Cursor szélessége pixelben
height Kurzor magassága pixelben
col Horizontális pozíció oszlopokban
row Vertikális pozíció sorokban

Az egyéb dekorátorokkal való kompatibilitás fenntartását javasoljuk. Mivel sokan beállíthatók, ne feltételezd, hogy a tiéd az egyetlen.

Ha például gyerekeket adsz át, állítsd össze a lehetséges meglévő értékeket:

render () { const customChildren = Array.from(this.props.customChildren) .concat(<p>My new child</p>); return <Tab {...this.props} customChildren={customChildren} />}

Vagy ha a onDecorated tulajdonságot

onDecorated (term) { this.term = term; if (this.props.onDecorated) { this.props.onDecorated(term); }}

Actions and Effects

A Redux összes akciója elérhető számodra, hogy a middleware-en és a reduktorokon keresztül kezeld. Egy példát a Hyperpower referencia pluginban találsz.

A mellékhatások két alapvető formában fordulnak elő:

  • Egyik akció az állapot alapján más akciókat küld el.
  • Egyes akciók aszinkron munkát végeznek az RPC csatornán keresztül kommunikálva a főfolyamat felé

Minden esetben a mellékhatás effect kulcsként kerül átadásra az akcióban, és később a middleware-ünk kezeli.

Ez azt jelenti, hogy felülbírálhatjuk, összeállíthatjuk vagy teljesen kiiktathatjuk a hatásokat! Más szóval, így változtathatjuk meg az alkalmazás alapértelmezett funkcionalitását vagy viselkedését.

Egy példaként nézzük meg azt az akciót, amellyel a Command+= megnyomásakor növeljük a betűméretet:

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 }); } }); };}

A mögöttes terminál

Hyper sebességének és funkcionalitásának nagy részét az xterm erejének köszönhetően éri el.js

Kiegészítő API-k

Az Electron app objektumok a következő tulajdonságokkal bővülnek:

config Egy Object a config blokkal a .hyper.js-ból.
plugins Egy Object a bővítmények segítőivel.
getWindows Egy Function, amely visszaad egy Set-t az összes nyitott ablakról.
createWindow Egy Function, amely létrehoz egy új ablakot. Elfogad egy opcionális callbackot, amely az új ablak init visszahívásaként kerül átadásra.

Az BrowserWindowElektron BrowserWindow objektumok a következő paraméterekkel bővülnek:

rpc Egy EventEmitter, amely lehetővé teszi a kommunikációt az ablakfolyammal.
sessions Egy Map Sessionobjektum, amely az egyes terminusok pty. kommunikációját tartja.

A renderelő ablakok hasonlóan bővülnek:

rpc Egy EventEmitter, amely lehetővé teszi a kommunikációt az ablak folyamatával.
store A Redux Store objektummal. Ez lehetővé teszi a dispatch műveletek elérését vagy a globális állapot olvasását a getState segítségével.

A rpc objektum szimmetrikus a böngésző és a renderelő folyamat között. Az API ugyanaz, mint a Node.js, azzal a különbséggel, hogy paraméterként csak egyetlen objektumot fogad be:

window.rpc.emit('hi there', { some: 'payload', any: });

Példatéma: Hyperyellow

A következő kiterjesztés egyszerűen módosítja a configot, hogy CSS-t és sárga színeket adjon hozzá! Itt a kód.

A témák egyszerűen bővítmények! Csak egy kampó, a decorateConfigszükséges:

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; } ` });}

Az osztályneveket a Devtools segítségével a kifejezés vizsgálatával szereztem meg, amit a View -> Toggle Developer Tools-ről indíthatsz. Ha ezt megteszed, vedd észre, hogy néhány osztály automatikusan generálódik, és egy véletlenszerű nonce követi (pl.: term_13hv8io). Ne törődj ezekkel: minden új ablakkal változnak!

Észrevehető, hogy a hangsúly a más kiterjesztésekkel való jó együttműködésen van. Pontosabban, létrehozunk egy új objektumot, csak a minket érdeklő kulcsokat bővítjük, és úgy állítjuk össze a CSS-t, hogy megmaradjon a felhasználó és más szerzők beállítása:

return Object.assign({}, config, { css: ` ${config.css || ''} /* your css here */ `});

Példa bővítmény: Hyperpower

A következő kiterjesztés a caret mozgása közben rendereli a részecskéket:

Sétáljunk végig a kódján.
Először is, elfogjuk a Redux SESSION_ADD_DATA műveletét. Az akciók teljes listáját megtalálod az adattárban.

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); }};

Figyeljük meg, hogy nem küldjük vissza az akciót, ami azt jelenti, hogy soha nem adjuk vissza a parancs kimenetét a terminálra. Ehelyett egy saját akciót küldünk el, amelyet a uiReducer-ben ragadunk meg, és később leképezünk:

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 });};

Ezután a <Term> komponenst akarjuk díszíteni, hogy hozzáférhessünk a mögöttes carethez.

A <Term> azonban nem egy konténer, amelyhez leképezhetjük a kellékeket. Ezért a getTermProps segítségével továbbítjuk a tulajdonságot tovább:

exports.getTermProps = (uid, parentProps, props) => { return Object.assign(props, { wowMode: parentProps.wowMode });}

A kiterjesztés ezután egy magasabb rendű komponenst ad vissza a <Term> csomagolására. Vegyük észre, hogy átadjuk a onDecoratedtulajdonságot az alap Term komponens és annak DOM ref eléréséhez, és a onCursorMove tulajdonságot a Hyper cursor API használatához:

render () { return React.createElement(Term, Object.assign({}, this.props, { onDecorated: this._onDecorated, onCursorMove: this._onCursorMove }));}

admin

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.

lg