Как повторить набранный в данный момент параметр на консоли bash?

23

Я просто печатал что-то вроде:

mv foo/bar/poit/zoid/narf.txt

и вдруг понял, черт возьми, я должен снова набрать большие части этого параметра

mv foo/bar/poit/zoid/narf.txt foo/bar/poit/zoid/troz.txt

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

Так есть ли способ скопировать вставить текущий параметр строки с помощью клавиатуры?

k0pernikus
источник
3
Мой совет не отвечает на ваш вопрос, но это небольшой совет. Как и в вашем примере, вы можете использовать следующую конструкцию: mv foo/bar/poit/zoid/{narf.txt,troz.txt}вместо того, чтобы печатать / копировать длинный адрес дважды.
Раш
2
Чуть короче @ решения Раша: mv foo/bar/poit/zoid/{narf,troz}.txt. Это работает особенно хорошо, если у нас есть что-то вроде.../zoid/this_source_file_has_to_be_patched.c{,.orig}
Ансгар Эстерманн
@Rush Вы не возражаете, указав это в качестве ответа? Это может быть не совсем то, что я просил, но опять же, ваше решение гораздо ближе к тому, что я хочу. Это заслуживает признания.
k0pernikus

Ответы:

15

Если я планировал заранее, я использую расширение скобки . В этом случае:

mv foo/bar/poit/zoid/{narf,troz}.txt

Вот еще один подход с использованием readlineсочетаний клавиш по умолчанию :

  • mv foo/bar/poit/soid/narf.txt: Начало
  • Ctrl- w: unix-word-ruboutудалитьfoo/bar/poit/soid/narf.txt
  • Ctrl- y, Space, Ctrl- y: yankпространство, yankчтобы снова попастьmv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txt
  • Meta- backspace, Meta- backspace: backward-kill-wordдважды удалить последнийnarf.txt
  • troz.txt: введите другую часть хвоста

Если вы используете нетривиальное количество времени, используя bashоболочку, я бы рекомендовал периодически читать список стандартных ярлыков и выбирать те из них, которые кажутся полезными для изучения и включения в вашу рутину. Глава 8 bashруководства - хорошее место для начала. Знание ярлыков действительно может повысить вашу эффективность.

jw013
источник
Ухоженная! В моем случае мне пришлось нажать Alt + Backspace вместо Meta + Backspace.
k0pernikus
3
@ k0pernikus Да, на большинстве клавиатур клавиша Alt является мета-клавишей.
jw013
1
Чтобы сохранить повторный набор .txt, вы можете нажать Ctrl + Left (или любой другой вызывающий ярлык backward-word), затем оставьте один символ, затем Alt + Backspace и введите troz.
wjandrea
24

Расширение истории фактически работает и для текущей команды, используя указатель события !#. Объедините это с указателем слова для последнего аргумента - $- чтобы получить параметр, который вы только что ввели. И вы можете использовать все обычные модификаторы поверх него, поэтому, если, например, вы переименовываете файл в далекой директории, вы можете просто набрать:

mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname
qwertyboy
источник
Очень полезный! Это особенно хорошо работает с magic-spaceопцией bash в inputrc для автоматического расширения расширений истории. (Я не мог использовать ответ с наибольшим количеством голосов, потому что я установил ^ W, чтобы разбить на слешах, так как это обычно более полезно.)
Сорен Бьорнстад
@SorenBjornstad alt+backspaceобычно уже останавливается на разделителях слов, таких как косые черты, поэтому вам не нужно менять способ ^Wполучения этой функциональности, вы можете удалить как слова, не содержащие символов, так и слова с
пробелами
14

Как и в вашем примере, вы можете использовать следующую конструкцию:

mv foo/bar/poit/zoid/{narf.txt,troz.txt}

или даже (как предложил Ансгар Эстерманн ):

mv foo/bar/poit/zoid/{narf,troz}.txt

вместо того, чтобы печатать / копировать длинный адрес дважды.

порыв
источник
2
Это называется расширением скобок .
CodeGnome
6

Играя вокруг, я получил это на работу:

mv foo/bar/poit/zoid/narf.txt

Нажмите, Enter
чтобы сохранить последний параметр.

Теперь используйте, чтобы получить последний набранный в строке назад. Введите пробел и для получения последнего использованного параметра используйте:

Alt + .

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

k0pernikus
источник
Круто, еще один отличный совет узнал!
Брэм
<kbd> Esc </ kbd> + <kbd>. </ kbd> (это?) совпадает с <kbd> Alt </ kbd> + <kbd>. </ kbd>.
Никос Александрис
2

Вы можете легко использовать переменные:

a=test.csv ; cp $a $a.bak

Или в вас случае (закладка примечание конкурс работ для в части):

a=foo/bar/poit/zoid/ ; mv ${a}narf.txt ${a}troz.txt
ррр
источник
2

У меня есть это в моем ~/.inputrc:

"\ej":"!#:$\e^"

!#текущая строка, :$последнее слово и \e^есть history-expand-line.

nisetama
источник
это должно быть помечено как ответ. Нажатие «alt / option + j» теперь копирует последнее слово.
mpprdev
2

Для zshменя полезны следующие сочетания клавиш.

# Bind alt-m to insert previous word from the current line
bindkey '^[m' copy-prev-shell-word

# Bind alt-k to kill word before cursor in vi-style
bindkey '^[k' vi-backward-kill-word

Поэтому я нажимаю Alt- Mчтобы повторить последний аргумент Alt- Kесли я хочу удалить части за концом пути.

Вот полезная ссылка на некоторые виды поведения, которые вы можете отобразить.

bdellaterra
источник
2

Краткое интерактивное двухэтапное решение

  1. тип: echo foo/bar/poit/zoid/narf.txt

    Это делает foo/bar/poit/zoid/narf.txtдоступным для Alt- .ярлык в bash.

  2. тип: mvи удар Alt- ., Space, Alt-.

    Вы получите mv foo/bar/poit/zoid/troz.txt foo/bar/poit/zoid/troz.txt. Теперь вы можете легко изменить последнее слово.

Полуночный командир

Этот инструмент, который может быть (очень) удобен, - файловый менеджер, работающий в консоли. Это дает вам возможность интерактивно копировать имена файлов и пути к каталогам в командную строку. Midnight Commander показывает вам две панели (слева и справа), которые содержат содержимое различных каталогов.

Краткое руководство:

  • UpDownКлавиши со стрелками / позволяют выбрать файлы на текущей панели.
  • Tab переключается между левой и правой панелью.
  • Ctrl- Shift- Enterкопирует текущий выбранный файл в командную строку (включая полный путь)
  • Alt- oоткрывает текущий выбранный каталог в другой панели
  • Ctrl- oпозволяет увидеть консоль в полноэкранном режиме
  • Ctrl- x, pкопирует путь активной панели в консоли
  • Ctrl- x, Ctrl- pкопирует путь неактивной панели в консоль
  • Esc- Tabэто автозаполнение

Это самый быстрый способ, который я нашел до сих пор - после того, как я привык к ярлыкам.

Маркус Дучке
источник
0

Используйте то же самое в {,} "дубликаторе". То есть:

git tag -m {v,v}1.0.1

# same as 

git tag -m v1.0.1 v1.0.1
Pylinux
источник