问题标签 [termcap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - c程序中的非规范终端模式缓冲区标准输出
我正在做一个学校项目(构建一个非常基本的外壳)。
这个想法是能够像在 bash 中一样进行行编辑。为此,我将终端模式更改为非规范并停止回显。
我做了一个非常简单的代码来暴露我的问题(请注意,我确实检查函数返回等......我只是为了这篇文章尽可能短)
所以基本上它是一个读取循环来捕获用户条目。它为“c”清除屏幕,为“b”输出字符,为“q”中断并恢复原始终端模式。
问题是:
每当我输入任何内容时,它似乎都会被缓冲,因为在我用“q”中断循环之前什么都没有发生。此时,屏幕上显示输出,如果我输入 5 次 b,我将得到 5 个 b,如果我输入 'c',屏幕将被清除。但是,只有在输入“q”之后。恢复或不恢复原始终端模式时行为相同。(之前的最后一行return
)
我怀疑的是:
在使代码非常短并检查所有返回之后,我倾向于认为我更改终端模式的方式可能存在问题?我尝试使用标志TCSAFLUSH
和具有相同结果TCSADRAIN
的函数。tcsetattr
谢谢 !:)
c - 为什么 termcaps 在 `write` 系统调用之前不起作用?
为什么这个程序的输出没有下划线
但这是?
编辑
事实上,问题在于缓冲区管理!如果我添加fflush
,则字符串会正确加下划线
c - 如何在 C 中写入输入部分?
我正在尝试用 C 语言为学校项目编写一个迷你 shell,我想做的是做一种命令历史记录(就像在 shell 中一样),当我按下 UP 键时,它将先前的输入写入输入部分, DOWN 则相反,等等...,您可以在按 Enter 之前对其进行编辑以将其发送到程序,如下所示(抱歉英语不好): [] 代表用户光标
我可以使用 termcaps 和其他一些功能isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs
。
问题是我无法理解ioctl
和tty
函数的文档,也找不到关于这些函数的详细解释的示例教程,也找不到我正在尝试使用它们的文档。
有人可以以一种可以理解的方式向我解释这些功能吗?以及我应该如何将它们应用于我正在尝试做的事情(我正在寻找一种 Linux-MacOs 兼容方式)感谢您的帮助。
c - 使用 termcaps 删除输出
我正在尝试删除从光标到行尾的字符,问题是当我打印一个新行('\n')之后,删除的字符重新出现,我还尝试在新行之前打印一个空字符行,它也一样。最小代码:
输出:Hello World
没有最后一个write(1, "\n", 1)
输出:Hello
我花了几个小时才发现是新线路造成的,现在我不知道该怎么做。
我也尝试过write(1, "\0\n", 2)
,它也是如此。
关于如何避免这种情况的任何线索?
c - 在非规范模式下,输出的行不能在终端内正确换行
我正在尝试使用Termcap
功能实现 bash 的迷你版,现在我正在尝试读取用户的输入并在终端 Stdout 中重新键入它。
一切正常,但是在尝试调整终端窗口大小时会出现问题,正如您在下面的 gif 中看到的那样,当我写一个单行然后缩小窗口,然后再次展开它时,输出包装得很好.
但是当我的文本越过第一行(不按 Enter)时,如果我执行与以前相同的步骤,则输出换行与我想要的不同。我需要的是第一行的最后一个字符在缩小窗口时必须与第二行字符连接,反之亦然,当我展开窗口时第二行的第一个字符与第一行字符连接。
有没有办法让输出的行换行与 bash 完全相同?(相互连接线)
到目前为止,这是我的代码,-ltermcap
当你想编译它时使用 flag 并提前感谢。
shell - 如何仅重置 $(tput bold)?
我正在对日志进行一些后期格式化以提高可读性。
使用正则表达式,我的脚本可以识别流中的一些模式,并通过分别在文本的开头和结尾插入$(tput bold)
和值来使对应的文本变为粗体。$(tput sgr0)
流不是文本的,它已经包含一些特殊的格式转义序列,如颜色等。
问题是我无法弄清楚如何仅关闭粗体模式。使用$(tput sgr0)
会将所有其他当前终端设置降至默认值,包括颜色。
我曾经man terminfo
知道我应该使用什么“capname”。例如,我知道如何将一些文本设置为斜体,因为列表包含两者sitm
——capname toenter_italic_mode
和ritm
capname to exit_italic_mode
。
我想使用相同的方法使文本变为粗体,因为列表terminfo
包含. 但是既没有“exit_bold_name”字符串变量,也没有对应的capname!bold
enter_bold_mode
我错过了什么吗?我应该使用另一种方法吗?在我在 Internet 上找到的所有文章中,它仅使用sgr0
capname 解决方案。
c - C中架构x86_64 termcap.h的未定义符号
我有这个代码:
我无法编译它,因为我得到了
为什么会这样?
macOS 卡塔利娜
debugging - 如果项目需要库,如何使用 Cmake 在 Clion 中调试
我是 C 新手。我的代码使用 termcap 库。我正在尝试通过 Cmake 应用程序使用 Clion 调试我的代码。但它无法编译,因为我从库中使用的函数未定义。我应该在 CMakeLists.txt 中添加什么来调试我的项目?我的 CMakeLists.txt 现在:
当我使用 clang 编译时,我只是这样做:
它有效。不明白该怎么办。请帮忙。