vim:ps的代码; ex模式,静音模式,硬拷贝,语法

时间:2018-02-02 02:50:46

标签: bash vim printing syntax-highlighting

我一直在尝试在.bash_profile脚本中添加一个函数,以便轻松地将/打印(大多数)代码文件转换为.ps文件。 我的第一次尝试......

    #TRY1
    code2ps() {
        if [ -z $1 ]; then
            echo "ERROR: argument missing\n code2ps [targetfile]"
        else
            ex -c "open $1" -c "syntax on" -c "hardcopy > $1.ps" -c q
        fi
    }

...作品。但是,由于vim在终端窗口中打开和关闭,因此仍然存在短暂的闪烁。

我的第二次尝试......

    #TRY2
    code2ps() {
        if [ -z $1 ]; then
            echo "ERROR: argument missing\n code2ps [targetfile]"
        else
            ex -s -c "open $1" -c "syntax on" -c "hardcopy > $1.ps" -c q
        fi
    }

...通过使用静默模式-s避免闪烁,但会生成.ps文件而不突出显示任何语法。

我错过了什么?

另外:

那根本不起作用,为什么?

    #TRY3
    code2ps() {
        if [ -z $1 ]; then
            echo "ERROR: argument missing\n code2ps [targetfile]"
        else
            string=$(printf 'ex -c \"open %s\" -c \"syntax on\" -c \"hardcopy > %s.ps\" -c q' $1 $1)
            $string
            echo "Executed: $string"
        fi
    }
提前谢谢!

---------- ---------- EDIT

还有一件事:我添加了几行来转换为pdf:

    code2pdf() {
        in_file="${1}"      #input filename
        ps_file="${1}.ps"   #filename.ps
        pdf_file="${1}.pdf" #filename.pdf

        if [[ $in_file == "" ]]
        then
            echo "ERROR: argument missing: code2pdf [targetfile]"
        else
            code2ps $in_file #convert code to .ps
            ps2pdf $ps_file $pdf_file #convert .ps to .pdf
            rm $ps_file #remove .ps fi
    }

工作正常。但有没有更简单的方法,可能是通过管道输出code2ps()?

code2ps xxx | ps2pdf

不起作用......

2 个答案:

答案 0 :(得分:2)

一些事情; if [ -z $1 ];至少引用"$1";不确定当前版本,但我认为测试会抱怨如果没有设置$1没有参数,你正在测试。如果[[ "${1}" == "" ]];在大多数时间都有效,则更具可读性的选项。

Try2似乎搞砸了前人对颜色的了解;它 语法突出显示,但没有颜色......不完全是你的想法。

Try3可能会失败,因为应引用$(printf ... )string="$(printf ...)"

实际答案由Emily E提供:通过将(大部分缺席)输出(闪烁)重定向到/dev/null(位桶,通常用于所有要丢弃的输出[它包含最后一位]重定向到它)你可以摆脱那闪烁。

所以正确的脚本是:

 code2ps() {
    if [[ "${1}" == "" ]]
    then
        echo "ERROR: argument missing\n code2ps [targetfile]"
    else
        ex -c "open ${1}" -c "syntax on" -c "hardcopy > ${1}.ps" -c q >/dev/null
    fi
 }

答案 1 :(得分:0)

第二个问题(编辑后)需要一些解释。 因为,为了防止闪烁,ex的输出被重定向到/dev/null正常的管道不起作用。

hardcopy命令必须写入stdout,但该输出被重定向到/dev/null;你可以通过创建一些额外的文件描述符和一些重定向来解决这个问题,但坦率地说;我认为这不会使您的代码更具可读性或更高效。除非你很难用于磁盘空间,否则我会选择制作中间文件的文件。

另一个解决方案是创建一个生成pdf文件的虚拟打印机,然后让硬拷贝发送到那个。这确实可以节省额外的步骤并保持清洁。