Ссылка на вывод предыдущей команды/содержимое экрана терминала в текущей командной строке

Ссылка на вывод предыдущей команды/содержимое экрана терминала в текущей командной строке

Мне часто приходится полностью копировать строку вывода в Bash:

$ grep -ilr mysql_connect *
httpdocs/includes/config.php
httpdocs/admin/db.php
statistics/logs/error_log
$ vim httpdocs/includes/config.php

Есть ли способ настроить сочетание клавиш Bash или Tmux для three lines up, например @@3:

$ grep -ilr mysql_connect *
httpdocs/includes/config.php
httpdocs/admin/db.php
statistics/logs/error_log
$ vim @@3 # This would be the equivalent of vim httpdocs/includes/config.php (three lines up)

Ярлык не обязательно должен быть @@, подойдет любой другой. В идеале это будет работать в любом Bash, но ярлык tmux тоже подойдет.

Обратите внимание, что я знаком с tmux и копированием и вставкой экрана (вход в режим вставки, переход к копированию, возврат, вставка), но я надеюсь на что-то более простое в использовании (@@N), поскольку я, похоже, часто это делаю.

решение1

Следующая функция Bash будет использовать вывод, который вы получите после запуска команды (т.е. grep -ilr mysql_connect *), чтобы создать список, из которого вы можете выбрать один вариант — файл. После того, как выбор сделан, файл будет открыт с помощью Vim.

output_selection()
{
    local i=-1;
    local opts=()
    local s=

    while read -r line; do
        opts+=("$line")
        printf "[$((++i))] %s\n" "$line"
    done < <("$@")

    read -p '#?' s

    if [[ $s = *[!0-9]* ]]; then
        printf '%s\n' "'$s' is not numeric." >&2

    elif (( s < 0 )) || (( s >= ${#opts[@]} )); then
        printf '%s\n' "'$s' is out of bounds." >&2

    else
        vim "${opts[$s]}"
    fi
}

Предпосылки: Вывод должен быть разделен символами '\n'.

Использование: output_selection [команда]

Пример:

output_selection grep '.php$' foo.txt

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

решение2

Если предположить, что имена файлов не содержат пробелов, то это сделает то, что вы просили:

$ set -- $(grep -ilr mysql_connect * | tac)
$ echo $3
httpdocs/includes/config.php
$ echo $2
httpdocs/admin/db.php
$ echo $1
statistics/logs/error_log

Вы можете создать другую функцию, не | tacпечатая ее в правильном порядке:

$ set -- $(grep -ilr mysql_connect *)
$ echo $1
httpdocs/includes/config.php
$ echo $2
httpdocs/admin/db.php
$ echo $3
statistics/logs/error_log

Связанный контент