Сочетание клавиш истории Bash для! *

В Bash существуют некоторые удобные операторы для повторения частей последней команды:

  • !^ расширяется до первого аргумента предыдущей команды, например,

    $ echo one "two three"
    one two three
    $ echo !^
    echo one
    one
    
  • !$ расширяется до последнего аргумента предыдущей команды, например,

    $ echo one "two three"
    one two three
    $ echo !$
    echo "two three"
    two three
    
  • !* расширяется до всех аргументов предыдущей команды, например,

    $ echo one "two three"
    one two three
    $ echo !*
    echo one "two three"
    one two three
    

(Насколько я понимаю, это синтаксический сахар для !!:^, !!:$ и !!:* соответственно, где !! указатель события, который расширяется до предыдущей команды, и ^, $ и * указатели слова, видят Справочник Bash или man bash.)

Они часто довольно удобны. Но это становится еще более прохладным с сочетаниями клавиш:

  • Когда Вы поражаете Высокий звук +. или Высокий звук + _, последний аргумент предыдущей команды вставляется в текущую команду, так же как будто Вы записали !$ в той точке.

  • Также возможно поразить Alt+Ctrl+y для вставки первого аргумента предыдущей команды, как будто Вы записали !^ в той точке.

(См. библиотеку Readline GNU или info readline.)

Я склонен предпочитать сочетания клавиш по операторам истории Bash, потому что я вижу то, что я вставляю, прежде чем я на самом деле выполню команду. Однако, кажется, нет ярлыка, который позволяет мне вставить все слова предыдущей команды, т.е. то, которое делает !*задание. По крайней мере, я не мог найти его.

Есть ли такой ярлык? В противном случае действительно ли возможно настроить readline библиотеку для добавления один, и как?

8
задан 21 October 2014 в 02:15

1 ответ

Если Вы смотрите на вывод следующей команды:

bind -l

или лучше к:

bind -l | grep arg

Вы видите, что это не существует, любой функции readline для всех аргументов нравится, например, yank-last-arg для последнего аргумента - который может вставить последний аргумент предыдущей команде (последнее слово предыдущей записи истории). Так, если такая функция не делает существует, по всей вероятности не существует ярлык для выполнения то, чего Вы желаете.

Давайте попытаемся упаковать в ящики тот, к которому приближаются к Вашему запросу...

Во-первых, посмотрите, например, на вывод следующей команды:

bind -p | grep yank-nth-arg

Вывод:

"\e\C-y": yank-nth-arg

и может быть переведен следующим образом: yank-nth-arg (которые вставляют первый аргумент предыдущей команде - с аргументом n, вставляют энный аргумент от предыдущей команды), связывается с Alt+Ctrl+y.

Таким же образом может быть интерпретирован любая строка от вывода bind -p команда.

Теперь играйте внимание в следующих сценариях:

  • Если Вы устанавливаете следующую привязку:

    bind '"\ea": "\e2\e."'
    

    Alt+A будет отображен на Alt+2Alt +. который отображается для вставки второго аргумента предыдущей команды. Так, после при нажатии Alt+A второй аргумент предыдущей команды вставляется в текущую команду.

  • Если Вы устанавливаете:

    bind '"\ea": "\e1\e. \e2\e."'
    

    После при нажатии Alt+A первые два аргумента предыдущей команды вставляются в текущую команду. Если количество аргументов от предыдущей команды максимально 2, конечно, вся предыдущая команда вставляется в текущую команду.

  • Если Вы устанавливаете:

    bind '"\ea": "\e1\e. \e2\e. \e3\e."'
    

    После при нажатии Alt+A первые три аргумента предыдущей команды вставляются в текущую команду. Если количество аргументов от предыдущей команды максимально 3 (как в Вашем случае), конечно, вся предыдущая команда вставляется в текущую команду.

  • И так далее.

Для первых 10 аргументов можно использовать:

bind '"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."'

И я думаю, что это достаточно длинно насколько я не использую слишком часто команды с таким количеством аргументов.

Для создания этого персистентным добавьте следующую строку строки к Вашему ~/.inputrc файл:

"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."

В этом примере я выбрал Alt+A для вставки всех аргументов (если количество аргументов не больше, чем 10) предыдущей команды, но Вы можете, выбрал любую другую комбинацию Вы с путем замены в предыдущей команде \ea строка.

Ресурсы:

5
ответ дан 23 November 2019 в 05:50

Другие вопросы по тегам:

Похожие вопросы: