9.5 操作命令行
本节内容包括字补全、命令行编辑和拼写校正。
9.5.1 字补全
如果用户允许,那么TC Shell将在命令行上执行文件名、命令和变量名的自动补全。在tcsh中,用来统称这些特性的术语是字补全。
1. 文件名补全
当用户指定一个唯一的文件名前缀后,TC Shell可以补全该文件名。文件名补全类似于文件名生成,但是文件名补全的目标是选择单个文件。两者一起使得使用更具有描述性的较长文件名变得实用。
在命令行上输入文件名时,为了使用文件名补全,应输入该文件名足够多的部分(以在该目录下唯一标识该文件),然后按下TAB键。tcsh补充该文件名并添加一个空格符,然后移动光标,这样用户就可以输入其他参数或者是按下RETURN键。在下面的示例中,用户输入命令cat trig1A并按下TAB键,系统补充了以trig1A开头的文件名的剩余部分:
tcsh $ cat trig1A —>TAB —> cat triglA.302488 ■
如果有两个或者更多文件名匹配用户输入的前缀,而用户没有提供更多的信息,那么tcsh将不能补全这个文件名。如果可能,shell将试图通过添加字符使前缀的长度达到最大,并且发出蜂鸣声,以提醒用户需要输入更多信息以消除模糊:
tcsh $ ls h*
help.hist he1p.trig01 help.txt
tcsh $ cat h —> TAB —> cat help. (beep)
用户在补充了足够的字符以消除模糊之后,可以再次按下TAB键。另外,用户还可以按下CONTROL+D组合键使tcsh显示匹配文件名的列表:
tcsh $ cat help. —> CONTROL-D
help.hist he1p.trig01 help.txt
tcsh $ cat help. ■
在显示这些文件名之后,tcsh将命令行重新打出来,这样用户就可以消除文件名模糊(通过再次按下TAB键)或者手动完成文件名的输入。
2. 代字符补全
TC Shell分析出现在字首部的代字符(~),并试图在用户输入TAB键的时候将其扩展成一个用户名:
tcsh $ cd ~a1 —> TAB —> cd ~a1ex/■ —> RETURN
tcsh $ pwd
/home/alex
通过追加一个斜杠(/),tcsh指出已补全的字是一个目录。斜杠也使继续指定路径名变得容易。
3. 命令补全和变量补全
对命令名和变量名均可以使用与列出和补全文件名相同的机制。除非用户给出完整的路径名,否则shell使用变量path试图补全命令名。被列出的候选项可能位于不同目录下。
tcsh $ up —> TAB (beep) —> CONTROL-D
up2date updatedb uptime
up2date-config update-mime-database
up2date-nox updmap
tcsh $ up —> t —> TAB —> uptime ■ —> RETURN
9:59am up 31 days, 15:11, 7 users, load average: 0.03, 0.02, 0.00
如果像下面这个示例中一样,设置了autolist变量,那么在按下TAB键调用自动补全时shell将自动列出候选项。这样用户就不必按下CONTROL+D组合键。
tcsh $ set autolist
tcsh $ up —> TAB(beep)
up2date updatedb uptime
up2date-config update-mime-database
up2date-nox updmap
tcsh $ up —> t —> TAB —> uptime ■ —> RETURN
10:01am up 31 days, 15:14, 7 users, load average: 0.20, 0.06, 0.02
如果将autolist设置为ambiguous,shell将只在用户所输入的字是一组命令中的最长前缀时,按下TAB键才会列出候选项。否则,按下TAB键将使得shell向这个字添加一个或者多个字符,直到它成为最长前缀,然后再次按下TAB键将列出候选项:
tcsh $ set autolist=ambiguous
tcsh $ echo $h —> TAB (beep)
histfile history home
tcsh $ echo $h■ —> i —> TAB —> echo $hist■ —> TAB
histfile history
tcsh $ echo $hist■ —> o —> TAB —> echo $history ■ —> RETURN
1000
shell必须根据某个字在输入行中的上下文来判断该字是一个文件名、用户名、命令或者是变量名。输入行的第1个字被假设是命令名。如果字以特殊字符$开头,那么这个字就被认为是变量名,等等。在下面的示例中,第2个which命令没有正常工作:字up的上下文使其看上去像某个文件名的开头而不是某条命令的开头。TC Shell为which提供一个updates(不可执行文件)参数,which显示一条错误消息:
tcsh $ ls up*
updates
tcsh $ which updatedb ups uptime
/usr/bin/updatedb
/usr/1ocal/bin/ups
/usr/bin/uptime
tcsh $ which up —> TAB —> which updates
updates: Command not found.
9.5.2 编辑命令行
bindkey tcsh命令行编辑特性类似于bash。用户可以使用emacs模式命令(默认)或者vim模式命令。使用bindkey -v切换到vim模式命令,而使用bindkey -e切换到emacs模式命令。在两种模式下,方向键都被绑定到明显的移动命令上,这样用户可以在其历史列表中来回(上下)滚动,还可以在当前命令行上左右移动。
如果不带任何参数,内置命令bindkey将显示编辑器命令与可在键盘上输入的按键序列之间的当前映射:
tcsh $ bindkey
Standard key bindings
"^@" -> set-mark-command
"^a" -> beginning-of-line
"^b" -> backward-char
"^c" -> tty-sigintr
"^d" -> delete-char-or-list-or-eof
...
Multi-character bindings
"^[[A" -> up-history
"^[[B" -> down-history
"^[[C" -> forward-char
"^[[D" -> backward-char
"^[[E" -> beginning-of-line
"^[[F" -> end-of-line
...
Arrow key bindings
down -> down-history
up -> up-history
left -> backward-char
right -> forward-char
home -> beginning-of-line
end -> end-of-line
^表示CONTROL字符(^B=CONTROL+B)。^[表示META或者ALT字符,在输入该键的下一个字符的同时按下META或者ALT键。如果没有进行替换,或者所使用的键盘没有META和ALT键,就按下ESCAPE键并释放,然后输入下一个字符。对于^[[F,要按下META+[或者ALT+[组合键,后面跟着F键或者按下ESCAPE [ F。down/up/left/right表示方向键,home/end表示数字键盘上的HOME和END键。
这个示例在用户处于emacs模式时给出了bingkey的输出。切换到vi(m)模式(bindkey -v)并给出另一条bindkey命令将显示vi(m)键绑定。可以使用管道将bindkey的输出发送到less,以便于列表的阅读。
9.5.3 校正拼写
可以让tcsh试图校正命令名、文件名以及变量(但只使用emacs形式的键绑定)的拼写。拼写校正只发生两次,即在输入RETURN之前和输入RETURN之后。
1. 在输入RETURN之前
为了让tcsh在用户输入RETURN之前纠正某个字,用户必须指出希望这样做。用于这个目的两个功能为spell-line和spell-word:
$ bindkey | grep spell
"^[$" -> spell-line
"^[S" -> spell-word
"^[s" -> spell-word
bindkey的输出显示spell-line被绑定到META-$(ALT-$或者ESCAPE-$),spell-word被绑定到META-S和META-s(ALT-s或者ESCAPE s和ALT-S或者ESCAPE S)。要想校正光标左边的字的拼写,输入META-S。输入META-$将调用spell-line功能,试图校正命令行中的所有字:
tcsh $ ls
bigfile.gz
tcsh $ gunzipp —> META-s —> gunzip bigfele.gz —> META-s—> gunzip bigfile.gz
tcsh $ gunzip bigfele.gz —> META-$ —> gunzip bigfile.gz
tcsh $ ecno $usfr —> META-$ —> echo $user
2. 在输入RETURN之后
名为correct的变量控制着在用户输入RETURN之后且在把命令行传递给被调用命令之前tcsh将要试图校正和补全的内容。如果没有设置correct,tcsh将不校正任何内容:
tcsh $ unset correct
tcsh $ ls morning
morning
tcsh $ ecno $usfr morbing
usfr: Undefined variable.
shell报告变量名错误而不是命令名错误,这是因为shell在执行命令之前扩展变量。如果用户给出一个不带任何参数的错误命令名,shell报告这是一个错误的命令名。
将correct设置为cmd会使shell只校正命令,而设置为all将校正命令、变量和文件名,设置为complete将补全命令:
tcsh $ set correct = cmd
tcsh $ ecno $usfr morbing
CORRECT>echo $usfr morbing (y|n|e|a)? y
usfr: Undefined variable.
tcsh $ set correct = all
tcsh $ echo $usfr morbing
CORRECT>echo $user morning (y|n|e|a)? y
alex morning
当correct设置为cmd时,tcsh将命令名ecno校正为echo。当correct设置为all,tcsh将同时校正命令名和变量。而如果命令行上出现文件名,它还试图校正该文件名。
进行自动拼写检查时显示一个特殊的提示符,让用户选择,输入y接受被修改的命令行,输入n拒绝,输入e进行编辑,或者输入a取消命令。参见第9.6.7节中的prompt3部分中关于拼写检查中使用的特殊提示符的讨论。
在下面的示例中,在设置correct变量之后,用户将ls命令的名字拼写错误,tcsh提示了一个纠正的命令名。因为tcsh给出的替换命令并不是ls,所以用户选择编辑这个命令行。shell将光标移动到命令之后,这样用户就可以纠正这个错误:
tcsh $ set correct=cmd
tcsh $ lx -1 —> RETURN (beep)
CORRECT>lex -1 (y|n|e|a)? e
tcsh $ 1x -l■
如果将值complete指派给变量correct,tcsh将试图按照与文件名补全相同的方式进行命令名补全。在下面的示例中,在将correct的值设置为complete之后,用户输入命令up。shell响应为Ambiguous command,这是因为有几个命令均以这两个字母开头但是它们的第3个字母不同。然后shell重新显示命令行。用户此时可以输入TAB键,这样就可以得到一个以up开头的命令的列表,然后输入t并输入RETURN。因为这3个字母唯一标识了uptime工具,所以shell补全了这条命令:
tcsh $ set correct = complete
tcsh $ upRETURN
Ambiguous command
tcsh $ up —> tRETURN —> uptime
4:45pm up 5 days, 9:54, 5 users, load average: 1.62, 0.83, 0.33






