OS/2を使わないから

OS/2を使わないから

行編集モードでは、左右のless矢印キーがカーソルを前後に移動します。約束どおりに単語ごとにナビゲートするためにコントロールキーで使用したいと思いますman less

       ^LEFTARROW [ ESC-b or ESC-LEFTARROW ]
              (That is, CONTROL and LEFTARROW simultaneously.)  Move the cursor one word to the left.

       ^RIGHTARROW [ ESC-w or ESC-RIGHTARROW ]
              (That is, CONTROL and RIGHTARROW simultaneously.)  Move the cursor one word to the right.

残念ながら、これは私の端末で動作しないようです。 (Fedora 28のTilix 1.8.3、VTE 0.52、GTK 3.22.30)。代わりに、Control-左を押すと、認識できない内容が印刷されます。次の例では、入力してalpha betaすぐにCtrl-左を押します。このESC[1;5D行に追加されます。

[1]

ここに設定エラーはありますか?他のアプリケーション(vimControl-LeftやControl-Rightなど)は、期待どおりに単語ごとにナビゲートします。

今後、Ctrl+左/右矢印キーの問題、関連性がある可能性があります方向キー入力less

答え1

試してAlt+wください。Alt+b

勝つ順方向検索に使用されます。第二逆に使用されます。

答え2

OS/2を使わないから

私は真剣だった。

OS/2 入力処理コードは次のとおりです。less⎈ Control+および⎈ Control+コードを内部SK_CTL_LEFT_ARROWおよびイベントにマッピングする「特殊キー」がありますSK_CTL_RIGHT_ARROW

Unixコードに対応するマッピングはありません。これは悪名高い欠陥のあるtermcapに依存します。

docoの角かっこ内の内容は正しい内容で、括弧内の内容は誤った内容です。誰かがうまくいくまで、、⎋ Escape B⎋ Escape Fsic ⎋ Escape !)と(sic!)シーケンス(コードではありません)を使用する必要があります。報告書を提出してください。⎋ Escape less

(一部の端末エミュレータでは、修飾キーに⎋ Escapeanプレフィックスを付けるように設定できます。これは、すべての端末エミュレータと端末、特にここで入力制御シーケンスがエミュレートされる端末(逆にC​​SIシーケンス)に適用されるわけではありません。less(端末自体から受け取った最初の文字には、lessそのような修飾語の概念がないということです。)

追加読書

答え3

less用語キャップtermcapインターフェースを使用するアプリケーションは、特定の端末について「知っている」すべての情報を取得します。 〜しない限り開発者はいくつかを紹介しました。ハードコーディング行動(私が言及しない非常に少数のプログラムで行われるようなもの)、lessこれらのキーの組み合わせは標準機能ではないためサポートされていません(たとえば参照)。 用語キャップ「ncurses」にリストされている機能列用語情報(5))そしていいえ2- 割り当てられた役割の名前(参照端末データベース拡張の要約)。

ところで、審判私の答え簡単に見てください。ソースコード、左/右に対応する項目は表示されません。言葉Shift(左/右Shiftの意図した意味ではない場合)A_LSHIFTそしてA_RSHIFT)。 子供の責めこの内容と「word」のマニュアルページの説明は、2007年(バージョン394)までさかのぼります。 2016年基準ではさらに有望に見えます。

    SK(SK_CTL_RIGHT_ARROW),0,       A_RRSHIFT,
    SK(SK_CTL_LEFT_ARROW),0,        A_LLSHIFT

しかし、チェックインコメントにはこんな感じです。

commit e5c195113d1666ac506ea3f65545d436d96fe099
Author: Mark Nudelman <[email protected]>
Date:   Sat Oct 22 15:25:44 2016 +0000

    New commands ESC-{ and ESC-} to shift to start/end of displayed lines.

コードを読んでください(command.c) 組み込みの場合、以下の結論と変わらない。lessスクロールするリスト(単一文字)の代わりに性格しかし、OPのコメントは以下を指摘しています。

    ESC,SK(SK_LEFT_ARROW),0,        EC_W_LEFT,      /* ESC LEFTARROW */
    SK(SK_CTL_LEFT_ARROW),0,        EC_W_LEFT,      /* CTRL-LEFTARROW */
    ESC,'w',0,                      EC_W_RIGHT,     /* ESC w */
    ESC,SK(SK_RIGHT_ARROW),0,       EC_W_RIGHT,     /* ESC RIGHTARROW */
    SK(SK_CTL_RIGHT_ARROW),0,       EC_W_RIGHT,     /* CTRL-RIGHTARROW */

