vim:代码为ps;前模式,静默模式,硬拷贝,语法

vim: code to ps; ex mode, silent mode, hardcopy, syntax on

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

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

...有效。但是,由于 vim 在终端 window.

中打开和关闭,仍然存在短暂的闪烁

我的第二次尝试...

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

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

我错过了什么?


另外:

那个根本不管用,为什么?

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

提前致谢!

------------编辑----------

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

    code2pdf() {
        in_file=""      #input filename
        ps_file=".ps"   #filename.ps
        pdf_file=".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

没用...

几件事; if [ -z ]; 至少,引用 "";不确定当前版本,但我认为如果 </code> 未设置,测试会抱怨没有参数,您正在测试。一个更具可读性的选项是如果 <code>[[ "" == "" ]]; 大多数时候都有效。

Try2 似乎搞乱了 ex 对可用颜色的了解; 语法高亮显示,但没有颜色...不是您想要的。

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

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

所以正确的脚本应该是:

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

第二个问题(编辑后)需要解释一下。 因为,为了防止闪烁,ex 的输出被重定向到 /dev/null,普通管道将无法工作。

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

另一种解决方案是创建一个生成 pdf 文件的虚拟打印机,然后让 ex 将硬拷贝发送到该打印机。这确实节省了额外的步骤并使事情变得非常干净。