One of the coolest ways to get familiar with the Terminal is to use it to open files. For earlier versions of Mac OS X, including Mac OS X Mavericks 10.9, Mac OS X Mountain Lion 10.8, Mac OS X Lion 10.7, Mac OS X Snow Leopard 10.6, Mac OS X Leopard 10.5, Mac OS X Tiger 10.4, and before, the process to obtain those installers differs a bit. Downloading Mac OS X. Download Microsoft Remote Desktop for macOS 10.13 or later and enjoy it on your Mac. Use Microsoft Remote Desktop for Mac to connect to a remote PC or virtual apps and desktops made available by your admin. With Microsoft Remote Desktop, you can be productive no matter where you are. GET STARTED Configure your PC for remote access using the.
Get Software
Terminal Scripts for OS X are a set of “scripts” that invoke the Terminal and ssh programs distributed with OS X.
- Terminal Scripts for OS X – 107KB (zipped file)
MD5 (Autumn08-Terminal-scripts.zip) = 1cd76d1104998c2a2a79a7e172083a09
About These Scripts
NOTE: Starting with OS X 10.3 (Panther), the Terminal program supports a variety of terminal emulations. Unfortunately, the default (xterm color) is not likely to work on many systems, including most of the UW central systems. You MUST change this default. Run Terminal (e.g., from Applications->Utilities) and use Terminal->Preferences to bring up the preferences panel. From the pop-up list next to “Declare terminal type as:” select “vt102” (or vt100).
To connect with ssh, open the OS X “Terminal” app and type in the command “ssh YourUWNetID@UWHost”. For example, if YOUR UW NetID were “myuwnetID” and you wanted to connect to homer, you’d enter “ssh myuwnetID@homer.u.washington.edu”. If you have used your UW NetID as your OS X login ID then the ID can be omitted. Using “ssh -2” uses v2 of ssh instead of v1, for those hosts that permit (or require) it.
Printing directly from Pine may work if you are using Terminal version 1.5.1 (OS X 10.4.11) or BEFORE, but appears to be broken in the current version (as of this writing, 2.0.1 with OS X 10.5.4), but will only go to the current default printer.
Applescripts for Terminal
Starting with OS X 10.2 (aka Jaguar), this can be made a little easier with some fairly simple AppleScripts (thanks to David Linker and Scott King for inspiration – and more 🙂 ). Find some examples here in the same folder with this document, in both “runable” and “editable” (-Template) forms. Double-clicking the “Template” versions should run the AppleScript Editor to let you modify the script. Double-click the “regular” copy (without the “-Template” name) to run the script.

Terminal to UW Hosts
This is the most general (and complicated), it prompts for UW NetID and then for a selection from a list of known hosts. You can change the list of hosts by editing the script. Probably best in a “lab” where many people connect to many different hosts. The example list is {Dante, Homer, Other(prompt me)}.
Terminal to Vergil (or Homer or Shell)
It is easy to make “clickable” icons that open a connection to a given host, after prompting for the UW NetID.
Terminal to MyUWHost
Lastly, you can include everything in the script, so when you double-click it it just connects (and asks for a password, of course). This example, MUST be edited. To use it use the Script Editor to put in your NetID and desired host before use.
Keynes Terminal Window
This one is a little different, it is a file of saved settings for the Terminal application.
The behavior of saved “term” files is somewhat different in OS X 10.5 from previous versions.
Keynes With OS X 10.5.2 (and presumably above)
The Terminal program allows you to keep a “library” of settings, then open sessions using any of those. To add the Keynes settings to your library:
- StepsActions
- Copy the “Keynes Window.terminal” (be sure to use the “.terminal” file, not “.term”) file to your Documents folder from the “Terminal Scripts” folder.
- Run Applications -> Utilities -> Terminal.
- Select Terminal -> Preferences.
- At the bottom of the list of settings profiles find the “gear” button and select it to expose a list of options, select “import” from the list.
- If necessary, navigate to your Documents folder (it may already be pointing there), locate and open the “Keynes Window.terminal” file you copied there in step 1. A new “Keynes Window” profile is added to your list. You may make it your default profile if you use Terminal mostly (or only) for connections to Keynes, but it is usually not recommended.
- Close prefs, quit Terminal.
- Run Terminal again (you may want Terminal in your Dock…), if the Keynes settings are your default, a login window to Keynes appears.
- Otherwise (recommended) use Shell -> New Window -> Keynes Window.
Now that you have a separate profile for Keynes connections you can easily edit the preferences in that profile, choose font type and size, colors, etc. as you prefer. If the “Enter” key is not working to “send a screen”, use “control J” instead. If using a laptop, remember that you may have to use the “fn” key to stroke “Enter” (as fn+return).
Download Terminal For Macos
Keynes With OS 10.3 – 10.4
When you double-click the “Keynes.term” file a Terminal window will open, and open a connection to keynes.u.washington.edu, that window will have the settings that SOME users are reporting allows them to connect to the Keynes (Administrative) system. The “Enter” (far right of the keypad) key should now work to “send screens” in Keynes apps.

