Instalare

ultima versiune: 3.0.2

64 biți
macOS (.app) 3.0.2
Windows (.exe) 3.0.2
Debian (.deb) 3.0.2
Fedora (.rpm) 3.0.2
Alte distribuții Linux (.AppImage) 3.0.2

Obiectivele proiectului

Obiectivul proiectului este de a crea o experiență frumoasă și extensibilă pentru utilizatorii interfeței de linie de comandă, construită pe standarde web deschise. La început, atenția noastră se va concentra în principal în jurul vitezei, stabilității și dezvoltării API-ului corect pentru autorii de extensii.

În viitor, anticipăm că comunitatea va veni cu adăugiri inovatoare pentru a îmbunătăți ceea ce ar putea fi cea mai simplă, mai puternică și mai bine testată interfață pentru productivitate.

Extensiuni

Extensiunile sunt disponibile pe npm. Încurajăm pe toată lumea să includă hyper în câmpul keywords din package.json.

$ npm search hyper

Apoi editați .hyper.js și adăugați-l la plugins

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

Hyper va afișa o notificare atunci când modulele dvs. sunt instalate în .hyper_plugins.

Keymaps

Toate cheile de comandă pot fi modificate. Pentru a le schimba, editați .hyper.js și adăugați modificarea dorită la keymaps.

Apoi Hyper va schimba valoarea implicită cu modificarea dvs. personalizată.

Exemplu: 'window:devtools': 'Cmd+Alt+O'

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

Default keymaps:

Configuration

Localizare configurare

.

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

Note: configurația de la ~/.hyper.js este încă acceptată, dar va fi ignorată, dacă este prezentă configurația din directorul de aplicații. În caz contrar, aceasta va fi mutată în directorul de aplicații la prima rulare.

Obiectul config văzut mai sus în .hyper.js admite următoarele

.

.

.

.

.

