Instalação
versão mais recente: 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 |
Outras distros Linux (.AppImage) | 3.0.2 |
Metas do projeto
O objetivo do projeto é criar uma bela e extensível experiência para usuários de interface de linha de comando, construída sobre padrões web abertos. No início, nosso foco será principalmente em torno da velocidade, estabilidade e o desenvolvimento da API correta para autores de extensão.
No futuro, antecipamos que a comunidade irá apresentar adições inovadoras para melhorar o que poderia ser a interface mais simples, poderosa e bem testada para a produtividade.
Extensões
Extensões estão disponíveis em npm. Nós encorajamos a todos a incluir hyper
no campo keywords
em package.json
.
$ npm search hyper
Em seguida, edite .hyper.js
e adicione-o a plugins
module.exports = { config: { /*... */ }, plugins: };
Hyper
irá mostrar uma notificação quando seus módulos forem instalados para .hyper_plugins
.
Keymaps
Todas as teclas de comando podem ser alteradas. Para alterá-las, edite .hyper.js
e adicione a alteração desejada para keymaps
.
Então Hyper irá alterar o padrão com sua alteração personalizada.
Exemplo: 'window:devtools': 'Cmd+Alt+O'
module.exports = { config: { /*... */ }, keymaps: { 'window:devtools': 'cmd+alt+o' }};
Keymaps por defeito:
Configuração
Configurar localização
macOS | ~/Library/Application Support/Hyper/.hyper.js |
Janelas | $Env:AppData/Hyper/.hyper.js |
Linux | ~/.config/Hyper/.hyper.js |
Nota: config em ~/.hyper.js
ainda é suportado, mas será ignorado, se configurada no diretório de aplicação presente. Caso contrário ele será movido para o diretório de aplicação na primeira execução.
O objeto config
visto acima em .hyper.js
admite o seguinte
Propriedade | Padrão | Descrição |
>updateChannel > |
“estável” | O canal de atualização para receber atualizações de |
fontSize |
12 | O tamanho padrão em pixels para o terminal |
fontFamily |
“Menlo, DejaVu Sans Mono, Lucida Console, monospace” | A família de fontes a usar com fallbacks opcionais |
uiFontFamily > |
“-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, ….” | A família de fontes a usar para a IU com fallbacks opcionais |
fontWeight |
“normal” | O peso padrão da fonte: “normal” ou “bold” |
fontWeightBold > |
“bold” | >O peso da fonte para caracteres bold: “normal” ou “negrito” |
cursorColor | “rgba(248,28,229,0).8)” | A cor do carpete no terminal |
>cursorAccentColor > |
“#000” | A cor do texto sob o cursor BLOCK |
cursorShape |
“BLOCK” | A forma do carpete no terminal. As opções disponíveis são: ‘BEAM’, ‘UNDERLINE’, ‘BLOCK’ |
cursorBlink | “false” | Se for verdade, o cursor piscará |
foregroundColor |
“#fff” | A cor do texto principal do terminal |
backgroundColor | “#000” | A cor e opacidade da janela e fundo do terminal principal |
selectionColor |
“rgba(248,28,229,0.3)” | A cor de fundo/opacidade da seleção de texto no terminal |
borderColor |
“#333” | A cor da borda da janela principal e barra de tabulação |
css |
“” | CSS Personalizado para incluir na janela principal |
padding |
“12px 14px” | CSS valores de enchimento para o espaço em torno de cada termo |
>colors > |
{ preto: “#000000”, vermelho: “#ff0000”, … } | Uma lista de anulações para a paleta de cores. Os nomes das teclas representam o “ANSI 16”, que pode ser visto na configuração padrão. |
shell |
“” | Um caminho para uma shell personalizada para executar quando Hyper inicia uma nova sessão |
shellArgs |
“” | Uma matriz de argumentos de shell |
env | {} | Um objeto de variáveis de ambiente a definir antes lançando shell |
windowSize |
>A largura/altura padrão em pixels de uma nova janela | |
scrollback |
1000 | O número de linhas a serem persistidas no buffer de terminal para rolagem |
copyOnSelect |
falso | Se verdadeiro, o texto selecionado será automaticamente copiado para o clipboard |
quickEdit |
falso | Se verdadeiro, no clique direito do mouse, o texto selecionado será copiado ou colado se nenhuma seleção estiver presente (true by default no Windows) |
defaultSSHApp |
true | Se verdadeiro, Hyper será definido como o cliente de protocolo padrão para SSH |
modifierKeys |
{altIsMeta: false} | Alterar o comportamento das teclas modificadoras para agir como meta-chave |
showHamburgerMenu > |
verdadeiro no Linux/Windows, false no MacOS | Alterar a visibilidade do menu de hambúrgueres. As opções disponíveis são: true, false |
showWindowControls |
“” | Alterar a posição/visibilidade dos controles da janela. As opções disponíveis são: true, false, “left” |
Extensions API
Extensions são módulos universais do Node.js carregados tanto pelo Electron como pelo processo do renderizador.
O sistema de extensão é projetado em torno da composição das APIs que usamos para construir o terminal: React
componentes e Redux
ações.
Em vez de expor um método ou parâmetro API personalizado para cada ponto de customização possível, nós permitimos que você intercepte e componha cada bit de funcionalidade!
O único conhecimento que é necessário para estender com sucesso Hyper
é o de suas bibliotecas de código aberto subjacentes.
Você pode encontrar detalhes adicionais sobre o desenvolvimento de plugins no repositório Hyper.
O seu módulo tem de expor pelo menos um destes métodos:
Método | Convidado de | Descrição | ||||||
onApp |
Electron |
Convidado quando o aplicativo carregar pela primeira vez. Se um plugin recarregar, é invocado novamente com o aplicativo existente. Parâmetros:
|
||||||
onWindow |
Electrão |
Foquando cada janela é criada. Se um plugin recarregar, é invocado novamente com as janelas existentes. Parâmetros:
|
||||||
onUnload |
Electrão |
Falado quando um plugin é removido pelo utilizador. Parâmetros:
|
||||||
decorateConfig |
Electron / Renderer |
v0.5.0+. Permite decorar a configuração do utilizador. Parâmetros:
|
||||||
decorateEnv |
Electron |
v0.7.0+. Permite-lhe decorar o ambiente do utilizador devolvendo um objecto de ambiente modificado. Parâmetros:
|
||||||
decorateMenu |
Electron |
Falecido com o modelo Electron’s Parâmetros:
|
||||||
decorateBrowserOptions |
Electron |
Permite decorar as Parâmetros:
|
||||||
onRendererWindow |
Renderizador |
Fabricado quando um plugin é carregado pela primeira vez ou posteriormente recarregado em cada janela. Parâmetros:
|
||||||
middleware |
Renderizador | >
Um middleware Redux personalizado que pode interceptar qualquer acção. Subsequentemente invocamos o middleware |
||||||
reduceUI reduceSessions reduceTermGroups |
Renderizador |
Um redutor personalizado para o
|
||||||
getTabsProps |
Renderizador |
Passar os escoras de
|
||||||
getTabProps |
Renderizador |
Passar os adereços de
|
||||||
getTermGroupProps |
Renderizador |
Passar os prumos de
|
||||||
getTermProps
|
Renderizador |
Passar os prumos de
|
||||||
mapHyperState mapTermsState mapHeaderState mapNotificationsState |
>Renderizador |
Um mapeador personalizado para as propriedades de estado que os componentes do recipiente recebem. Note que para que os componentes filhos recebam essas propriedades, você tem que passá-las usando os métodos correspondentes (como Deve retornar um objeto estendido do mapa passado.
|
||||||
mapHyperDispatch mapTermsDispatch mapHeaderDispatch >mapNotificationsDispatch |
Renderizador |
Um mapeador personalizado para as propriedades de expedição. Deve retornar um objeto extendido do mapa passado.
|
||||||
decorateHyper decorateNotifications decorateNotification decorateHeader decorateTabs decorateTab decorateTerms decorateTermGroup decorateSplitPane decorateTerm
|
Renderizador |
Fabricado com o Parâmetros:
|
Carregamento do módulo
O utilizador pode carregar e carregar os plugins a quente pressionando Command + R (refresh). Por favor, esforce-se para fazer plugins que não requerem um reinício completo da aplicação para funcionar.
Notice
Plugins que afetem a `BrowserWindow` terão efeito em novas janelas após o carregamento a quente.
No futuro poderemos fazer isso automaticamente.
Ao desenvolver, você pode adicionar seu plugin a .hyper_plugins/local
e então especificá-lo sob a matriz localPlugins
em .hyper.js
. Nós carregamos novos plugins:
- Periodicamente (a cada poucas horas)
- Quando são feitas alterações no arquivo de configuração (
plugins
oulocalPlugins
) - Quando o usuário clica em Plugins > Atualizar tudo agora
O processo de recarga envolve
- Executar
npm prune
enpm install
em.hyper_plugins
. - Pruning the
require.cache
tanto no processo de electrão como no processo de renderização - Invoquérito
on*
métodos sobre as instâncias existentes e renderização de componentes com as decorações frescas no local.
Localização dos plugins
macOS | ~/Library/Application Support/Hyper/.hyper_plugins |
Janelas | $Env:AppData/Hyper/.hyper_plugins |
Linux | >~/.config/Hyper/.hyper_plugins
|
Nota: plugins em ~/.hyper_plugins
ainda são suportados, mas serão ignorados, se plugins no diretório de aplicações presentes. Caso contrário eles serão movidos para o diretório da aplicação na primeira execução.
Note: no processo principal, os plugins são registrados o mais rápido possível (nós disparamos onLoad
). No navegador, cabe ao usuário acionar sua carga pressionando comando+R. Nós colocamos o usuário no controle da carga desta forma para evitar que ele perca trabalho crítico por extensões que reinicializam o estado ou não o preservam corretamente.
Decorando componentes
Damos-lhe a capacidade de fornecer um componente de ordem superior para cada peça do Hyper
UI.
A estrutura da Its é a seguinte:
<Hyper> <Header> <Tabs> <Tab /> ... </Tabs> </Header> <Terms> <TermGroup> <SplitPane> <TermGroup> <Term /> ... </TermGroup> <TermGroup> <Term /> ... </TermGroup> </SplitPane> </TermGroup> </Terms> <Notifications> <Notification /> ... </Notifications></Hyper>
Todos os métodos decorate*
recebem as seguintes referências num objecto passado como segundo parâmetro:
React |
O espaço de nomes do React inteiro. |
notify |
Uma função helper que mostra uma notificação desktop. O primeiro parâmetro é o título, o segundo é o corpo opcional da notificação, e o terceiro é outro parâmetro opcional que pode ser usado para registrar detalhes no console de desenvolvimento. Para passar estes detalhes, basta fornecer e objeto com uma propriedade |
Notification |
O componente Notification caso você queira reutilizá-lo. |
Todos os componentes aceitam as duas propriedades seguintes para estender sua marcação:
customChildren |
Um array de Element ou um únicoElement para inserir na parte inferior do componente. |
customChildrenBefore |
O mesmo que a propriedade acima, mas inserido como o(s) primeiro(s) elemento(s) infantil(es) do componente. |
O seu componente de pedido superior pode fornecer uma onDecorated
propriedade ao componente decorado para obter uma referência à sua instância.
Seu componente de ordem superior pode fornecer uma propriedade onCursorMove
handler que será chamada quando o cursor se mover com um parâmetro de objeto representando sua posição relativa à origem do Termo:
x |
Posição horizontal em pixels |
y |
Posição vertical em pixels |
width |
Largura do cursor em pixels |
height |
Altura do cursor em pixels |
col |
Posição horizontal em colunas |
row |
Posição vertical em linhas |
Aconselhamo-lo a manter a compatibilidade com outros decoradores. Como muitos podem ser definidos, não assuma que o seu é o único.
Por exemplo, se você está passando crianças, componha valores potenciais existentes:
render () { const customChildren = Array.from(this.props.customChildren) .concat(<p>My new child</p>); return <Tab {...this.props} customChildren={customChildren} />}
Or se você usar onDecorated
propriedade
onDecorated (term) { this.term = term; if (this.props.onDecorated) { this.props.onDecorated(term); }}
Ações e Efeitos
Todas as ações Redux estão disponíveis para você lidar através de seu middleware e redutores. Para um exemplo, consulte o plugin de referência Hyperpower.
Efeitos secundários ocorrem em duas formas fundamentais:
- Acções que enviam outras acções com base no estado.
- Algumas ações fazem trabalho assimétrico comunicando-se através do canal RPC para o processo principal
Em todos os casos, o efeito colateral é passado como a chave effect
na ação e mais tarde tratado pelo nosso middleware.
Isso significa que você pode sobrepor, compor ou eliminar completamente os efeitos! Em outras palavras, é assim que você pode alterar a funcionalidade ou comportamento padrão do app.
Como exemplo, considere a ação que usamos para aumentar o tamanho da fonte quando você pressiona 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 }); } }); };}
O terminal subjacente
Hyper
atinge muita da sua velocidade e funcionalidade graças ao poder do xterm.js
As APIs adicionais
O elétron app
objetos são estendidos com as seguintes propriedades:
config |
Um Object com o bloco config de .hyper.js . |
plugins |
Um Object com ajudantes para plugins. |
getWindows |
A Function A Function que devolve um Set de todas as janelas abertas. |
createWindow > |
A Function que irá criar uma nova janela. Aceita um opcional callback que será passado como a nova janela init callback. |
Electron BrowserWindow
objetos são estendidos com os seguintes parâmetros:
rpc |
An EventEmitter que permite a comunicação com o processo da janela. |
sessions |
A Map de Session objetos que mantêm a comunicação com cada termo. |
As janelas do renderizador são estendidas similarmente com:
rpc |
An EventEmitter que permite a comunicação com o processo da janela. |
store > |
O objecto Redux Store . Isto permite o acesso a dispatch ações ou ler o estado global com . |
O objeto rpc
é simétrico entre o browser e o processo de renderizador. A API é a mesma do Node.js, com a exceção de que ela admite apenas um único objeto como parâmetro:
window.rpc.emit('hi there', { some: 'payload', any: });
Tema de exemplo: Hyperyellow
A seguinte extensão simplesmente altera a configuração para adicionar CSS e cores amarelas! Aqui está o código.
Temas são simplesmente plugins! Apenas um gancho, decorateConfig
é necessário:
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; } ` });}
Eu peguei os nomes das classes inspecionando o termo com Devtools, que você pode acionar a partir de View -> Toggle Developer Tools
. Quando o faz, note que algumas classes são automaticamente geradas e seguidas por um nonce aleatório (por exemplo: term_13hv8io
). Ignore essas: elas mudam a cada nova janela!
Note a ênfase em jogar bem com outras extensões. Especificamente, nós criamos um novo objeto, estendemos apenas as chaves que nos interessam, e compomos o CSS para preservar a configuração do usuário e a de outros autores’:
return Object.assign({}, config, { css: ` ${config.css || ''} /* your css here */ `});
Example extension: Hyperpower
A seguinte extensão renderiza partículas à medida que o carpete se move:
Vamos através do seu código.
Primeiro, interceptamos a acção Redux SESSION_ADD_DATA
. Você pode encontrar a lista completa de ações no repositório.
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); }};
Note que nós não re-dispatchamos a ação, o que significa que nós nunca renderizamos a saída do comando para o terminal. Em vez disso, nós despachamos uma ação nossa, que nós pegamos no mapa uiReducer
e mais tarde no mapa:
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 });};
Nós então queremos decorar o componente <Term>
para que possamos acessar o caret.
No entanto, <Term>
não é um container para o qual nós podemos mapear adereços. Então usamos getTermProps
para passar a propriedade mais abaixo:
exports.getTermProps = (uid, parentProps, props) => { return Object.assign(props, { wowMode: parentProps.wowMode });}
A extensão então retorna um componente de ordem superior para embrulhar <Term>
. Note que passamos a propriedade onDecorated
property para acessar o componente Term base e sua ref DOM, e a propriedade onCursorMove
para usar Hyper cursor API:
render () { return React.createElement(Term, Object.assign({}, this.props, { onDecorated: this._onDecorated, onCursorMove: this._onCursorMove }));}