m4宏,使用可变数量的选项卡将一列对齐

最高

这是我到目前为止拥有的宏:

define(`debug_macro', `
#ifndef $1_DEBUG
#define $1_DEBUG'forloop(`i',`1',eval(5-(len($1)/4+ifelse(eval(len($1)%4 == 0)), `0', `1')),`   ')dnl`0
#endif

')

目的是在_DEBUG0字符之间放置正确数量的制表符,以便它们全部对齐。可能缺少括号或引号,但希望您对我要去的地方有所了解。

我正在使用Xcode,并将选项卡设置为4。这是我为适应此情况所做的更改:

divert(`-1')
# forloop(var, from, to, stmt)
define(`forloop',
`pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')')
define(`_forloop',
`$4`'ifelse($1, `$3', ,
`define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')')
divert`'dnl
changecom()dnl
define(`debug_macro', `
#ifndef $1_DEBUG
#define $1_DEBUG`'forloop(`i', `1', ifelse(eval(len($1) >= 16), 1, 1, eval(5-(len($1)/4+ifelse(eval(len($1)%4 > 1), 0, `0', `1')))),`   ')0
#endif

')
changecom()dnl

由于我无法在系统上找到“ forloop.m4”,因此将其包含在内。除以4个回合,因此我添加了对余数大于1的检查。我还更改了单个制表符的空格范围。

如果有兴趣,我可以使用此宏定义常量,以用于打开应用程序不同区域的调试。此文件已签入git。然后有一个个人文件,未检入,看起来像这样:

//#define NETWORK_DEBUG  1

在包含上述文件之前,该文件包含在myapp.pch文件中。这样,每个程序员都可以根据需要打开或关闭自己的调试区域。

吉勒斯“别再邪恶了”

最简单的缩进方式是使用空格,而不是制表符。尤其是非标准宽度的标签(由于标签的标准宽度为8,因此不能超过此宽度)。

用制表符缩进的第二种最简单的方法是生成一个带空格的文件,并调用unexpand用制表符替换空格。

话虽如此,您可以在m4中完成此操作,但是您必须更加熟悉它。逐步构建您的表达式:先编写一个,然后再进行下一个。

forloop不是标准的m4宏。我认为您的意思forloop是GNU m4手册中介绍这是GNU m4附带的示例代码(手册对此不太清楚)。要在您的代码中使用它,您需要显式地包括它。发行版本可能会发行也可能不会发行,因此最好将其与代码一起发行。

您的代码中有几个语法问题。

  • 您已将呼叫保留在forloop任何引号之外,因此在评估时define评估它,而不在debug_macro评估评估它。
  • ifelse宏不选择仅基于第一个参数的值,比较其前两个参数-这是更多的情况下,宏:应将呼叫ifelse(…, 0, 0, 1)ifelse(… == 0, 1, 0, 1)
  • #开始评论。M4在评论后会忽略所有内容。定义更改注释定界符debug_macro

只要参数不太长,下面的代码就可以工作:

include(`/usr/share/doc/m4/examples/forloop.m4')dnl
changecom()dnl
define(`debug_macro', `
#ifndef $1_DEBUG
#define $1_DEBUG`'forloop(`i',`1',eval(5-(len($1)/4+ifelse(eval(len($1)%4), 0, `0', `1'))),`    ')0
#endif

')dnl
changecom('#')dnl

使用导致最大循环索引变为0或更小的参数,循环执行约2 32次(m4使用32位模运算)。在这种情况下,您需要进行其他测试。这是当参数过长时插入单个制表符的代码。

include(`/usr/share/doc/m4/examples/forloop.m4')dnl
changecom()dnl
define(`debug_macro', `
#ifndef $1_DEBUG
#define $1_DEBUG`'forloop(`i', `1', ifelse(eval(len($1) >= 16), 1, 1, eval(5-(len($1)/4+ifelse(eval(len($1)%4), 0, `0', `1')))),`       ')0
#endif

')dnl
changecom('#')dnl

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

仅使用键将Sublime Text中的选项卡从一列移到另一列

如何将可变数量的串联标签的一列拆分为每个标签一列?

tidyr:将一列分成数量可变的列

Excel VLOOKUP-将需要显示从一个选项卡到另一个Excel选项卡的一列

使用Python根据选项卡分层文件中的第一列对行进行计数(不使用Pandas,Numpy等)

如何将go-sqlmock WithArgs()与可变数量的参数一起使用?

将numpy mgrid与可变数量的索引一起使用

如何将列表理解与可变数量的文件名列表一起使用?

如何对一列进行分组并输出由选项卡分隔的多个列-Python

如何在中心对齐bootstrap 4列表选项卡?

将两列变成选项卡

使用Pandas处理可变数量的列-Python

如何制作可变参数宏(可变数量的参数)

将宏扩展为m4中的引号

使用存储在另一个文件中的 m4 宏

如何使用js删除String中的一定数量的选项卡?

jQuery UI选项卡中的选项卡对齐

使用可变数量的float参数

当selectedIndex高于选项卡的实际数量时,材料选项卡更改为最后一个选项卡

使用多个输入启用选项卡并使用一个输入禁用选项卡

使用引导程序 4 选项卡时将活动类存储在本地存储中

将$ .when()与函数的可变数组一起使用

对齐左选项卡元素

LaTeX表格-额外的对齐选项卡?

PagerTabStrip选项卡向左对齐

在#vba 中使用转置将数据从一个选项卡传输(复制和粘贴)到另一个选项卡

增加操作上的选项卡数量

使用引导程序从选项卡调用另一个选项卡?

使用Selenium Webdriver计算由ng-repeat生成的选项卡集中的选项卡数量