Pages

Wednesday, 18 January 2012

定制自己的tcsh/bash提示符

先说bash:
bash的提示符为 PS1 变量, 默认是 环境变量, 下面包含bash为用户在PS1中所使用的符号的一个完整列表:

\a ASCII 响铃字符(也可以键入 \007) 
\d "Wed Sep 06" 格式的日期           
\e ASCII 转义字符(也可以键入 \033) 
\h 主机名的第一部分(如 "mybox") 
\H 主机的全称(如 "mybox.mydomain.com") 
\j 在此 shell 中通过按 ^Z 挂起的进程数 
\l 此 shell 的终端设备名(如 "ttyp4") 
\n 换行符 
\r 回车符 
\s shell 的名称(如 "bash") 
\t 24 小时制时间(如 "23:01:01") 
\T 12 小时制时间(如 "11:01:01") 
\@ 带有 am/pm 的 12 小时制时间 
\u 用户名 
\v bash 的版本(如 2.04) 
\V Bash 版本(包括补丁级别) ?/td>; 
\w 当前工作目录(如 "/home/drobbins") 
\W 当前工作目录的“基名 (basename)”(如 "drobbins") 
\! 当前命令在历史缓冲区中的位置 
\# 命令编号(只要您键入内容,它就会在每次提示时累加) 
\$ 如果您不是超级用户 (root),则插入一个 "$";如果您是超级用户,则显示一个 "#" 
\xxx 插入一个用三位数 xxx(用零代替未使用的数字,如 "\007")表示的 ASCII 字符 
\\ 反斜杠 
\[ 这个序列应该出现在不移动光标的字符序列(如颜色转义序列)之前。它使 bash 能够正确计算自动换行。 
\] 这个序列应该出现在非打印字符序列之后。
颜色是通过在 PS1 中添加专用序列来选择的 -- 基本上是夹在 "\e["(转义开方括号)和 "m" 之间数字值。如果指定一个以上的数字代码,则用分号将它们分开。
下面是一个颜色代码示例:
"\e[0m" 

如果将数字代码指定为零,则它就会通知终端将前景、背景和加粗设置重置为它们的默认值。您可能会在提示行结束时使用这个代码,以使您键入的文字成为非彩色的。现在,让我们看一下这些颜色代码。请注意下面的抓屏结果:

颜色表 
前景             背景              颜色
   ---------------------------------------
   30                40               黑色
   31                41               紅色
   32                42               綠色
   33                43               黃色
   34                44               藍色
   35                45               紫紅色
   36                46               青藍色
   37                47               白色

代码              意义
   -------------------------
   0                 OFF
   1                 高亮显示
   4                 underline
   5                 闪烁
   7                 反白显示
   8                 不可见
要使用这个表,首先请查找您要使用的颜色,然后查找对应的前景编号 (30-37) 和背景编号 (40-47)。例如,如果您喜欢黑底绿字,则可将编号分别设为 32 和 40。然后打开您的提示行定义并在其中添加适当的颜色代码。下面的定义:

export PS1="\w> " 
变为: 
export PS1="\e[32;40m\w> " 
到现在为止,提示行
尽管已经很不错了,但仍不太完美。在 bash 显示出工作目录以后,我们需要使用 "\e[0m" 序列将颜色重新设置为正常值。 
export PS1="\e[32;40m\w> \e[0m" 

# 先设置需要的颜色变量, 分别为 关闭颜色, 黑色, 红色, 绿色, 黄色, 蓝色,紫红色,青蓝色,白色。 注意这里没有写背景色, 你也可以如上 \e[32;40m 这样加入背景色, 来获取更加丰富的颜色方案, 但是这里我认为足够了。
     c_1="\[\e[0m%\]"
     c0="\[\e[30m%\]"
     c1="\[\e[31m%\]"
     c2="\[\e[32m%\]"
     c3="\[\e[33m%\]"
     c4="\[\e[34m%\]"
     c5="\[\e[35m%\]"
     c6="\[\e[36m%\]"
     c7="\[\e[37m%\]"
     PS1="$c0***** $c1\w $c2*** $c3<\u@\h> $c4***** $c5\! $c6***** $c7\t $c1***\n$c2\$ $c_1"; export PS1

