Суффиксные псевдонимы в bash - PullRequest
4 голосов
/ 30 января 2012

Суффиксные псевдонимы - единственная причина, по которой я собираюсь перейти на ZSH, но я хочу придерживаться bash. Так возможно ли иметь что-то вроде псевдонимов суффиксов в bash?

Для тех, кто не знает, что такое псевдоним суффикса, следующее в ZSH

$ alias -s cpp=vi
$ filename.cpp

будет запускаться vi с filename.cpp в качестве первого аргумента.

Обратите внимание, что что-то вроде xdg-open или gnome-open недостаточно. Я хочу, чтобы bash выполнил команду при вводе имени файла.

Завершение очень важно для меня. Поэтому, если начало имени файла набрано, было бы хорошо, если бы оставшаяся часть имени файла была бы завершена при нажатии клавиши TAB.

1 Ответ

12 голосов
/ 30 января 2012

Вы можете создать его, используя новую функцию command_not_found_handle(). Получение полной способности псевдонима zsh заняло бы больше работы, чем мой простой пример здесь; но моего простого примера может быть достаточно для ваших нужд:

$ command_not_found_handle() { if [[ $1 =~ .*.cpp ]]; then vi $1 ; elif [[ $1 =~ .*.java ]]; then cat $1 ; fi ; }
$ splice.cpp  # started vi on splice.cpp
$ Year.java
import java.util.Scanner;

class Year {
    public static void main(String[] args) {
        Scanner yearenter = new Scanner(System.in); 
        System.out.println("Enter year ");
        int year = yearenter.nextInt();     
        System.out.print("Year " + year + " is ..");
        if (year % 400!=0 || year % 4 != 0 && year % 100==0)
            System.out.println(" not a leapyear"); 
        else
            System.out.println(" a leapyear"); 

    }    
} 
$ 

Вот функция, достаточно расширенная, чтобы ее можно было прочитать:

command_not_found_handle()
{
    if [[ $1 =~ .*.cpp ]]
    then
        vi "$1"
    elif [[ $1 =~ .*.java ]]
    then
        cat "$1"
    fi
}

Расширяйте его по своему усмотрению - каждое =~ соответствует регулярному выражению , поэтому не стесняйтесь использовать любые регулярные выражения, которые вы хотите.

Обратите внимание, что это конфликтует с command-not-found пакетами Debian и Ubuntu, поэтому вам может потребоваться удалить или иным образом ограничить этот пакет для получения надежных результатов. (Просто убедитесь, что эта функция определена в вашем * ~/.bashrc или ~/.bash_profile файле после общесистемных /etc/bash* файлов, и она должна просто работать.)

...