在老式的电传打字机终端时代,终端远离计算机,并通过串行电缆连接到计算机。可以通过发送一系列字节来配置终端。终端的所有功能(例如将光标移动到新位置、擦除屏幕的一部分、滚动屏幕、更改模式等)都可以通过这些字节序列来访问。这些控制序列通常称为转义序列,因为它们以转义 (0x1B) 字符开头。即使在今天,通过适当的模拟,我们也可以向模拟器发送转义序列,并在终端窗口上实现相同的效果。
假设您想用彩色打印一行。请在您的控制台上尝试输入以下内容。
echo "^[[0;31;40mIn Color" |
第一个字符是转义字符,看起来像两个字符 ^ 和 [。为了能够打印它,您必须按 CTRL+V,然后按 ESC 键。所有其他字符都是正常的打印字符。您应该能够看到红色的字符串“In Color”。它会保持这种状态,要恢复到原始模式,请键入以下内容。
echo "^[[0;37;40m" |
现在,这些神奇的字符是什么意思呢?难以理解吗?它们甚至可能因终端而异。因此,UNIX 的设计者发明了一种名为termcap的机制。它是一个文件,列出了特定终端的所有功能,以及实现特定效果所需的转义序列。在后来的几年里,这被terminfo取代。在不深入太多细节的情况下,这种机制允许应用程序查询 terminfo 数据库并获取要发送到终端或终端模拟器的控制字符。
您可能想知道,所有这些技术术语的重要性是什么。在上述场景中,每个应用程序都应该查询 terminfo 并执行必要的操作(发送控制字符等)。很快,管理这种复杂性变得困难,这催生了“CURSES”。Curses 是对名称“cursor optimization”(光标优化)的双关语。Curses 库构成了一个在原始终端代码之上工作的包装器,并提供了高度灵活和高效的 API(应用程序编程接口)。它提供了移动光标、创建窗口、产生颜色、操作鼠标等功能。应用程序无需担心底层终端功能。
那么什么是 NCURSES?NCURSES 是原始 System V Release 4.0 (SVr4) curses 的克隆。它是一个可自由分发的库,完全兼容旧版本的 curses。简而言之,它是一个函数库,用于管理应用程序在字符单元终端上的显示。在本文档的其余部分,术语 curses 和 ncurses 可以互换使用。
NCURSES 的详细历史记录可以在源代码分发包中的 NEWS 文件中找到。当前的软件包由 Thomas Dickey 维护。您可以通过 bug-ncurses@gnu.org 联系维护人员。
NCURSES 不仅为终端功能创建了一个包装器,还提供了一个强大的框架,可以在文本模式下创建漂亮的 UI(用户界面)。它提供了创建窗口等功能。它的姊妹库 panel、menu 和 form 提供了对基本 curses 库的扩展。这些库通常与 curses 一起提供。可以创建包含多个窗口、菜单、面板和表单的应用程序。窗口可以独立管理,可以提供“可滚动性”,甚至可以隐藏。
菜单为用户提供了简单的命令选择选项。表单允许创建易于使用的数据输入和显示窗口。面板扩展了 ncurses 的功能,以处理重叠和堆叠的窗口。
这些只是我们可以使用 ncurses 完成的一些基本事情。随着我们继续前进,我们将看到这些库的所有功能。
好的,现在您知道可以使用 ncurses 做什么了,您一定迫不及待地想开始了。NCURSES 通常随您的安装一起提供。如果您没有该库或想自行编译它,请继续阅读。
编译软件包
NCURSES 可以从 ftp://ftp.gnu.org/pub/gnu/ncurses/ncurses.tar.gz 或 https://gnu.ac.cn/order/ftp.html 中提到的任何 ftp 站点获取。
请阅读 README 和 INSTALL 文件,了解有关如何安装它的详细信息。它通常涉及以下操作。
tar zxvf ncurses<version>.tar.gz # unzip and untar the archive cd ncurses<version> # cd to the directory ./configure # configure the build according to your # environment make # make it su root # become root make install # install it |
使用 RPM
NCURSES RPM 可以在 http://rpmfind.net 找到并下载。RPM 可以使用以下命令在成为 root 用户后安装。
rpm -i <downloaded rpm> |
本文档旨在成为使用 ncurses 及其姊妹库进行编程的“All in One”指南。我们从简单的“Hello World”程序逐步过渡到更复杂的表单操作。本文档不假设您有任何 ncurses 的先验经验。写作风格是非正式的,但为每个示例都提供了很多细节。
文档中的所有程序都以压缩形式 在此处 提供。解压缩并解 tar。目录结构如下所示。
ncurses | |----> JustForFun -- just for fun programs |----> basics -- basic programs |----> demo -- output files go into this directory after make | | | |----> exe -- exe files of all example programs |----> forms -- programs related to form library |----> menus -- programs related to menus library |----> panels -- programs related to panels library |----> perl -- perl equivalents of the examples (contributed | by Anuradha Ratnaweera) |----> Makefile -- the top level Makefile |----> README -- the top level README file. contains instructions |----> COPYING -- copyright notice |
各个目录包含以下文件。
Description of files in each directory -------------------------------------- JustForFun | |----> hanoi.c -- The Towers of Hanoi Solver |----> life.c -- The Game of Life demo |----> magic.c -- An Odd Order Magic Square builder |----> queens.c -- The famous N-Queens Solver |----> shuffle.c -- A fun game, if you have time to kill |----> tt.c -- A very trivial typing tutor basics | |----> acs_vars.c -- ACS_ variables example |----> hello_world.c -- Simple "Hello World" Program |----> init_func_example.c -- Initialization functions example |----> key_code.c -- Shows the scan code of the key pressed |----> mouse_menu.c -- A menu accessible by mouse |----> other_border.c -- Shows usage of other border functions apa | -- rt from box() |----> printw_example.c -- A very simple printw() example |----> scanw_example.c -- A very simple getstr() example |----> simple_attr.c -- A program that can print a c file with | -- comments in attribute |----> simple_color.c -- A simple example demonstrating colors |----> simple_key.c -- A menu accessible with keyboard UP, DOWN | -- arrows |----> temp_leave.c -- Demonstrates temporarily leaving curses mode |----> win_border.c -- Shows Creation of windows and borders |----> with_chgat.c -- chgat() usage example forms | |----> form_attrib.c -- Usage of field attributes |----> form_options.c -- Usage of field options |----> form_simple.c -- A simple form example |----> form_win.c -- Demo of windows associated with forms menus | |----> menu_attrib.c -- Usage of menu attributes |----> menu_item_data.c -- Usage of item_name() etc.. functions |----> menu_multi_column.c -- Creates multi columnar menus |----> menu_scroll.c -- Demonstrates scrolling capability of menus |----> menu_simple.c -- A simple menu accessed by arrow keys |----> menu_toggle.c -- Creates multi valued menus and explains | -- REQ_TOGGLE_ITEM |----> menu_userptr.c -- Usage of user pointer |----> menu_win.c -- Demo of windows associated with menus panels | |----> panel_browse.c -- Panel browsing through tab. Usage of user | -- pointer |----> panel_hide.c -- Hiding and Un hiding of panels |----> panel_resize.c -- Moving and resizing of panels |----> panel_simple.c -- A simple panel example perl |----> 01-10.pl -- Perl equivalents of first ten example programs |
主目录中包含一个顶层 Makefile。它构建所有文件并将准备使用的 exes 放在 demo/exe 目录中。您也可以通过进入相应的目录来执行选择性 make。每个目录都包含一个 README 文件,解释了目录中每个 c 文件的用途。
对于每个示例,我都包含了相对于 examples 目录的文件路径名。
如果您喜欢浏览单个程序,请将您的浏览器指向 https://tldp.cn/HOWTO/NCURSES-Programming-HOWTO/ncurses_programs/
所有程序均根据与 ncurses (MIT-style) 相同的许可发布。这使您能够执行几乎任何操作,除了声明它们是您的。随意在您的程序中酌情使用它们。
本 howto 也可在 tldp.org 站点上以各种其他格式提供。以下是本文档其他格式的链接。
如果以上链接已损坏,或者您想尝试 sgml,请继续阅读。
Get both the source and the tar,gzipped programs, available at http://cvsview.tldp.org/index.cgi/LDP/howto/docbook/ NCURSES-HOWTO/NCURSES-Programming-HOWTO.sgml http://cvsview.tldp.org/index.cgi/LDP/howto/docbook/ NCURSES-HOWTO/ncurses_programs.tar.gz Unzip ncurses_programs.tar.gz with tar zxvf ncurses_programs.tar.gz Use jade to create various formats. For example if you just want to create the multiple html files, you would use jade -t sgml -i html -d <path to docbook html stylesheet> NCURSES-Programming-HOWTO.sgml to get pdf, first create a single html file of the HOWTO with jade -t sgml -i html -d <path to docbook html stylesheet> -V nochunks NCURSES-Programming-HOWTO.sgml > NCURSES-ONE-BIG-FILE.html then use htmldoc to get pdf file with htmldoc --size universal -t pdf --firstpage p1 -f <output file name.pdf> NCURSES-ONE-BIG-FILE.html for ps, you would use htmldoc --size universal -t ps --firstpage p1 -f <output file name.ps> NCURSES-ONE-BIG-FILE.html |
有关更多详细信息,请参阅 LDP 作者指南。如果一切都失败了,请发送邮件至 ppadala@gmail.com
我感谢 Sharath 和 Emre Akbas 在一些章节中对我的帮助。引言最初由 sharath 撰写。我重写了它,并从他的初步工作中摘取了一些内容。Emre 帮助撰写了 printw 和 scanw 部分。
示例程序的 Perl 等价物由 Anuradha Ratnaweera 贡献。
然后是 Ravi Parimi,我最亲爱的朋友,早在写下第一行代码之前,他就参与了这个项目。他不断地向我提出建议,并耐心地审阅了全文。他还检查了每个程序在 Linux 和 Solaris 上的运行情况。
这是愿望清单,按优先级排序。如果您有愿望或想致力于完成愿望,请发送邮件至 我。
为表单部分的最后部分添加示例。
准备一个演示,展示所有程序,并允许用户浏览每个程序的描述。让用户编译并查看程序的运行效果。首选基于对话框的界面。
添加调试信息。_tracef, _tracemouse 等。
使用 ncurses 软件包提供的函数访问 termcap, terminfo。
同时在两个终端上工作。
为杂项部分添加更多内容。
版权所有 © 2001 Pradeep Padala。
特此授予许可,对获得本软件和相关文档文件(“软件”)副本的任何人免费,以不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、带修改分发、再许可和/或销售软件副本的权利,并允许向其提供软件的人员这样做,但须遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
本软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,上述版权持有者均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权诉讼或其他诉讼中,由本软件或本软件的使用或其他交易引起、产生或与之相关。
除非本声明中包含的内容,否则未经事先书面授权,不得在广告或其他方面使用上述版权持有者的姓名来推销、使用或以其他方式处理本软件。