级别: 初级 Teodor Zlatanov (tzz@iglou.com), 程序员, Gold Software Systems
2001 年 3 月 01 日 为面向 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
的终端,或者 "Eterm -t trans",用于透明 Eterm)。 我发现透明
Eterm,设置成粘在所有其它窗口下一层中,对于日常工作来说非常有用。因为它是粘着的,所以总是可用的,它从来不会遮蔽其它窗口,并可以提供良好的视觉效果,让您从黑白中解脱出来。
可以编写自己的 Eterm 主题。有关进一步信息,请查看 Eterm
文档。
Emacs 定制
Emacs 不仅仅是编辑器 -- 它还是完整的编辑环境、文件管理器、Lisp
编译器和虚拟机等等。我喜欢 Emacs 是因为它所提供的编程支持。
清单 6 和 7 相当复杂。它们使用许多 Lisp
代码,因此应该在尝试修改它们来使它们来适合您自己的需要之前对 Lisp
有相当的了解。(有关 Lisp 的帮助,请参阅
参考资料。)
清单 6:.emacs.gun.custom 文件
有关 emacs.gnu.custom 文件中所有设置的帮助,请使用 Emacs
帮助设施。在 Emacs 内部,按 C-h
v,然后是希望检查的变量的名称。您甚至可以进一步从出现的窗口中定制变量的值。
.emacs 文件调用定制文件。.emacs 文件相当大而且复杂,它使用 Emacs
中不包括的许多 Lisp 模块(可以在
参考资料 中找到)。我已在“参考资料”中包括了绝大多数模块,但您必须在
Web 上冲浪来获得较大的包,例如 eshell。
清单 7:.emacs 文件
我已尝试对 .emacs
文件从头至尾加以注释。尝试理解每一行都是做什么的;如果需要帮助,请使用
Emacs 帮助设施。C-h a 调用 apropos
命令,它将基于关键字查找帮助。另外,有关使用 Emacs
的详细信息和帮助,请参阅
参考资料。
最重要的是,只选您需要的那些部分。如果不使用注脚或折叠方式,没有问题。可能您比较喜欢循环缓冲区和对齐,或者对
emacs.gnu.custom 文件中的某些事物比较感兴趣。
参考资料部分将为您提供更进一步的指导。
其它:各种设置文件
我使用 vim,一种功能非常强大的 vi 克隆。这就是我的 vimrc 文件(有关
vim 和 vimrc 文件的详细信息,请参阅
参考资料):
清单 8: .vimrc 文件
下面是用来启动新 Emacs
窗口的脚本。它可能适合于其它用途,但我只需要它来向 Emacs 发送 USR1
信号,或者如果新 Emacs 还未运行的话,启动一个新的 Emacs。您需要
CPAN Proc::ProcessTable 模块来使用该脚本。以 "./getem.pl emacs"
调用它。
清单 9:getem.pl
#!/usr/bin/perl -w
use Proc::ProcessTable;
use strict;
# get the process name
my $name = shift @ARGV or die "You must provide a process name";
# get the PID to process
my $pid = get_pid ($name);
# if we got a PID...
if (defined $pid)
{
kill 'USR1', $pid or die "$pid - $!\n";
}
else # start a new process
{
system("$name &");
}
# find the PID from a process table, based on a name
sub get_pid
{
my $name = shift @_;
my $table = new Proc::ProcessTable;
foreach my $p (@{$table->table})
{
# this filters out getem.pl itself
return $p->pid if (defined $p->cmndline &&
$p->cmndline !~ /perl/ &&
$p->cmndline =~ /^$name/);
}
return undef;
} |
我的 XFree 配置使用带有两个视频卡的 xinerama。Xinerama 是用于
XFree
服务器的模块,提供多个监视器能力。这意味着对于计算机来说两个监视器可以是一个显示器。Enlightenment
支持 xinerama --
例如,最大化窗口将它最大化成一个监视器,而不是整个显示器,显示器可以是多个监视器。不幸的是,XFree
配置文件不是可移植的,所以我的文件对于别人可能没有用处。必须阅读
XFree 文档并为您自己的机器创建配置文件。
前瞻
我希望对我设置过程的介绍能够有助于您改进自己的环境。找到合适的环境的确是经验问题,正如我前面所讲的,经验是永远没有止境的。
我还希望您能够从这次旅行中学到一些新程序。如果没有,请仔细查看
参考资料,我保证您可以从中找到一些新东西。
如果需要这里所显示的设置的任何帮助,或者需要常规辅助,同样,
参考资料 可以帮助您。您的答案几乎都在里面,只需把它找出即可。如果您陷入困境,请求助
Usenet 新闻组、Web 论坛和手册来获得有疑问程序的信息。
参考资料
关于作者  | 
|  |
Teodor Zlatanov 于 1999
年毕业于波士顿大学计算机工程系,他获得了硕士学位。他做程序员这份工作从
1992 年就开始了,他使用过 Perl、Java、C 和
C++。他的兴趣是对文本语法分析使用的开放源码、3
层客户机/服务器数据库体系结构、Unix 系统管理、CORBA
和项目管理。欢迎通过电子邮件提供建议和指正。请通过
tzz@iglou.com与 Teodor 联系。
|
对本文的评价
|