Awesome
Better Window Names for tmux
A plugin to name your tmux windows smartly, like IDE's.
Index
Dependencies
- tmux (Tested on 3.0a)
- Python 3.6.8+ (Maybe can be lower, tested on 3.6.8)
- pip
- libtmux >0.16
Use case
If you are using tmux as your main multiplexer you probably found yourself with 5+ windows per session with indexed names but no information about whats going on in the windows.
You tried to configure automatic-rename
and automatic-rename-format
but you found yourself pretty limited.
This plugin comes to solve those issues to name your windows inspired by IDE tablines.
It makes sure to show you the shortest path possible!
Examples
This session:
1. ~/workspace/my_project
2. ~/workspace/my_project/tests/
3. ~/workspace/my_other_project
4. ~/workspace/my_other_project/tests
Will display:
1. my_project
2. my_project/tests
3. my_other_project
4. my_other_project/tests
It knows which programs runs
1. ~/workspace/my_project (with nvim)
2. ~/workspace/my_project
3. ~/workspace/my_other_project (with git diff)
4. ~/workspace/my_other_project
Will display:
1. nvim:my_project
2. my_project
3. git diff:my_other_project
4. my_other_project
For more scenarios you check out the tests.
Usage
Install the plugin and let it name your windows :)
Note: if you are using tmux-resurrect tmux-window-name
must be loaded before tmux-resurrect
You can tmux rename-window
manually to set your own window names, to re-enable automatic renames set run tmux rename-window ""
Make sure your configuration/other plugins doesn't turn on automatic-rename
and doesn't rename your windows.
Automatic rename after launching neovim
By default tmux-window-name
hooks after-select-window
which trigged when switching windows.
You can add autocmd to rename after nvim launches and stops as so:
local uv = vim.loop
vim.api.nvim_create_autocmd({ 'VimEnter', 'VimLeave' }, {
callback = function()
if vim.env.TMUX_PLUGIN_MANAGER_PATH then
uv.spawn(vim.env.TMUX_PLUGIN_MANAGER_PATH .. '/tmux-window-name/scripts/rename_session_windows.py', {})
end
end,
})
Automatic rename after changing dir
By default tmux-window-name
hooks after-select-window
which trigged when switching windows, you can add hook in your .shellrc
to execute tmux-window-name
.zshrc
tmux-window-name() {
($TMUX_PLUGIN_MANAGER_PATH/tmux-window-name/scripts/rename_session_windows.py &)
}
add-zsh-hook chpwd tmux-window-name
Hooks Used
Make sure the hooks that used aren't overridden.
- @resurrect-hook-pre-restore-all
- @resurrect-hook-post-restore-all
How it works
Each time you unfocus from a pane, the plugin looks for every active pane in your session windows.
Note: if you have a better hook in mind make sure to notify me!
- If shell is running, it shows the current dir as short as possible,
long_dir/a
->a
, it avoids intersections too! - If "regular" program is running it shows the program with the args,
less ~/my_file
->less ~/my_file
. - If "special" program is running it shows the program with the dir attached,
git diff
(inlong_dir/a
) ->git diff:a
, it avoids intersections too!
Intersections
To make the shortest path as possible the plugin finds the shortest not common path if your windows.
Installation
Install libtmux (must)
Note: Make sure you are using the user
python and not sudo
python or virutalenv
python!
python3 -m pip install --user libtmux
Install dataclasses (for Python 3.6.X only)
python3 -m pip install dataclasses --user
Installation with Tmux Plugin Manager (recommended)
Add plugin to the list of TPM plugins:
set -g @plugin 'ofirgall/tmux-window-name'
Note: set tmux-window-name
before tmux-resurrect
(if you are using tmux-resurrect
)
set -g @plugin 'ofirgall/tmux-window-name'
set -g @plugin 'tmux-plugins/tmux-resurrect'
Press prefix + I to install it.
Manual Installation
Clone the repo:
$ git clone https://github.com/ofirgall/tmux-window-name.git ~/clone/path
Add this line to your .tmux.conf:
run-shell ~/clone/path/tmux_window_name.tmux
Reload TMUX environment with:
$ tmux source-file ~/.tmux.conf
Configuration Options
Note: All options are evaluated with eval be careful!
@tmux_window_name_shells
Shell programs, will show dir instead of the program
set -g @tmux_window_name_shells "['bash', 'fish', 'sh', 'zsh']"
@tmux_window_name_dir_programs
Programs that will show the dir name too.
E.g: git diff
running in long_dir/my_repo
will show git diff:my_repo
set -g @tmux_window_dir_programs "['nvim', 'vim', 'vi', 'git']"
@tmux_window_name_ignored_programs
Programs that will be skipped/ignored when looking for active program.
set -g @tmux_window_name_ignored_programs "['sqlite3']" # Default is []
@tmux_window_name_max_name_len
Maximum name length of a window
set -g @tmux_window_name_max_name_len "20"
@tmux_window_name_use_tilde
Replace $HOME
with ~
in window names
set -g @tmux_window_name_use_tilde "False"
@tmux_window_name_show_program_args
Show arguments that the program has been ran with.
set -g @tmux_window_name_show_program_args "True"
@tmux_window_name_substitute_sets
Replace program command lines with re.sub.
The options expect list of tuples with 2 elements, pattern
and repl
.
E.g: The example below will replace /usr/bin/python3 /usr/bin/ipython3
with ipython3
, and the same for ipython2
Note: use ~/.tmux/plugins/tmux-window-name/scripts/rename_session_windows.py --print_programs
to see the full program command line and the results of the substitute.
set -g @tmux_window_name_substitute_sets "[('.+ipython2', 'ipython2'), ('.+ipython3', 'ipython3')]"
# Same example but with regex groups
set -g @tmux_window_name_substitute_sets "[('.+ipython([32])', 'ipython\g<1>')]"
# Default Value:
set -g @tmux_window_name_substitute_sets "[('.+ipython([32])', 'ipython\g<1>'), ('^(/usr)?/bin/(.+)', '\g<2>'), ('(bash) (.+)/(.+[ $])(.+)', '\g<3>\g<4>')]"
# 0: from example
# 1: removing `/usr/bin` and `/bin` prefixes of files
# 2: removing `bash /long/path/for/bashscript`
@tmux_window_name_dir_substitute_sets
Replace dir lines with re.sub.
The options expect list of tuples with 2 elements, pattern
and repl
as above.
E.g: The example below will replace tmux-resurrect
with resurrect
set -g @tmux_window_name_dir_substitute_sets "[('tmux-(.+)', '\\g<1>')]"
# Default Value:
set -g @tmux_window_name_dir_substitute_sets "[]"
Debug Configuration Options
@tmux_window_name_log_level
Set log level of the script.
Logs output go to /tmp/tmux-window-name.log
# Enable debug logs
set -g @tmux_window_name_log_level "'DEBUG'"
# Default Value:
set -g @tmux_window_name_log_level "'WARNING'"
Testing
Run pytest
at the root dir