2012-06-16 25 views
5

私は自分自身にncursesを教えようとしてきましたが、私はこれまでこれを愛しています。しかし、私はピコやナノのような小さなテキストエディターを書こうとしています。私はこれまでかなり良い設定をしています。私はキーをマッピングする関数を作成しました。私が何をしても、私はKEY_ENTERからの応答を得ることができません。私がそれを押すたびに、私は現在の行の始めに行きます。私はraw()を使って試しました。 「KEY_ENTER」の代わりに13を使用してください。他のすべてのキーは期待どおりに応答します。私は何かアドバイスをいただければ幸いです。私はこれを永遠に働かせようとしています。ありがとう! PDCurses documentationから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

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

raw()nonl()を呼び出してみてください。

'(いずれの場合も(コールaddchをNLとnonlルーチンは、基礎となる表示装置が入力に改行にリターンキーを変換するかどうかを制御し、それが出力にリターンとラインフィードに改行を変換するかどうかを\ n ')は、仮想スクリーン上のリターンと改行に相当します)。最初は、これらの翻訳が行われます。 nonlを使用してそれらを無効にすると、cursesはラインフィード機能をより有効に利用できるようになり、結果としてカーソルの動きが速くなります。また、cursesはリターンキーを検出することができます。

+1

hmm ....それはうまくいかなければならないようだが、それはしなかった。私はそれに気をつけています。あなたの助けをありがとう –

4

私はncurses.Alsoで私のために働いてくれました。実際にコードを更新してください。このコードは構文が間違っているためです。

+2

'10'は' libncurses5-dev'で私のために働いた – vyom

0

最近、同じKEY_ENTERの問題が発生しました。KEY_ENTERを10または\ n(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

可能性の高い問題は、テンキーの対通常のキーボード上の Enterキーを入力しキーの間でユーザーの混乱です。それらのの両方がコントロール/ M(13)を送信することができますが、必ずしもそうである必要はありません。端末の説明とKEY_ENTERはテンキーパッドを指します。

getchのためのncursesマニュアルページはNOTESでの動作を説明します

一部のキーは、一般的に使用されるコントロールキーと同じであってもよく、 例えば、KEY_ENTER制御/ M、KEY_BACKSPACE 対対コントロール/ H。いくつかのcursesの実装は、これらのコントロールキーを特に (またはterminfoを無視する)として扱うか、terminfo定義を使うかによって異なる場合があります。 Ncursesはterminfo定義を使用します。コントロール/ Mを押すと、 がKEY_ENTERがコントロール/ Mとなっていると、getchはKEY_ENTER を返します。

一般的に、KEY_ENTERによって送られた文字(s)はテンキー Enterキーを表し:

  • 端末記述が最も有用なキーを示し、

  • のキーをのキーボードに入力は、既に

  • は キャリッジ・リターンまたはいずれかを返すことができる通常のキーボード上の「エンター」 を押すと、呼ばれたnlnonlに応じて、キャリッジ・リターンおよび改行のための標準的なASCII文字で処理され改行、最後に

  • この「 」の標準的な説明は「Enter or send」です。

ラインフィードは、方法により、10であるが、Cにおいては、通常('\r'としてキャリッジリターン)'\n'として示されています。

関連する問題