2012-01-30 51 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