I am looking for suggestions for a setup for my particular needs. I haven't done much linux since college and want to get back into it as a hobby. I have some not-too-powerful hardware (512 MB ram, single core). I want to do everything via text-based shells and editors, such as vim. My goal is to never touch the mouse.

I need the ability to have multiple shells open at once, one running a web server, one running vim, one running my application build pipeline, another one for ad-hoc shell commands such as wget, grepping and untarring, etc. I need to be able to open new shells and switch between shells quickly with the keyboard.

But even though I want multiple shells, I do not want a graphical desktop environment. I don't ever want to be tempted to use the mouse; part of my purpose is to force myself to learn the command-line way of doing various tasks.

I also want to be able to take advantage of my large monitor, running vim with a couple hundred columns dipslayed.

Is this possible?

  • 1
    Have a look at dvtm... You could also combine it with tmux or screen.
    – jasonwryan
    Nov 22, 2012 at 18:02
  • 1
    This question may be more suitable as a community wiki.
    – jw013
    Nov 23, 2012 at 15:36

8 Answers 8


I read through your questions several times before I realized that I definitely have a recommendation for you: vim with tmux: http://tmux.sourceforge.net/

tmux is a screen 'multiplexor' that lets you have several windows and panes 'within 1'

It is a successor to the venerable 'screen' program, long a staple of many cli coders. One of its original winning features over vim was the ability to do split windows vertically as well as horizontally. However screen has moved forward and can now do that too.


enter image description here

Another part of the setup that I would recommend is a good set of aliases. These will make your typing and interaction a lot easier and quicker

Some of my favorites are shown here as examples:

alias gcv='git commit'
alias gg='git grep ' # for searching (add parameter)
alias gst='git status -sb' # I must use this 100 times a day!!!
alias h='history | tail'
alias hg='history | grep' # for searching my history (add parameter)
alias l='ls -alFtrG'
alias ls='ls --color=auto'
alias mv='mv -i'
alias p='pwd'# at least 200 times a day! so 2 chrs saved * 200 = 400 less characters to type ;)

Aliases can be setup in a .bash_aliases file that is called from .bashrc with: # Alias definitions. if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi

Chances are you already have that code, so just your own .bash_aliases file.

Both these options work on a Mac and that is an important consideration for myself (a mostly Ubuntu user).

Most folks using tmux remap the keys to make it easier. The default bindings are just not that good. Here are my settings:

$ cat ~/tmux.conf