Property Default Description
updateChannel „stable” Canalul de actualizare de pe care se primesc actualizări
fontSize 12 Dimensiunea implicită în pixeli pentru terminal
fontFamily „Menlo, DejaVu Sans Mono, Lucida Console, monospace” Familia de fonturi de utilizat cu fallback-uri opționale
uiFontFamily „-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, …” Familia de fonturi care urmează să fie utilizată pentru interfața de utilizare, cu variante opționale
fontWeight „normal” Greutatea implicită a fontului: „normal” sau „bold”
fontWeightBold „bold” Greutatea fontului pentru caracterele bold: „normal” sau „bold”
cursorColor „rgba(248,28,229,0.8)” Culoarea caretului în terminal
cursorAccentColor „#000” Culoarea textului sub cursorul BLOCK
cursorShape „BLOCK” Forma caretului în terminal. Opțiunile disponibile sunt: ‘BEAM’, ‘UNDERLINE’, ‘BLOCK’
cursorBlink „false” Dacă este adevărat, cursorul va clipi
foregroundColor „#fff” Culoarea textului principal al terminalului
backgroundColor „#000” Culoarea și opacitatea fundalului ferestrei și a fundalului principal al terminalului
selectionColor „rgba(248,28,229,0.3)” Culoarea și opacitatea fundalului selecției de text în terminal
borderColor „#333” Culoarea marginii ferestrei principale și a barei de tabulare
css „” CSS personalizat de inclus în fereastra principală
padding „12px 14px” Valorile padding-ului CSS pentru spațiul din jurul fiecărui termen
colors { black: „#000000”, roșu: „#ff0000”, … } O listă de suprascrieri pentru paleta de culori. Numele cheilor reprezintă „ANSI 16”, care pot fi văzute toate în configurația implicită.
shell „” O cale către un shell personalizat care să ruleze atunci când Hyper începe o nouă sesiune
shellArgs „” O matrice de argumente de shell
env {} Un obiect de variabile de mediu care trebuie setat înainte de lansarea shell-ului
windowSize Lățimea/înălțimea implicită în pixeli a unei noi ferestre
scrollback 1000 Numărul de rânduri care urmează să fie păstrate în memoria tampon a terminalului pentru derulare
copyOnSelect false Dacă este adevărat, textul selectat va fi copiat automat în clipboard
quickEdit false Dacă este adevărat, la un clic dreapta, textul selectat va fi copiat sau lipit dacă nu este prezentă nicio selecție (true by default pe Windows)
defaultSSHApp true Dacă este adevărat, Hyper va fi setat ca și client de protocol implicit pentru SSH
modifierKeys {altIsMeta: false} Schimbă comportamentul tastelor modificatoare pentru a acționa ca o tastă meta
showHamburgerMenu true pe Linux/Windows, false pe macOS Schimbă vizibilitatea meniului hamburger. Opțiunile disponibile sunt: true, false
showWindowControls „” Schimbă poziția/vizibilitatea controalelor din fereastră. Opțiunile disponibile sunt: true, false, „left”

Extensiuni API

Extensiunile sunt module universale Node.js încărcate atât de Electron, cât și de procesul de redare.

Sistemul de extensii este conceput în jurul compoziției API-urilor pe care le folosim pentru a construi terminalul: React componente și Redux acțiuni.

În loc să expunem o metodă sau un parametru API personalizat pentru fiecare punct de personalizare posibil, vă permitem să interceptați și să compuneți fiecare bucată de funcționalitate!

Unele cunoștințe care sunt, prin urmare, necesare pentru a extinde cu succes Hyper sunt cele ale bibliotecilor open source care stau la baza sa.

Puteți găsi detalii suplimentare despre dezvoltarea de plugin-uri în depozitul Hyper.

Modul dvs. trebuie să expună cel puțin una dintre aceste metode:

Metoda Invocată de Descriere
onApp Electron

Invocată la prima încărcare a aplicației. Dacă un plugin se reîncarcă, este invocat din nou cu aplicația existentă.

Parametri:

app Aplicația electron.
onWindow Electron

Invocată la crearea fiecărei ferestre. Dacă un plugin se reîncarcă, este invocat din nou cu ferestrele existente.

Parametri:

window Un electron BrowserWindow.
onUnload Electron

Invocat atunci când un plugin este eliminat de către utilizator.

Parametri:

app Aplicația electron.
decorateConfig Electron / Renderer

v0.5.0+. Vă permite să decorați configurația utilizatorului.
Util pentru tematizare sau parametri personalizați pentru plugin-ul dvs.

Parametri:

config Obiectul config
decorateEnv Electron

v0.7.0+. Vă permite să decorați mediul utilizatorului prin returnarea unui obiect de mediu modificat.

Parametri:

environment Obiectul environment
decorateMenu Electron

Invocat cu șablonul MenuElectron. Dacă un plugin se reîncarcă, este apelat din nou și meniul este reîmprospătat.

Parametri:

menu Obiectul șablon de meniu
decorateBrowserOptions Electron

Vă permite să decorați opțiunile BrowserWindow lui Electron atunci când se creează o fereastră nouă.

Parametri:

options Obiectul de opțiuni BrowserWindow.
onRendererWindow Renderer

Invocat atunci când un plugin este încărcat pentru prima dată sau reîncărcat ulterior în fiecare fereastră.

Parametri:

window Obiectul fereastră
middleware Renderer

Un middleware Redux personalizat care poate intercepta orice acțiune. Ulterior, invocăm thunkmiddleware-ul, ceea ce înseamnă că middleware-ul dvs. poatenext thunks.

reduceUI
reduceSessions
reduceTermGroups
Renderer

Un reductor personalizat pentru forma de stare ui, sessions sau termgroups.

.

state Obiectul de stare Redux
action Obiectul de acțiune
getTabsProps Renderer

Pasează props de la <Tabs>la componenta <Header>. Trebuie să returneze obiectul props compus.

parentProps Props de la componenta părinte.
props Proprietățile existente care vor fi transmise componentei.
getTabProps Renderer

Pasează props de la <Tab>la componenta <Tabs>. Trebuie să returneze obiectul props compus.

uid Tab / Term uid
parentProps Props de la componenta părinte.
props Proprietățile existente care vor fi transmise componentei.
getTermGroupProps Renderer

Transmite props de la <Terms>la componenta <TermGroup>. Trebuie să returneze obiectul props compus.

uid TermGroup uid
parentProps Props de la componenta părinte.
props Proprietățile existente care vor fi transmise componentei.
getTermProps Renderer

Transmite props de la <TermGroup>la componenta <Term>. Trebuie să returneze obiectul props compus.

uid Termen uid
parentProps Props din componenta părinte.
props Proprietățile existente care vor fi transmise componentei.
mapHyperState
mapTermsState
mapHeaderState
mapNotificationsState
Renderer

Un mapper personalizat pentru proprietățile de stare pe care le primesc componentele container. Rețineți că pentru ca componentele copii să primească aceste proprietăți, trebuie să le transmiteți în jos folosind metodele corespunzătoare (cum ar fi getTermProps).

Trebuie să returneze un obiect extins al hărții transmise.

state Starea globală Redux
map Harta existentă a proprietăților care vor fi transmise componentei.
mapHyperDispatch
mapTermsDispatch
mapHeaderDispatch
mapNotificationsDispatch
Renderer

Un mapator personalizat pentru proprietățile de expediere. Trebuie să returneze un obiect extins al hărții transmise.

dispatch Funcția de expediere Redux
map Hărți existente de proprietăți care vor fi transmise componentei.
decorateHyper
decorateNotifications
decorateNotificationdecorateHeader
decorateTabs
decorateTabdecorateTerms
decorateTermGroup
decorateSplitPane
decorateTerm
Renderer

Invocat cu React Componentpentru a decora. Trebuie să returneze o componentă de ordin superior.

Parametri:

Hyper Constructorul React Component.
env O colecție de referințe de module utile pentru construirea componentelor. Vezi mai jos

Încărcarea modulelor

Utilizatorul poate încărca și reîncărca la cald modulele prin apăsarea Command + R (refresh). Vă rugăm să vă străduiți să realizați plugin-uri care să nu necesite o repornire completă a aplicației pentru a funcționa.

Atenție

Pluginele care afectează `BrowserWindow` vor avea efect asupra noilor ferestre după reîncărcarea la cald.

În viitor am putea face acest lucru în mod automat.

Când dezvoltați, puteți adăuga plugin-ul dvs. la .hyper_plugins/local și apoi să îl specificați sub matricea localPlugins în .hyper.js. Încărcăm plugin-uri noi:

  • Periodic (la câteva ore)
  • Când se fac modificări în fișierul de configurare (plugins sau localPlugins)
  • Când utilizatorul face clic pe Plugins > Update all now

Procesul de reîncărcare implică

  • Executarea npm prune și npm install în .hyper_plugins.
  • Executarea require.cache atât în electroni, cât și în procesul de randare
  • Invocarea metodelor on* pe instanțele existente și redarea din nou a componentelor cu decorațiile proaspete la locul lor.

Localizarea pluginurilor

.

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

Nota: pluginurile de la ~/.hyper_plugins sunt încă acceptate, dar vor fi ignorate, dacă sunt prezente pluginurile din directorul de aplicații. În caz contrar, acestea vor fi mutate în directorul de aplicații la prima rulare.

Nota: pe procesul principal, plugin-urile sunt înregistrate cât mai curând posibil (lansăm onLoad). Pe browser, este la latitudinea utilizatorului să declanșeze încărcarea lor apăsând comanda+R. În acest fel, punem utilizatorul în controlul încărcării pentru a preveni pierderea muncii critice de către extensiile care resetează starea sau nu o păstrează corect.

Decorarea componentelor

Vă oferim posibilitatea de a oferi o componentă de ordin superior pentru fiecare piesă a interfeței Hyper.
Structura sa este următoarea:

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

Toate metodele decorate* primesc următoarele referințe într-un obiect trecut ca al doilea parametru:

React Întregul spațiu de nume React.
notify

O funcție ajutătoare care afișează o notificare pe desktop. Primul parametru este titlul, al doilea este corpul opțional al notificării, iar al treilea este un alt parametru opțional care poate fi utilizat pentru a înregistra detalii în consola de dezvoltare.

Pentru a transmite aceste detalii, este suficient să furnizați un obiect cu o proprietate error care să conțină informațiile de înregistrat.

Notification Componenta Notification în cazul în care doriți să o reutilizați.

Toate componentele acceptă următoarele două proprietăți pentru a-și extinde marcajul:

customChildren Un array de Element sau un singurElement pentru a fi inserat în partea de jos a componentei.
customChildrenBefore La fel ca și proprietatea de mai sus, dar inserată ca primul (primele) element(e) copil(e) al(e) componentei.

Componenta de ordin superior poate furniza o onDecoratedproprietate componentei decorate pentru a obține o referință la instanța acesteia.

Componenta dvs. de ordin superior Term poate furniza o proprietate onCursorMovehandler care să fie apelată atunci când cursorul s-a deplasat cu un parametru obiect care reprezintă poziția sa relativă față de originea Term:

.

x Poziția orizontală în pixeli
y Poziția verticală în pixeli
width Lățimea cursorului în pixeli
height Înălțimea cursorului în pixeli
col Poziția orizontală în coloane
row Poziția verticală în rânduri

Vă încurajăm să mențineți compatibilitatea cu alte decoratoare. Deoarece multe pot fi setate, nu presupuneți că al dvs. este singurul.

De exemplu, dacă treceți copii, compuneți potențialele valori existente:

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

Sau dacă folosiți proprietatea onDecorated

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

Acțiuni și efecte

Toate acțiunile Redux sunt disponibile pentru a fi gestionate prin intermediul middleware-ului și reductoarelor dvs. Pentru un exemplu, consultați pluginul de referință Hyperpower.

Efectele secundare apar în două forme fundamentale:

  • Câteva acțiuni expediază alte acțiuni pe baza stării.
  • Câteva acțiuni fac muncă asincronă comunicând prin canalul RPC cu procesul principal

În toate cazurile, efectul secundar este trecut ca și cheie effect în acțiune și este gestionat ulterior de către middleware-ul nostru.

Acest lucru înseamnă că puteți suprascrie, compune sau elimina complet efectele! Cu alte cuvinte, acesta este modul în care puteți schimba funcționalitatea sau comportamentul implicit al aplicației.

Ca exemplu, luați în considerare acțiunea pe care o folosim pentru a mări dimensiunea fontului atunci când apăsați 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 }); } }); };}

