---
title: Terminal-based Working Environments
linkTitle: Terminal IDEs
type: docs
weight: 11
aliases:
- /manuals_linux-cluster_terminalIDE.html
- /manuals_linux-cluster_terminalIDE
---
## Terminal IDEs
This page introduces [tmux](https://github.com/tmux/tmux/wiki) and [Neovim](https://neovim.io/) as terminal-based working environments for
working efficiently on remote systems like HPC clusters or cloud systems. They can
be used independently or in combination, and provide many useful
functionalities for working in local or remote terminal environments.
Users who prefer a more graphical environment,
[VSCode](https://hpcc.ucr.edu/manuals/hpc_cluster/selected_software/vscode/)
might be a good alternative.
## Tmux: virtual terminal multiplexer
[Tmux](https://github.com/tmux/tmux/wiki) is a virtual terminal multiplexer providing persistent terminal sessions
that are de- and re-attachable. It is an incredible useful tool for terminal-based
work on remote systems. Major advantages of tmux are:
* Work on remote system cannot get lost due to disconnects. One can always re-attach to a session from the same or different computers.
* Many useful functionalities '_power charge_' terminals.
[Screen](https://www.gnu.org/software/screen/) is a related virtual terminal multiplexer tool that can be used as an alternative (not covered here).
It has similar functionalities as tmux.
Tmux can be downloaded and installed from
[here](https://github.com/tmux/tmux/wiki/Installing). A custom tmux (and nvim)
environment with extensions can be installed by HPCC users with a
single command (here `Install_Nvim-R_Tmux`). The same
script also installs several useful Nvim plugins (see
[below](https://hpcc.ucr.edu/manuals/hpc_cluster/terminalide/#nvim-introduction)).
Alternatively, the install script can be downloaded from
[here](https://github.com/tgirke/Nvim-R_Tmux#2-installation). After installing
the provided tmux environment in a user account, one needs to log out and in
again to activate the environment. Note, installing the custom environment is
optional and not required for any of the following examples. Users also need to
be aware that the install script will make changes to their .bashrc` and
`.tmux.conf` files. If this is not desirable, then one can install the
components stepwise, or run the install, and then undo any configuration changes by
following the instructions printed to the screen during the install.
Tmux: Window Split into Several Panes
### Important considerations for virtual tmux sessions
* Both tmux and screen sessions run on the system, where they were initialized.
* To reattach to a specific session on a remote system, like the HPCC cluster, one needs to first log in to the same node (here headnode) and then re-attach to the corresponding tmux session.
* It is important not to run tmux (or screen) sessions on computer nodes since tmux sessions are persistent. Instead tmux sessions should be run on a headnode. From an open tmux session one can then log in to a computer node via `srun`, or just submit jobs from a tmux session with `sbatch`.
### Start Tmux
* `module load tmux`: only required on systems that use environment modules, and the tmux load command is not specified in a user's .bashrc file
* `tmux`: starts a new tmux session
* `tmux a`: attaches to an existing session, or a default session of a system, _e.g._ specified under `~/.tmux.conf`
* `tmux attach -t `: attaches to a running session selected under ``
* `tmux ls`: lists existing tmux sessions
### Prefix
The prefix for controlling tmux depends on a user's settings in their `~/.tmux.conf` file.
* `Ctrl-b`: default is hard to type, and thus often not preferred
* `Ctrl-a`: more commonly used, also on HPCC
The prefix can be changed by placing the following lines into `~/.tmux.conf`.
```sh
unbind C-b
set -g prefix C-a
```
### Mouse Support
Mouse support in tmux can be enabled with the following command.
* `Ctrl-a : set -g mouse on`
To turn mouse support on by default, include on a separate line of `~/.tmux.conf` this command: `set -g mouse on`
### Important keybindings for tmux
Tmux sessions are organized in panes, windows and sessions themselves, where a
window can have a single or several panes, and a session a single or several
windows. The following commands for controlling tmux are organized by pane-,
window- and session-level commands.
__Pane-level commands__
* `Ctrl-a %`: splits pane vertically
* `Ctrl-a “`: splits pane horizontally
* `Ctrl-a o` or `Ctrl-a `: jumps cursor to next pane
* `Ctrl-a Ctrl-o`: swaps panes
* `Ctrl-a `: rotates pane arrangement
* `Ctrl-a Alt `: resizes to left or right
* `Ctrl-a Esc `: resizes to left or right
* `Ctrl-a z`: zoom into split pane (full window view); press again to zoom out
__Window-level commands__
* `Ctrl-a n`: switches to next tmux window
* `Ctrl-a Ctrl-a`: switches to previous tmux window
* `Ctrl-a c`: creates a new tmux window; any tmux window can be closed by typing `exit` on the command prompt
* `Ctrl-a 1`: switches to specific tmux window selected by number
__Session-level commands__
* `Ctrl-a d`: detaches from current session
* `Ctrl-a s`: switch between available tmux sessions
* `$ tmux new -s `: starts new session with a specific name
* `$ tmux ls`: lists available tmux session(s)
* `$ tmux attach -t `: attaches to specific tmux session
* `$ tmux attach`: reattaches to session
* `$ tmux kill-session -t `: kills a specific tmux session
* `Ctrl-a : kill-session`: kills a session from tmux command mode that can be initiated with Ctrl-a :
## Vim/Nvim overview
Vim is a widely used, extremely powerful and versatile text editor for coding
that is usually available on most Linux, Unix and macOS systems by default, and
also can be installed on Windows. The newer version is called Neovim or Nvim.
The main advantages of Nvim compared to Vim are its better performance and its
built-in terminal emulator facilitating the communication among Nvim and
interactive programming environments, such as command-lines, octave, R, etc.
Since Vim and Nvim are managed independently, one can easily install and use
them in parallel on the same system without interfering with each other. The
usage of Nvim is almost identical to Vim. Emacs is a powerful alternative that
can be used as an alternative to Nvim.
Neovim Example with Autocompletion
### Nvim introduction
The following opens a file (here `myfile`) with nvim (or vim). If nvim is not
found then one might need to load it with `module load neovim` first. A custom
nvim/tmux environment with extensions can be installed by HPCC users with the
`Install_Nvim-R_Tmux` command. For details about this install script, see the
corresponding tmux section
[above](https://hpcc.ucr.edu/manuals/hpc_cluster/terminalide/#tmux-virtual-terminal-multiplexer).
### Open file with Nvim
```sh
nvim myfile.txt # for neovim (or 'vim myfile.txt' for vim)
```
Tip: to always load Nvim with the standard `vim` command, one can add `alias vim=nvim` to `~/.bashrc`.
### Three main modes
Within Vim/Nvim, there are three main modes: normal, insert and command mode. The most important commands
for navigating between the three modes are:
* `i`: The `i` key switches from the normal mode to the insert mode. The latter is used for typing.
* `Esc`: The `Esc` key switches from the insert mode back to the normal mode.
* `:`: The `:` key starts the command mode at the bottom of the screen.
### Most important modifier keys
The arrow keys can be used to move the cursor in the text. Using `Fn Up/Down key` allows to page through
the text quicker (more on this below). In the following command overview, all commands starting with `:` need to be typed in the command mode.
All other commands are typed in the normal mode after pressing the `Esc` key.
* `:w`: save changes to file. If you are in editing mode you have to hit `Esc` first.
* `:q`: quit file that has not been changed
* `:wq`: save and quit file
* `:!q`: quit file without saving any changes
### Mouse support
When enabled, one can position the cursor anywhere with the mouse as well as resize Nvim split windows, and switch the scope from one window split to another.
* `:set mouse=n` # enables mouse support, also try the `a` option
* `:set mouse-=n` # disables mouse support
To enable mouse support by default, add `set mouse=n` to Nvim’s config file located in a user’s home under `~/.config/nvim/init.vim`. The corresponding config file
for the older Vim version is `~/.vimrc`.
### Moving around
* `arrow_keys`: move cursor in the text
* `Fn Up/Down`: faster scrolling via paging.
* `$` or `0`: jump to back or beginning of line
* `G` or `gg`: jump to end of document and back to beginning
* `w` or `b`: move forward and backward by word
* `)` or `(`: move forward and backward by sentence
### Important keybindings
* `:split` or `:vsplit`: splits viewport (similar to pane split in tmux)
* `gz`: maximizes size of viewport in normal mode (similar to Tmux's `Ctrl-a z` zoom utility)
* `Ctrl-w w`: jumps cursor to other viewport and back
* `Ctrl-w r`: swaps viewports
* `Ctrl-w =`: resizes splits to equal size
* `:resize <+5 or -5>`: resizes height by specified value
* `:vertical resize <+5 or -5>`: resizes width by specified value
* `Ctrl-w H` or `Ctrl-w K`: toggles between horizontal/vertical splits
* `:vsplit term://bash` or `:terminal`: opens terminal in split mode or in a separate window, respectively.
* `Ctrl-s and Ctrl-x`: freezes/unfreezes vim (some systems)
### Powerful features of command mode
For example, search and replace with regular expression support. A detailed overview for using regular expressions in vim is [here](https://learnbyexample.gitbooks.io/vim-reference/content/Regular_Expressions.html).
* `/` or `?`: search in text forward and backward
* `:%s/search_pattern/replace_pattern/cg`: replacement syntax
### Set command
The `set` command typed in the command mode provides access to a large number of additional functions. Only a small number of examples is given here.
For a more complete listing type `:set all` or consult the vim help with `:help`.
* `:set wrap` or `:set nowrap`: toggle for turning line wrapping on/off
* `:set number` or `:set nonumber`: toggle for turning line nubers on/off
* `:set syntax=bash`: toggle syntax highlighting for different languages (e.g. python, perl, bash, etc) or turn off with `set syntax=off`
### Visual mode
* Initialized from normal mode with `v`, `V` or `Ctrl + v`.
* Delete and copy selected text with `d` and `y`, respectively. For paste use `p` from normal mode. The copied (yanked) text is stored in a separate vim clipboard.
### Copy and delete lines
* `yy`: copies line where cursor is or those that are selected via visual mode. Paste works with `p` as above.
* `dd`: deletes line where cursor is or those that are selected via visual mode.
### Indentation guides
Vertical indentation lines (guides) are useful for tracking context in code. To
enable indentation lines in nvim, one can use the
[indent-blankline.nvim](https://github.com/lukas-reineke/indent-blankline.nvim)
plugin. Installation and configuration instructions for this plugin are [here](https://github.com/tgirke/Nvim-R_Tmux#28-indentation-guides).
Indentation Guides with `indent-blankline.nvim` Plugin
### Help
Vim has a comprehensive built-in help system. To access and navigate it, here
are some important commands. For a more detailed overview, visit this
[Built-in Vim
Help](https://www.seanh.cc/2020/08/02/how-to-use-vim's-built-in-help/) page.
* `:help`: opens vim help system (`:q` closes it)
* `Ctrl-]` or `Ctrl-[`: use in help to jump to tagged topic
* `:help helphelp`: opens help as a file
* `:help quickhelp` or `:help index`: short help overview
### File browser built into vim: `NERDtree`
NERDtree provides file browser functionality for Vim. To enable it, the NERDtree plugin needs to be installed. It is included in the account configuration
with `Install_Nvim-R_Tmux` mentioned [above](https://hpcc.ucr.edu/manuals/hpc_cluster/terminalide/#tmux-virtual-terminal-multiplexer). To use NERDtree, open
a file with vim/nvim and then type in normal mode `zz`. The same command closes NERDtree. Note the default for opening NERDtree is `:NERDtree` which has been
remapped here to `zz` for quicker access.
The basic NERDtree usage is explained [here](https://github.com/tgirke/Nvim-R_Tmux#33-basic-nerdtree-usage).
NERDtree in action
### Useful resources for learning vim/nvim
* [Interactive Vim Tutorial](http://www.openvim.com)
* [Official Vim Documentation](http://vimdoc.sourceforge.net/)
* [HPCC Linux Manual](/manuals/linux_basics/vim/)
## Nvim for R users with `nvim-R` plugin
### Basics
The `Nvim-R` plugin provides a powerful command-line working environment for R
where users can send code from an R/Rmd script opened in Nvim to the R console.
Essentially, this provides an RStudio like working environment within a terminal,
which is often more flexible when working on remote systems than a GUI solution.
It also can be combined with tmux to support 'persistent' R sessions that can be de- and
re-attached (see tmux session above).
Nvim-R IDE for R
### Quick configuration in user accounts
The following steps 1-3 can be skipped if Nvim, Tmux and nvimR are already configured on a user's system or account. One can also follow the [detailed
instructions](https://github.com/tgirke/Nvim-R_Tmux) for installing `Nvim-R-Tmux` from scratch.
1. Log in to your user account on HPCC and execute `Install_Nvim-R_Tmux` (old: `install_nvimRtmux`). Additional details on this install are given in the tmux section [above](https://hpcc.ucr.edu/manuals/hpc_cluster/terminalide/#tmux-virtual-terminal-multiplexer). Alternatively, one can use the step-by-step install [here](https://github.com/tgirke/Nvim-R_Tmux).
2. To enable the nvim-R-tmux environment, log out and in again.
3. Follow usage instructions of next section.
### Basic usage of Nvim-R-Tmux
The official and much more detailed user manual for `Nvim-R` is available [here](https://github.com/jalvesaq/Nvim-R/blob/master/doc/Nvim-R.txt).
The following gives a short introduction into the basic usage of Nvim-R-Tmux:
__1. Start tmux session__ (optional)
Note, running Nvim from within a tmux session is optional. Skip this step if tmux functionality is not required (_e.g._ re-attaching to sessions on remote systems).
```sh
tmux # starts a new tmux session
tmux a # attaches to an existing session
```
__2. Open nvim-connected R session__
Open a `*.R` or `*.Rmd` file with `nvim` and intialize a connected R session with `\rf`. This command can be remapped to other key combinations, e.g. uncommenting lines 10-12 in `.config/nvim/init.vim` will remap it to the `F2` key. Note, the resulting split window between Nvim and R behaves like a split viewport in `nvim` meaning the usage of `Ctrl-w w` followed by `i` and `Esc` is important for navigation (for details see vim usage above).
```sh
nvim myscript.R # or *.Rmd file
```
__3. Send R code from nvim to the R pane__
Single lines of code can be sent from nvim to the R console by pressing the
space bar. To send several lines at once, one can select them in nvim's visual
mode and then press the space bar. Please note, the default command for sending
code lines in the nvim-r-plugin is `\l`. This key binding has been remapped in
the provided `.config/nvim/init.vim` file to the space bar. Most other key
bindings (shortcuts) still start with the `\` as LocalLeader, _e.g._ `\rh`
opens the help for a function/object where the curser is located in nvim. More
details on this are given below.
### Important keybindings for tmux
See corresponding tmux section [above](https://hpcc.ucr.edu/manuals/hpc_cluster/terminalide/#important-keybindings-for-tmux).
## `Nvim-R`-like solutions for Bash, Python and other languages
### Basics
For languages other than R one can use the
[vimcmdline](https://github.com/jalvesaq/vimcmdline) plugin for nvim (or vim).
Supported languages include Bash, Python, Golang, Haskell, JavaScript, Julia,
Jupyter, Lisp, Macaulay2, Matlab, Prolog, Ruby, and Sage. The nvim terminal
also colorizes the output, as in the screenshot below, where different colors
are used for general output, positive and negative numbers, and the prompt
line.
vimcmdline
### Install
To install it, one needs to copy from the `vimcmdline` resository the directories
`ftplugin`, `plugin` and `syntax` and their files to `~/.config/nvim/`. For
user accounts of UCR’s HPCC, the above install script `Install_Nvim-R_Tmux` (old: `install_nvimRtmux`) includes the
install of `vimcmdline` (since 09-Jun-18).
### Usage
The usage of `vimcmdline` is very similar to `nvim-R`. To start a connected terminal session, one
opens with nvim a code file with the extension of a given language (_e.g._ `*.sh` for Bash or `*.py` for Python),
while the corresponding interactive interpreter session is initiated
by pressing the key sequence `\s` (corresponds to `\rf` under `nvim-R`). Subsequently, code lines can be sent
with the space bar. More details are available [here](https://github.com/jalvesaq/vimcmdline).