这样一个漂亮的 提示符便展现在你的面前。
注意 最后的 $c_1 , 一定不要忘记, 这个是让终端恢复以前的颜色, 不然你所键入的命令, 显现的文件都将显示为最后 $c2 所定义的颜色。 还有, 细心的人定会发现颜色前后都被加上\[ \]这对符号,以其作用不外乎告诉终端, 这个是不占用终端的空间的, 开始终端编码而已,以便终端能够顺利换行等事情。

tcsh的设置。
我们可以使用的标记列表有:
!      跟%h一样
%B      开始粗体模式
%b      结束粗体
%c      当前工作目录名称的最后部分, 相当于basename $cwd 或者 ${cwd:tail} ${cwd:t}
%c2, %c3等等   最后2,3(等等)部分
%C      与%c类似,但是使用长形式
%d      本周的当天
%D      今天时当月中的第几天
%h      历史编号
%l      shell的当前控制终端
%U      开始下划线
%u      结束下划线
%/      完整目录名
%~      短格式目录
%m      机器名
%n      登录名
%h      历史编号
%P %p %t %T      时间的不同形式。

太多了, 我们用到的也就几个而已,不知道的自己上网Google吧。

tcsh 会读取 .login 和 .cshrc(或者.tcshrc), 登录shell两个文件都读取, 非登录shell只读取 .cshrc. 而提示符tcsh下使用的是 prompt 通常不设定为环境变量, 设为shell变量即可。 以下便是 上面PS1版本在TCSH下 prompt的设定。

set c_1 = "%{\e[0m%}"
set c0 = "%{\e[30m%}"
set c1 = "%{\e[31m%}"
set c2 = "%{\e[32m%}"
set c3 = "%{\e[33m%}"
set c4 = "%{\e[34m%}"
set c5 = "%{\e[35m%}"
set c6 = "%{\e[36m%}"
set c7 = "%{\e[37m%}"
set prompt = "$c1***** $c2%/ $c3*** $c4<%U`whoami`%u@%m> $c5*** $c6%h$c_1 $c7***** $c1%P $c2***\n$c3%%$c_1 "

注意, bash设置变量直接写 x="..."这样,但是tcsh要有set。 %{ %}就相当于bash下的\[ \]。

我的tcsh配色方案如下:
set prompt = "$c6<$c_1$c1`whoami`@%m:%~$c_1$c6>$c_1$c2%%$c_1"
------------------------------------------------------------------------

csh/tcsh的颜色配置 


配置文件
全局配置文件 /etc/csh.cshrc
个人配置文件 ~/.cshrc或~/.tcshrc

为了方便,建议修改全局性的配置文件,这样每个账号都可以享受便利。
按键绑定

通常,我们不设置按键绑定也能很好地工作,
但是对于远程登录,可能需要一些额外的配置。
比如,为了避免putty登录后,Home、End、Delete等变成~,你需要如下配置:

bindkey '\e[1~' beginning-of-line      # Home
bindkey '\e[3~' delete-char            # Delete
bindkey '\e[4~' end-of-line            # End
bindkey "^W" backward-delete-word      # Delete
bindkey -k up history-search-backward  # PageUp
bindkey -k down history-search-forward # PageDown

提示符

设置一个漂亮使用的的提示符可以让工作变得更愉快高效。
以下是一个合理的配置方案:

if ( $?prompt ) then                                #如果$prompt变量尚未设置,则做如下设置
     if ( "$uid" == "0" ) then                      #判断用户的uid
         set prompt = "%U%n%u@%m [%l] %B%~%b # "    #对于root,我们显示“#”号
     else
         set prompt = "%U%n%u@%m [%l] %B%~%b % "    #对于普通用户,显示“%”号。
     endif
endif


一种彩色的配置方案如下:

set cr = "%{\e[31m%}" #开始红色
set cg = "%{\e[32m%}" #开始绿色
set c0 = "%{\e[0m%}"  #恢复为默认色彩

# Set some variables for interactive shells
if ( $?prompt ) then
    if ( "$uid" == "0" ) then
 set prompt = "%B%U%n%u@%m.$cr%l$c0%b %c2 %B%#%b "
    else
 set prompt = "%B%U%n%u@%m.$cg%l$c0%b %c2 %B%%%b "
    endif
endif


