2012-01-30 53 views
4

后缀别名是我考虑切换到ZSH的唯一原因,但我想坚持bash。那么是否有可能在bash中有后缀别名?bash中的后缀别名

对于那些不知道后缀的别名是什么,在ZSH

$ alias -s cpp=vi 
$ filename.cpp 

以下将filename.cpp运行vi作为第一个参数。

请注意,像xdg-open或gnome-open这样的东西是不够的。我希望bash在输入文件名时执行命令。

完成对我来说非常重要。因此,如果输入文件名的开头,那么当按下TAB键时,如果文件名的其余部分将被完成,那将会很好。

+0

的'**/*。O'文件模式是另一种很好的理由去'zsh'(但也许bash 4也是这样)。 'zsh'完成设施比'bash'好。 – 2012-01-30 06:20:54

回答

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 2012-01-30 18:52:42