Using Mac OS X Terminal With Keynes
The keypad digits will likely NOT work, use the top-row digit keys instead. Note that having the setting in Terminal for “strict vt100 keypad behavior” on is the essential setting for this. Note that if using the keypad for numeric entry is STRICTLY required, you may be able to get that working by turning the “strict” behavior off and entering the “Enter” keystroke with “control J”. Printing that works via “ansi print escape” (much of the student data base system) will NOT work correctly though the screens CAN be captured (and then printed) using the “Grab” utility.
NEW with OS X 10.3 are some problems with lots of “inverse video” being drawn on the Keynes screens, just pressing “Enter” without entering any data, may clear the screen some. There are reports that the old MacSSH program (run under “Classic”) in OS X DOES work with newer versions of OS X (10.2.6 – 10.4.x). This may be a better solution for Keynes users, however since “Classic” is not supported on Macs using “Intel” hardware or with system 10.5 and above, it isn’t going to work in those cases. Printing, after setting up a default printer WITHIN Classic, should also work using MacSSH.
Other Uses for “.term” Files
NOTE: This no longer seems to work as described below in OS X 10.5. It may still be of interest to those running older systems. You can create multiple profiles within Terminal and associate a startup command with each profile (settings -> shell).
All the settings in the Terminal Window Settings are preserved in a “.term” file created with the File->Save as command, you can adjust font choice and size, colors, transparency, etc. You can also (perhaps too easily…) make these choices effect the DEFAULT setup for Terminal, so use this with some caution.
You can also directly edit the .term file, for example by using TextEdit, and this gives you access to some things that the Windows Settings dialogs won’t, specifically you can edit the “Execution String”. Find the lines
“<key>ExecutionString</key>”
“<string></string>”
On the second line, insert whatever command you want executed every time you open this .term file between the “<string>” and “</string>” statements. For example, to make a connection to homer automatically you could put
<string>ssh -2 your-UWNetID-goes-here@homer.u.washington.edu</string>
in THAT place, instead of using the script above, this would also then let you control font, color, etc. and still have a “double-clickable” file/icon for the homer terminal.
Installation
latest version: 3.0.264-bit | |
macOS (.app) | 3.0.2 |
Windows (.exe) | 3.0.2 |
Debian (.deb) | 3.0.2 |
Fedora (.rpm) | 3.0.2 |
Other Linux distros (.AppImage) | 3.0.2 |
Project Goals
The goal of the project is to create a beautiful and extensible experience for command-line interface users, built on open web standards. In the beginning, our focus will be primarily around speed, stability and the development of the correct API for extension authors.
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.
Extensions
Extensions are available on npm. We encourage everyone to includehyper
in the keywords
field in package.json
.
Then edit .hyper.js
and add it to plugins
Hyper
will show a notification when your modules are installed to .hyper_plugins
.
Keymaps
All command keys can be changed. In order to change them, edit.hyper.js
and add your desired change to keymaps
.
Then Hyper will change the default with your custom change.
Example: 'window:devtools': 'Cmd+Alt+O'
Default keymaps:
Configuration
Config location
macOS | ~/Library/Application Support/Hyper/.hyper.js |
Windows | $Env:AppData/Hyper/.hyper.js |
Linux | ~/.config/Hyper/.hyper.js |
Note: config at ~/.hyper.js
still supported, but will be ignored, if config in application directory present. Otherwise it will be moved to the application directory at first run.
The config
object seen above in.hyper.js
admits the following
Property | Default | Description |
updateChannel | 'stable' | The update channel to receive updates from |
fontSize | 12 | The default size in pixels for the terminal |
fontFamily | 'Menlo, DejaVu Sans Mono, Lucida Console, monospace' | The font family to use with optional fallbacks |
uiFontFamily | '-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, ...' | The font family to use for the UI with optional fallbacks |
fontWeight | 'normal' | The default font weight: 'normal' or 'bold' |
fontWeightBold | 'bold' | The font weight for bold characters: 'normal' or 'bold' |
cursorColor | 'rgba(248,28,229,0.8)' | The color of the caret in the terminal |
cursorAccentColor | '#000' | The text color under BLOCK cursor |
cursorShape | 'BLOCK' | The shape of the caret in the terminal. Available options are: 'BEAM', 'UNDERLINE', 'BLOCK' |
cursorBlink | 'false' | If true, cursor will blink |
foregroundColor | '#fff' | The color of the main text of the terminal |
backgroundColor | '#000' | The color and opacity of the window and main terminal background |
selectionColor | 'rgba(248,28,229,0.3)' | The background color/opacity of the text selection in terminal |
borderColor | '#333' | The color of the main window border and tab bar |
css | ' | Custom CSS to include in the main window |
padding | '12px 14px' | CSS padding values for the space around each term |
colors | { black: '#000000', red: '#ff0000', ... } | A list of overrides for the color palette. The names of the keys represent the 'ANSI 16', which can all be seenin the default config. |
shell | ' | A path to a custom shell to run when Hyper starts a new session |
shellArgs | '['--login']' | An array of shell arguments |
env | {} | An object of environment variables to set before launching shell |
windowSize | [540, 380] | The default width/height in pixels of a new window |
scrollback | 1000 | The number of rows to be persisted in terminal buffer for scrolling |
copyOnSelect | false | If true, selected text will automatically be copied to the clipboard |
quickEdit | false | If true, on right click selected text will be copied or pasted if no selection is present (true by default on Windows) |
defaultSSHApp | true | If true, Hyper will be set as the default protocol client for SSH |
modifierKeys | {altIsMeta: false} | Change the behaviour of modifier keys to act as meta key |
showHamburgerMenu | true on Linux/Windows, false on macOS | Change the visibility of the hamburger menu. Available options are: true, false |
showWindowControls | ' | Change the position/visibility of the window controls. Available options are: true, false, 'left' |
Extensions API
Extensions are universal Node.js modules loaded by both Electron and the renderer process.
The extension system is designed around composition of the APIs we use to build the terminal: React
components andRedux
actions.
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!
The only knowledge that is therefore required to successfully extendHyper
is that of its underlying open source libraries.

