如何使源突出显示默认着色 .dotfiles?

如何使源突出显示默认着色 .dotfiles?

通常当我捕获这样的文件时

在此输入图像描述

不着色很难阅读。

我已经设法cat像这样使用源突出显示:

cdc() {
  for fn in "$@"; do
    source-highlight --out-format=esc -o STDOUT -i $fn 2>/dev/null || /bin/cat $fn
  done; }; alias cat='cdc'

现在为可识别的文件扩展名生成以下内容 - 在本例中为 .sh:

在此输入图像描述

但是,如果没有 .sh,例如,如果仅调用该文件,.bash_functions则不会发生着色 - 因为文件扩展名未知。

有什么方法可以将color-highlight彩色点文件(以点开头的文件)作为sh颜色?

顺便说一句,这是建立在如何对 cat 输出(包括黑白中的未知文件类型)进行着色?

man source-higlight显示以下内容,但我不清楚该怎么做:

...
--outlang-def=filename
      output language definition file

--outlang-map=filename
      output language map file (default=`outlang.map')

--data-dir=path
      directory where language definition files and language maps are searched for.   If  not  specified
      these files are searched for in the current directory and in the data dir installation directory

--output-dir=path
      output directory

--lang-def=filename
      language definition file

--lang-map=filename
      language map file  (default=`lang.map')

--show-lang-elements=filename
      prints the language elements that are defined

      in the language definition file

--infer-lang
      force to infer source script language (overriding given language specification)

答案1

-s sh仅当$fn看起来像点文件时指定。

cdc() {
  for fn in "$@"; do
    OPTIONS="-f esc"
    case "${fn##*/}" in
      .*) OPTIONS="$OPTIONS -s sh" ;;
    esac
    source-highlight $OPTIONS -i "$fn" 2>/dev/null || \cat "$fn"
  done
}
alias cat=cdc

您可以在 中添加其他自定义文件名匹配规则case

答案2

yaegashi的想法是正确的,尽管我会这样做:

cdc() {
    for path
    do
        command=(source-highlight --out-format=esc -o STDOUT --failsafe)
        case "${path##*/}" in
            .*) command+=(-s sh)
                ;;
        esac
        "${command[@]}" -i "$path"
    done
}
  • --failsafe行为就像cat无法检测到语言一样 - 比忽略所有错误要好得多
  • 使用一个命令参数的数组

答案3

cdc将您的函数定义为

cdc() {
    for fn do
        if [[ "${fn##*/}" == .* ]]
        then
            source-highlight --src-lang=sh --out-format=esc -i "$fn"
        else
            source-highlight               --out-format=esc -i "$fn"
        fi 2> /dev/null  ||  /bin/cat "$fn"
    done
}
  • for fn do是 的缩写for fn in "$@"; do
  • ${fn##*/}查看 的值$fn并删除从开始到(包括)最后一个 的所有内容/。即,如果$fn是完整路径名,则这只是文件名部分。
  • [[ (the_above) == .* ]]检查文件名是否与.*glob/通配符模式匹配;即文件名是否以 a 开头.。请注意,这种用法==仅适用于内部[[ … ]];它在里面不起作用[ … ]
  • 因此,如果$fn是“点文件”,请source-highlight使用该--src-lang=sh选项运行。

    • 您应该始终将 shell 变量引用放在双引号中,除非您有充分的理由不这样做,并且您确定您知道自己在做什么。 Unix/Linux 文件名可以包含空格。如果您有一个名为 的文件foo bar,并且您说过/bin/cat "foo bar"cat将显示该文件的内容foo bar。但是,如果您说cdc "foo bar" (使用函数的当前版本cdc),您将运行source-highlightwith -i foo bar,它将查找名为 的文件foo,并且通常会弄乱事情。所以它会失败,你的函数会尝试/bin/cat foo bar,这同样会失败。使用"$fn"使得此方法适用于包含空格的文件名。
    • cp程序要求您在参数列表中指定要写入的文件或目录的名称。这是大多数程序默认写入标准输出的规则的少数例外之一(除非您另外指定)。你不需要说-o STDOUT,我想知道为什么程序的作者甚至让你可以指定这一点。

    是的,我意识到您刚刚复制了其他问题答案中的所有内容。

  • 显然,如果$fn不是点文件,只需以source-highlight正常方式运行,并让它检查扩展名。
  • 请注意,可以对整个块执行the2> /dev/null和 the ;不必为每个分支重复它们。|| /bin/cat "$fn"if … then … else … fi

唔。我的版本source-highlight(3.1.7) 有一个选项(简称为 yaegashi 使用的)。我刚刚注意到它不在您问题中包含的手册页摘录中。因此,显然,如果您的版本不支持该选项,我的答案将不适合您。 (当然,yaegashi 也不会。)如果是这种情况,您应该看看是否可以安装 3.1.7 版(或兼容版本)。--src-lang=LANGUAGE-s LANGUAGEsource-highlightsource-highlightsource-highlight

答案4

除了查看文件扩展名之外,source-highlight 还有其他一些检测语言的方法。您可以像这样注释您的 shell 脚本文件:

  1. shabang 行:将#!/bin/sh#!/bin/bash放在文件的第一行。
  2. # -*- shell -*-Emacs 风格的文件类型注释:在文件中添加类似或 的注释# -*- bash -*-(不需要是第一行)。

详情请参见如何发现输入语言在source-highlight的手册中。

相关内容