颜色代码:
1 for brighter colors
4 for underlined text
5 for flashing text
30 for black foreground
31 for red foreground
32 for green foreground
33 for yellow (or brown) foreground
34 for blue foreground
35 for purple foreground
36 for cyan foreground
37 for white (or gray) foreground
40 for black background
41 for red background
42 for green background
43 for yellow (or brown) background
44 for blue background
45 for purple background
46 for cyan background
47 for white (or gray) background

查看更多参数,及其作用:

man tcsh  #查看man手册
/%/       #搜索到“%/”开始的地方

环境变量等

你在抱怨 FreeBSD下的 ls 没有显示颜色, grep 出来的东西没有高亮吗? 那么你需要如下的配置:

#让 ls 鲜艳些
setenv LSCOLORS ExGxFxdxCxegedabagExEx
setenv CLICOLOR yes
#让 grep 匹配到的字符高亮
setenv GREP_OPTIONS --color=auto

对于在KDE下使用fcitx的人,需要如下三行设置,
其实就是fcitx安装完后所提示的内容,如果你够细心的话。

setenv XMODIFIERS @im=fcitx
setenv QT_IM_MODULE xim
setenv GTK_IM_MODULE xim

嗯, ls 有颜色了,但是等等,为何 tab 不能补全?
你需要如下配置:

set autolist

如果命令输错了,让csh/tcsh 为你纠正:

set correct = cmd

为了在命令行启动某个游戏,或者kde程序,例如dolphin、kcalc,
你需要加两个路径到$path中去:
/usr/games /usr/local/kde4/bin/

set path = (/sbin /bin /usr/sbin /usr/local/bin /usr/games /usr/local/sbin /usr/bin $HOME/bin /usr/local/kde4/bin/)

黑魔法防御术
重定向防御

重定向很强大,我们有时候会运行诸如“date ? b.txt”,“ls -l > files.txt”等命令。
然而如果一不小心,把“?”输成“>”会造成什么后果呢?
为此,tcsh提供了noclobber这个选项:

set noclobber

有了它,悲剧就不会发生。如果“>”的目标文件已存在,tcsh会拒绝重定向。
覆盖防御

是否遇到过“mv a b”,从而把有用的b文件覆盖掉了?
为此,我们要让mv和cp的行为更谨慎:

alias mv 'mv -i'
alias cp 'cp -i'

如果目标文件已存在,mv和cp会拒绝操作,除非使用参数“-f”。
误删防御

rm这个命令自从诞生起,就一直是个危险的操作。
我们可以让rm更温和:

alias rm 'rm -i'

这样rm之前,会要求再次确认。
一切皆alias

前面,我们在黑魔法防御术中已经初步见识了alias。
alias不仅可以避免危险操作,还可以简化命令,自创命令。
除非极短,否则良好的alias命名,应当以某个统一的单词或字母开头,
例如下面即将展示的reload/edit系列、update系列、show系列等。

先展示最基本的alias,并逐条解释。

alias ..    'cd ..'       #两点即可回到上级目录
alias -     'cd -'        #一杠返回上次的目录
alias q     'exit'        #退出登录
alias rm    'rm -i'       #误删防御
alias del   'rm -r'       #删除整个目录
alias mv    'mv -i'       #覆盖防御
alias cp    'cp -i'       #覆盖防御
alias ls    'ls -I'       #root状态下,默认不显示隐藏文件(.*)。BSD的ls很特殊,root默认显示所有文件。
alias la    'ls -a'       #显示所有文件
alias ll    'ls -h -l'    #显示文件权限和大小(以合理的单位)
alias lr    'ls -R'       #递归显示目录
alias dh    'df -h -a -T' #以合适的单位显示所有磁盘的剩余空间,以及文件系统类型(如ufs、devfs、procfs)。
alias ds    'du -sh'      #以合适的单位显示查看每个文件/文件夹的大小

find/wc系列。快速查找当前目录下的所有c/cxx/python源码文件。结合wc可以统计行数。

alias find-c 'find . -name "*.h" -o -name "*.c"'
alias find-x 'find . -name "*.h" -o -name "*.hpp" -o -name "*.cpp" -o -name "*.cxx"'
alias find-py 'find . -name ".py"'
alias wc-c 'find . -name "*.h" -o -name "*.c" | xargs wc | sort -k 4'
alias wc-x 'find . -name "*.h" -o -name "*.hpp" -o -name "*.cpp" -o -name "*.cxx" | xargs wc | sort -k 4'
alias wc-py 'find . -name ".py" | xargs wc | sort -k 4'

