linux - M4 未展开 .m4 文件中的所有宏

标签 linux m4 i3

我正在使用 m4 将一些宏替换为我的 i3wm 配置文件中包含的文件中定义的颜色/等。

$ m4 -I themes/gruvbox-dark config.m4 > config

这是(摘录的)上述命令的目录结构。

$ tree .
.
├── config.m4
├── font.m4
├── themes
│   ├── gruvbox-dark
│   │   ├── color.m4
│   │   └── i3.m4
└── Xresources.m4

我定义了宏,例如:

define(M4_COLOR_FG,`#a89984')
define(M4_I3_FG,`M4_COLOR_FG')
define(M4_I3_BG,`#3c3836')

并且在 m4 的输出中我仍然看到未展开的宏,例如:

client.focused #3c3836 M4_I3_BG M4_I3_ACTIVE_FG M4_I3_BG M4_I3_BG
client.focused_inactive #3c3836 M4_I3_BG M4_COLOR_FG M4_I3_BG M4_I3_BG
client.unfocused #3c3836 M4_I3_BG M4_COLOR_FG M4_I3_BG M4_I3_BG
client.urgent #fb4934 M4_I3_BG M4_COLOR_9 M4_COLOR_9 M4_I3_BG
client.placeholder #3c3836 M4_I3_BG M4_COLOR_FG M4_I3_BG M4_I3_BG
client.background #282828

第一个宏已展开,但该行中的其余宏未展开。以下是输入 .m4 文件中的相同行:

client.focused M4_I3_BG M4_I3_BG M4_I3_ACTIVE_FG M4_I3_BG M4_I3_BG
client.focused_inactive M4_I3_BG M4_I3_BG M4_COLOR_FG M4_I3_BG M4_I3_BG
client.unfocused M4_I3_BG M4_I3_BG M4_COLOR_FG M4_I3_BG M4_I3_BG
client.urgent M4_COLOR_9 M4_I3_BG M4_COLOR_9 M4_COLOR_9 M4_I3_BG
client.placeholder M4_I3_BG M4_I3_BG M4_COLOR_FG M4_I3_BG M4_I3_BG
client.background M4_COLOR_BG

当我尝试制作一些 MWE 时,它总是有效...不确定这些特定文件/宏的问题是什么。

所有文件都在:https://github.com/tomocafe/dotfiles/tree/master/i3/.i3

我在公司和家里都试过了,我家里的电脑是 Solus (Linux)。

$ m4 --version | head -1
m4 (GNU M4) 1.4.18

最佳答案

非常简单:如果你想扩展M4_COLOR_3 M4_COLOR_3:

  1. m4 将第一个 M4_COLOR_3 替换为 #colorcode
  2. m4 不会展开下一个 M4_COLOR_3,因为(展开的)# 表示注释。

您有解决方案:

  1. 您将使用 changecom 更改(或禁用)注释字符。
  2. 您将在定义中使用双引号:define(FOO,``#aabbcc'')

第一个:changecom(XXX) 将注释开始标记(当然只在 m4 中)更改为 XXX 并且结束将换行符。 changecom()' 将禁用注释(因此所有内容都将由 m4` 解析)。

第二个:

define(FOO,``#aabbcc'')
FOO FOO FOO FOO FOO

关于linux - M4 未展开 .m4 文件中的所有宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55894377/

相关文章:

macros - m4 扩展里面的宏

linux - 如何将这些命令嵌套在 i3-msg 中

python - django-多语言和模板端语言之间的切换

c++ - 从另一个线程调用 socket->native_handle()

android - 我的自定义 selinux 策略似乎被 android 系统忽略了

linux - subprocess.Popen 在退出时中断终端

linux - i3 config如何执行sudo命令

linux - 添加到主机的挂载点不会显示在正在运行的 docker 容器中

linux - 如何查看 Qt .pro 文件中的编译器版本?

autotools - AS_HELP_STRING 多行