Як повторити поточний набраний параметр на консолі bash?


23

Я щойно набирав щось у формі:

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

і раптом зрозумів, чорт забираю, мені доведеться знову набрати великі частини цього параметра

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

Навіть при заповненні табуляції досить біль. Я знаю, що можу скопіювати вставити параметр, вибравши текст та середній клік мишкою, але це недостатньо добре. Я хочу залишитися на клавіатурі.

То чи існує спосіб скопіювати вставку поточного параметра рядка за допомогою клавіатури?


3
Моя порада не відповідає на ваше запитання, але це невелика порада. Як і у вашому прикладі, ви можете використовувати наступну конструкцію: mv foo/bar/poit/zoid/{narf.txt,troz.txt}замість того, щоб двічі вводити / копіювати довгу адресу.
пік

2
Трохи коротше, ніж рішення @ Rush : mv foo/bar/poit/zoid/{narf,troz}.txt. Це особливо добре спрацьовує, якщо у нас є щось на кшталт.../zoid/this_source_file_has_to_be_patched.c{,.orig}
Ansgar Esztermann

@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посібника - це гарне місце для початку. Знання ярликів може дійсно підвищити вашу ефективність.


Акуратно! У моєму випадку мені довелося натиснути Alt + Backspace замість Meta + Backspace.
k0pernikus

3
@ k0pernikus Так, на більшості клавіатур клавіша Alt - це мета-ключ.
jw013

1
Щоб зберегти повторне введення тексту .txt, ви можете натиснути Ctrl + Вліво (або будь-який інший ярлик, який дзвонить backward-word), потім Вліво один символ, потім Alt + Backspace та введіть troz.
wjandrea

24

Розширення історії насправді працює і на поточну команду, використовуючи позначення подій !#. Поєднайте це з позначувачем слова для останнього аргументу - $-, щоб отримати параметр, який ви щойно ввели. І ви можете використовувати всі звичайні модифікатори над ним, так що якщо, наприклад, ви перейменовуєте файл у далекий каталог, ви можете просто ввести:

mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname

Дуже корисний! Це особливо добре працює з 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 + .

Я ненавиджу помилку, але в цьому випадку вона виконує роботу.


Класно, ще одна чудова порада дізналася!
Брем

<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.


це слід позначити як відповідь. Натискаючи "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якщо я хочу видалити частини в кінці шляху.

Ось корисна довідка про деякі поведінки, які ви можете зіставити.


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 показує вам 2 панелі (зліва та справа), на яких перерахований вміст різних каталогів.

Короткий посібник:

  • Up/ Downклавішами зі стрілками виберіть файли на поточній панелі.
  • 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.