在終端環境下開發互動式文本編輯器,是學習 Ncurses 庫的經典切入點。本文將從零開始,構建一個僅具備基本輸入功能的單屏編輯器,重點講解鍵盤事件捕捉、窗口管理與色彩設置等核心機制。
首先引入必要的頭文件,並初始化 Ncurses 環境:
#include <locale.h>
#include <stdio.h>
#include <ncurses.h>
int main(int argc, char *argv[]) {
setlocale(LC_ALL, "");
initscr(); // 初始化標準屏幕
clear(); // 清屏
noecho(); // 關閉鍵盤回顯
cbreak(); // 禁用行緩衝,逐字符讀取
檢查終端是否支持色彩,若不支持則退出:
if (has_colors() == FALSE) {
endwin();
printf("您的終端不支持色彩!\n");
return 1;
}
start_color(); // 啟動色彩機制
init_pair(1, COLOR_GREEN, COLOR_BLACK); // 定義色彩對:綠字黑底
利用 newwin 在屏幕中央創建一個帶邊框的子窗口,並啟用鍵盤模式以捕捉方向鍵等特殊按鍵:
int width = COLS - 14;
int height = LINES - 14;
int x, y;
WINDOW *win1 = newwin(height, width, 7, 7); // (行數, 列數, 起始y, 起始x)
keypad(win1, TRUE); // 啟用功能鍵捕捉
box(win1, ACS_VLINE, ACS_HLINE); // 繪製邊框
wattron(win1, COLOR_PAIR(1)); // 應用色彩
wrefresh(win1); // 刷新窗口顯示
getyx(win1, y, x); // 獲取當前光標位置
++y; ++x; // 移至內部可編輯區域起始處
使用 mvwgetch 在指定坐標讀取字符,並實現基本的換行與邊界環繞邏輯:
while (1) {
int c = mvwgetch(win1, y, x); // 在(y,x)處讀取字符
++x;
// 自動換行邏輯
if (x >= width - 1) {
++y;
x = 1;
}
if (y >= height - 1) {
y = 1;
}
mvwprintw(win1, y, x, "%c", c); // 顯示輸入字符
wrefresh(win1);
}
gcc -lncursesw a.c -o mytest
./mytest
編譯時需鏈接 ncursesw 庫(支持寬字符)。運行後將出現一個綠色邊框的編輯窗口,可自由輸入字符,超出邊界自動換行環繞。
此版本為最基礎原型,後續可擴展:方向鍵移動光標、退格刪除、保存/讀取文件、多窗口切換等功能,將在後續文章中逐步實現。