You can find additional details about plugin developmentin the Hyper repository.
Your module has to expose at least one of these methods:
Method | Invoked from | Description | ||||||
onApp | Electron | Invoked when the app first loads. If a plugin reloads, it's invoked again with the existing app. Parameters:
| ||||||
onWindow | Electron | Invoked when each window is created. If a plugin reloads, it's invoked again with the existing windows. Parameters:
| ||||||
onUnload | Electron | Invoked when a plugin is removed by the user. Parameters:
| ||||||
decorateConfig | Electron / Renderer | v0.5.0+. Allows you to decorate the user's configuration. Parameters:
| ||||||
decorateEnv | Electron | v0.7.0+. Allows you to decorate the user's environment by returning a modified environment object. Parameters:
| ||||||
decorateMenu | Electron | Invoked with the Electron's Parameters:
| ||||||
decorateBrowserOptions | Electron | Allows you to decorate Electron's Parameters:
| ||||||
onRendererWindow | Renderer | Invoked when a plugin is first loaded or subsequently reloaded in each window. Parameters:
| ||||||
middleware | Renderer | A custom Redux middleware that can intercept any action. Subsequently we invoke the | ||||||
reduceUI reduceSessions reduceTermGroups | Renderer | A custom reducer for the
| ||||||
getTabsProps | Renderer | Passes down props from
| ||||||
getTabProps | Renderer | Passes down props from
| ||||||
getTermGroupProps | Renderer | Passes down props from
| ||||||
getTermProps | Renderer | Passes down props from
| ||||||
mapHyperState mapTermsState mapHeaderState mapNotificationsState | Renderer | A custom mapper for the state properties thatcontainer componentsreceive. Note that for children components to get these properties, you have to pass them down using the corresponding methods (like Must return an extended object of the map passed.
| ||||||
mapHyperDispatch mapTermsDispatch mapHeaderDispatch mapNotificationsDispatch | Renderer | A custom mapper for the dispatch properties. Must return an extended object of the map passed.
| ||||||
decorateHyper decorateNotifications decorateNotification decorateHeader decorateTabs decorateTab decorateTerms decorateTermGroup decorateSplitPane decorateTerm | Renderer | Invoked with the Parameters:
|
Module loading
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.
Notice
Plugins affecting the `BrowserWindow` will the effect on new windows after hot-reload.
In the future we might do this automatically.
When developing, you can add your plugin to.hyper_plugins/local
and then specify it under the localPlugins
array in.hyper.js
. We load new plugins:
- Periodically (every few hours)
- When changes are made to the configuration file (
plugins
orlocalPlugins
) - When the user clicks Plugins > Update all now
The process of reloading involves
- Running
npm prune
andnpm install
in.hyper_plugins
. - Pruning the
require.cache
in both electron and the renderer process - Invoking
on*
methods on the existing instances and re-rendering components with the fresh decorations in place.
Plugins location
macOS | ~/Library/Application Support/Hyper/.hyper_plugins |
Windows | $Env:AppData/Hyper/.hyper_plugins |
Linux | ~/.config/Hyper/.hyper_plugins |
Note: plugins at ~/.hyper_plugins
still supported, but will be ignored, if plugins in application directory present. Otherwise they will be moved to the application directory at first run.
Note: on the main process, plugins are registered as soon as possible (we fire onLoad
). 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.
Decorating components
We give you the ability to provide a higher order component for every piece of the Hyper
UI.
Its structure is as follows:
All the decorate*
methods receive the following references in an object passed as the second parameter:
React | The entire React namespace. |
notify | A helper function that shows a desktop notification. The first parameter is the title, the second is the optional body of the notification, and the third is another optional parameter which can be used to log details to the development console. To pass these details, simply provide and object with an |
Notification | The Notification component in case you want to re-use it. |
All the components accept the following two properties to extend their markup:
customChildren | An array of Element or a singleElement to insert at the bottom of the component. |
customChildrenBefore | The same as the above property, but inserted as the first child element(s) of the component. |
Your higher order component can supply a onDecorated
property to the decorated component to get a reference to its instance.
Your Term higher order component can supply anonCursorMove
handler property that be called when cursor has moved with an object parameter representing its relative position to Term origin:
x | Horizontal position in pixels |
y | Vertical position in pixels |
width | Cursor width in pixels |
height | Cursor height in pixels |
col | Horizontal position in columns |
row | Vertical position in rows |
We encourage you to maintain compatibility with other decorators. Since many can be set, don't assume that yours is the only one.
For example, if you're passing children, compose potential existing values:
Or if you use onDecorated
property
Actions and Effects
All theRedux actionsare available for you to handle through your middleware and reducers. For an example, refer to the Hyperpowerreference plugin.
Side effects occur in two fundamental forms:
- Some actions dispatch other actions based on state.
- Some actions do async work by communicating over the RPC channel to the main process
In all cases, the side effect is passed as the effect
key in the action and later handled by our middleware.
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.
As an example, consider the action we use to increase the font size when you press Command+=
:

The underlying terminal
Hyper
achieves a lot of its speed and functionality thanks to the power ofxterm.js
Additional APIs
The Electron app
objects are extended with the following properties:
config | An Object with the config block from.hyper.js . |
plugins | An Object with helpers for plugins. |
getWindows | A Function that returns an Set of all the open windows. |
createWindow | A Function that will create a new window. Accepts an optional callback that will be passed as the new window's init callback. |
Electron BrowserWindow
objects are extended with the following parameters:
rpc | An EventEmitter that allows for communication with the window process. |
sessions | A Map of Session objects which hold the communication with each term's pty.. |
Renderer windows are similarly extended with:
rpc | An EventEmitter that allows for communication with the window process. |
store | The Redux Store object. This allows access todispatch actions or read the global state withgetState . |
The rpc
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:
Mac Terminal Program
Example theme: Hyperyellow
The following extension simply alters the config to add CSS and yellow colors! Here's thecode.
Themes are simply plugins! Only one hook, decorateConfig
is needed:
I grabbed the class names by inspecting the term with Devtools, which you can trigger from View -> Toggle Developer Tools
. When you do so, notice that some classes are automatically generated and followed by a random nonce (e.g.: term_13hv8io
). Ignore those: they change with every new window!
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 compose the CSS to preserve the user's setting and that of other authors':
Example extension: Hyperpower
The following extension renders particles as the caret moves:
Let's walk throughits code.
First, we intercept the Redux action SESSION_ADD_DATA
. You can find the full list of actionsin the repository.
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 uiReducer
and later map:
We then want to decorate the <Term>
component so that we can access the underlying caret.
However, <Term>
is not a container that we can map props to. So we use getTermProps
to pass the property further down:
Download Terminal For Mac Os 10.12
The extension thenreturnsa higher order component to wrap <Term>
. Notice we pass the onDecorated
property to access the base Term component and its DOM ref, and theonCursorMove
property to use Hyper cursor API:
