結合面板庫實現一個支持三窗口並行編輯、鍵盤/鼠標導航、彩色語法高亮、文件讀寫持久化的文本編輯器。核心功能:
WINDOW *mywins[3];\
PANEL *mypanels[3];\
PANEL *top;\
char filename[10];\
int nowwinid = 2; // 當前活動窗口索引\
\
// 初始化三窗口\
for (i = 0; i < 3; ++i) {\
mywins[i] = newwin(height, width, begin_y, begin_x);\
keypad(mywins[i], TRUE); // 啟用功能鍵\
wattron(mywins[i], COLOR_PAIR(i+1));\
mypanels[i] = new_panel(mywins[i]);\
box(mywins[i], ACS_VLINE, ACS_HLINE);\
wattroff(mywins[i], COLOR_PAIR(i+1));\
begin_y += 4; begin_x += 4;\
}\
\
// 用戶指針構成循環鏈表:0→1→2→0\
set_panel_userptr(mypanels[0], mypanels[1]);\
set_panel_userptr(mypanels[1], mypanels[2]);\
set_panel_userptr(mypanels[2], mypanels[0]);\
top = mypanels[2];\
\
update_panels();\
doupdate();
while (1) {\
int c = mvwgetch(mywins[nowwinid], y, x);\
switch (c) {\
case KEY_MOUSE:\
if (getmouse(&event) == OK && (event.bstate & BUTTON1_PRESSED)) {\
y = event.y - 7; x = event.x - 7;\
wmove(mywins[nowwinid], y, x);\
}\
break;\
case KEY_BACKSPACE: /* 退格邏輯 */ break;\
case KEY_RIGHT: /* 右移邏輯 */ break;\
case KEY_LEFT: /* 左移邏輯 */ break;\
case KEY_UP: /* 上移邏輯 */ break;\
case KEY_DOWN: /* 下移邏輯 */ break;\
case 10: /* Enter 換行 */ break;\
case KEY_F(9): /* F9 讀取文件 */ break;\
case KEY_F(10): /* F10 保存文件 */ break;\
case KEY_F(11): /* F11 退出確認 */ break;\
case KEY_F(12): /* F12 刪除整行 */ break;\
case '\t': /* Tab 切換窗口 */\
nowwinid = (nowwinid + 1) % 3;\
top = (PANEL*)panel_userptr(top);\
top_panel(top);\
update_panels(); doupdate();\
sprintf(filename, "myed%d.dat", nowwinid);\
getyx(mywins[nowwinid], y, x); ++y; ++x;\
break;\
default:\
if (c >= 32 && c <= 126) { // 可打印字符\
waddch(mywins[nowwinid], c);\
++x;\
}\
}\
}
set_panel_userptr 將面板串成環狀鏈表,Tab 鍵只需 top = panel_userptr(top) 即可 O(1) 切換,無需額外索引運算。event.y - 7、event.x - 7 扣除邊框與邊距偏移,將終端座標轉換為窗口內部座標。init_pair(1, GREEN, BLACK) 等,配合 wattron/wattroff 實現窗口級顏色隔離,互不干擾。sprintf(filename, "myed%d.dat", nowwinid) 實現三窗口獨立存儲,切換窗口自動切換關聯文件。三個彩色邊框窗口錯開顯示,支持並行編輯不同文件。Tab 鍵平滑切換活動窗口(頂層高亮),功能鍵操作直觀高效。

gcc -lncursesw -lpanel editor.c -o editor
此編輯器展示了 NCURSES Panel 在構建實用 TUI 應用中的強大能力:窗口管理、輸入多路復用、狀態隔離、持久化集成,是從「玩具程序」邁向「生產力工具」的關鍵一步。