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 keywords
mező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:
|
||||||
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:
|
||||||
onUnload |
Elektron |
Elhívódik, ha egy bővítményt a felhasználó eltávolít. Paraméterek:
|
||||||
decorateConfig |
Electron / Renderer |
v0.5.0+. Lehetővé teszi a felhasználói konfiguráció díszítését. Paraméterek:
|
||||||
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:
|
||||||
decorateMenu |
Electron |
Az Electron Paraméterek:
|
||||||
decorateBrowserOptions |
Electron |
Az Electron Paraméterek:
|
||||||
onRendererWindow |
Renderer |
A plugin első betöltésekor vagy későbbi újratöltésekor minden ablakban meghívódik. Paraméterek:
|
||||||
middleware |
Renderer |
Egy egyedi Redux middleware, amely bármilyen műveletet képes elfogni. Ezt követően meghívjuk a |
||||||
reduceUI reduceSessions reduceTermGroups |
Renderer |
Egy egyéni reduktor a
|
||||||
getTabsProps |
Renderer |
A
|
||||||
getTabProps |
Renderer |
A
|
||||||
getTermGroupProps |
Renderer |
Átadja a
|
||||||
getTermProps |
Renderer |
Átadja a
|
||||||
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 Az átadott leképező kiterjesztett objektumát kell visszaadnia.
|
||||||
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.
|
||||||
decorateHyper decorateNotifications decorateNotification decorateHeader decorateTabs decorateTab decorateTerms decorateTermGroup decorateSplitPane decorateTerm
|
Renderer |
Az Paraméterek:
|
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
vagylocalPlugins
) - Amikor a felhasználó a Plugins > Update all now
Az újratöltés folyamata magában foglalja
- A
npm prune
ésnpm 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 |
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 onDecorated
tulajdonságot a díszített komponensnek, hogy hivatkozást kapjon a példányára.
A Term magasabb rendű komponensed megadhat egy onCursorMove
handler 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 callback ot, amely az új ablak init visszahívásaként kerül átadásra. |
Az BrowserWindow
Elektron 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 Session objektum, 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 decorateConfig
szü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 onDecorated
tulajdonsá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 }));}