Terminalul subiacent

HyperTerminalul subiacent

Hyper obține o mare parte din viteza și funcționalitatea sa datorită puterii xterm.js

Additional APIs

Obiectele Electron app sunt extinse cu următoarele proprietăți:

config Un Object cu blocul config din .hyper.js.
plugins Un Object cu ajutoare pentru plugin-uri.
getWindows Un Function care returnează un Set al tuturor ferestrelor deschise.
createWindow Un Function care va crea o fereastră nouă. Acceptă un callback opțional care va fi trecut ca init callback al init noii ferestre.

Obiectele BrowserWindowElectron BrowserWindow sunt extinse cu următorii parametri:

rpc Un EventEmitter care permite comunicarea cu procesul ferestrei.
sessions Un Map de Sessionobiecte care dețin comunicarea cu pty-ul fiecărui termen…

Fereastra de redare este extinsă în mod similar cu:

rpc Un EventEmitter care permite comunicarea cu procesul ferestrei.
store Obiectul Redux Store. Acesta permite accesul la acțiunile dispatch sau citirea stării globale cu getState.

Obiectul rpc este simetric între browser și procesul de randare. API-ul este același ca în Node.js, cu excepția faptului că nu admite decât un singur obiect ca și parametrii săi doar:

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

Exemplu de temă: Hyperyellow

