使用 ncurses 在你的 Linux 屏幕上定位文本
大多數的 Linux 實用程序僅僅只在屏幕的底部滾動文本。如果你想在屏幕中放置你的文本,例如一個遊戲或者一個數據展示,你可以試試 ncurses。
curses 是一個舊的 Unix 庫,它可以在文本終端界面控制游標。curses 的名稱就來自於術語 「 游標控制 」。多年以後,其他人編寫了新的 curses 版本用來添加新的功能,新版本被叫做 「new curses」 或者 「ncurses」。你可以在每個流行的 Linux 發行版中找到 ncurses。儘管默認情況下可能未安裝開發庫、頭文件和文檔。例如,在 Fedora 上,你需要使用以下命令安裝 ncurses-devel
包:
$ sudo dnf install ncurses-devel
在程序中使用 ncurses
要在屏幕上直接定址,你首先需要初始化 ncurses
庫。大部分程序會通過以下三行來做到這一點:
initscr()
:初始化窗口對象和 ncurses 代碼,返回代表整個屏幕的窗口對象cbreak()
:禁用緩衝並使鍵入的輸入立即可用noecho()
:關閉回顯,因此用戶輸入不會顯示在屏幕上
這些函數定義在 curses.h
頭文件中,你需要在你的程序中通過以下方式將其包含進來:
#include <curses.h>
初始化終端後,你可以自由使用任何 ncurses 函數,我們將在示常式序中探討其中的一些函數。
當你使用完 ncurses 並想返回到常規終端模式下時,使用 endwin()
重置一切。此命令可以重置任何屏幕顏色,將游標移動到屏幕的左下角,並使游標可見。通常在退出程序之前執行此操作。
在屏幕上定址
關於 ncurses 首先需要知道的是屏幕的坐標分為行和列,左上角的是 0,0
點。ncurses 定義了兩個全局變數來幫助你識別屏幕:LINES
是屏幕的行數,COLS
是屏幕的列數。屏幕右下角的位置是 LINES-1,COLS-1
。
例如,如果你想要移動游標到第 10 行和第 30 列,你可以使用 move()
函數,移動到此坐標:
move(10, 30);
之後顯示的任何文本都將從屏幕的該位置開始。要顯示單個字元,請對單個字元使用 addch(c)
函數。要顯示字元串,將對字元串使用 addstr(s)
函數。對於類似於 printf
的格式化輸出,請使用帶有常用選項的 printw(fmt, ...)
。
移動到屏幕指定位置和顯示文本是一件很常見的事情,ncurses 提供了同時執行這兩項操作的快捷方式。mvaddch(row, col, c)
函數將在屏幕第 row
行,第 col
列的位置顯示一個字元。而 mvaddstr(row, col, s)
函數將在屏幕第 row
行,第 col
列的位置顯示一個字元串。舉個更直接的例子,在程序中使用 mvaddstr(10, 30, "Welcome to ncurses");
函數將從屏幕的第 10
行和第 30
列開始顯示文本 Welcome to ncurses
。使用 mvaddch(0, 0, '+')
函數將在屏幕的左上角第 0
行和第 0
列處顯示一個加號(+
)。
在終端屏幕上繪製文本會對某些系統產生性能影響,尤其是在較舊的硬體終端上。因此 ncurses 允許你「堆疊」一堆文本以顯示在屏幕上,然後使用 refresh()
函數使所有這些更改對用戶可見。
讓我們來看一個將以上所有內容整合在一起的簡單示例:
#include <curses.h>
int
main()
{
initscr();
cbreak();
noecho();
mvaddch(0, 0, '+');
mvaddch(LINES - 1, 0, '-');
mvaddstr(10, 30, "press any key to quit");
refresh();
getch();
endwin();
}
程序的開始初始化了一個終端窗口,然後在屏幕的左上角列印了一個加號,在左下角列印了一個減號,在第 10
行和第 30
列列印了 press any key to quit
文本。程序通過使用 getch()
函數接收了鍵盤輸入的單個字元,接著,使用 endwin()
函數在程序完全退出前重置了終端。
getch()
是一個很有用的函數,你可以使用它來做很多事情。我經常使用它在我退出程序前用來暫停。與大多數 ncurses 函數一樣,還有一個名為 mvgetch(row, col)
的 getch()
版本,用於在等待字元輸入之前移動到屏幕位置的第 row
行,第 col
列。
使用 ncurses 編譯
如果你嘗試以通常的方式編譯該示常式序,例如 gcc pause.c
,你可能會從鏈接器中獲得大量錯誤列表。那是因為 GNU C 編譯器不會自動鏈接 ncurses
庫。相反,你需要使用 -l ncurses
命令行選項載入它以進行鏈接。
$ gcc -o pause pause.c -lncurses
運行新程序將列印一條簡單的 press any key to quit
消息,該消息差不多位於屏幕中央:
圖 1:程序中居中的 「press any key to quit」 消息。
使用 ncurses 構建更好的程序
探索 ncurses
庫函數以了解在屏幕上顯示文本的其它方法。你可以在 ncurses
的手冊頁中找到所有 ncurses
函數的列表。這給出了 ncurses 的一般概述,並提供了不同 ncurses
函數的類似表格的列表,並參考了包含完整詳細信息的手冊頁。例如,在 curs_printw(3X)
手冊頁中描述了 printw
,可以通過以下方式查看:
$ man 3x curs_printw
更簡單點:
$ man curs_printw
使用 ncurses,你可以創建更多有趣的程序。通過在屏幕上的特定位置列印文本,你可以創建在終端中運行的遊戲和高級實用程序。
via: https://opensource.com/article/21/8/ncurses-linux
作者:Jim Hall 選題:lujun9972 譯者:perfiffer 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive