9

私は小さなPython/cursesアプリを作成しようとしています。

しかし、私が見る限り、 CTRL+JまたはEnter押されたかどうかを判断する方法はありません。これは、両方が同じASCIIコード(10)を持っているという事実が原因である可能性があります。

http://en.wikipedia.org/wiki/Control_character#In_ASCII

しかし、VIMはこれら2つの違いをどのように見分けることができますか?

4

3 に答える 3

13

Enter通常、Cmと同等です。ただし、icrnlフラグがttyに対してアクティブである場合(を参照stty -a)、入力Cmは自動的にCjに変換されます(そのため、を押すだけでUnixで終了する行を簡単に入力できますEnter)。

プレーンCでは、termios関数tcgetattr(3)およびtcsetattr(3)c_iflagを使用して、入力時にCmがCjに変換されないようにICRNLフラグの設定を解除できます。入力と出力を完全に制御したい場合は、「raw」モードを使用します(すべての入力と出力の処理を無効にします)。Pythonにはこれらのtermios関数があるようです。

cursesライブラリには、ttyモードを処理するための高レベルの関数がいくつかあります:savetty(3)resetty(3)nonl(3)raw(3)cbreak(3)など。Pythonにもこれらのcursesがあるようです。関数

cursesライブラリの他のビットを使用している場合は、その関数を使用してICRNLフラグ(たとえば、nonl(3))を調整し、ライブラリが行った仮定(つまり、ttyが一方向に設定しますが、termiosレベルの呼び出しは状況を変え、その仮定を破ります)。

于 2013-01-31T05:39:53.443 に答える
0

<C-J>と同等で<NL>あり、ではありません<CR>(これはに対応し<C-M>ます):

:echo "\<C-J>" ==# "\<CR>"
0
:echo "\<C-J>" ==# "\<NL>"
1

したがって、あなたの仮定は間違っています。Vimでさえそれらを区別することはできません。キーボード入力が内部で処理される方法と、端末とそのAPIの長く複雑な歴史のために、これらのキーを区別することは困難ですが、(ほとんどの最新の端末エミュレーターでは)これは今日可能です。

一部の人々(主にPaul LeoNerd Evans)は、Vimの問題を修正したいと考えており、さまざまな提案を行っています。http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

しかし、今日の時点では、パッチやボランティアはまだ提供されていませんが、多くの人が将来のVim8メジャーリリースでこれを使用したいという希望を表明しています。Pythonでこの問題を解決する方法はわかりませんが、リンクされたディスカッションから洞察の塊を見つけることができます。

于 2013-01-31T08:43:56.503 に答える
0

私は思いません<ctrl-J>Enter、同じです。vimでは、<ctrl-j>キーコードは10ですが、Enter13です。

いくつかの同等のキーがあります、例えば

<ctrl-M> and Enter
<ctrl-H> and backspace
<ctrl-[> and ESC
...

どのモードを使用していても、vimでテストでき、同じことを実行でき<ctrl-M>ます。Enter

実際には、別のキーの組み合わせがありますが、これもとと区別するのが困難<Enter>です<Ctrl-M><C-Enter>何を達成したいのかわからないのですが、端末開発(ncurses)を行いたいとおっしゃっていましたが、端末がそれらのキーを区別できない場合は、そのままにしておくことができます。私はncursesの経験がありません、私が間違っていたとしても怒ってはいけません。^ _ ^

入力:h keycodesすると詳細が表示されます。以下の表はvimヘルプからコピーされたものです。

notation    meaning         equivalent  decimal value(s)    ~
-----------------------------------------------------------------------
<Nul>       zero            CTRL-@    0 (stored as 10) *<Nul>*
<BS>        backspace       CTRL-H    8 *backspace*
<Tab>       tab         CTRL-I    9 *tab* *Tab*
                            *linefeed*
<NL>        linefeed        CTRL-J   10 (used for <Nul>)
<FF>        formfeed        CTRL-L   12 *formfeed*
<CR>        carriage return     CTRL-M   13 *carriage-return*
<Return>    same as <CR>                *<Return>*
<Enter>     same as <CR>                *<Enter>*
<Esc>       escape          CTRL-[   27 *escape* *<Esc>*
<Space>     space                32 *space*
<lt>        less-than       <    60 *<lt>*
<Bslash>    backslash       \    92 *backslash* *<Bslash>*
<Bar>       vertical bar        |   124 *<Bar>*
<Del>       delete              127
<CSI>       command sequence intro  ALT-Esc 155 *<CSI>*
<xCSI>      CSI when typed in the GUI       *<xCSI>*
于 2013-01-31T00:18:35.417 に答える