私は小さなPython/cursesアプリを作成しようとしています。
しかし、私が見る限り、 CTRL+JまたはEnter押されたかどうかを判断する方法はありません。これは、両方が同じASCIIコード(10)を持っているという事実が原因である可能性があります。
http://en.wikipedia.org/wiki/Control_character#In_ASCII
しかし、VIMはこれら2つの違いをどのように見分けることができますか?
私は小さなPython/cursesアプリを作成しようとしています。
しかし、私が見る限り、 CTRL+JまたはEnter押されたかどうかを判断する方法はありません。これは、両方が同じASCIIコード(10)を持っているという事実が原因である可能性があります。
http://en.wikipedia.org/wiki/Control_character#In_ASCII
しかし、VIMはこれら2つの違いをどのように見分けることができますか?
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レベルの呼び出しは状況を変え、その仮定を破ります)。
<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でこの問題を解決する方法はわかりませんが、リンクされたディスカッションから洞察の塊を見つけることができます。
私は思いません<ctrl-J>
しEnter
、同じです。vimでは、<ctrl-j>
キーコードは10ですが、Enter
13です。
いくつかの同等のキーがあります、例えば
<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>*