home-config/fish/functions/_fzf_search_processes.fish
d40a56ec99137942d4c4058800d71743cb390be5
· 1.7 KB · 32 lines
raw
| 1 | function _fzf_search_processes --description "Search all running processes. Replace the current token with the pid of the selected process." |
| 2 | # Directly use ps command because it is often aliased to a different command entirely |
| 3 | # or with options that dirty the search results and preview output |
| 4 | set -f ps_cmd (command -v ps || echo "ps") |
| 5 | # use all caps to be consistent with ps default format |
| 6 | # snake_case because ps doesn't seem to allow spaces in the field names |
| 7 | set -f ps_preview_fmt (string join ',' 'pid' 'ppid=PARENT' 'user' '%cpu' 'rss=RSS_IN_KB' 'start=START_TIME' 'command') |
| 8 | set -f processes_selected ( |
| 9 | $ps_cmd -A -opid,command | \ |
| 10 | _fzf_wrapper --multi \ |
| 11 | --prompt="Processes> " \ |
| 12 | --query (commandline --current-token) \ |
| 13 | --ansi \ |
| 14 | # first line outputted by ps is a header, so we need to mark it as so |
| 15 | --header-lines=1 \ |
| 16 | # ps uses exit code 1 if the process was not found, in which case show an message explaining so |
| 17 | --preview="$ps_cmd -o '$ps_preview_fmt' -p {1} || echo 'Cannot preview {1} because it exited.'" \ |
| 18 | --preview-window="bottom:4:wrap" \ |
| 19 | $fzf_processes_opts |
| 20 | ) |
| 21 | |
| 22 | if test $status -eq 0 |
| 23 | for process in $processes_selected |
| 24 | set -f --append pids_selected (string split --no-empty --field=1 -- " " $process) |
| 25 | end |
| 26 | |
| 27 | # string join to replace the newlines outputted by string split with spaces |
| 28 | commandline --current-token --replace -- (string join ' ' $pids_selected) |
| 29 | end |
| 30 | |
| 31 | commandline --function repaint |
| 32 | end |