微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重新编译 ls 命令以获取以 README_* 开头的文件所需的颜色,即用字符串扩展

如何解决重新编译 ls 命令以获取以 README_* 开头的文件所需的颜色,即用字符串扩展

我对这篇文章做了以下说明:export-ls-colors-apply-the-rule-for-every-file-beginning-by-readme

我简要总结一下这个问题:

eval `/opt/local/libexec/gnubin/dircolors ~/.dircolors`
export LS_COLORS="${LS_COLORS}*README=00;37;44"

然后,当创建一个 README 文件时,我会得到:

README

但现在,我想应用规则并对以 README 开头的每个文件名(如 README_somethingREADME_important)执行相同的操作。

为此,我尝试放置:

 export LS_COLORS="${LS_COLORS}*README*=00;37;44"

但没有如上图显示(只有白色)。

潜在的解决方

一个潜在的解决方案是从 ls 源包重新编译 coreutils 命令(我使用的是 MacOS Big Sur 11.2.3)。

修改位于此处:

https://github.com/wertarbyte/coreutils/blob/master/src/ls.c#L4206

如果我希望文件 README_string 其中 string 是任何类型的字符串被命令“l”着色,我正在研究需要哪些修改~/.zshrc

alias l='grc -es --colour=auto ls --color -Gh -C -lrt'

如何进行重新编译?

编辑

在管理文件着色的部分代码下方(https://github.com/wertarbyte/coreutils/blob/master/src/ls.c#L4206):

/* Check the file's suffix only if still classified as C_FILE.  */
  ext = NULL;
  if (type == C_FILE)
    {
      /* Test if NAME has a recognized suffix.  */

      len = strlen (name);
      name += len;      /* Pointer to final \0.  */
      for (ext = color_ext_list; ext != NULL; ext = ext->next)
        {
          if (ext->ext.len <= len
              && strncmp (name - ext->ext.len,ext->ext.string,ext->ext.len) == 0)
            break;
        }
    }

我希望对没有扩展名的文件进行着色。我对 C 语言有一些概念,但不足以理解这部分代码中发生的事情。

我可以申请哪些修改以获得无需扩展的着色?

解决方法

除了它正在做什么之外,您还可以使用 grc 为 README 文件着色 现在。由于您已经设置了别名,只需将正则表达式/颜色对添加到 grcls 配置文件的副本:

mkdir ~/.grc/
{
cat /usr/local/share/grc/conf.ls
cat << here
-
# README
regexp=(README[^.]*$)
colours=white on_blue blink
here
} > ~/.grc/conf.ls


如果您仍想尝试更改 ls 的来源,您需要几个 修改。根据您链接中的来源,您似乎需要...

将第 551 行更改为:

    C_CLR_TO_EOL,C_README

在第 593 行之后添加:

    { LEN_STR_PAIR ("37;44") },

将第 4231 行 (return false;) 更改为:

    {
      if (startsWith(name,"README"))
        {
          if (is_colored (C_NORM))
            restore_default_color ();
          put_indicator (&color_indicator[C_LEFT]);
          put_indicator (&color_indicator[C_README]);
          put_indicator (&color_indicator[C_RIGHT]);
          return true;
        }
      else
        return false;
    }

并在 print_color_indicator 函数之前的某处添加此函数:

bool startsWith(const char *pre,const char *str)
  {
    size_t lenpre = strlen(pre),lenstr = strlen(str);
    return lenstr < lenpre ? false : memcmp(pre,str,lenpre) == 0;
  }

所有这些 C 代码都完全未经测试(而且我的 C 非常生疏)。这也是 不推荐 - 如评论中所述,这将难以实施 并支持。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。