How to copy to system clipboard from tmux, when using vi keys - tmux

This question is answered here: https://unix.stackexchange.com/questions/131011/use-system-clipboard-in-vi-copy-mode-in-tmux
In my tmux config I have
set-window-option -g mode-keys vi
So that when I run :
C-b [
The navigation is with vim keys, which is good.
But what I'm not sure about is how I copy to the system clipboard from within this mode.
For example - if i select a couple of lines in this mode (vim keys Vkk) and want to copy them to the system keyboard, how is this done?
system info
system:
> lsb_release -a
No LSB modules are available.
Distributor ID: Pop
Description: Pop!_OS 22.04 LTS
Release: 22.04
Codename: jammy
Tmux:
> tmux -V
tmux 3.2a

Related

How to disable mouse copy while keeping mouse scroll in tmux?

I'm running tmux via ssh on a linux (remote) machine from an iTerm2 on macOS.
I've configured .tmux.conf in order to get mouse wheel scrolling inside of tmux via the following:
set -g mouse on
This enables mouse wheel scrolling, copy to clipboard on mouse drag and others.
Can I keep mouse wheel scrolling but disable copy on mouse drag to clipboard at the same time?
Here is the best behaviour I was able to get from tmux so far
set -g mouse on
unbind-key MouseDown2Pane
unbind-key MouseDragEnd1Pane
bind-key -n MouseDown2Pane run "tmux set-buffer \"$(xclip -o -sel primary)\"; tmux paste-buffer"
bind-key -T copy-mode MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -sel primary -i"
set -g set-clipboard external
If you run tmux list-keys you should see lines like
bind-key -T root MouseDrag1Pane ...
depending on your version of tmux. You can add lines to your config file to unbind the ones you don't want, eg:
unbind-key -T root MouseDrag1Pane
When tmux has the mouse mode on (set -g mouse on), then in iTerm on macOS you can press the option key (= alt key) to temporary disable sending mouse events to the terminal application (and thus you can mark lines in the terminal as you are used to).
This also allows you to scroll back in your buffer to before you started tmux.

How to set pane titles with tmuxinator

How do you set a unique title on each pane in a tmuxinator session?
I'm trying to run multiple panes to show the output from htop being run through ssh to different servers. My configuration looks like:
project_name: Server Monitor
windows:
- servers:
layout: tiled
panes:
- ssh -t -i mykey.pem user#server1 htop
- ssh -t -i mykey.pem user#server2 htop
- ssh -t -i mykey.pem user#server3 htop
When I launch this with tmuxinator local, it runs the commands just fine and I see the output from htop. However, the panes all look the same and the SSH title isn't shown, making it nearly impossible to tell which pane corresponds to which server.
How do I change my configuration so that a unique title is shown on each pane?
This example shows that this feature is supported in the underlying tmux, but I'm not sure how to access this through tmuxinator.
What you need to do is first enable pane status in your .tmux.conf with the lines:
set -g pane-border-format "#{pane_index} #{pane_title}"
set -g pane-border-status bottom
Then add to your tmuxinator config a printf command that will send the appropriate escape sequence to dynamically set the pane title. You will have 2 commands now per pane, so you need to add another level of indentation with a name.
project_name: Server Monitor
windows:
- servers:
layout: tiled
panes:
- p1:
- printf '\033]2;%s\033\\' 'server1'
- ssh -t -i mykey.pem user#server1 htop
- p2:
- printf '\033]2;%s\033\\' 'server2'
- ssh -t -i mykey.pem user#server2 htop
- p3:
- printf '\033]2;%s\033\\' 'server3'
- ssh -t -i mykey.pem user#server3 htop
You need at least tmux 2.3 to have pane titles shown in the borders.
For anyone else who comes across this and:
Doesn't want to change their layout
Has a problem parsing the structure in Meuh's answer (I was getting a undefined method shellescape for #<Array error.
You still need to add these to your .tmux.conf:
set -g pane-border-format "#{pane_index} #{pane_title}"
set -g pane-border-status bottom
You can just add a ; before the ssh command and do this:
name: myBoxes
root: ~/
windows:
- hosts:
layout: tiled
panes:
- printf '\033]2;%s\033\\' 'role_storage_v45 : hostname2.net'; ssh 10.20.30.1
- printf '\033]2;%s\033\\' 'role_dns_v15 : hostname1.net'; ssh 10.20.30.2

How to bind Ctrl-Tab and Ctrl-Shift-Tab in tmux for mintty

I would like to bind CTRL+TAB and CTRL+SHIFT+TAB (without prefix) to tmux functions, under minTTY/cygwin.
I have tried the following tmux configuration:
set-option -gw xterm-keys on
bind-key -n C-Tab next-window
bind-key -n "^[[1;5I" next-window # tmux doesn't recognize
bind-key -n "\e[1;5I" next-window # tmux doesn't recognize
If I hit CTRL+TAB after launching tmux, I get a bell sound. If I hit it after the tmux prefix, it prints 1;5I.
I am using minTTY 2.2.3 under cygwin/Babun. I have disabled minTTY's handling of this key combo via its options (SwitchShortcuts=no in .minttyrc).
For reference, CTRL+TAB and CTRL+SHIFT+TAB work for cycling screen windows with the following .screenrc:
bindkey "^[[1;5I" next
bindkey "^[[1;6I" prev
I got here because I bumped into the same issue.
tmux now supports custom key bindings via user-keys - since August 2017, so if you can build tmux yourself, or once a new tmux version is released, it's possible like so:
set -s user-keys[0] "\e[1;5I"
set -s user-keys[1] "\e[1;6I"
bind-key -n User0 select-pane -t+
bind-key -n User1 select-pane -t-
Note that you must use double quotes and not single quotes or else it won't interpret \e correctly.
At the time of writing the example in the manual uses single quotes - https://github.com/tmux/tmux/issues/1043 , though it's likely to be fixed soon.

Ubuntu - change tmux 1.8 to tmux-next 1.9 [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
This question does not appear to be about a specific programming problem, a software algorithm, or software tools primarily used by programmers. If you believe the question would be on-topic on another Stack Exchange site, you can leave a comment to explain where the question may be able to be answered.
Closed 6 years ago.
Improve this question
After I tried install few plugins for tmux I found that my tmux version is 1.8.
Following steps from this answer I install tmux 2.1: Ugrade tmux from 1.8 to 1.9 on Ubuntu 14.04
(I didn't found tmux=1.9a-1~ppa1~t and instead install tmux-next and substitute link in usr bin with sudo ln -sf $(which tmux-next) /usr/bin/tmux
Tmux works nicely, but didn't load my config. I tried tmux source, but now I should tmux source every time I use tmux.
And after all I get this errors:
unknown option: mode-mouse
unknown option: mode-mouse
unknown option: mouse-select-pane
unknown option: mouse-resize-pane
unknown option: mouse-select-window
unknown option: mode-mouse
unknown option: mode-mouse
Is tmux-next the same tmux? And what I should do to load .tmux.conf automatically?
Just have installed tmux 2.1 on Ubuntu Server and faced the same problem. The solution for me is to delete all those unknown options and add those lines instead:
set -g mouse-utf8 on
set -g mouse on
Now in tmux 2.1 I can choose a pane, a window and resize everything with a mouse as it was in tmux 1.8
MOUSE SUPPORT section of 'man tmux':
"The default key bindings allow the mouse to be used to select and resize panes, to copy text and to change window using the status line. These take effect if the mouse option is turned on."
UPDATE (since there are a lot of questions):
0 Install:
brew cask install easysimbl
1 Download .dmg file here: https://bitheap.org/mouseterm/
2 Execute:
cd /Volumes/MouseTerm && cp -r MouseTerm.bundle /Library/Application\ Support/SIMBL/Plugins
3 Add this to your .tmux.conf file:
set -g mouse-utf8 on
set -g mouse on
bind -n WheelUpPane select-pane -t= \; copy-mode -e \; send-keys -M
bind -n WheelDownPane select-pane -t= \; send-keys -M
4 Reload tmux
5 Scroll!!!1
I hope this will help. Works for me on iTerm 2/OS X El Capitan/tmux-2.1
Options mode-mouse, mouse-select-pane, mouse-resize-pane, mouse-select-window are deprecated. Use mouse option instead, it covers all the functionality of those four options:
set -g mouse on
The official deprecation dates back to v2.1, but the actual changes were introduced between v1.9 and v2.0.

Tmux: How do I find out the currently running version of tmux?

I know that I can run tmux -V to find the version of tmux that is in my PATH, but how can I get the version of tmux that is currently running?
As pointed out in a comment, tmux -V returns the version:
$ tmux -V
tmux 3.0a
Tested on Centos 7 and OSX 12.5.
Most obvious, but not 100% correct way is to execute this command in console
$ tmux -V
and receive output like this tmux 2.9a with version of tmux INSTALLED, not currently running.
In 99% cases it is enough, but there can be subtle nuances.
Command tmux -V will return version of tmux installed at /usr/bin/tmux or any other directory inside your PATH variable. If you have tmux already running, it is possible that tmux can be started from binary of other version and from different place (for example, tmux can be started from /home/user/bin/tmux).
In this case, you have to call
$ ps -e | grep tmux
to see PID of all tmux processes currently running. It will output something like this
[vodolaz095#ivory ~]$ ps -e | grep tmux
19699 pts/0 00:00:00 tmux: client
19701 ? 00:00:00 tmux: server
Here, number 19701 depicts process id (PID) of currently running tmux server.
After getting PID of tmux server, you can ran command
$ lsof -p 19701
to get information about CURRENTLY RUNNING tmux server process (in my case its 19701) that will output something like this (Figure 1)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tmux:\x20 19701 vodolaz095 cwd DIR 8,33 4096 22544385 /home/vodolaz095
tmux:\x20 19701 vodolaz095 rtd DIR 8,1 4096 2 /
tmux:\x20 19701 vodolaz095 txt REG 8,1 677760 3675332 /usr/bin/tmux
tmux:\x20 19701 vodolaz095 mem REG 8,1 6406312 131327 /var/lib/sss/mc/group
as you can see, tmux currently running was executed from binary placed in /usr/bin/tmux.
Or, you can call one liner
lsof -p `pgrep 'tmux: server'`
to achieve the same output as Figure 1
After you get path to tmux binary CURRENTLY RUNNING, (in my case, it was /usr/bin/tmux), you can execute this binary with flag -V to get its version
/usr/bin/tmux -V
or, if tmux was installed by limited user into /home/user/bin/tmux,
/home/user/bin/tmux -V
And, as result, you'll get version of tmux currently running, not the one, that was installed.
To get the version of the tmux server you can use display-message.
./tmux2.3 display-message -p "#{version}"
Will show the version of the server (2.7 in my case)
-p will direct the output of stdout so you can script with it and {version} can be anything from the FORMATS section in the man page.
The following will give you the executable of your tmux server, on linux:
realpath /proc/$(tmux display-message -p "#{pid}")/exe
And on macos, proc_pidpath can be used, see https://stackoverflow.com/a/8149380
To find the actual version of the tmux that is running, you have to find the PID of the tmux:
pgrep tmux
With this info, you can check the version by running:
lsof -p $tmuxPID | grep REG | grep -i -e deleted -e "tmux$"
If there is not a (deleted) next to the tmux file listed, you can just run that file with a -V.
If it results in files that are "(deleted)", you are running an old, uninstalled version. If you are on linux, you can figure out what it is by running:
/proc/$tmuxPID/exe -V`
If you are on OS X, you are stuck with whatever information is in the path to the filename, possibly something like Cellar/tmux/<version number>/bin/tmux.
You can combine many of these steps into the following one-liner:
for tmuxPID in $(pgrep tmux); do lsof -p $tmuxPID | grep REG | grep -i -e deleted -e "tmux$"; done
Or if you are on Linux, this always works:
for tmuxPID in $(pgrep tmux); do /proc/$tmuxPID/exe -V; done

Resources