作者:Teodor Zlatanov 優化機器來滿足需要 為面向 Java 和 Perl 的編程環境定制了 tcsh、Enlightenment、Eterm 和 Emacs 後,Teodor 為我們展示了他桌面的 Linux 配置。這是為 Java 和 Perl 編程設置優化的,但毫無疑問,其他程序員也會在其中發現許多有用的竅門。 幾年前,我就開始了在 Unix 中構建我的編程環境。這項工作至今仍未完成!我在這裡所介紹的是我所使用的環境的一個縮影,但請您理解,它並不完整,也不夠完美。您應該不斷地改進計算環境。做些修修補補的事很有趣,因為可能會在過程中學到許多新知識。 所有的過錯都是我犯的,但我仍要感激幾年來曾幫助過我的那些人。(人數眾多,以至我無法一一列出他們的名字。)如果沒有他們的幫助,無論是個人還是新聞組,我都無法寫出下面的文章。 入門 本文旨在面向中高級 Linux 用戶。應該安裝 Perl 5.6.0,或至少 5.005 才能完成某些示例。這裡將會提到 Emacs 編輯器,如果希望嘗試 Emacs 示例,需要安裝它。還會提到 Enlightenment 窗口管理器,它需要和 Eterm 終端仿真器一起安裝,但大多數最近的窗口管理器和終端仿真器都具有與 Enlightenment 和 Eterm 在本文環境中提供的類似的那些特性。 您應該習慣於編輯文件,進行系統修改、從源碼安裝 Linux 軟件包,並願意使用 Linux。如果您不熟悉這些任務的話,在嘗試這裡描述的任何操作的時候要格外小心,並且注意將每樣事物進行備份。(在任何情況下這都不失為一個好的做法。) tcsh 定制 我使用 tcsh 作為主要登錄 shell。很容易將示例轉換成由 bash、zsh 或其它 shell 使用。我使用 tcsh shell 好幾年了,但這並不意味著說對每個人都適合。 tcsh shell 使用一些初始化 (rc) 文件。在 UNIX 中,rc(發音為:"ar cee")文件是由程序在初始化時讀取的文件。rc 名字來自文件名的公共 "rc" 後綴(例如,"tcshrc" 用於 tcsh shell,"exrc" 用於標准 vi 編輯器)。rc 文件有時還稱作 "dot" 文件,因為它們以一個點 (dot) 開頭,這樣可以在正常的目錄列表中隱藏起來。 我所進行的 tcsh shell 定制位於 .cshrc、.login 和 .logout 文件中。其他人使用 .tcshrc 而不是 .cshrc,但除非您也使用 C (csh) shell(其實不應該使用它;tcsh 更好),否則沒什麼差異。 .login 文件是為登錄 shell 執行的第一個文件: 清單 1:我的 .login 文件 stty erase \^? echo TERM = $TERM switch ($HOST) case "workmachine": fetchmail breaksw case "homemachine": fortune echo "---" from tail mesg y echo "---" breaksw default: breaksw endsw "stty erase" 那一行將擦除字符設置成刪除鍵。我比較喜歡這個設置,因為我習慣於使用刪除鍵來向後擦除,但如果您覺得缺省值很適合您,就不必更改它。 然後,echo 語句打印出當前的終端。我之所以這樣做是因為可以知道是否支持 xterm 能力,但這不那麼重要。 後面跟著 switch 語句。它在形式上與 C switch() 語句類似(畢竟 C [csh] shell 以及稍後的 tcsh shell 都沿襲了它)。根據不同的主機名,可以運行 fetchmail(我在我的工作機器上每個登錄 shell 中運行它,因為多個 fetchmail 的副本相互之間不影響),或者在本地運行其它一些命令。 本地機器的命令如下:print a fortune(試一下;非常有趣!);然後是除數 ("---");然後是郵箱中最後幾條消息;然後打開分頁面許可權;然後打印另一個除數。 命令還有一種缺省情況,應該可以隨處運行。但未在我的環境中使用。 在 .login 文件之後,tcsh shell 經過 .cshrc 文件(它更喜歡使用 tcshrc 文件,但如果只能使用 .cshrc 的話也只能將就了)。 清單 2:我的 .cshrc 文件,第 1 部分:特定於 shell 的設置 清單 2 中的代碼是特定於 shell 的,意味著它不直接與任何其它 shell 相接。一般來說,特定於 shell 的設置是使用 "set" 命令設置的,而環境設置是使用 "setenv" 設置的。路徑是個例外,因為 tcsh shell 維護著 $PATH 和 $path 的同步,所以可以使用 set 或 setenv 來設置路徑。這是個人喜好的問題。 set 和 setenv 的反操作是 unset 和 unsetenv。只有 set 或 setenv 才打印出 shell 和環境設置的列表。 就我個人來看,我認為環境和 shell 設置之間的差異是 tcsh 最糟糕的一個方面。我會使用其中一個,但不會同時使用它們。當前的設計強迫我同時使用它們。 清單 3:我的 .cshrc 文件,第 2 部分:環境 # another switch statement switch ($HOST) case "homemachine": # from home, I use my work machine's external network interface setenv CVSROOT tzz@workmachine-external:/cvsroot # of course, ssh is the only protocol allowed. rsh is insecure. setenv CVS_RSH ssh # my NNTP server at home setenv NNTPSERVER nntp # give Emacs a name, for Enlightenment positioning alias emacs emacs -name workmachine-emacs breaksw case "homemachine-2": # same as homemachine setenv CVSROOT tzz@workmachine-external:/cvsroot setenv CVS_RSH ssh # but this is a Solaris machine, so use mailx (I could have used # OSTYPE instead of $HOST for generality) alias mail mailx breaksw default: # default CVS root for all machine at work. Leave rsh as the # default transport. setenv CVSROOT tzz@workmachine:/cvsroot breaksw endsw 清單 3 中的環境設置主要考慮是否正確設置了 CVS 資源庫根。如果使用 CVS,這是自動設置事物以使所有 CVS 命令可以從任何機器上使用的一種簡便方法。另外,我給主要 Emacs 窗口提供了一個名稱,這樣 Enlightenment 可以准確地找到它。 我應該使用 $OSTYPE 而不是 $HOST,並設置單獨的 switch() 語句來處理 Solaris;但所有為將 mail 取別名為 mailx 的語句對我來說都似乎有些多余。 清單 4:我的 .cshrc 文件,第 3 部分:別名 要嘗試下面定義的別名,只需要在提示上輸入它們。"abc" 別名將自己在一行上打印 "foreach?" 並等待您的輸入。例如,如果輸入 "echo $a",然後在下一個提示上輸入 "end", "echo" 命令將在 $a 中運行 1 到 9,然後從 A 到 Z,然後從 a 到 z。 最後,我的 .logout 非常簡單。它是在登錄 shell 退出時執行的一系列命令,但只在我的本地機器上。在所有其它機器上,它什麼都不做。 清單 5:我的 .logout 文件 switch ($HOST) case "homemachine": # save the list of subscribed newsgroups, just in case: # save only the first 2000 characters of each lines (the # .newsrc file can have very long lines), then filter out the # unsubscribed newsgroups, and save the output in ~/.subbed cut -c 1-2000 ~/.newsrc egrep -v "!" > ~/.subbed # remove any dead letter files (/bin/mail generates them) rm ~/dead.letter breaksw default: breaksw endsw Enlightenment 和 Eterm 定制 我最常用的窗口管理器是 Enlightenment。我喜歡它所以使用它。您可能不喜歡 Enlightenment(以下稱為 "E"),但不管怎樣,您的窗口管理器也可能支持 E 中我所喜歡的大多數特性。要復制 Eterm 的功能比較困難,盡管 aterm 程序在目的和效果上與之類似。 E 和 Eterm 都使用主題。主題是給人看的,在實際當中不派什麼用場。我發現它們對於 Eterm 很有用,但對於 E,我不會將主題用於編程支持。 我對 E 進行的最重要的一項修改就是更改了與 e16keyedit 程序的缺省鍵綁定。我將 Alt-F1 到 Alt-F12 映射成桌面 1 到 12,這樣可以快速地在不同任務之間切換。我給某些桌面取了別名,添加了按鍵 -- 例如,Alt-Shift-M 可以帶我到郵件桌面。 另外,我還讓 Ctrl-Alt-M 啟動一個郵件窗口(實際上是 "emacs -name gnus -f gnus",因為我使用 Gnus 來閱讀郵件)。以類似的方式,我讓 Alt-Shift-Letter 轉到特定桌面,而 Ctrl-Alt-Letter 啟動該桌面上的一個程序。 E 可以記住程序的位置和命令行調用。這意味著如果程序具有獨特的名稱,E 可以在下次您登錄的時候重新啟動它,或者在下次您啟動它的時候記住它的位置。名稱是窗口的 X 名,通常用 -name 參數指定給程序。 Eterm 使用主題來指定定制行為。可以嘗試 Eterm 所帶的所有缺省主題(例如,"Eterm -t mutt" 用於面向 mutt 的終端,或