シェルでViキーバインドを使用しているときに現在のViモードを表示する方法は?


15

tcshシェルでviキーバインドを使用します。

今、私はどのviモード(insertモードまたはcommandモード)であるかわかりませんが、これは多くのフラストレーションにつながります。

誰もがシェルで現在のviモードを表示する方法を知っていますか?(プロンプトまたは何かに含めることにより)

回答:


4

自分のモードを視覚的に判断する方法はないと思いますが、振る舞いを少し変更しても問題はありません。

コマンドモードにしたい場合は、コマンドを入力する前にEscキーを押します。

挿入モードにする場合は、コンテンツを入力する前にEscキーとiキーを押します。

ESCを何度も押すことになりますが、私が出会ったすべてのviユーザーはとにかくそれを行います。


1
問題は、シェルで余分なESCが無視されないことです。余分なESCを入力してからコマンドを入力すると(たとえばhを左に移動する)、ビープ音が鳴り、何もしません。
スンダ

2
私は私がいるよ何モードかわからないので、私は多くを行う- 「余分ESC」によって、私はコマンドモードですでによESCを押す意味。
サンダーを-復活モニカ

あなたは正しいです。私はそれをあまりにも長く使ってきたので、その振る舞いに気付かないことさえあります。繰り返しますが、最も簡単な答えです。ESCとhを押しても何も起こらない場合は、もう一度hを押します。それは別の質問を開くと思います。viキーバインドの「コマンド」モードでEscキーを押すと、次の文字が正しく解釈されないのはなぜですか?vi自体はこれを行いません。ESCを10回入力しても、次のコマンドは予想どおりに機能します。
ボブウェーバー

別のヒント、ベルをオフにします。それはあなたが説明する理由だけで信じられないほど迷惑です-それはタブの完了時にビープ音を発するからです。これを行うには、環境に応じてさまざまな方法があります。
ボブウェーバー

1
[OK]を、私は現在、このソリューションを試してみています。Caps LockをEscapeにマッピングすることでこれを簡単に実装できますが、私はまだ挿入モードでESC-iに慣れていません。私はすぐに願っています。> ESCを押してもhが何も起こらない場合は、もう一度hを押します。これに伴う問題は、非常にイライラさせ、フローを大きく中断させます。私が形成しているコマンドに加えて、私が考えなければならない余分なことです。目的自体...という区切りのこの種-私は彼らが私の筋肉の記憶にいると考えるように1つの以下のものを与えることが非常に理由でviのキーバインドを好む
サンダー-復活モニカ

3

ドキュメントを見てきましたが、現在のviモードを検出して表示する方法が見つからなかったと言わざるを得ません。嬉しい驚きがあり、誰かが解決策を思いつくことを願っていますが、私は確かにあなたが求めていることをする方法を見つけることができません。

これを行う方法はあると思いますが、それはほんの少しの迷惑には大げさなやり過ぎであり、この質問を提起したときにそれが念頭にあったとは思いません。これが本当なら、今読んで停止し、あなたの人生を楽しんでください。

OTOH、これが本当にあなたのペットの忍耐であり、それがあなたを狂わせている場合、あなたは本当にこの問題を絶対に必死に叩きたいのであれば、それをどうするかについての私の考えは次のとおりです:

  1. W. Richard StevensによるUNIX(R)環境での高度なプログラミングのコピーを入手してください。
  2. StreamsおよびTerminal I / O の章を読んでください。
  3. 上記の本にソースコードをダウンロードします。この本には、端末に階層化できるストリームの例が含まれています。
  4. Escキーの組み合わせ(または両方のモード変更キー押下)の処理を実装し、ベルまたは現在の行のバックグラウンド操作でそれを示します。

手短に言えば、Unixは端末I / Oを、モジュールを挿入できるデバイスドライバーとユーザープロセス間の全二重I / Oストリームとして実装します。スタックとして編成されているため、必要な数のストリームを階層化できます。注入されたストリームの合計により、ターミナルI / O動作が作成されます。

文字が入力されると、最初のモジュールがその文字を検査し、渡します(必要な場合)。応答が反対方向に届くと、再度検査して渡す機会が得られます。これは、Ctrl-Cが通常の文字キーよりも高いレベルで処理される方法です。

ストリームモジュールを実装するバイナリを作成できます。これは、呼び出されるとフォアグラウンドでサイレントに実行され、すべてのキーストロークを検査して渡し、関心のあるキーストロークで好みのアクションを実行します。すべての意図と目的のために、あたかもシェルで作業しているように見えます。おー このバイナリは、.tcshrcの最後の(または最初の、または任意の)行で呼び出すことができ、そこにあることさえ知りません。

ここには優れた入門書がありますが、このトピックについてはあまり見当たりませんでした。おそらくそれが首相を過ぎているからでしょう。


2

このページには、zshで必要なもの(およびそれ以上)をセットアップするかなり詳細なスクリプトがあります。おそらく、tcshで動作するように適合させることができます(私はそのシェルにそれほど精通していません)。


私もtcshに精通していませんが、あなたが示したページではzshウィジェット(zleを使用)を使用していると思います。私は他のシェルがそれを持っているとは思わないが、もしそうなら、それは間違いなくトリックを行うだろう。
BrianH

1

このような問題を抱えている人(私のように)に:stackoverflowで解決策を見つけました。どうやらこれはreadlineでネイティブにサポートされているため、次のものをに追加するだけです~/.inputrc

set show-mode-in-prompt on

実際のキャラクターの使用をカスタマイズするには:

set vi-ins-mode-string "custom-ins"
set vi-cmd-mode-string "custom-cmd"

0

tcshを使用したコマンドライン編集


最も一般的に使用される2つのテキストエディタであるEmacsとvi に基づいて、コマンドラインを編集するための2つの主なモードがあります。

viのバインディング、あなたは切り替える必要があり、インサートコマンドモード。
各モードで異なるコマンドが役立ちます。

viモードには、挿入モードとコマンドモードの2つのサブモードがあります。

  • デフォルトのモードはinsertです。
  • を押すと、モードを切り替えることができますEsc
  • または、コマンドモードで
    「a」(追加)または「i」(挿入)を入力すると、挿入モードに戻ります

既に上記にリンクされているtcshカスタマイズページに関するその他のメモ。


2
あなたのリンクは著作権で保護されたオライリーの本に行きます
...-BrianH

0

私はまったく同じ問題を抱えていて、偶然にも解決策を見つけました。このスレッドは古いですが、解決策を提供する他のWebサイトが見つからなかったため、このスレッドに投稿しても大丈夫だと思います。

端末プログラムまたはシェルの設定をリセットするだけです。現在PuTTYを使用していますが、保存した接続の保存した設定を削除し、保存したセッションを再作成しました。魅力のように働いた。

お役に立てれば!


0

SOに関する私の答えをご覧ください。Bash 4.4 / Readline 7.0は、この機能のサポートを追加します。暫定的に、パッチ版のBash 4.3 / Readline 6.3をgithubに公開しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.