как расширить псевдонимы, встроенные в Bash?


84

Есть ли способ расширить псевдонимы, встроенные в Bash?

$bash>alias ll='ls -l '
$bash>ll<tab>
$bash>ls -l 

Ответы:


107

Вы можете нажать Ctrl- Alt- eдля выполнения функции readline, shell-expand-lineкоторая будет выполнять псевдоним, историю и раскрытие слов. Обратите внимание, что на некоторых клавиатурах Metaнет Alt. Возможно, вам придется нажать Escпотом Ctrl-e

Функции alias-expand-lineи history-and-alias-expand-lineне связаны по умолчанию, но вы можете связать их, добавив в ~/.inputrcфайл строки, подобные приведенным ниже .

"\e\C-l": alias-expand-line

который заставил бы Ctrl- Alt- l(строчная буква "ell") выполнять только расширение псевдонима.


Можем ли мы отобразить расширение псевдонима на <tab>, не затрагивая другие завершения bash ?.
asdfg

2
@asdfg: если вы это сделаете, это нарушит другие дополнения. Это может сработать (не проверено), чтобы создать карту, как показано выше, а затем добавить эту дополнительную карту, чтобы заменить существующую для Tab: "\C-i": "\e\C-l\e\e"которая создает макрос, который выполняет оба alias-expand-lineи complete. Это зависит от привязки из моего ответа выше и от того, что привязка по умолчанию для Esc-Esc остается на месте. Вы все равно сможете выполнять Esc-Esc, если хотите выполнить завершение по умолчанию.
Деннис Уильямсон

4
Действительно, ESC C-eработает на Bash, но C-x aработает на Zsh. Также тестируется на OS X.
Blaz

Если вы просто ищете Ctrl + что - то, где - то может быть ключ «х», вы можете сделать это , как это в некоторых системах: Control-x: history-and-alias-expand-line.
igordcard

1
@WeijunZhou: это зависит от вашего оконного менеджера и любых ваших пользовательских настроек. Для Gnome, например, экран блокировки - Super + L.
Деннис Уильямсон

2

На самом деле это может быть гораздо более простой способ сделать то, что вы пытаетесь сделать ( bashверсия> = 4.2.29):

shopt -s direxpand
shopt -s expand_aliases

shopt«s manстраница: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html


3
Это не верно. Параметры оболочки "direxpand" и "expand_aliases" не помогают расширять встроенные псевдонимы, как указано в вопросе. Я не знаю, из какой шапки "direxpand" был взят ...? По умолчанию «expand_aliases» уже установлено. Если вы отключите его, результатом будет отключение псевдонимов от работы (они не раскрываются до интерпретации командной строки). Например, при наличии псевдонима alias ll='ls -lоболочка будет интерпретировать 'll' как команду / функцию 'll', которая, вероятно, не существует.
FooF

0

Это не работает. Но я предполагаю / надеюсь, что что-то подобное можно сделать, чтобы делать то, что вы хотите сделать. Вы должны будете использовать свой собственный скрипт завершения. Вот как вы делаете один:

_ll()
{
     COMPREPLY=(ls -l)
     #The next line does not work. I just hope there were a way to replace that word
     COMP_WORDS[COMP_CWORD-1]="ls -l"
}
complete -F _ll ll

Теперь поставьте полный файл bash_completion ( http://caliban.org/bash ) и поместите вышеупомянутый скрипт в файл внутри каталога bash_completion.d, который скрипт получит из ссылок URL. Дайте мне знать, если это не сработает.

Благодарю.


0

Для тех, кто установил zsh и ищет простое решение, globalias может быть вашим другом

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

# .zsrc:
alias S="sudo systemctl"

$ S<space>
# expands to:
$ sudo systemctl

для установки просто добавьте "globalias" в список плагинов .zshrc

plugins=(... globalias)

Затем просто нажмите, SPACEчтобы запустить расширение команды, которую вы написали.

Если вы хотите вставить только пробел без расширения командной строки, нажмите CTRL+SPACE

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