#+title:  Tmux Configuration
#+author: Howard X. Abrams
#+date:   2026-01-15
#+filetags: emacs hamacs
#+lastmod: [2026-01-15 Thu]

I use [[https://github.com/tmux/tmux/wiki][tmux]] infrequently as I'm usually running a bunch of Terminals from within Emacs. Laugh all you want, but Emacs is my terminal multiplexer. That said, frequent network connectivity and long-running jobs make a =tmux= helpful on a remote server.

* Remote Installation
  Log in an install =tmux= on a RedHat-based system with a =yum= command:

  #+BEGIN_SRC sh :dir /ssh:docker:
    sudo yum install -y tmux
  #+END_SRC

And on my Ubuntu systems:

  #+BEGIN_SRC sh :dir /ssh:docker:
    sudo dpkg install tmux
  #+END_SRC
* Remote Configuration
Copy the following to =$HOME/~/.tmux.conf=:

#+BEGIN_SRC conf :tangle /ssh:docker:/home/vagrant/.tmux.conf
    set-option -g prefix C-`

    set -g status-right "| docker "
    set-option -g allow-rename off

    # Start windows and panes at 1, not 0
    set -g base-index 1
    set -g pane-base-index 1

    # Bind function keys.
    bind -n F1 select-window -t 1
    bind -n F2 select-window -t 2
    bind -n F3 select-window -t 3
    bind -n F4 select-window -t 4
    bind -n F5 select-window -t 5
    bind -n F6 select-window -t 6
    bind -n F7 select-window -t 7
    bind -n F8 select-window -t 8
    bind -n F9 select-window -t 9
    bind -n F10 select-window -t 10
#+END_SRC

Not sure why =screen= and =tmux= chose such awful prefix keybindings as ~C-a~ and ~C-b~, so I change this to ~C-`~.

I'm not a tmux power user, as changing windows is about all I do, so I bind the function keys to change tabs.

The following =~/.bash_aliases= enhance tmux:

#+BEGIN_SRC sh :tangle /ssh:docker:/home/vagrant/.bash_aliases
  #!/bin/sh
  # The following aliases have been installed on this machine.
  # - `nw` to create a new Tmux window. Give ‘er a command.
  alias nw='tmux new-window'

  # - `root` for a TMUX window as the root user.
  alias root='nw -n root "sudo su -" '
#+END_SRC

When using Docker sessions on the remote system, the =go= and =logs= opens a new window:

#+BEGIN_SRC sh
  # - `go` to connect to a docker container
  function go {
      nw -n "$1" "sudo docker exec -it $1 bash"
  }

  # - `logs` for displaying the logs from a container
  function logs {
      nw -n $1-logs "sudo docker logs -f $*"
  }
#+END_SRC

After writing a number of helper aliases, I find it helpful to see those aliases when I roll into a remote server, so put this in the =.bashrc= file:

#+BEGIN_SRC sh
  if [ "$HOME/.bash_aliases" ]
  then
      source "$HOME/.bash_aliases"
      grep '^# ' "$HOME/.bash_aliases" | sed 's/^# *//'
      echo
  fi
#+END_SRC

Note: this can interfere with Tramp.
* Local Access
For a collection of long-running and highly verbose programs (like a remote Anisble run), I use iTerm on a MacOS with a special binding to create Mac-widgets in tmux.

#+BEGIN_SRC sh
  ssh -t laptop 'tmux -CC attach || tmux -CC'
#+END_SRC


#+DESCRIPTION: Code to be used for configuring Tmux.

#+PROPERTY:    header-args:sh :tangle no
#+PROPERTY:    header-args:emacs-lisp  :tangle yes
#+PROPERTY:    header-args    :results none :eval no-export :comments no mkdirp yes

#+OPTIONS:     num:nil toc:nil todo:nil tasks:nil tags:nil date:nil
#+OPTIONS:     skip:nil author:nil email:nil creator:nil timestamp:nil
#+INFOJS_OPT:  view:nil toc:nil ltoc:t mouse:underline buttons:0 path:http://orgmode.org/org-info.js
