A tmux "mode" that allows you to open file links in an $EDITOR
, urls in the browser and more.
Tmux fingers plugin introduced the "fingers" mode, where particularly looking chunks of text (e.g. file paths) are highlighted and assigned a character "mark". When user hits the mark key, the highlighted text gets copied to clipboard.
Super Fingers builds upon this idea. Notably:
$EDITOR
running elsewhere within the same tmux session*UsersController#show
in rails log or +++ b/app/models/user.rb
in a diff) is also highlighted* currently this behavior only works for (n)vim - everything else is sent to OS open.
* if no running terminal $EDITOR
is found in the session, plugin attempts to start one in a new window.
** code is designed in such a way that it should be easy to add new types of marks/actions.
Pressing space toggles "secondary" mode. In this mode, mark is copied to clipboard.
Requires Python >= 3.9.
set -g @plugin 'artemave/tmux_super_fingers'
Hit prefix + I to fetch and source the plugin.
Clone the repo:
git clone https://github.com/artemave/tmux_super_fingers.git ~/.tmux/plugins/tmux_super_fingers
Source it in your .tmux.conf
:
run-shell ~/.tmux/plugins/tmux_super_fingers/tmux_super_fingers.tmux
Reload TMUX conf by running:
tmux source-file ~/.tmux.conf
Customize how to enter fingers mode. Always preceded by prefix: prefix + @super-fingers-key
. Defaults to f
.
set -g @super-fingers-key f
Requires writing some python code.
There are different types of mark targets (e.g. text file target, url target). Each target type has a primary and a secondary action. You can supply a python file that changes default actions for target types.
For example, the following code changes primary action to open files in vscode and secondary action to send them to vim:
```python3 import os from .targets.file_target import FileTarget from .actions.send_to_vim_in_tmux_pane_action import SendToVimInTmuxPaneAction from .actions.action import Action from .targets.target_payload import EditorOpenable
class SendToVsCodeAction(Action): def init(self, target_payload: EditorOpenable): self.target_payload = target_payload
def perform(self):
path = self.target_payload.file_path
if self.target_payload.line_number:
path += f':{self.target_payload.line_number}'
os.system(f'code -g {path}')
FileTarget.primary_action = SendToVsCodeAction FileTarget.secondary_action = SendToVimInTmuxPaneAction ```
You can also define new action types. See existing actions for details.
Now let's plug it in:
set -g @super-fingers-extend /path/to/the/above/code.py
Prerequisites: python3, pipenv, node, make
git clone https://github.com/artemave/tmux_super_fingers.git
cd tmux_super_fingers
pipenv install --dev
npm install
Run checks and tests:
make
The plugin relies on EDITOR
variable being set. However, it has been observed that under some circumstances (I can't figure out what they are) tmux does not inherit environment when it starts and so the plugin code runs, EDITOR
is missing and nothing works.
Running tmux set-environment -g EDITOR $EDITOR
later fixes it, but I can't figure out how to automate this.
One (untested) workaround could be to alias tmux like this:
alias tmux="tmux && tmux set-environment -g EDITOR $EDITOR"
vim
and xdg-open
)@super-fingers-key
Hi,
Would it be possible to use this script to open directories using default application, just like all the files? I thought about just submitting a PR extending the regexes, but I'm not sure how you would go about it and didn't want to potentially pollute your code.
tmux tmux-plugin vim