2012-01-30 3 views
4

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

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

$ alias -s cpp=vi 
$ filename.cpp 

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

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

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

+0

Параметр '**/*. O' файл шаблон является еще хорошая причина пойти в 'zsh' (но, возможно, bash 4 тоже). А объекты завершения 'zsh' лучше, чем' bash'. –

ответ

11

Вы можете построить один, используя новую функцию 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 
} 

Продолжит его по своему усмотрению - каждый =~ is a regular expression match, так что не стесняйтесь использовать любые регулярные выражения, которые вы хотите.

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

+0

приятно, спасибо! Единственное, что оставалось быть совершенным, - это завершение. любая идея, как заставить его работать, когда никакая комманда не введена? – brillout

Смежные вопросы