многопроцессный bash в fzf - функция preview - PullRequest
3 голосов
/ 15 марта 2019

Я пытаюсь использовать fzf следующим образом, я хотел бы иметь возможность искать термин в моей кодовой базе, а затем в окне предварительного просмотра иметь возможность увидеть файл, который содержит строку, которую я ищу в строке, где находится строка .

До сих пор мне удавалось выполнять нечеткий поиск по базе кодов для различных терминов, выполняя поиск в ripgrep всех файлов в каталоге и ниже. И я использовал cut, чтобы разобрать имя файла для cat или tail, чтобы прочитать и распечатать в окне предварительного просмотра. Это команда, используемая для этого.

rg . -n | fzf --preview-"cut -d":" -f1 <<< {} | xargs cat"

Обратите внимание, что строка, представленная {}, имеет следующий формат:

myfile.c:72:The string I am fuzzy searching

Моя проблема в том, что я не могу разобрать как имя файла , так и номер строки.

Я попытался передать bashscript в команде предварительного просмотра, а также использовать $ () в следующем примере. (Обратите внимание, что здесь я использую tail с аргументом --lines+N для печати файла после строки N)

rg . -n | fzf --preview-"tail $(cut -d":" -f1 <<< {}) --lines=+$(cut -d":" -f2 <<< {})"

Это не работает, как и различные варианты этой попытки. Любая помощь или отзывы приветствуются.

Редактировать (1):

Я пытался разбить его на массив, например

rg . -n | fzf --preview="IFS=":" read -r -a arr <<< {}| xargs tail ${arr[0]} --lines=+${arr[1]}"

Это работает в том смысле, что в предварительном просмотре файл отображается в строке, где найдена строка, однако он не обновляется при циклическом просмотре других нечетких найденных предложений.

1 Ответ

2 голосов
/ 21 марта 2019

Итак, в конце концов я нашел решение, которое работает.

Это включает вызов отдельного скрипта из моего подпроцесса, работающего внутри --preview. Я использовал следующий скрипт для получения строки, которую fzf передает в --preview (в формате имени файла: linenumber: found_string), а затем использовал bat , чтобы отобразить окно предварительного просмотра с подсветкой синтаксиса.

Этот метод довольно хорош, но несколько ресурсоемок. Я надеюсь уменьшить нагрузку, добавив к игнорирующему шару и используя ripgrep, а не найду, поскольку это кажется более эффективным.

bashscript, который я называю string2arg.sh

#!/bin/bash

string2arg() {
    export arg_filename=$(cut -d":" -f1 <<< $1);
    export arg_linenum=$(cut -d":" -f2 <<< $1);
    min_offset=25
    let max_offset="min_offset*3"
    min=0
    if (($min_offset < $arg_linenum)); then
        let min="arg_linenum-$min_offset"
    fi
    let max="arg_linenum+$max_offset"
    bat --color=always --highlight-line $arg_linenum --style=header,grid,numbers --line-range $min:$max $arg_filename;
}

Затем он вызывается из моего псевдонима fzf для поиска следующим образом:

alias fsearch='rg . -n -g "!*.html" | fzf --preview="source $SC/string2arg.sh; string2arg {}"'

где $ SC - путь к моему bashscript string2arg.sh.

Если я ищу термин с намерением открыть найденный файл в строке, в которой он найден, я использую следующий псевдоним bash.

alias vfsearch='export vfile=$(fsearch);vim +$(cut -d":" -f2 <<< $vfile) $(cut -d":" -f1 <<< $vfile)'

Также я использую следующие значения по умолчанию для fzf и считаю, что они работают для меня, хотя, поскольку я перешел на tmux, иногда мне лучше показывать окно предварительного просмотра, а не в стороне.

export FZF_DEFAULT_COMMAND="fd --type file --color=always"
export FZF_DEFAULT_OPTS="--reverse --inline-info --ansi"
export FZF_COMPLETION_TRIGGER=']]'

Я нахожу это чрезвычайно полезным и планирую перенести его в мои сеансы vim. Надеюсь, это поможет другим!

Снимок экрана, чтобы лучше проиллюстрировать сценарий использования.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...