2012-06-16 23 views
5

我一直在試圖教自己ncurses,我很喜歡它。但是,我正在嘗試編寫一個像pico或nano這樣的小文本編輯器。到目前爲止,我的設置相當不錯。我創建了一個映射鍵的函數。無論我做什麼,我都無法得到KEY_ENTER的迴應。每當我按下它,它就會轉到我所在的當前行的開頭。我試過用raw();並使用13而不是「KEY_ENTER」沒有運氣。所有其他鍵按預期響應。我將不勝感激任何建議。我一直在盯着這個試圖讓它永遠工作的東西。謝謝!ncurses- KEY_ENTER失敗

void keymaps(){ 

    int ch; 
    keypad(stdscr,TRUE); 
     case KEY_UP: 
      addstr("Up\n"); 
      break; 
     case KEY_LEFT: 
      addstr("Left\n"); 
      break; 
     case KEY_RIGHT: 
      addstr("Right\n"); 
      break; 
     case KEY_BACKSPACE: 
      delch(); 
      break; 
     case Key_Enter: 
      addstr("You pressed Enter\n"); 
     default: 
      break; 
     } 
     refresh(); 
    } while(ch != KEY_HOME); 
} 

回答

1

PDCurses documentation

#define KEY_ENTER 0x157 /* enter or send (unreliable) */ 

嘗試raw()後調用nonl()

的n1和NONL例程控制底層顯示設備是否轉換了返回鍵插入輸入新行,以及是否它轉換換行符插入輸出返回和換行(在任一情況下,呼叫addch('\ n')在虛擬屏幕上進行等價的返回和換行)。最初,這些翻譯確實發生。如果您使用nonl禁用它們,curses將能夠更好地使用換行功能,從而加快光標移動速度。此外,curses將能夠檢測到返回鍵。

+1

嗯....似乎應該已經工作,但它沒有。我會繼續玩弄它。感謝您的幫助 –

4

嘗試10 as ASCII值...在ncurses上爲我工作。也請更新實際的代碼,因爲您放置的代碼是錯誤的語法。

+2

'10'爲'libncurses5-dev'工作 – vyom

0

我最近得到了同樣的KEY_ENTER的問題,我用10或\ n更換KEY_ENTER,這是ASCII新線固定它。

#include <ncurses.h> 
int main() { 
    initscr(); /* init ncurses */ 
    keypad(stdscr, TRUE); /* get keyboard input */ 
    addstr("Press enter to exit.\n"); 
    while (10 != getch()) {} /* 10 == enter */ 
    endwin(); /* end ncurses */ 
    return 0; 
} 
3

的可能的問題是數字小鍵盤上的回車普通鍵盤相對於鍵進入鍵之間的用戶混淆。那些可能都發送一個控制/ M(13),但不一定。終端描述和KEY_ENTER指的是數字鍵盤。

getch Ncurses的手冊頁解釋在NOTES行爲:

某些密鑰可以是相同的常用控制鍵, 例如KEY_ENTER相對於對照/ M,KEY_BACKSPACE與 控制/H。一些詛咒的實現可能會因爲他們是否特意處理這些控制鍵而有所不同(並且忽略terminfo),或者使用terminfo定義。 Ncurses使用terminfo定義。如果說 即KEY_ENTER是控制/ M,getch將返回KEY_ENTER 當你按下control/M。

通常,KEY_ENTER表示由 發送的字符(或多個)數字鍵盤上輸入鍵:

  • 終端描述列出了最有用的鍵,

  • 輸入普通鍵盤已經由回車和換行的標準ASCII字符來處理,這取決於是否nlnonl被稱爲

  • ,按 「進入」常規鍵盤上可能會返回一個 回車或換行,最後

  • 「輸入或發送」是此 密鑰的標準描述。

換行,順便說一下,爲10.但是,在C,它通常表示爲'\n'(和回車作爲'\r')。