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


24

Я не впевнений, як це сказати, але часто мені трапляється набирати такі команди:

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

Зазвичай я просто набираю шлях двічі (із заповненням вкладки) або копіюю та вставляю шлях курсором. Чи є якийсь башфу, який полегшує це набір?


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

чорт ось солодкий. Я подумав, що я не перший, хто задався питанням.
користувач1028270

Що робить кома там?
користувач1028270

5
Дивіться Brace Expansion в посібнику: він розділяє значення, які використовуються для розширення. Тут два значення - порожній рядок і .bak.
Стівен Кітт

12

Розширення історії може бути корисним для подібних речей (якщо припустити, що історія башів увімкнена).

У вашому прикладі ви можете:

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

Тут !#посилання на поточний рядок, !#:1посилається на параметр 1 у поточному рядку
та !#:1.bakпосилається на параметр 1 у поточному рядку з позначкою '.bak', що позначена в кінці.

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

У розділі "Розширення історії" на сторінках bash man є додаткова інформація.


8

Схожий на відповідь прого, але дещо простіший: 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).
Випадково832

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

У будь-якому випадку ви віддасте перевагу робити це, ознайомлення з тим, що може запропонувати баш в інтерактивному відділі ключів, буде корисним. 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 та paste / yank, як у tcsh/ zsh.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.