# mdd tmux settings
bind r source-file ~/.tmux.conf \; display "Reloaded!"  # Reload with ctrl-r
set -g prefix C-a         # prefix from ctrl-b to ctrl-a
unbind C-b                # allow ctrl-b for other things
set -sg escape-time 1     # quicker responses
bind C-a send-prefix      # Pass on ctrl-a for other apps
set -g base-index 1        # Numbering of windows
setw -g pane-base-index 1  # Numbering of Panes
# bind | split-window -h    # Split panes horizontal
bind \ split-window -h    # Split panes horizontal
bind - split-window -v    # Split panes vertically
bind h select-pane -L     # Switch to Pane Left
bind j select-pane -D     # Switch to Pane Down
bind k select-pane -U     # Switch to Pane Up
bind l select-pane -R     # Switch to Pane Right
bind -r C-h select-window -t :-  # Quick Pane Selection
bind -r C-l select-window -t :+  # Quick Pane Selection
bind -r H resize-pane -L 5       # Switch to Pane Left
bind -r J resize-pane -D 5       # Switch to Pane Down
bind -r K resize-pane -U 5       # Switch to Pane Up
bind -r L resize-pane -R 5       # Switch to Pane Right
setw -g mode-mouse off           # Mouse Off
set -g mouse-select-pane off     # Mouse Off  
set -g mouse-resize-pane off     # Mouse Off
set -g mouse-select-window off   # Mouse Off
#set -g  default-terminal "screen-256color"
setw -g monitor-activity on      # Activity Alerts
set -g visual-activity on
set -g status-fg white           # Status line Colors
set -g status-bg black
setw -g window-status-fg cyan    # Window list color
setw -g window-status-bg default
setw -g window-status-attr dim
setw -g window-status-current-fg white     # Active Window Color
setw -g window-status-current-bg red
setw -g window-status-current-attr bright
set -g pane-border-fg green      # Pane colors
set -g pane-border-bg black 
set -g pane-active-border-fg white 
set -g pane-active-border-bg yellow
set -g message-fg white          # Command/Message Line.
set -g message-bg black
set -g message-attr bright
set -g status-left-length 40     # Status Line, left side
set -g status-left "#[fg=white]Session: #S #[fg=yellow]#I #[fg=cyan]#P"
set -g status-utf8 on            # Status Line, right side
set -g status-right "-------"
set -g status-interval 60        # frequency of status line updates
set -g status-justify centre     # center window list
setw -g mode-keys vi             # vi keys to move 
unbind v                         # Open panes in same directory as tmux-panes script
unbind n
bind v send-keys " ~/tmux-panes -h" C-m
bind n send-keys " ~/tmux-panes -v" C-m
unbind Up                        # Maximizing and Minimizing...
bind Up new-window -d -n tmp \; swap-pane -s tmp.1 \; select-window -t tmp
unbind Down
bind Down last-window \; swap-pane -s tmp.1 \; kill-window -t tmp
bind P pipe-pane -o "cat >>~/#W.log" \; display "Toggled logging to ~/#W.log"
# Make keys for copy mode be like vi
unbind [
bind Escape copy-mode
unbind p
bind p paste-buffer
bind -t vi-copy 'v' begin-selection
bind -t vi-copy 'y' copy-selection

Finally (to close the loop), here's my .vimrc settings themselves that I like having to make the shell easier to use:

" mdd specific stuff --- start
set hlsearch
set incsearch
set number
" more3 mdd stuff - set tabs to be spaces and length of 2 characters.
set smartindent
set tabstop=2
set shiftwidth=2
set expandtab
" mdd specific stuff --- end
" Forget being compatible with good ol' vi
set nocompatible

" Get that filetype stuff happening
filetype on
filetype plugin on
filetype indent on

" Turn on that syntax highlighting
syntax on

" Why is this not a default
set hidden

" Don't update the display while executing macros
set lazyredraw

" At least let yourself know what mode you're in
set showmode

" Enable enhanced command-line completion. Presumes you have compiled
" with +wildmenu.  See :help 'wildmenu'
set wildmenu

" Let's make it easy to edit this file (mnemonic for the key sequence is
" 'e'dit 'v'imrc)
nmap <silent> ,ev :e $MYVIMRC<cr>

" And to source this file as well (mnemonic for the key sequence is
" 's'ource 'v'imrc)
nmap <silent> ,sv :so $MYVIMRC<cr>

highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()

Finally I make a few changes to my .bashrc file For example with shopt -s autocd when I type a directory name (that exists) my shell cd's into that directory immediately. Nifty! So here's my .bashrc changes:

# Automatic cd'ing
shopt -s autocd

# Have cd show directory info ('cos my shell doesn't show full directory path in $PS1 prompt (intended).
cd() {
      builtin cd "$@" && pwd 

# enable programmable completion features
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion

PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"  # Load RVM into a shell session *as a function*

# mdd Terminal Multiplexor 6/15/2012
if [[ ! $TERM =~ screen ]]; then
    exec tmux

[ -z "$TMUX" ] && export TERM=xterm-256color

export EDITOR=vim

git config --global --add color.ui true
  • Nice detailed answer. I've been using tmux for a bout a year now (and vi/vim for about 25) but I picked up some things here.
    – Dan
    Nov 27, 2012 at 22:58
  • Great, great answer for a noob like me. About the only thing missing is what vim plugins you use... but that is another question for another day. :) Thanks again... alhtough it will take me forever to go through it and try everything out, I wanted to go ahead give you the accepted answer. Nov 30, 2012 at 21:02
  • Sure, I actually think I'm not using any plugins but I know there are many available including some for my area of ruby on rails. Dec 1, 2012 at 14:44
  • 2
    Much of what you say here may be useful, but one thing is off: vim can readily split panes both horiz and vertically.
    – dubiousjim
    Dec 31, 2012 at 0:08
  • 1
    Updated to note that screen can do horizontal and vertical splits now. Apr 10, 2015 at 16:53

I'm using XMonad + tmux + Emacs for a similar setup.

I used ratpoison for a year in the past but XMonad felt more robust. I never had any problems in my 256MB, 512MB boxes with it. Ratpoison had some stability problems, but this is anecdotal and things might have changed since then.

I also used GNU screen but tmux has some features that screen hasn't.

If you already know vim, you'd better not learn a new tool. If you don't, Emacs can employ multiple shells (C-u M-x shell), use your favorite shell (M-x term), you can write, compile and debug your programs, read your mails, hangout in IRC, read web/info/man pages, run most REPL shells (e.g. M-x run-python), use git/hg/svn inside it, edit remote files with TRAMP, use dired to do almost all file operations, use grep/find/ack inside it. You can use Emacs with or without X. You don't need a terminal multiplexer like screen or tmux, but I prefer to run emacs as a server and use emacsclient from tmux if running it from shell.

  • I would suggest to use terminator! But Its purely one's choice! Nov 27, 2012 at 17:19
  • solution with no X at all: framebuffer + Linux console + GNU screen + vim + w3m
  • solution with X but no desktop environment: dwm + urxvt + GNU screen + vim + w3m + surf

dwm uses only a few hundred kB of memory, keyboard driven, but you can use mouse as well if you like. Check http://suckless.org for more simple yet powerful tools.


For multiple shells with easy keyboard navigation between them, you might want to look into GNU Screen, or byobu (which is an enhancement of it).


I undertook a similar endeavor a couple of months ago, abandoning my mouse and exploring a multitude of set ups and window managers. Looks like you've already been offered plenty of helpful suggestions, but I figured a couple extra cents couldn't hurt. Here's my two:

Take a look at i3 window manager. It's light, with simple configuration and doesn't require a recompile after altering the config. Tiling functionality and tagged workspaces mean no mouse and endless possibilities based on preference and screen space. Programs can be assigned to tags and keys can be bound to just about anything. i3status or conky are easily piped to i3 for system info. Install dmenu and unplug your mouse.

Try a light distro. Arch, Gentoo, and Slackware all offer different options for setting up a light environment. Start small, and pay attention to dependencies. Install only what you need and learn to configure it properly. Don't start X on boot. Learn to use all of the tools at your expense. Vim is a beast. If you already know it, use it. If not, learn it. Pay attention to the details. Learn what you have on your system and why it's there.

  • Seconding the "light distro" approach. It really forces you to get your hands dirty, even if they lay it out for you command by command (the Gentoo Install Handbook is excellent), because every system is different. The initial install doesn't even give you X, so you're stuck on the command line.
    – ND Geek
    Nov 29, 2012 at 15:42

I had a similar desire about six months ago. Primarily because I was working via SSH all day. As has already been suggested, use GNU screen. Its pretty terrible (IMHO) straight after installing it. However! It is highly customizable via the .screenrc file. There are plenty of online tutorials which provide code you can cut and paste to get it just as you like.

I went so far as to put together a few scripts for setting up such an environment - MALiCE - 'My Awesome Linux Coding Environment'. Its available on Github here:


This also documents a lots keyboard shortcuts as well as a sample .muttrc and .screenrc files - which are setup to work with things like gmail.

Note its not perfect but it may save you some time and effort to have a look at some of the config files and scripts. There's a strong vim bias.

I'd also recommend programs such as cmus (text-based media player - pretty good) and mutt (email client - again configured via text file .muttrc). There are also text-based IRC clients and believe it or not, text-based video decoders which will turn video into ASCII - a bit extreme but each to their own.

If you don't want a desktop at all then there are number of options. For example you could install slackware, which if I remember correctly boots to a command-line interface. You have to go out of your way to start the GUI.

  • We could add the elinks web browser to that list of good text-based utilities. Nov 22, 2012 at 20:44
  • How does it compare with other text-based web browsers? I could never get used to web surfing from the command-line :p
    – user19082
    Nov 22, 2012 at 21:17



But they are not all supported by all graphic cards, you should test them.

For switching between multiple shells I think Alt-F it is quick enough.


The key to this is not the distribution, but the tools. Just stop using GUI tools, and tweak the CLI tools to look and behave exactly as you'd like. One way is to edit ~/.Xresources, and then load it with xrdb in ~/.xinitrc. There, you could also start a bunch of applications that you always use.

Obviously you need a good shell: I'd say zsh. You'll have to work extensively on ~/.zshrc. (But bash would work too, of course. Then, ~/.bashrc would be the place.)

Second, an editor. Emacs or vim, depending on which you currently use. A less advanced editor (e.g., nano) won't do. As with the shell, you'd do a lot of work on ~/.emacs or the corresponding init file(s).

You need to incorporate as much as you possibly can in your text editor. I'll give some examples from the Emacs world, simply because I'm an Emacs user. For mail, rmail. For file management, dired. For web browsing, W3M. For news, gnus (although I don't use it). For man pages, M-x man. And so on.

The reason you'd do this, and not use other CLI applications (e.g., just man for man pages, lynx for browsing, etc.) is:

1) the level of integration (kill, yank, make shortcuts; everything in a blink...)

2) the keyboard shortcuts for navigating the cursor, searching, etc. (i.e., your muscle memory)

As for X, you don't need to abandon it. Just because you want everything in CLI doesn't mean you don't want GFX at all (or - at least, I want CLI-only, and GFX). For example, although you modify images with (CLI) mogrify or convert, you'd still want to display it to check the result (for example, in gliv; just disable the menu bar not to be tempted to use the mouse). Another example is LaTeX and PDF documents.

As for the terminal, most people would say screen or tmux but you could also use the Linux virtual terminals (the console, or ttys). In X, urxvt has a Perl extension that enables tabs. For those (the ttys and urxvt) you could set up a uniform interface, for example Alt-J/K to switch between tabs, so you don't have to reach for the arrow keys (or whatever is default).

Good luck :) Feel free to mail me some pointers of your own when you're done (or almost there... you're never done), as I'm on the same track as you.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .