【问题标题】:Tab width when reading from file从文件读取时的标签宽度
【发布时间】:2012-12-26 13:54:04
【问题描述】:

我在终端中使用<ncurses.h> 库作为一个简单的程序。它以传统方式逐字符读取文件:

FILE* f = fopen(filename, "r");
int c;
while ((c = fgetc(f)) != EOF) { /* process c */ }

字符被放入一个字符数组中。我需要知道终端屏幕上每个字符的 (y,x) 坐标。为此,我将确定屏幕上第一个和最后一个字符的索引保留在另一个数组中。当终端窗口调整大小时,它很容易调整 - 每行包含max_x 字符,或者更少数量的字符,如果有'\n'

选项卡会导致问题 - 尽管它们被识别为 '\t',但它们的宽度以及文本界面中的“像素”数量是不同的(当 cat 在终端中显示或作为包含所有字符的字符串中的连续字符时)文件中的字符)。但是,当通过以下方式与文件的其余部分分开时:

if (c == '\t') {...}

它们没有区别。我还尝试打印那些检测到的选项卡并比较光标的位置以获取它们的宽度,但它们再次看起来相同。

读取文件时如何获取选项卡的实际宽度?我想将宽度转换为多个空格。感谢您的关注和提示。

【问题讨论】:

  • 您是在寻找默认选项卡宽度,还是(可能)由系统设置重新定义的选项卡宽度?
  • 标签总是由在屏幕上显示文本的程序解释。除了猜测不同的制表符位置(标准宽度)并在文本“看起来正确”时停止之外,没有办法确定文本作者的意图。大多数系统的历史标准是 8 个字符。但大多数编辑器允许您选择默认值。我见过具有 2、3、4 和 8 个字符的默认制表符宽度的代码。当然人们可以选择他们想要的任何东西。
  • 看看:unix.stackexchange.com/questions/52795/…linux.die.net/man/3/set_tabsize,了解如何设置更改标签大小以及如何将它们组合在一起
  • 也许你想使用readline 处理标签的库。

标签: c linux text


【解决方案1】:

当然,实际的标签宽度取决于您在屏幕上呈现它的方式。对于经典演示文稿,即每八列一个列表,您必须跟踪选项卡出现的column 编号。然后你可以使用:

tab_width = 8 - column % 8

column 的第一列从 0 开始计数。

【讨论】:

  • 这对于例如 Linux 源代码来说是正确的。但是,如果您愿意,可以将编辑器或显示程序设置为“tabsize=3”或“tabsize=16”。
  • @MatsPetersson 是的。这就是为什么我说这是为了“对于经典表示,这是每八列一个表格”。
  • 感谢您的帮助。这就是我需要的!我忘了补充一点,我希望我的输出以less 的方式显示。坚持这个公式可以解决 Linux 源代码的问题,这是我主要关心的问题。
猜你喜欢
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多