mirror of
https://github.com/quine-global/hyper.git
synced 2026-01-13 12:38:39 -09:00
1153 lines
82 KiB
HTML
1153 lines
82 KiB
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<title>Hyper™</title>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="initial-scale=1.0" />
|
|
<meta name="twitter:card" content="summary_large_image" />
|
|
<meta name="twitter:site" content="@zeithq" />
|
|
<meta name="og:title" content="Hyper™" />
|
|
<meta name="og:url" content="https://hyper.now.sh" />
|
|
<meta name="description" content="Hyper™: HTML/JS/CSS terminal" />
|
|
<meta name="og:description" content="Hyper™: HTML/JS/CSS terminal" />
|
|
<meta name="og:image" content="https://hyper.now.sh/static/hyper.png" />
|
|
<meta name="theme-color" content="#000000">
|
|
<link rel="dns-prefetch" href="https://cdn.zeit.co" />
|
|
<link rel="shortcut icon" href="favicon.png" />
|
|
<link rel="stylesheet" href="style.css" />
|
|
</head>
|
|
<body>
|
|
<div id="main">
|
|
<div id="header">
|
|
<span><a target="_blank" href="https://zeit.co">▲</a></span>
|
|
<span><a target="_blank" href="https://github.com/zeit/hyper/releases">Changelog</a></span>
|
|
<span><a target="_blank" href="https://github.com/zeit/hyper">GitHub</a></span>
|
|
<span>License: <b>MIT</b></span>
|
|
<span><span id="download-for">Download for:</span>
|
|
<a href="#installation" class="download-link"><img src="static/apple-logo.svg"/></a>
|
|
<a href="#installation" class="download-link"><img src="static/windows-logo.svg"/></a>
|
|
<a href="#installation" class="download-link"><img src="static/linux-logo.svg"/></a>
|
|
</span>
|
|
</div>
|
|
|
|
<div id="top">
|
|
<div id="loading"></div>
|
|
<div id="logo">
|
|
<img width='60' height='53' title='' alt='' src='data:image/gif;base64,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'>
|
|
|
|
<div class="title"><b>Hyper</b>™ <span style="font-size: 12px; display: block; margin-top: 6px; color: #999">JS/HTML/CSS Terminal</span></div>
|
|
</div>
|
|
<div id="video">
|
|
<video id="vid" src="https://cdn.zeit.co/hyper/hyperapp.mp4" height="100%" autoplay muted></video>
|
|
</div>
|
|
<div class="top-content">
|
|
<div class="top-download">
|
|
<a href="#installation" class="download-button">
|
|
<svg id="mac-os-icon" class="is-hidden" xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16" fill="currentColor" fill-rule="evenodd">
|
|
<path d="M13.11 12.415c-.24.552-.523 1.06-.85 1.527-.447.638-.813 1.078-1.095 1.323-.437.402-.905.608-1.407.62-.36 0-.794-.103-1.3-.31-.506-.207-.972-.31-1.398-.31-.447 0-.927.103-1.44.31-.512.207-.926.316-1.242.326-.48.022-.96-.19-1.44-.635-.304-.266-.686-.723-1.144-1.37-.49-.69-.894-1.49-1.21-2.404-.34-.986-.51-1.94-.51-2.865 0-1.06.23-1.973.688-2.74.36-.614.84-1.1 1.44-1.455.6-.356 1.248-.537 1.946-.55.382 0 .883.12 1.505.35.62.234 1.02.352 1.194.352.13 0 .574-.138 1.324-.413.71-.257 1.31-.362 1.8-.32 1.33.107 2.33.63 2.994 1.575-1.19.72-1.778 1.73-1.766 3.025.01 1.008.377 1.848 1.096 2.514.326.31.69.548 1.094.718-.088.255-.18.498-.28.733zm-3.05-12c0 .79-.29 1.527-.865 2.21C8.5 3.437 7.66 3.907 6.75 3.833c-.012-.095-.02-.195-.02-.3 0-.76.33-1.57.918-2.235.293-.336.665-.616 1.117-.84.45-.218.877-.34 1.278-.36.012.105.017.21.017.316z"/>
|
|
</svg>
|
|
<svg id="linux-icon" class="is-hidden" xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16" fill="currentColor" fill-rule="evenodd">
|
|
<path d="M13.47 13.393c-.065-.075-.158-.147-.276-.22-.018-.01-.067-.04-.147-.084-.08-.045-.143-.084-.192-.117-.048-.032-.11-.09-.188-.17-.077-.08-.14-.164-.183-.254-.044-.09-.088-.21-.13-.362-.04-.152-.064-.32-.07-.504-.084.072-.13.212-.14.424-.01.21.037.426.135.647.096.22.243.362.44.43.192.064.344.135.46.208.117.075.192.158.225.255.033.094-.023.197-.165.308-.144.11-.372.22-.687.327-.434.148-.743.276-.924.38-.183.103-.45.3-.8.593-.238.196-.49.302-.76.317-.267.014-.484-.084-.65-.294-.167-.212-.22-.512-.16-.9.112-.744.11-1.323-.008-1.74-.095-.326-.116-.615-.062-.865.053-.25.137-.395.25-.437.112-.043.234.047.365.267.01.03.04.088.08.175.042.087.075.147.103.183.026.036.067.08.12.14.055.056.122.095.202.12.08.024.174.04.28.044.203.006.384-.036.546-.126.16-.09.28-.19.36-.298.08-.11.16-.215.242-.317.08-.1.15-.158.21-.17.066-.01.126-.076.18-.195.053-.12.088-.284.106-.495.018-.21.004-.464-.044-.754-.09-.517-.266-1.085-.53-1.706-.265-.618-.562-1.103-.888-1.454-.59-.626-.985-1.274-1.187-1.946-.208-.71-.298-1.346-.268-1.91.03-.405-.06-.845-.263-1.318-.204-.474-.478-.834-.816-1.084-.214-.16-.48-.284-.795-.37-.316-.087-.63-.126-.947-.122-.387 0-.697.062-.93.188-.476.256-.79.567-.946.932-.155.366-.227.817-.214 1.352.024 1.18.072 2.1.144 2.768-.084.31-.453.89-1.107 1.74-.12.12-.236.28-.348.482-.113.202-.203.383-.268.545-.065.16-.153.393-.263.695-.11.304-.19.518-.237.644-.042.107-.107.232-.195.375-.09.143-.162.284-.214.42-.054.138-.084.293-.09.464-.007.13 0 .244.018.34.024.144.068.188.134.134.267-.202.604-.083 1.01.358.284.31.787 1.03 1.507 2.16.06.1.12.208.178.326.06.116.116.27.17.464.054.194.077.367.067.522-.01.155-.077.297-.206.428-.127.13-.32.214-.576.25-.137.018-.302.006-.496-.036-.193-.043-.44-.11-.737-.206-.297-.095-.517-.16-.66-.196-.21-.047-.505-.108-.89-.183-.383-.075-.634-.13-.753-.165-.203-.053-.312-.13-.33-.23-.018-.085.024-.228.126-.43.1-.202.15-.347.15-.437.008-.065.005-.13-.007-.196-.01-.065-.024-.116-.04-.15-.015-.037-.04-.09-.077-.16-.036-.073-.06-.127-.072-.16-.108-.25-.123-.42-.044-.51.054-.078.18-.11.383-.09.304.03.55-.015.742-.135.315-.195.41-.512.285-.946 0 .202-.036.354-.107.455-.072.102-.196.207-.376.313-.1.06-.28.095-.535.108-.257.012-.427.054-.51.126-.06.054-.09.134-.093.242-.004.108.01.215.04.326.03.11.06.237.09.38.03.143.042.262.036.357-.007.066-.06.228-.16.487-.102.26-.123.457-.062.595.03.065.08.124.15.174.073.05.173.093.3.13.128.035.245.063.353.084.108.02.256.048.446.08.19.033.342.06.455.085.38.077.815.206 1.303.384.49.177.82.27.992.275.167.006.327-.028.478-.103.152-.075.28-.16.39-.255.107-.095.265-.184.477-.268.21-.084.448-.128.71-.134.12-.007.293-.014.518-.023.227-.01.395-.013.51-.013.512 0 .897.003 1.16.008.178.006.32.034.42.085.1.05.166.11.196.174.03.066.08.142.148.227.068.087.156.157.263.21.226.107.492.15.796.128.303-.02.506-.078.607-.174.167-.16.392-.35.674-.572.283-.22.537-.387.764-.5l.243-.115c.113-.053.21-.1.286-.138.075-.04.17-.088.28-.147.11-.06.2-.114.267-.165.07-.05.14-.108.21-.175.07-.065.117-.13.138-.196.02-.066.028-.133.023-.2-.016-.072-.052-.143-.118-.217zm-4.785-8.63c.018-.012.03-.016.036-.013.007.003.02.014.037.036l.05.058.06.072c.027.03.056.054.086.072.036.025.078.04.13.05.05.007.09.024.115.043.026.022.045.057.058.104.012.065.002.126-.03.178-.033.054-.077.077-.13.072-.107-.025-.223-.118-.347-.28-.127-.166-.148-.295-.065-.39zM7.578 1.295c.03-.04.047-.07.054-.093.01-.036.013-.073.005-.11-.01-.04-.007-.078.008-.117.015-.04.05-.06.103-.067.054 0 .126.044.214.134.018.01.045.03.085.054.04.024.065.044.08.062.014.018.023.033.023.044-.012.03-.04.05-.08.062-.04.012-.087.018-.134.018-.048 0-.075.003-.08.008-.048.018-.093.044-.134.08-.04.036-.075.062-.098.08-.025.018-.048.018-.072 0-.025-.036-.033-.06-.026-.075.005-.015.023-.04.052-.08zM3.256 7.978c.04-.048.072-.087.09-.116.018-.03.035-.07.05-.12.014-.052.027-.09.04-.112.01-.025.03-.033.054-.026.01-.004.02.003.026.018.007.014.008.022.008.022v.027c0 .01 0 .022-.005.037l-.014.04c-.006.012-.01.03-.018.054-.006.026-.01.045-.018.063-.024.06-.06.113-.11.16-.05.048-.09.07-.112.062-.036-.013-.032-.05.008-.107zm5.84 5.508c-.01.19-.052.46-.12.803-.07.344-.11.574-.13.687-.125-.007-.195-.053-.213-.14-.018-.086 0-.197.054-.334.13-.398.2-.672.205-.82.012-.275-.018-.43-.09-.465-.065-.047-.166.043-.303.268-.264.43-.79.687-1.58.777-.715.095-1.21-.01-1.484-.32-.06-.044-.12-.05-.178-.024-.06.025-.098.054-.116.084-.006.01 0 .03.018.054l.085.107c.04.048.07.095.093.144.232.404.21.678-.062.82 0-.274-.02-.483-.062-.628-.042-.146-.126-.307-.25-.482-.125-.176-.21-.31-.26-.397.18-.018.314-.086.407-.205.094-.12.135-.247.127-.384-.01-.137-.06-.25-.157-.34-.054-.054-.33-.28-.83-.682-.5-.402-.81-.67-.93-.808-.024-.025-.095-.084-.214-.178-.12-.095-.194-.178-.223-.25-.275-.6-.304-1.096-.09-1.483l.036-.044c.028-.007.03.047.007.16-.036.166-.047.332-.036.5.025.374.132.654.323.838.125.126.21.116.26-.026.035-.047.05-.224.048-.527-.002-.304.003-.51.014-.616.048-.34.19-.76.425-1.26.234-.5.42-.767.557-.803-.108-.173-.142-.36-.103-.563.04-.203.1-.376.188-.518.087-.142.175-.308.263-.494.09-.188.134-.356.134-.505 0-.04.002-.072.01-.09.016-.054.092.012.222.196.25.37.438.586.563.652.13.072.276.068.438-.01.16-.077.36-.206.594-.384.235-.177.436-.31.603-.392.018-.007.045-.02.085-.04.04-.022.068-.037.09-.045.02-.008.047-.023.08-.04l.075-.045c.017-.01.035-.026.053-.04.018-.016.03-.03.036-.045.006-.015.01-.028.01-.04-.012-.055-.038-.087-.078-.1-.04-.01-.09-.004-.156.024-.066.026-.14.062-.22.108-.08.044-.17.095-.267.152-.1.057-.198.11-.3.156-.1.048-.21.09-.32.126-.114.035-.222.056-.323.06-.25.008-.45-.058-.597-.195-.095-.09-.146-.145-.152-.17-.007-.024.02-.03.08-.017.32.042.556.047.705.018.155-.025.362-.094.625-.206.054-.025.19-.082.407-.175.217-.09.385-.157.504-.193.07-.018.12-.045.146-.084.026-.04.036-.076.026-.108-.008-.033-.027-.06-.058-.075-.066-.036-.126-.012-.178.072-.03.053-.093.106-.188.156s-.183.09-.263.116c-.08.025-.183.058-.31.092-.124.036-.19.057-.204.062-.326.102-.63.146-.91.134-.13-.006-.237-.024-.317-.06-.08-.03-.136-.07-.165-.115-.03-.044-.077-.1-.144-.17-.065-.068-.14-.125-.223-.174-.058-.03-.08-.084-.066-.16.015-.078.06-.16.14-.243.005-.006.066-.042.18-.11.117-.07.2-.14.246-.21.054-.085.146-.17.276-.26.007-.025.01-.09.013-.197.003-.108-.027-.223-.086-.348-.058-.125-.14-.187-.24-.187-.145-.007-.244.036-.305.125-.06.09-.087.2-.08.33.006.113.033.212.084.3.05.086.096.128.14.128.064-.007.085.018.06.072-.035.065-.082.108-.143.126-.04.01-.087-.028-.138-.12-.05-.094-.09-.205-.116-.336-.026-.13-.037-.242-.03-.33.01-.184.06-.36.146-.53.087-.17.21-.252.37-.245.168.006.3.107.403.303.1.196.148.464.143.804.018.042.064.057.14.044.074-.012.172-.013.293-.005.123.01.21.042.264.094.006 0 .01-.044.01-.134-.108-.75.158-1.15.795-1.197.093.018.173.04.24.067.066.026.136.072.21.134.076.062.138.154.19.273.05.12.09.267.12.445v.33c0 .19-.04.297-.116.322-.126.042-.214.04-.268-.005-.054-.045-.047-.125.018-.238.06-.148.047-.32-.036-.517-.083-.196-.235-.286-.456-.268-.148.006-.256.086-.32.242-.067.154-.09.306-.073.454.017.15.05.227.097.232.036.006.142.054.317.144.176.09.308.142.396.16.232.047.364.122.397.223.033.1.02.248-.04.443-.06.194-.077.352-.055.478.025.13.07.25.134.358.066.107.136.205.21.294.074.09.16.256.262.5.1.242.193.55.276.918l.067.062c.04.036.078.08.117.134.04.054.085.126.14.22.053.092.11.226.173.406.062.177.12.383.175.615.065.275.1.594.103.956.003.363.026.612.072.746.044.134.16.19.344.165.232-.01.38-.137.446-.375.196-.69.036-1.52-.482-2.482-.196-.376-.365-.622-.51-.74.21.118.424.342.644.668.22.328.36.634.42.92l.05.236c.025.127.04.203.043.224l.036.183c.022.102.032.167.032.197s.003.088.01.174c.006.088.004.155-.005.202-.01.047-.018.11-.026.193-.01.08-.024.158-.044.232l-.066.244c.326.145.49.27.49.377-.12-.1-.3-.167-.533-.2-.232-.032-.447 0-.646.094-.2.096-.3.254-.308.474-.214 0-.366.054-.456.16-.13.155-.2.364-.205.63-.006.265.017.554.068.866.05.313.07.53.058.656zM5.354 3.138c-.018-.006-.032-.024-.044-.054 0-.053.026-.075.08-.062.036.012.07.058.103.134.033.077.04.167.023.268 0 .018-.008.026-.026.026-.065 0-.09-.06-.072-.178.018-.09-.003-.134-.064-.134zm2.314.144l-.018.026c-.047.03-.072.036-.072.018-.024-.16-.077-.253-.16-.277l-.036-.02c-.042-.035-.02-.057.062-.06.018-.008.044.002.08.025.036.024.07.06.098.11.03.053.046.11.046.177z"/>
|
|
</svg>
|
|
<svg id="windows-icon" class="is-hidden" xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16" fill="currentColor" fill-rule="evenodd">
|
|
<path d="M0 2.265l6.54-.887.002 6.287-6.536.037L0 2.265zM6.536 8.39l.005 6.293-6.535-.896v-5.44l6.53.043zm.792-7.13L15.998 0v7.585l-8.67.07V1.26zM16 8.45L15.998 16l-8.67-1.22-.012-6.345L16 8.45z"/>
|
|
</svg>
|
|
<span id="download-button-text">
|
|
<strong>Download Hyper</strong>
|
|
</span>
|
|
<svg id="fallback-icon" class="is-hidden" width="17px" height="13px" viewBox="0 0 17 13" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
|
<g fill="none" fill-rule="evenodd" stroke="currentColor" stroke-linecap="square"><path d="M.5 5.5v6M16.5 5.5v6M8.5.5v7.07M5.5 5l2.828 2.828M11.328 5L8.5 7.828M.5 12h16"/></g>
|
|
</svg>
|
|
</a>
|
|
<span class="other-downloads"><a href="#installation">Other platforms</a></span>
|
|
</div>
|
|
|
|
<div id="arrow"><a href="#installation"><img src="static/arrow.svg" width="18" /></a></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="content">
|
|
<h2 id="installation"><a href="#installation">Installation</a></h2>
|
|
|
|
<table id="installation-table" class="offset-header">
|
|
<tr>
|
|
<td style="width: 33.333%" class="invisible-top-left"></td>
|
|
<td style="width: 33.333%">32-bit</td>
|
|
<td style="width: 33.333%">64-bit</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>macOS</b> (.app)</td>
|
|
<td id="td-mac-os" colspan="2">
|
|
<a href="https://releases.hyper.is/download/mac">DOWNLOAD <img src="static/download-icon.svg"/></a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>Windows</b> (.exe)</td>
|
|
<td class="soon">COMING SOON</td>
|
|
<td id="td-win">
|
|
<a href="https://releases.hyper.is/download/win">DOWNLOAD <img src="static/download-icon.svg"/></a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>Debian</b> (.deb)</td>
|
|
<td class="soon">COMING SOON</td>
|
|
<td id="td-debian">
|
|
<a href="https://releases.hyper.is/download/deb">DOWNLOAD <img src="static/download-icon.svg"/></a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>Fedora</b> (.rpm)</td>
|
|
<td class="soon">COMING SOON</td>
|
|
<td id="td-fedora">
|
|
<a href="https://releases.hyper.is/download/rpm">DOWNLOAD <img src="static/download-icon.svg"/></a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>Other Linux distros</b> (.AppImage)</td>
|
|
<td class="soon">COMING SOON</td>
|
|
<td id="td-appimage" colspan="2">
|
|
<a href="https://releases.hyper.is/download/AppImage">DOWNLOAD <img src="static/download-icon.svg"/></a>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<h2 id="hashtag-goals"><a href="#hashtag-goals">Project goals</a></h2>
|
|
|
|
<p> The goal of the project is to create a beautiful and extensible experience
|
|
for command-line interface users, built on open web standards.</p>
|
|
|
|
<p>In the beginning, our focus will be primarily around speed, stability and
|
|
the development of the correct API for extension authors.</p>
|
|
|
|
<p>In the future, we anticipate the community will come up with
|
|
innovative additions to enhance what could be the simplest,
|
|
most powerful and well-tested interface for productivity.</p>
|
|
|
|
<h2 id="extensions"><a href="#extensions">Extensions</a></h2>
|
|
|
|
<p>Extensions are available on npm. We encourage everyone to
|
|
include <code>hyper</code> in the <code>keywords</code>
|
|
field in <code>package.json</code>.</p>
|
|
|
|
<pre><code>$ npm search hyper</code></pre>
|
|
|
|
<p>Then edit <code>~/.hyper.js</code> and add it to <code>plugins</code></p>
|
|
|
|
<pre><code>module.exports = {
|
|
|
|
config: { /*... */ },
|
|
|
|
plugins: [
|
|
<b>"hyperpower"</b>
|
|
]
|
|
|
|
};</code></pre>
|
|
|
|
<p><code>Hyper</code> will show a notification when your modules are
|
|
installed to <code>~/.hyper_plugins</code>.</p>
|
|
|
|
<p>You can also take a look at
|
|
<a href="https://github.com/bnb/awesome-hyper">Awesome Hyper</a>
|
|
for a curated list of plugins and resources.</p>
|
|
|
|
<h2 id="keymaps"><a href="#keymaps">Keymaps</a></h2>
|
|
|
|
<P> All command keys can be changed. In order to change them, edit
|
|
<code>~/.hyper.js</code> and add your desired change to <code>keymaps</code>.
|
|
</p>
|
|
<p> Then Hyper will change the default with your custom change.</p>
|
|
<p> Example: <code>'window:devtools': 'Cmd+Alt+O'</code> <p>
|
|
<pre><code>module.exports = {
|
|
config: { /*... */ },
|
|
|
|
keymaps: {
|
|
'window:devtools': 'cmd+alt+o'
|
|
}
|
|
|
|
};</code></pre>
|
|
|
|
<p>Default keymaps: </p>
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><a href="https://github.com/zeit/hyper/blob/master/app/keymaps/win32.json">Windows</a></td>
|
|
<td><a href="https://github.com/zeit/hyper/blob/master/app/keymaps/linux.json">Linux</a></td>
|
|
<td><a href="https://github.com/zeit/hyper/blob/master/app/keymaps/darwin.json">macOS</a></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<h2 id="cfg"><a href="#cfg">Configuration</a></h2>
|
|
|
|
<p>The <code>config</code> object seen above in <code>~/.hyper.js</code>
|
|
admits the following</p>
|
|
|
|
<table class="config">
|
|
<thead>
|
|
<tr>
|
|
<td>Property</td>
|
|
<td>Default</td>
|
|
<td>Description</td>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>"updateChannel"</td>
|
|
<td>"stable"</td>
|
|
<td>The update channel to receive updates from</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"fontSize"</td>
|
|
<td>12</td>
|
|
<td>The default size in pixels for the terminal</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"fontFamily"</td>
|
|
<td>"Menlo, DejaVu Sans Mono, Lucida Console, monospace"</td>
|
|
<td>The font family to use with optional fallbacks</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"uiFontFamily"</td>
|
|
<td>"-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, ..."</td>
|
|
<td>The font family to use for the UI with optional fallbacks</td>
|
|
</tr>
|
|
<tr>
|
|
<tr>
|
|
<td>"cursorColor"</td>
|
|
<td>"#F81CE5"</td>
|
|
<td>The color of the caret in the terminal</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"cursorShape"</td>
|
|
<td>"BLOCK"</td>
|
|
<td>The shape of the caret in the terminal. Available options are: 'BEAM', 'UNDERLINE', 'BLOCK'</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"cursorBlink"</td>
|
|
<td>"false"</td>
|
|
<td>If true, cursor will blink</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"foregroundColor"</td>
|
|
<td>"#fff"</td>
|
|
<td>The color of the main text of the terminal</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"backgroundColor"</td>
|
|
<td>"#000"</td>
|
|
<td>The color and opacity of the window and main terminal background</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"borderColor"</td>
|
|
<td>"#333"</td>
|
|
<td>The color of the main window border and tab bar</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"css"</td>
|
|
<td>""</td>
|
|
<td>Custom CSS to include in the main window</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"termCSS"</td>
|
|
<td>""</td>
|
|
<td>Custom CSS to include in the terminal window</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"padding"</td>
|
|
<td>"12px 14px"</td>
|
|
<td>CSS padding values for the space around each term</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"colors"</td>
|
|
<td>{ black: "#000000", red: "#ff0000", ... }</td>
|
|
<td>A list of overrides for the color palette. The names of the keys represent the "ANSI 16", which can all be seen <a href="https://github.com/zeit/hyper/blob/aaed99abac97a3d6b1766f194522a69e8a994bcb/lib/utils/colors.js">in the default config</a>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"shell"</td>
|
|
<td>""</td>
|
|
<td>A path to a custom shell to run when Hyper starts a new session</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"npmRegistry"</td>
|
|
<td>npm get registry</td>
|
|
<td>Override the npm registry URL to use when installing plugins</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"windowSize"</td>
|
|
<td>null</td>
|
|
<td>The default width/height in pixels of a new window e.g. [540, 380]</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"copyOnSelect"</td>
|
|
<td>false</td>
|
|
<td>If true, selected text will automatically be copied to the clipboard</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"quickEdit"</td>
|
|
<td>false</td>
|
|
<td>If true, on right click selected text will be copied or pasted if no selection is present (true by default on Windows)</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"bell"</td>
|
|
<td>"SOUND"</td>
|
|
<td>System bell configuration. Available options are: "SOUND", false</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"bellSoundURL"</td>
|
|
<td>"lib-resource:hterm/audio/bell"</td>
|
|
<td>The URL of the bell sound to use, used only if "bell" is set to "SOUND"</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"modifierKeys"</td>
|
|
<td>
|
|
{
|
|
cmdIsMeta: false,
|
|
altIsMeta: false
|
|
}
|
|
</td>
|
|
<td>Change the behaviour of modifier keys to act as meta key</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"showHamburgerMenu"</td>
|
|
<td>""</td>
|
|
<td>
|
|
Change the visibility of the hamburger menu. Available options
|
|
are: true, false
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"showWindowControls"</td>
|
|
<td>""</td>
|
|
<td>
|
|
Change the position/visibility of the window controls.
|
|
Available options are: true, false, "left"
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<span class="table-note"></span>
|
|
|
|
<h2 id="extensions-api"><a href="#extensions-api">Extensions API</a></h2>
|
|
|
|
<p>Extensions are universal Node.js modules loaded by both
|
|
Electron and the renderer process.</p>
|
|
|
|
<p>The extension system is designed around <b>composition</b>
|
|
of the APIs we use to build the terminal: <code>React</code>
|
|
components and <code>Redux</code> actions.</p>
|
|
|
|
<p>Instead of exposing a custom API method or parameter for
|
|
every possible customization point, we allow you to intercept
|
|
and compose every bit of functionality!</p>
|
|
|
|
<p>The only knowledge that is therefore required to successfully
|
|
extend <code>Hyper</code> is that of its underlying open
|
|
source libraries.</p>
|
|
|
|
<p>Your module has to expose at least one of these methods:</p>
|
|
|
|
<table class="api">
|
|
<thead>
|
|
<tr>
|
|
<td>Method</td>
|
|
<td>Invoked from</td>
|
|
<td>Description</td>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>onApp</code></td>
|
|
<td>Electron</td>
|
|
<td>
|
|
<p>Invoked when the app first loads. If a plugin reloads,
|
|
it's invoked again with the existing app.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>app</code></td>
|
|
<td>The electron app.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>onWindow</code></td>
|
|
<td>Electron</td>
|
|
<td>
|
|
<p>Invoked when each window is created. If a plugin reloads,
|
|
it's invoked again with the existing windows.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>window</code></td>
|
|
<td>An electron <code>BrowserWindow</code>.</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>onUnload</code></td>
|
|
<td>Electron</td>
|
|
<td>
|
|
<p>Invoked when a plugin is removed by the user.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>app</code></td>
|
|
<td>The electron app.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>decorateConfig</code></td>
|
|
<td>Electron / Renderer</td>
|
|
<td>
|
|
<p><b>v0.5.0+</b>. Allows you to decorate the user's configuration.<br>
|
|
Useful for themeing or custom parameters for your
|
|
plugin.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>config</code></td>
|
|
<td>The <code>config</code> object</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>decorateEnv</code></td>
|
|
<td>Electron</td>
|
|
<td>
|
|
<p><b>v0.7.0+</b>. Allows you to decorate the user's environment
|
|
by returning a modified environment object.
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>environment</code></td>
|
|
<td>The <code>environment</code> object</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>decorateMenu</code></td>
|
|
<td>Electron</td>
|
|
<td>
|
|
<p>Invoked with the Electron's <code>Menu</code> template.
|
|
If a plugin reloads, it's called again and the menu
|
|
is refreshed.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>menu</code></td>
|
|
<td>The menu template object</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>onRendererWindow</code></td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>Invoked when a plugin is first loaded or subsequently
|
|
reloaded in each window.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tr>
|
|
<tbody>
|
|
<td><code>window</code></td>
|
|
<td>The window object</td>
|
|
</tbody>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>middleware</code></td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>A custom Redux middleware that can intercept any
|
|
action. Subsequently we invoke the <code>thunk</code>
|
|
middleware, which means your middleware can
|
|
<code>next</code> thunks.</p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>reduceUI</code><br><code>reduceSessions</code><br><code>reduceTermGroups</code></td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>A custom reducer for the <code>ui</code>, <code>sessions</code> or <code>termgroups</code> state shape.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>state</code></td>
|
|
<td>The Redux state object</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>action</code></td>
|
|
<td>The action object</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>getTermGroupProps</code>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>Passes down props from <code><Terms></code>
|
|
to the <code><TermGroup></code> component. Must return
|
|
the composed props object.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>uid</code></td>
|
|
<td>TermGroup uid</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>parentProps</code></td>
|
|
<td>Props form the parent component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>props</code></td>
|
|
<td>The existing properties that will be
|
|
passed to the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>getTermProps</code>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>Passes down props from <code><TermGroup></code>
|
|
to the <code><Term></code> component. Must return
|
|
the composed props object.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>uid</code></td>
|
|
<td>Term uid</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>parentProps</code></td>
|
|
<td>Props form the parent component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>props</code></td>
|
|
<td>The existing properties that will be
|
|
passed to the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>getTabsProps</code>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>Passes down props from <code><Tabs></code>
|
|
to the <code><Header></code> component. Must return
|
|
the composed props object.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>parentProps</code></td>
|
|
<td>Props form the parent component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>props</code></td>
|
|
<td>The existing properties that will be
|
|
passed to the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>getTabProps</code>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>Passes down props from <code><Tab></code>
|
|
to the <code><Tabs></code> component. Must return
|
|
the composed props object.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>uid</code></td>
|
|
<td>Tab / Term uid</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>parentProps</code></td>
|
|
<td>Props form the parent component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>props</code></td>
|
|
<td>The existing properties that will be
|
|
passed to the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>mapHyperState</code><br>
|
|
<code>mapTermsState</code><br>
|
|
<code>mapHeaderState</code><br>
|
|
<code>mapNotificationsState</code>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>A custom mapper for the state properties that
|
|
<a href="https://github.com/zeit/hyper/tree/master/lib/containers" target="_blank">container components</a> receive. Note that for children components to
|
|
get these properties, you have to pass them down using the corresponding
|
|
methods (like <code>getTermProps</code>).</p><p> Must
|
|
return an extended object of the map passed.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>state</code></td>
|
|
<td>The <code>Redux</code> global state</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>map</code></td>
|
|
<td>The existing map of properties that will be
|
|
passed to the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>mapHyperDispatch</code><br>
|
|
<code>mapTermsDispatch</code><br>
|
|
<code>mapHeaderDispatch</code><br>
|
|
<code>mapNotificationsDispatch</code>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>A custom mapper for the dispatch properties. Must
|
|
return an extended object of the map passed.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>dispatch</code></td>
|
|
<td>The Redux dispatch function</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>map</code></td>
|
|
<td>The existing map of properties that will be
|
|
passed to the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>decorateHyper</code><br>
|
|
<code>decorateNotifications</code><br>
|
|
<code>decorateNotification</code>
|
|
<code>decorateHeader</code><br>
|
|
<code>decorateTabs</code><br>
|
|
<code>decorateTab</code>
|
|
<code>decorateTerms</code><br>
|
|
<code>decorateTermGroup</code><br>
|
|
<code>decorateSplitPane</code><br>
|
|
<code>decorateTerm</code><br>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>Invoked with the <code>React</code> <code>Component</code>
|
|
to decorate. Must return a Higher Order Component.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>Hyper</code></td>
|
|
<td>The <code>React</code> <code>Component</code>
|
|
constructor.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>env</code></td>
|
|
<td>A collection of useful module references for
|
|
building components. <a href="#decorating-components">See below</a></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<span class="table-note"></span>
|
|
|
|
<h3 id="extensions-module-loading"><a href="#extensions-module-loading">Module loading</a></h3>
|
|
|
|
<p>The user can hot-load and hot-reload plugins by pressing
|
|
Command + R (refresh). Please strive to make plugins that don't
|
|
require a complete restart of the application to work.</p>
|
|
|
|
<h4>Notice</h4>
|
|
<p>Plugins affecting the `BrowserWindow` will the effect on new windows after hot-reload.</p>
|
|
|
|
<p>In the future we might do this automatically.</p>
|
|
|
|
<p>When developing, you can add your plugin to
|
|
<code>~/.hyper_plugins/local</code> and then specify it
|
|
under the <code>localPlugins</code> array in <code>~/.hyper.js</code>.
|
|
|
|
We load new plugins:
|
|
<ul>
|
|
<li>Periodically (every few hours)</li>
|
|
<li>When changes are made to the configuration file
|
|
(<code>plugins</code> or <code>localPlugins</code>)</li>
|
|
<li>When the user clicks Plugins > Update all now</li>
|
|
</ul>
|
|
|
|
<p>The process of reloading involves</p>
|
|
<ul>
|
|
<li>Running <code>npm prune</code> and <code>npm install</code>
|
|
in <code>~/.hyper_plugins</code>.</li>
|
|
<li>Pruning the <code>require.cache</code> in both electron
|
|
and the renderer process</li>
|
|
<li>Invoking <code>on*<code> methods on the existing instances
|
|
and re-rendering components with the fresh decorations in place.</li>
|
|
</ul>
|
|
|
|
<p>Note: on the main process, plugins are registered as
|
|
soon as possible (we fire <code>onLoad</code>).
|
|
On the browser, it's up to the user to trigger their load by
|
|
pressing command+R. We put the user in control of the loading
|
|
in this way to prevent them from losing critical work by
|
|
extensions that reset state or don't preserve it correctly.</p>
|
|
|
|
<h3 id="decorating-components"><a href="#decorating-components">Decorating components</a></h3>
|
|
|
|
<p>We give you the ability to provide a higher order component
|
|
for every piece of the <code>Hyper</code> UI.<br> Its structure
|
|
is as follows:</p>
|
|
|
|
<pre><code><Hyper>
|
|
<Header>
|
|
<Tabs>
|
|
<Tab /> ...
|
|
</Tabs>
|
|
</Header>
|
|
<Terms>
|
|
<TermGroup>
|
|
<SplitPane>
|
|
<TermGroup>
|
|
<Term /> ...
|
|
</TermGroup>
|
|
<TermGroup>
|
|
<Term /> ...
|
|
</TermGroup>
|
|
</SplitPane>
|
|
</TermGroup>
|
|
</Terms>
|
|
<Notifications>
|
|
<Notification /> ...
|
|
</Notifications>
|
|
</Hyper></code></pre>
|
|
|
|
<p>All the <code>decorate*</code> methods receive the following
|
|
references in an object passed as the second parameter:</p>
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>React</code></td>
|
|
<td>The entire React namespace.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>notify</code></td>
|
|
<td>A helper function that shows a desktop notification.
|
|
The first parameter is the title and the second is the optional
|
|
body of the notification.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>Notification</code></td>
|
|
<td>The <code>Notification</code> component in case you
|
|
want to re-use it.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>All the components accept the following two properties
|
|
to extend their markup:</p>
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>customChildren</code></td>
|
|
<td>An array of <code>Element</code> or a single
|
|
<code>Element</code> to insert at the bottom
|
|
of the component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>customChildrenBefore</code></td>
|
|
<td>The same as the above property, but inserted
|
|
as the first child element(s) of the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
<p>Your higher order component can supply a <code>onDecorated</code>
|
|
property to the decorated component to get a reference to its instance.</p>
|
|
|
|
<p>We encourage you to maintain compatibility with other decorators.
|
|
Since many can be set, don't assume that yours is the only one.<p>
|
|
|
|
<p>For example, if you're passing children, compose potential existing
|
|
values:</p>
|
|
|
|
<pre><code>render () {
|
|
const customChildren = Array.from(this.props.customChildren)
|
|
.concat(<p>My new child</p>);
|
|
return <Tab {...this.props} customChildren={customChildren} />
|
|
}</code></pre>
|
|
|
|
<p>Or if you use <code>onDecorated</code> property</p>
|
|
<pre><code>onDecorated (term) {
|
|
this.term = term;
|
|
if (this.props.onDecorated) {
|
|
this.props.onDecorated(term);
|
|
}
|
|
}</code></pre>
|
|
|
|
|
|
<h3 id="actions-and-effects"><a href="#actions-and-effects">Actions and Effects</a></h3>
|
|
|
|
<p>All the <a href="https://github.com/zeit/hyper/tree/master/lib/actions"
|
|
target="_blank">Redux actions</a> are available for you to
|
|
handle through your middleware and reducers. For an example, refer to the <a href="#hyperpower">Hyperpower</a> reference plugin.</p>
|
|
|
|
<p>Side effects occur in two fundamental forms:</p>
|
|
<ul>
|
|
<li>Some actions dispatch other actions based on state.</li>
|
|
<li>Some actions do async work by communicating over the RPC
|
|
channel to the main process</li>
|
|
</ul>
|
|
|
|
<p>In all cases, the side effect is passed as
|
|
the <code>effect</code> key in the action and later handled
|
|
by our middleware.</p>
|
|
|
|
<p>This means that you can override, compose or completely
|
|
eliminate effects! In other words, this is how you can
|
|
change the default functionality or behavior of the app.</p>
|
|
|
|
<p>As an example, consider the action we use to increase
|
|
the font size when you press <code>Command+=</code>:</p>
|
|
|
|
<pre><code>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
|
|
});
|
|
}
|
|
});
|
|
};
|
|
}</code></pre>
|
|
|
|
<h3 id="hterm"><a href="#hterm">The underlying terminal</a></h3>
|
|
|
|
<p><code>Hyper</code> achieves a lot of its speed and functionality
|
|
thanks to the power of <a target="_blank" href="https://chromium.googlesource.com/apps/libapps/+/master/hterm">hterm</a> underneath,
|
|
the terminal emulator of the Chromium project.</p>
|
|
|
|
<p>To access the terminal object, you can supply
|
|
a <code>onTerminal</code> property to the <code><Term></code>
|
|
component.</p>
|
|
|
|
<h3 id="additional-apis"><a href="#additional-apis">Additional APIs</a></h3>
|
|
|
|
<p>The Electron <code>app</code> objects are extended with the following properties:</p>
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>config</code></td>
|
|
<td>An <code>Object</code> with the <code>config</code> block
|
|
from <code>~/.hyper.js</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>plugins</code></td>
|
|
<td>An <code>Object</code> with helpers for plugins.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>getWindows</code></td>
|
|
<td>A <code>Function</code> that returns an <code>Set</code>
|
|
of all the open windows.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>createWindow</code></td>
|
|
<td>A <code>Function</code> that will create a new window. Accepts an
|
|
optional <code>callback</code> that will be passed as the new window's
|
|
<code>init</code> callback.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>Electron <code>BrowserWindow</code> objects are extended
|
|
with the following parameters:</p>
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>rpc</code></td>
|
|
<td>An <code>EventEmitter</code> that allows for communication
|
|
with the window process.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>sessions</code></td>
|
|
<td>A <code>Map</code> of <code>Session</code>
|
|
objects which hold the communication with each
|
|
term's pty..</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>Renderer windows are similarly extended with:</p>
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>rpc</code></td>
|
|
<td>An <code>EventEmitter</code> that allows for communication
|
|
with the window process.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>store</code></td>
|
|
<td>The Redux <code>Store</code> object. This allows
|
|
access to <code>dispatch</code> actions or read the global
|
|
state with <code>getState</code>.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>The <code>rpc</code> object is symmetrical between browser
|
|
and renderer process. The API is the same as Node.js,
|
|
with the exception that it only admits a single object
|
|
as its parameters only:</p>
|
|
|
|
<pre><code>window.rpc.emit('hi there', {
|
|
some: 'payload',
|
|
any: [
|
|
'object',
|
|
'here'
|
|
]
|
|
});</code></pre>
|
|
|
|
<h3 id="hyperyellow"><a href="#hyperyellow">Example theme: Hyperyellow</a></h3>
|
|
|
|
<p>The following extension simply alters the config to add CSS
|
|
and yellow colors! Here's the <a target="_blank" href="https://github.com/zeit/hyperyellow/blob/29c4ac9748be74d7ad587b7077758ef26f6ce5c2/index.js#L1">code</a>.</p>
|
|
|
|
<p style="text-align: center"><img src="static/hyperyellow.gif" width="446" height="333" /></p>
|
|
|
|
<p>Themes are simply plugins! Only one hook, <code>decorateConfig</code>
|
|
is needed:</p>
|
|
|
|
<pre><code>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;
|
|
}
|
|
`
|
|
});
|
|
}</code></pre>
|
|
|
|
<p>I grabbed the class names by inspecting the term with
|
|
Devtools, which you can trigger from <code>View -> Toggle Developer Tools</code>.
|
|
When you do so, notice that some classes are automatically generated and
|
|
followed by a random nonce (e.g.: <code>term_13hv8io</code>). Ignore those: they change with every new window!</p>
|
|
|
|
<p>Notice the emphasis on playing nice with other extensions.
|
|
Specifically, we create a new object, extend only the keys we
|
|
are interested in, and we <b>compose</b> the CSS to preserve
|
|
the user's setting and that of other authors':</p>
|
|
|
|
<pre><code>return Object.assign({}, config, {
|
|
css: `
|
|
${config.css || ''}
|
|
/* your css here */
|
|
`
|
|
});</code></pre>
|
|
|
|
<h3 id="hyperpower"><a href="#hyperpower">Example extension: Hyperpower</a></h3>
|
|
|
|
<p>The following extension renders particles as the
|
|
caret moves:</p>
|
|
|
|
<p style="text-align: center"><img src="https://cloud.githubusercontent.com/assets/13041/16820268/13c9bfe6-4905-11e6-8fe4-baf8fc8d9293.gif" width="457" height="340" /></p>
|
|
|
|
<p>Let's walk through <a target="_blank"
|
|
href="https://github.com/zeit/hyperpower/blob/master/index.js">its code</a>.
|
|
<br>First, we intercept the Redux action <code>SESSION_ADD_DATA</code>. See the whole list of them <a target="_blank" href="https://github.com/zeit/hyper/tree/master/lib/actions">here</a>.</p>
|
|
|
|
<pre><code>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);
|
|
}
|
|
};</code></pre>
|
|
|
|
<p>Notice that we don't re-dispatch the action, which means
|
|
we never render the output of the command to the terminal. Instead, we dispatch an action of our own, which we grab
|
|
in the <code>uiReducer</code>and later map:</p>
|
|
|
|
<pre><code>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
|
|
});
|
|
};</code></pre>
|
|
|
|
<p>We then want to decorate the <code><Term></code> component
|
|
so that we can access the underlying caret.</p>
|
|
|
|
<p>However, <code><Term></code> is not a container that
|
|
we can map props to. So we use <code>getTermProps</code> to
|
|
pass the property further down:</p>
|
|
|
|
<pre><code>exports.getTermProps = (uid, parentProps, props) => {
|
|
return Object.assign(props, {
|
|
wowMode: parentProps.wowMode
|
|
});
|
|
}</code></pre>
|
|
|
|
<p>The extension then <a href="https://github.com/zeit/hyperpower/blob/82a09148e176584458829fdd8877fbc003fbb5b4/index.js#L51" target="_blank">returns</a> a higher order component to
|
|
wrap <code><Term></code>. Notice we pass the <code>onTerminal</code>
|
|
property to access the underlying hterm object:</p>
|
|
|
|
<pre><code>render () {
|
|
return React.createElement(Term, Object.assign({}, this.props, {
|
|
onTerminal: this._onTerminal
|
|
}));
|
|
}</code></pre>
|
|
|
|
<h2 id="credits"><a href="#credits">Credits</a></h2>
|
|
|
|
<p>Authored by <b>Guillermo Rauch</b> - <a href="https://twitter.com/rauchg" target="_blank">@rauchg</a>.<br />
|
|
Brought to you by <a href="https://zeit.co"><span style="font-size: 16px">▲</span>ZEIT</a>. Hosted on <a target="_blank" href="https://zeit.co/now">now</a>.</p>
|
|
|
|
<p>Special thanks to the following people:</p>
|
|
<ul>
|
|
<li>Jeff Haynies for his work on polish for general terminal behavior.</li>
|
|
<li>Nuno Campos for his work on zooming and configuration.</li>
|
|
<li>Leo Lamprecht and Johan Brook for their excellent UI improvements.</li>
|
|
<li>Harrison Harnisch for our nice default color palette.</li>
|
|
<li>Fernando Montoya for his feedback and patches.</li>
|
|
<li>Matias Tucci for his work on the auto updater.</li>
|
|
<li>Sebastian Markbage for his insight on the higher-order component extensibility API.</li>
|
|
<li>Joel Besada for his editor particles <a target="_blank" href="https://github.com/codeinthedark/editor/pull/1">idea</a> and Zero Cho for his reference implementation.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<script>
|
|
document.getElementById('vid').playbackRate = 1.7;
|
|
document.getElementById('vid').onended = function () {
|
|
document.getElementsByClassName('top-content')[0].style.animationDelay = '100ms';
|
|
document.getElementsByClassName('top-content')[0].style.animationName = 'arrow-video-finish';
|
|
}
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
var userAgent = navigator.userAgent;
|
|
var downloadButton = document.getElementsByClassName('download-button')[0];
|
|
var downloadButtonText = document.getElementById('download-button-text');
|
|
|
|
if (/Mac/.test(userAgent) && !/iPhone/.test(userAgent) && !/iPad/.test(userAgent)) {
|
|
downloadButton.setAttribute('href', 'https://releases.hyper.is/download/mac');
|
|
downloadButtonText.innerHTML += ' for <strong>macOS</strong>';
|
|
document.getElementById('td-mac-os').classList.add('highlighted');
|
|
document.getElementById('mac-os-icon').classList.remove('is-hidden');
|
|
} else if (/Windows/.test(userAgent)) {
|
|
downloadButton.setAttribute('href', 'https://releases.hyper.is/download/win');
|
|
downloadButtonText.innerHTML += ' for <strong>Windows</strong>';
|
|
document.getElementById('td-win').classList.add('highlighted');
|
|
document.getElementById('windows-icon').classList.remove('is-hidden');
|
|
} else if (/Linux/.test(userAgent) && !/Android/.test(userAgent)) {
|
|
document.getElementById('linux-icon').classList.remove('is-hidden');
|
|
if (/Ubuntu/.test(userAgent)) { // needs to be improved with other debian distros
|
|
downloadButton.setAttribute('href', 'https://releases.hyper.is/download/deb');
|
|
downloadButtonText.innerHTML += ' for <strong>Debian</strong>';
|
|
document.getElementById('td-debian').classList.add('highlighted');
|
|
} else if (/Fedora/.test(userAgent)) {
|
|
downloadButton.setAttribute('href', 'https://releases.hyper.is/download/rpm');
|
|
downloadButtonText.innerHTML += ' for <strong>Fedora</strong>';
|
|
document.getElementById('td-fedora').classList.add('highlighted');
|
|
} else {
|
|
downloadButton.setAttribute('href', 'https://releases.hyper.is/download/AppImage');
|
|
downloadButtonText.innerHTML += ' for <strong>Linux</strong>';
|
|
document.getElementById('td-appimage').classList.add('highlighted');
|
|
}
|
|
} else {
|
|
document.getElementById('fallback-icon').classList.remove('is-hidden');
|
|
document.getElementsByClassName('other-downloads')[0].classList.add('is-hidden');
|
|
}
|
|
});
|
|
var header = document.getElementById('header');
|
|
window.addEventListener('scroll', function () {
|
|
if (window.scrollY > 200) {
|
|
header.classList.add('hidden');
|
|
} else {
|
|
header.classList.remove('hidden');
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|