首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

基於 NCURSES Panel 的多窗口文本編輯器實現詳解

     編輯:關於C

項目概覽

結合面板庫實現一個支持三窗口並行編輯、鍵盤/鼠標導航、彩色語法高亮、文件讀寫持久化的文本編輯器。核心功能:

  • 三窗口錯開佈局,Tab 鍵循環切換活動窗口。
  • 功能鍵:F9 讀取、F10 保存、F11 確認退出、F12 刪除整行。
  • 方向鍵/回車/退格/鼠標點擊移動光標。
  • 每窗口獨立顏色配對(綠/藍/紅),邊框清晰分隔。
  • 用戶指針鏈表實現窗口循環切換邏輯。

關鍵數據結構與初始化

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;\
            }\
    }\
}

關鍵技術亮點

  1. 用戶指針實現窗口循環:set_panel_userptr 將面板串成環狀鏈表,Tab 鍵只需 top = panel_userptr(top) 即可 O(1) 切換,無需額外索引運算。
  2. 鼠標定位精確映射:event.y - 7、event.x - 7 扣除邊框與邊距偏移,將終端座標轉換為窗口內部座標。
  3. 色彩配對隔離:init_pair(1, GREEN, BLACK) 等,配合 wattron/wattroff 實現窗口級顏色隔離,互不干擾。
  4. 文件名動態生成:sprintf(filename, "myed%d.dat", nowwinid) 實現三窗口獨立存儲,切換窗口自動切換關聯文件。
  5. 退出確認對話框:在主窗口底部臨時打印提示,讀取單字符確認,避免誤操作丟失數據。

運行效果

三個彩色邊框窗口錯開顯示,支持並行編輯不同文件。Tab 鍵平滑切換活動窗口(頂層高亮),功能鍵操作直觀高效。
多窗口編輯器截圖

編譯命令

gcc -lncursesw -lpanel editor.c -o editor

擴展方向

  • 加入語法高亮(關鍵字著色)。
  • 實現撤銷/重做(環形緩衝區記錄操作)。
  • 支持分屏/多標籤(動態創建/銷毀面板)。
  • 集成 LSP(語言服務器協議)實現代碼補全、跳轉定義。

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved