How to activate keyboard shortcut for synchronize-panes? - tmux

Via the pragmatic programmer, one of their .tmux.conf files has this for "synchronize-panes":
# shortcut for synchronize-panes toggle
# START:sync
bind C-s set-window-option synchronize-panes
# END:sync
I do not know how to run this. I find myself running setw synchronize-panes a lot both to turn this on and off. How can I send a keyboard shortcut to run this in tmux? A simple C-s does not work while using the .tmux.conf above.

Your bind command means you have to press the prefix key (Control-b by default) then Control-s to run the command. If you want to just press Control-s then add the option -n to the bind:
bind -n C-s set-window-option synchronize-panes

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.

tmux - Force repeat prefix key for every command

Right now my tmux keybindings are set such that prefix + h/j/k/l (i.e vim-style bindings) are used to move focus of the panes left/down/up/right. However, sometimes when I switch to a pane running vim and I immediately start navigating with h/j/k/l, I get stuck in "tmux mode" where it will continue switching panes instead of navigating in vim. I have similar issues when switching to a normal terminal pane and listing files (i.e by using "l"). To avoid this, I would like to force tmux to require the prefix key for every pane switch I do.
Is there a way to do this?
Edit:
In case its needed, here is my .tmux.conf
# Bind CTRL+a to the prefix button
set -g prefix C-a
unbind C-b
bind C-a send-prefix
bind a send-prefix
# Remove the delay of escape key
set -s escape-time 0
# Bind PREFIX + r to reload the .conf file
unbind r
bind r source-file ~/.tmux.conf
# Quick pane cycling
unbind ^A
bind ^A select-pane -t :.+
set -g base-index 1
setw -g pane-base-index 1
set-option -g default-shell "/bin/bash"
# List of tmux plugins
set -g #plugin 'tmux-plugins/tmux-resurrect'
# Plugin manager
run '~/.tmux/plugins/tpm/tpm'
# Enable mouse support on tmux
set -g mouse on
# Rebind the pane switching to vim-like shortcuts
bind -r k select-pane -U
bind -r j select-pane -D
bind -r h select-pane -L
bind -r l select-pane -R
unbind Up
unbind Down
unbind Left
unbind Right
unbind C-Up
unbind C-Down
unbind C-Left
unbind C-Right
# Set the tmux colors to default
set -g default-terminal screen-256color
This is being caused by your use of -r when creating the key bindings for h/j/k/l.
From the entry for bind-key in the tmux man page:
The -r flag indicates this key may repeat, see the repeat-time option.
And about the repeat-time option:
Allow multiple commands to be entered without pressing the prefix-key again in the specified time milliseconds (the default is 500). Whether a key repeats may be set when it is bound using the -r flag to bind-key. Repeat is enabled for the default keys bound to the resize-pane command.
Just drop the -r from those four commands to have it require the prefix key every time.
I disagree with #filbranden's assertion that "Requiring the prefix for every pane switch is the normal behavior". This demonstrably false: on a fresh install, you can create a window with two panes, type the prefix (C-b), and then jump between the panes as many times as you like by pressing arrow keys.
This answer on StackExchange seems correct. The feature that results in the prefix not being required is controlled by setting the option repeat-time. It is set to 500 by default (which is why the default behaviour is that the prefix is not required).
To disable this behaviour, simply add this line to your config:
set-option -g repeat-time 0

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.

Rename a terminal in the Cloud9 IDE

Seeing 'bash - "username"' in the terminal name is pretty useless when I'm running multiple windows, is there a way to rename those windows?
you can add the following function to your bashrc
setTitle() {
# configure tmux to allow xterm set title sequence
tmux set-window-option automatic-rename off
tmux set-option allow-rename off
tmux set-option set-titles-string "#T"
tmux set-option set-titles on
# set terminal title
echo -ne "\033]0;$#\007"
}
and then run setTitle "my terminal name".
Sometimes bash prompt (PS1) contains \033]0;...\007 as well, in that case you need to modify it to not allow overriding the title set by setTitle function

Tmux copy mode: how to create your own command?

I love Tmux and its copy mode with Vi commands, but I'm really annoyed by the fact that this mode is very far from being as efficient as real Vim.
For example, there is no keybinding to just copy a word (yw), I must always "go to the beginning of a word" "begin selection", "go to the end of the word" then "finish selection". A lot of operations when I just need to do yw in vim.
I searched a way to create my own "yw" command in Tmux copy mode. Chaining all the operations needed is a good idea, but a simple bind with commands separated by ; just doesn't work (similar thing works in non-copy mode). Is there something I miss? Or is the copy mode of Tmux just limited and not as scriptable as I need it to be?
I have this in my tmux conf:
# vi-style controls in copy mode
set-option -g status-keys vi
set-window-option -g mode-keys vi
# v and y like vi in copy-mode
bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection
Now after going copy-mode i can easily select words by:
vw
And copy with
y
In tmux you have to select something to copy. There is nothing like copying in normal mode as you know from usual vi/vim commands. Unfortunately you can only use one key (like v or y) for every tmux argument.
You can find more about tmux's vi movement commands here: https://superuser.com/a/197272/57890
This appears to be a bug in the bind-key command when called with the -t option. I have filed a bug report at https://sourceforge.net/tracker/?func=detail&aid=3533562&group_id=200378&atid=973262.
On upstream (2.4+) tmux version this got changed, in order to create a bindings for begin selection you need to use -T and send-keys with -X.
More info in tmux changelog.
Here my bindings for vi copy mode as an example:
# Bind `v` to trigger selection
bind-key -T copy-mode-vi v send-keys -X begin-selection
# Bind `y` to yank current selection
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel
# Rebind `mouse click + drag button release` to not jump away from context
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-selection
If you are using emacs copy mode, replacing copy-mode-vi with copy-mode should be enough.
There's a patch for tmux allowing to create procedures and bind any number of actions for 'mode' keystrokes: http://ershov.github.io/tmux/

Resources