Команда Bash для копирования до курсора и вставки после?


24

Я не уверен, как это сформулировать, но я часто нахожу себя набирающим команды следующим образом:

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

Я обычно просто печатаю путь дважды (с завершением табуляции), или я скопирую и вставлю путь курсором. Есть ли какой-то bashfoo, который облегчает ввод?


2
Я думаю, что вы имеете в виду bash-fu:)
кот

Ответы:


43

Есть несколько хитростей (я думаю, что есть дубликат), но для этого я склонен делать

cp /etc/prog/dir1/myconfig.yml{,.bak}

который расширяется до вашей команды.

Это известно как расширение скобки . В используемой здесь форме {}выражение определяет количество строк, разделенных запятыми. Они «расширяют» все /etc/prog/dir1/myconfig.yml{,.bak}выражение, заменяя {}часть каждой строкой по очереди: пустая строка, давая /etc/prog/dir1/myconfig.yml, а затем .bak, давая /etc/prog/dir1/myconfig.yml.bak. Результат

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

Эти выражения могут быть вложенными:

echo a{b,c,d{e,f,g}}

производит

ab ac ade adf adg

Есть вариант, использующий числа для получения последовательностей:

echo {1..10}

производит

1 2 3 4 5 6 7 8 9 10

и вы также можете указать шаг:

echo {0..10..5}

производит

0 5 10

черт возьми, это мило. Я подумал, что я не первый, кто задавал вопрос, просто довольно сложный вопрос.
user1028270

Что там делает запятая?
user1028270

5
См. Расширение Brace в руководстве: оно разделяет значения, используемые в расширении. Здесь двумя значениями являются пустая строка и .bak.
Стивен Китт

12

Расширение истории может быть полезно для такого рода вещей (при условии, что включена история bash).

В вашем примере вы можете сделать:

cp /etc/prog/dir1/myconfig.yml !#:1.bak

Здесь !#относится к текущей строке, !#:1относится к параметру 1 в текущей строке
и !#:1.bakотносится к параметру 1 в текущей строке с прикрепленным к концу «.bak».

Если у вас напечатан спецификатор истории, вы можете использовать Ctrl+ Alt+, Eчтобы расширить его до его действительного значения, если вы хотите, например, дважды проверить или изменить имя файла.

Раздел «Расширение истории» на страницах руководства bash содержит больше информации.


8

Аналогично ответу progo, но несколько проще: C-wразрезает («убивает») слово слева от курсора, C-yвставляет («дергает») его снова.

$ cp /etc/dir1/myconfig.yml                              (C-w)
$ cp                                                     (C-y)
$ cp /etc/dir1/myconfig.yml                              (space, C-y)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml       (finish text)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml.bak

2
Также стоит отметить, что вы можете сделать это с несколькими словами подряд (например, если в вашем имени файла есть пробелы), и Cy вставит их все, если вы не переместили курсор или не набрали что-то еще между ними. Любое сочетание команд удаления, за исключением удаления одного символа (например, backspace / del / ctrl-d), работает с этим.
Random832

6

Вы также можете вырезать-вставить (kill-yank в терминах emacs / bash) из командной строки, чтобы дублировать детали для редактирования.

M-dубивает вперед до границы слова, и вы можете убивать текст несколько раз, и все они объединяются в одну «вставку» для восстановления. Удобный!

Верните все это обратно в командную строку курсором C-y. Поэтому, если у вас есть такая строка (элемент блока █ указывает позицию курсора):

$ cp avb.txt                 (M-b M-b)
$ cpavb.txt                  (M-d) kill the word 'avb'
$ cp █.txt                    (C-y) yank it back
$ cp avb█.txt                 (C-e) to the end of line
$ cp avb.txt                 (C-y) yank it again
$ cp avb.txt avb             finish the line
$ cp avb.txt avb.foo

В любом случае, вы предпочитаете это делать, и вам будет полезно ознакомиться с тем, что предлагает bash в отделе интерактивных ключей. http://web.mit.edu/gnu/doc/html/features_7.html


6

В tcshили zsh, Alt+Ctrl+_в emacsрежиме ( copy-prev-wordвиджет) вставляет последнее слово, так

cp очень длинный путь Alt+Ctrl+_.back

bashимеет copy-backward-wordвиджет (по умолчанию не привязан ни к одной клавише), но он копирует только слово в кольцевой буфер, вам также нужно нажать Ctrl-Yemacsрежиме), чтобы его восстановить. Но вы могли бы сделать:

bind '"\e[cpw~": copy-backward-word'
bind '"\e\C-_": "\e[cpw~\C-Y"'

Чтобы Alt+Ctrl+_сделать и копировать / snarf и вставить / yank, как в tcsh/ zsh.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.