summaryrefslogtreecommitdiff
path: root/.config/fish/functions/_fzf_search_processes.fish
blob: e3ef59fd3e0cb9331b8e0c0a6ce5d17663f0bd03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function _fzf_search_processes --description "Search all running processes. Replace the current token with the pid of the selected process."
    # use all caps to be consistent with ps default format
    # snake_case because ps doesn't seem to allow spaces in the field names
    set ps_preview_fmt (string join ',' 'pid' 'ppid=PARENT' 'user' '%cpu' 'rss=RSS_IN_KB' 'start=START_TIME' 'command')
    set processes_selected (
        ps -A -opid,command | \
        _fzf_wrapper --multi \
                     --query (commandline --current-token) \
                     --ansi \
                     # first line outputted by ps is a header, so we need to mark it as so
                     --header-lines=1 \
                     # ps uses exit code 1 if the process was not found, in which case show an message explaining so
                     --preview="ps -o '$ps_preview_fmt' -p {1} || echo 'Cannot preview {1} because it exited.'" \
                     --preview-window="bottom:4:wrap" \
                     $fzf_processes_opts
    )

    if test $status -eq 0
        for process in $processes_selected
            set --append pids_selected (string split --no-empty --field=1 -- " " $process)
        end

        # string join to replace the newlines outputted by string split with spaces
        commandline --current-token --replace -- (string join ' ' $pids_selected)
    end

    commandline --function repaint
end