Linux中國

使用 ncurses 在你的 Linux 屏幕上定位文本

大多數的 Linux 實用程序僅僅只在屏幕的底部滾動文本。如果你想在屏幕中放置你的文本,例如一個遊戲或者一個數據展示,你可以試試 ncurses。

curses 是一個舊的 Unix 庫,它可以在文本終端界面控制游標。curses 的名稱就來自於術語 「 游標控制 cursor control 」。多年以後,其他人編寫了新的 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, &apos;+&apos;) 函數將在屏幕的左上角第 0 行和第 0 列處顯示一個加號(+)。

在終端屏幕上繪製文本會對某些系統產生性能影響,尤其是在較舊的硬體終端上。因此 ncurses 允許你「堆疊」一堆文本以顯示在屏幕上,然後使用 refresh() 函數使所有這些更改對用戶可見。

讓我們來看一個將以上所有內容整合在一起的簡單示例:

#include <curses.h>

int
main()
{
  initscr();
  cbreak();
  noecho();

  mvaddch(0, 0, &apos;+&apos;);
  mvaddch(LINES - 1, 0, &apos;-&apos;);
  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消息,該消息差不多位於屏幕中央:

centered message in a program window

圖 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

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    這個站點使用 Akismet 來減少垃圾評論。了解你的評論數據如何被處理

    More in:Linux中國

    Linux中國

    捐贈 Let&apos;s Encrypt,共建安全的互聯網

    隨著 Mozilla、蘋果和谷歌對沃通和 StartCom 這兩家 CA 公司處罰落定,很多使用這兩家 CA 所簽發證書的網站紛紛尋求新的證書籤發商。有一個非盈利組織可以為大家提供了免費、可靠和安全的 SSL 證書服務,這就是 Let's Encrypt 項目。現在,它需要您的幫助
    Linux中國

    關於Linux防火牆iptables的面試問答

    Nishita Agarwal是Tecmint的用戶,她將分享關於她剛剛經歷的一家公司(印度的一家私人公司Pune)的面試經驗。在面試中她被問及許多不同的問題,但她是iptables方面的專家,因此她想分享這些關於iptables的問題和相應的答案給那些以後可能會進行相關面試的人。 所有的問題和相應的答案都基於Nishita Agarwal的記憶並經過了重寫。 嗨,朋友!我叫Nishita Agarwal。我已經取得了理學學士學位,我的專業集中在UNIX和它的變種(BSD,Linux)。它們一直深深的吸引著我。我在存儲方面有1年多的經驗。我正在尋求職業上的變化,並將供職於印度的P
    Linux中國

    Lets Encrypt 已被所有主流瀏覽器所信任

    旨在讓每個網站都能使用 HTTPS 加密的非贏利組織 Lets Encrypt 已經得了 IdenTrust的交叉簽名,這意味著其證書現在已經可以被所有主流的瀏覽器所信任。從這個裡程碑事件開始,訪問者訪問使用了Lets Encrypt 證書的網站不再需要特別配置就可以得到 HTTPS 安全保護了。 Lets Encrypt 的兩個中級證書 ...