使用するspace「単語」区切り文字として使用されます。おそらく、開発者がこれらの変更を加えたとき、彼は両方を可能にするviを模倣しようと思ったでしょう(viは性格いろいろな方法で分かれています。)

*Escapeleft-arrow提案などを提供するには、表の次の行を使用してください。

    ESC,SK(SK_LEFT_ARROW),0,        EC_W_LEFT,      /* ESC LEFTARROW */

    ESC,SK(SK_RIGHT_ARROW),0,       EC_W_RIGHT,     /* ESC RIGHTARROW */

しかし、現在のプログラムには何も含まれていません。仕事対応SK_CTL_RIGHT_ARROWまたはSK_CTL_LEFT_ARROW記号を使用します。これはいくつかのキー、例えばケースステートメント(または少なくとも近くのどこか):

            switch (*++p)
            {
            case 'u': ch = SK_UP_ARROW; break;
            case 'd': ch = SK_DOWN_ARROW; break;
            case 'r': ch = SK_RIGHT_ARROW; break;
            case 'l': ch = SK_LEFT_ARROW; break;
            case 'U': ch = SK_PAGE_UP; break;
            case 'D': ch = SK_PAGE_DOWN; break;
            case 'h': ch = SK_HOME; break;
            case 'e': ch = SK_END; break;
            case 'x': ch = SK_DELETE; break;
            default:
                error("illegal char after \\k", NULL_PARG);
                *pp = p+1;
                return ("");
            }

コードに割り当てがない場合は、ハードコードされたものだけを構成できません。

MSDOS / OS / 2構成は(ハードコードされた)表を持っている点でUnix構成とは異なります。キーコード:

#if MSDOS_COMPILER || OS2
        static char k_right[]           = { '\340', PCK_RIGHT, 0 };
        static char k_left[]            = { '\340', PCK_LEFT, 0  };
        static char k_ctl_right[]       = { '\340', PCK_CTL_RIGHT, 0  };
        static char k_ctl_left[]        = { '\340', PCK_CTL_LEFT, 0  };

そして規定されたケースステートメント:

#if MSDOS_COMPILER || OS2
        case SK_INSERT:
                s = k_insert;
                break;
        case SK_CTL_LEFT_ARROW:
                s = k_ctl_left;
                break;
        case SK_CTL_RIGHT_ARROW:
                s = k_ctl_right;
                break;

(注:まだ割り当てられていないため、これらのケースは使用されません。)一方、termcap設定ではこれらのシンボルはまったく使用されません。 (termcapは、自分が使用できる2文字ニーモニックを作成するのが難しく、この状況を実装するためにいくつかの修正を加えると、必要に応じて動作するという意味で「拡張可能」です。)

lesskeyにもう一度アクセスしてください。マニュアルページ、次のように言います。

アクションの後には、以下を含めることができます。「追加の」ひも。 lessの実行中にこれらのコマンドが入力されると、操作が実行され、追加の文字列はless内に入力されたかのように解析されます。この機能は、特定の状況でコマンド機能を拡張するために使用できます。例えば「{」そして「:ティー」次の例では、コマンドを使用します。これ 追加 文字列には特別な意味があります。「辞める」処置:lessが終了すると、追加の文字列の最初の文字が終了状態として使用されます。

これは、次のことができることを意味します。

\e[1;5D     noaction \e\e[D
\e[1;5C     noaction \e\e[C

マッピング済み追加文字列事前定義された単語の移動を使用します。

答え4

私はついにこれをすることができました。 (著者に連絡したところless、彼の答えは私が状況を必要以上に複雑にしていることを指摘しました。)

これがlesskey私が使用した設定ファイルです。

#! /usr/bin/env lesskey
#line-edit
\e[1;5D word-left
\e[1;5C word-right
\e[3;5~ word-delete

このファイルでlesskeyを実行し、新しいインスタンスを起動しCtrl-←Ctrl-→スペースで区切られていますか?)、単語ごとに移動して、Ctrl-Delete現在の単語の最後まで削除します。このソリューションの欠点は、端末エミュレータで生成された特定のエスケープシーケンスでハードコーディングされていることです。他の回答では、一般的な「コントロール+矢印キー」メカニズムが不可能な理由について説明します。

関連情報