reload/edit系列。实现快速修改,载入配置文件。

alias reload-rc.conf  'sh /etc/rc'
alias reload-cshrc    'unalias * && source /etc/csh.cshrc'
alias edit-xorg.conf  'vim /etc/xorg.conf'
alias edit-csh.cshrc  'vim /etc/csh.cshrc'
alias edit-make.conf  'vim /etc/make.conf'
alias edit-kern.conf  'vim /etc/kernconf/thinkpad'
alias edit-rc.conf    'vim /etc/rc.conf'
alias edit-vimrc      'vim /usr/local/share/vim/vimrc'

set系列。快速设置locale。

alias setlocale-zhcn 'setenv LC_ALL zh_CN.UTF-8 && setenv LANG zh_CN.UTF-8'
alias setlocale-c    'setenv LC_ALL C'

startx专用。
保持命令行下为英文locale(避免date等命令出现乱码),而让x环境为中文,适合手动startx而不是kdm的人。

alias sx 'setenv LC_ALL zh_CN.UTF-8 && setenv LANG zh_CN.UTF-8 && startx && setenv LC_ALL C'

make系列。快速编译kernel/world。

alias make-world  'cd /usr/src && make buildworld && cd -'
alias make-kernel 'cd /usr/src && make kernel KERNCONF=thinkpad && cd -'
alias make-installworld 'cd /usr/src && make installworld && make delete-old && cd -'

show系列。查看状态或某些信息。

alias show-ifstat 'systat -ifstat'    #查看网络接口的数据流量
alias show-geom  'gstat'             #查看I/O状态
alias show-thermal 'sysctl dev.acpi_ibm.0.thermal'  #查看ThinkPad笔记本的各部分温度
alias show-cpufreq 'sysctl dev.cpu.0.freq'          #查看当前cpu频率
alias show-cpulevels 'sysctl dev.cpu.0.freq_levels'   #查看可用的cpu频率
alias show-battery 'sysctl hw.acpi.battery.life && sysctl hw.acpi.battery.time' #查看电力
alias show-smartctl 'smartctl -a /dev/ad4'           #需要安装smartmontools,查看磁盘smart参数
alias show-alldep 'make all-depends-list'            #需要在ports的安装目录下执行,显示所有依赖
alias show-dep  'portmaster --show-work ./ | sort' #同上,且需要安装portmaster,只显示尚未安装的依赖
alias show-ver  'pkg_version -v'                   #查看是否有软件可更新

update系列。顾名思义,更新嘛。

alias update-locatedb    '/usr/libexec/locate.updatedb'            #更新locate数据库
alias update-kernsrc     'csup -L 2 /etc/supfiles/stable-supfile'  #同步kernel tree
alias update-ports       'portsnap fetch update'                   #同步ports tree
alias update-apps  'portmaster -a --force-config'            #需要安装portmaster,更新所有软件,提示配置选项

杂项,均需要安装第三方软件才能用。

alias lt    'tree -N -C'       #需要安装tree。树状显示目录,-N可以保证中文显示,-C使用彩色
alias l3    'tree -N -C -L 3'  #目录最多递归三级
alias l4    'tree -N -C -L 4'  #四级
alias l5    'tree -N -C -L 5'  #五级
alias l6    'tree -N -C -L 6'  #六级
alias v     'vim'              #不用说,我懒
alias m     'mocp'             #控制台下的cs架构播放器
alias getdir 'wget -c -r -np -k'                  #递归下载目录
alias ssh-home 'ssh raphael.vicp.cc -l root'        #用root账号登录,结合key可以免输密码
alias ftp-home   'ftp ftp://syh:syh@raphael.vicp.cc' #BSD自带的ftp,免输账号密码。主机已被电信和工信部和谐,勿再试
alias lft-phome 'lftp raphael.vicp.cc -u syh,syh'    #lftp的免输账号密码。
alias scons 'scons -Q -j 4'                      #构建工具,默认4个线程进行
alias valgrind-checkmem 'valgrind --tool=memcheck --leak-check=full'  #检查内存泄漏

最好的教材

最好的教材莫过于man手册,真的什么都有了:
# man tcsh

No comments:

Post a Comment