skim (fuzzy finder) integration into xonsh (shell)
Sets up keybinds to search various type of data: dirs/files, history of commands/CWDs/dirs, ssh hosts...
To install use pip:
xpip install xontrib-skim
# or: xpip install -U git+https://github.com/eugenesvk/xontrib-skim
Supported data sources:
- xonsh history of commands (and their frequency)
- xonsh history of commands' CWDs (and the frequency of commands started here)
- zoxide's history of dirs
CWDs/dirs support multi-selection (with proper escape-quoting) as well ascd
-ing to the selected dir in-place - files in the current directory and its sub-directories
- dirs in the current directory and its sub-directories
- ssh hosts from
/etc/ssh/ssh_config
,~/.ssh/config
,~/.ssh/known_hosts
This xontrib requires sk
(or sk-tmux
) to be in PATH
. If it's added to PATH
via another xontrib (e.g, you installed it via Homebrew and use xontrib-homebrew
), then you should load this xontrib after the one setting PATH
- Add the following to your
.py
xontrib loading config andimport
it in your xonsh run control file (~/.xonshrc
or~/.config/rc.xsh
):
from xonsh.xontribs import xontribs_load
from xonsh.built_ins import XSH
envx = XSH.env
xontribs = [ "skim", # Initializes skim (polyglot asdf-like runtime manager)
# your other xontribs
]
# ↓ optional configuration variables (use `False` to disable a keybind)
if 'skim' in xontribs: # Configure skim only if you're actually loading it
# config var value |default|alt_cmd¦ comment
envx["X_SKIM_KEY_HIST"] = "⎈s" #|c-s| False¦ Search in history entries and insert the chosen command
envx["X_SKIM_KEY_HIST_CWD→"] = "⎇s" #|['escape','s']| False¦ Search in history entries' CWD and CD to the selected item (if exists, do nothing otherwise)
envx["X_SKIM_KEY_HIST_CWD"] = "⎈⎇s"#|['escape','c-s']|False¦ Search in history entries' CWD and insert the selected item(s)
envx["X_SKIM_KEY_HIST_Z→"] = "⎇z" #|['escape','z']| False¦ Search in zoxide's history entries and CD to the selected item (if exists, do nothing otherwise)
envx["X_SKIM_KEY_HIST_Z"] = "⎈⎇z"#|['escape','c-z']|False¦ Search in zoxide's history entries and insert the selected item(s)
envx["X_SKIM_KEY_FILE"] = "⎈f" #|c-f| False¦ Find files in the current directory and its sub-directories
envx["X_SKIM_KEY_DIR"] = "⎇f" #|['escape','f']| False¦ Find dirs in the current directory and its sub-directories
envx["X_SKIM_KEY_SSH"] = "⎈b" #|c-b| False¦ Run 'ssh HOST' for hosts in /etc/ssh/ssh_config, ~/.ssh/config, ~/.ssh/known_hosts
# run to see the allowed list for ↑: from prompt_toolkit.keys import ALL_KEYS; print(ALL_KEYS)
# Alt is also supported as either of: a- ⎇ ⌥ (converted to a prefix 'escape')
# Control symbols are also supported as either of: ⎈ ⌃
# ↓ are key bindings for the skim binary itself, not this xontrib, so use skim rules https://github.com/lotabout/skim#keymap
envx["X_SKIM_KEY_SORT_TOGGLE"] = "ctrl-r" #|ctrl-r|False¦ ⎈R binding for 'toggle-sort'
envx["X_SKIM_KEY_CUSTOM"] = None #|None| a dictionary of {'key':'action'}
envx["X_SKIM_NO_HEIGHT"] = True #|True|False¦ disable `--height` to fix a skim bug
envx["X_SKIM_NO_SORT"] = True #|True|False¦ disable history sorting
envx["X_SKIM_CMD_FRQ"] = True #|True|False¦ add ∑command runs for a given command
envx["X_SKIM_CMD_FRQ_MIN"] = 5 #|5| hide frequency numbers below this
envx["X_SKIM_CWD_FRQ"] = True #|True|False¦ add ∑command runs at a given CWD
envx["X_SKIM_CWD_FRQ_MIN"] = 5 #|5| hide frequency numbers below this
envx["X_SKIM_CMD_FIND"] = "fd -t f -t l" #|None| command used by skim to search for files
envx["X_SKIM_CMD_FIND_DIR"] = "fd -t d " #|None| command used by skim to search for directories
envx["X_SKIM_DIR_VIEW"] = "ls -F --color=always {2..}" #|None| preview function for Dir lists
envx["SKIM_DEFAULT_OPTIONS"] = "--ansi --preview-window=right:40%:wrap" # |None| other options to pass to skim
xontribs_load(xontribs) # actually load all xontribs in the list
- Or just add this to your xonsh run control file
xontrib load skim # Initializes skim (fuzzy finder)
# configure like in the example above, but replace envx['VAR'] with $VAR
$X_SKIM_KEY_HISTORY = "c-s" # ...
-
cd
to a path in-place without losing the command you've already typed in the prompt! -
Find fils/dirs in xonsh-completed paths: type
cd ~/Mus
; hit ⎈F to limit your file search to~/Music
-
Find files with ⎈F and dirs with ⎇F
envx["X_SKIM_KEY_FILE"] = "⎇f"
envx["X_SKIM_KEY_DIR"] = "⎈f"
- Insert multiple paths with home row cursor keys
⎇J to toggle and ▼
⎇K to toggle and ▲envx["X_SKIM_KEY_CUSTOM"] = { 'alt-j':'toggle+down' , 'alt-k':'toggle+up' }
- skim doesn't clear the screen properly when
--height
is set due to a bug. At the moment this flag is disabled viaX_SKIM_NO_HEIGHT
- skim sometimes prints extraneous text symbols, e.g., when searching history, maybe due to this bug or something else
- skim might bug in tmux on some system/terminals bug1, bug2
toggle-sort
(andX_SKIM_KEY_SORT_TOGGLE
) doesn't seem to be supported in skim,ls | sk --bind=pgdn:toggle-sort
also fails- to remove extra
?[38;5;26mFOLDER
from output, add--ansi
to$SKIM_DEFAULT_OPTIONS
or disable colors in your$X_SKIM_CMD_FIND
/DIR
filter (e.g.,fd -t d -c never
) - ⎈/⎇f conflict with xontrib-output-search's defaults
This package was created with xontrib template