
Scripting tmux - mplanchard
https://www.arp242.net/tmux.html
======
3xblah
This comment was posted using tmux scripting, as follows:

    
    
        set -x
        send(){ tmux send "$@";}       
        send 'links -no-connect https://news.ycombinator.com/login?goto=news' ;
        send c-m; sleep 2;
        send 3xblah c-m $HNPASSWORD c-m c-m c-m; sleep 2;
        send Escape; sleep 1; send V S; sleep 1;
        send 'scripting tmux' c-m Down Down Down Down Down Down c-m;
        send Escape; sleep 1; send V S; sleep 1;
        send 'add comment' c-m Up;
        send 'This comment was posted using tmux scripting, as follows: ' c-m; 
        a=$(sed '5,18!d' $0); sleep 2;
        send "$a"; sleep 2; send c-m c-m Down c-m;

~~~
GordonS
Nice, I had no idea you could script tmux like that! Reminds me of "expect",
which I've used to automate interactive SSH sessions with network devices.

~~~
tyingq
Replacing the sleeps with calls to "tmux capture-pane" to parse the responses
would be closer to expect.

~~~
3xblah
Brainless method I use to check the panel:

    
    
      case $1 in
      ""|-b|-E|-S|-t)
      tmux capturep $@ --;
      tmux showb $@ --;
      exec tmux dele --;
      esac
    

Also there is a "-N repeat count" option for send-keys in newer versions of
tmux.

~~~
abcdef123xyz2
capture-pane has -p so you can pipe its output rather than letting it create a
buffer you have to delete.

~~~
3xblah
s/has/now &/

I started using tmux in 2009. There was no -p option when capturep command was
first added. Old scripts that keep working tend not to get updated. I have
updated it now. Thank you.

------
tony
I wrote libtmux ([https://libtmux.git-pull.com](https://libtmux.git-pull.com))
as a way to control tmux via python objects.

In the backend, it's all tmux CLI commands.

tmuxp ([https://tmuxp.git-pull.com](https://tmuxp.git-pull.com)), similar to
tmuxinator, uses libtmux under the hood to build workspaces from a yaml/json
file: [https://github.com/tmux-
python/tmuxp/blob/master/tmuxp/works...](https://github.com/tmux-
python/tmuxp/blob/master/tmuxp/workspacebuilder.py)

Despite that, I've found some people prefer just using plain tmux scripting
([https://twitter.com/bitprophet/status/561356905843392514](https://twitter.com/bitprophet/status/561356905843392514)).
Aside: That's Jeff Forcier, creator of fabric
([http://www.fabfile.org/](http://www.fabfile.org/))

Through tmux's formats ([http://man7.org/linux/man-
pages/man1/tmux.1.html#FORMATS](http://man7.org/linux/man-
pages/man1/tmux.1.html#FORMATS)), you can about any info you'd like on your
workspace.

An area I don't know about is -C (control mode). libtmux could technically use
it to get live updates rather than inefficiently and possibly needlessly
querying session/window/pane info to keep objects up to date. Apparently
iterm2's tmux integration uses it.

~~~
cheez
This is awesome. I had to hack together some scripts to implement workspace
building and tmuxp looks like it might have saved me a lot of headache!

------
frankharv
I use Tmux for starting 4 Bhyve VM's on FreeBSD via rc.local. It really like
it better than screen or daemon processes. Nice for large compiling jobs on
remote machines too.

------
tjoff
Just this night I was thinking if whether tmux scripting could be abused to
get it to work like zmodem. Sending files from the system with the tmux
session to whatever machine one had sshd into (and ideally the other direction
as well).

Anyone know of this or a better approach?

~~~
tyingq
Tmux has pipe-pane, and it has -I and -O to go both directions.

It does require some gyrations to get around the fact that it logs everything
(the command itself, terminal control, etc), and not just what's output by the
command. Here's a quick and dirty example:

a) Start a tmux session to a remote host

b) On the local host, run this (assuming session 0):

$ tmux pipe-pane -o -t0 "tail -n +2 | col -b | base64 -d > ~/output"

$ tmux send-keys -t0 "base64 /some/file && read" Enter

$ tmux pipe-pane -t0

$ tmux send-keys -t0 Enter

You should now have ~/output on the local host, which is identical to
/some/file on the remote.

~~~
tjoff
Thank you, that is great! Will certainly play around with that :)

------
ORioN63
Have been looking for a while, but does anyone know if there is there anything
like which-key for tmux?

which-key on vim has been great in making sure, I use new features, I add to
my config file.

~~~
nine_k
Prefix + ? will show you the current key map; it is searchable like normal
text.

Not utterly comfortable, but helps most of the time.

~~~
ORioN63
That's nice to know, thanks.

------
kohtatsu
Despite using tmux for years, even having written scripts for nested sessions
that I use each day, I hadn't noticed the CLI was missing long options. Kind
of crazy.

~~~
Pete_D
This is a common property of software with BSD-ish roots. For example, neither
does OpenSSH's ssh.