Următoarea extensie modifică pur și simplu configurația pentru a adăuga CSS și culori galbene! Iată codul.

Temele sunt pur și simplu plugin-uri! Este necesar doar un singur cârlig, 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; } ` });}

Am preluat numele claselor inspectând termenul cu Devtools, pe care îl puteți declanșa din View -> Toggle Developer Tools. Când faceți acest lucru, observați că unele clase sunt generate automat și urmate de un nonce aleatoriu (de exemplu: term_13hv8io). Ignorați-le pe acelea: ele se schimbă la fiecare fereastră nouă!

Observați accentul pus pe a juca frumos cu alte extensii. Mai exact, creăm un nou obiect, extindem doar cheile care ne interesează și compunem CSS-ul pentru a păstra setările utilizatorului și ale altor autori:

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

Exemplu de extensie: Hyperpower

Următoarea extensie redă particule pe măsură ce se deplasează cursorul:

Să parcurgem codul său.
În primul rând, interceptăm acțiunea Redux SESSION_ADD_DATA. Puteți găsi lista completă a acțiunilor în depozit.

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

Observați că nu redistribuim acțiunea, ceea ce înseamnă că nu redăm niciodată ieșirea comenzii în terminal. În schimb, dispecerizăm o acțiune proprie, pe care o preluăm în uiReducerși mai târziu o mapăm:

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

Vrem apoi să decorăm componenta <Term> astfel încât să putem accesa caret-ul subiacent.

Dar, <Term>nu este un container în care să putem mapa props. Așa că folosim getTermProps pentru a trece proprietatea mai jos:

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

Extensia returnează apoi o componentă de ordin superior pentru a înveli <Term>. Observați că transmitem proprietatea onDecorated pentru a accesa componenta Term de bază și ref DOM a acesteia, iar proprietatea onCursorMove pentru a utiliza API-ul de cursor Hyper:

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

.

admin

Lasă un răspuns

Adresa ta de email nu va fi publicată.

lg