zsh:使用“less -R”作为READNULLCMD

时间:2012-12-27 10:30:59

标签: zsh

现在,我很确定这里的限制。但让我们退后一步。

简单陈述

 READNULLCMD="less -R"

不起作用,产生以下错误:

$ <basic.tex                                                                            
zsh: command not found: less -R

行。很确定这是因为,默认情况下,zsh不会在每个空格中拆分字符串变量。无论zsh使用此变量,它都使用$ READNULLCMD,它应该使用$ {= READNULLCMD},以确保选项参数与正常空间的命令正确分离。从1996年回来看这个讨论(!): http://www.zsh.org/mla/users/1996/msg00299.html

那么,没有设置SH_WORD_SPLIT(我不想99%的时间),最好的解决方法是什么?

到目前为止,我最好的想法是将READNULLCMD分配给一个简单的zsh脚本,该脚本在STDIN上调用“less -R”。例如

#!/opt/local/bin/zsh
less -R /dev/stdin

不幸的是,这似乎是一个非首发,因为在这种方式中使用较少因为某些原因错过了/ dev / stdin输入的前几行。

有人有更好的想法吗?

3 个答案:

答案 0 :(得分:1)

export LESS=…可能是专门用于less的好解决方案,如果您希望此类行为在所有情况下都是默认行为,但如果您想要更通用的行为,那么您可以使用函数:

function _-readnullcmd()
{
    less -R
}
READNULLCMD=_-readnullcmd

_-readnullcmd没有特殊含义,前者永远不会出现在任何分布式zsh脚本中,后者表示该函数的用途。)

答案 1 :(得分:1)

问题不是没有读取它的环境变量(LESS或LESSOPEN)。问题是您没有像您想象的那样调用READNULLCMD。

<foo

不会转化为

less $LESS foo

而是

之类的东西
cat foo | less $LESS

或者,或许

cat foo $LESSOPEN | less $LESS

我猜你(像我一样)想要使用-R来获取语法着色(在LESSOPEN中使用src-hilite-lesspipe.sh,后者又使用&#34; source-highlight&#34;实用程序) 。后两种调用方式的问题是src-hilite-lesspipe.sh(嵌入在$ LESSOPEN中)不会收到文件名,因此它无法推断出文件类型(通过--infer-lang)选项&#34; source-highligt&#34;)。没有文件名后缀,&#34; source-highlight&#34;将恢复为&#34;没有突出显示&#34;。

您可以在READNULLCMD中获取语法着色,但是以一种相当无用的方式。这是通过--lang-def选项显式指定语言。但是,由于在数据通过管道匿名传递时,没有文件名,因此您将获得与#34; source-higlight&#34;一样少的线索。也许有一种方法可以做一个动态启发式解析器并通过内容推导它,但是你肯定会离开这个小小的练习。

答案 2 :(得分:0)

$LESS env var设置为less中您始终想要的选项。

因此,请勿触摸READNULLCMD并在zshrc中使用export LESS="R"(以及您想要的其他选项)。