解決策:

解決策:

私はfzfを使ってVimでファイルを開く関数にCtrlVmyをマッピングしました。.bash_profileうまくいきますが、Python REPLを終了するたびに、次のようになるまでマッピングは機能しません。.bash_profile 二重または、新しいシェルセッションを開始します。

再現段階:

  1. .bash_profile問題を再現するには、次の最小限のアプローチを使用してください。

    stty lnext ^-
    bind -x '"\C-v": "echo mapping works"'
    
  2. Bashセッションを開始します。

  3. - >を押してCtrlV出力を表示しますmapping works

  4. ランニングpython3

  5. REPLを使用exit()または終了します。CtrlD

  6. CtrlVデフォルトの動作に戻ります。

  7. source ~/.bash_profileマッピングはまだ機能しませんか?

  8. source ~/.bash_profileこれでCtrlV正しく作成されましたmapping works。どうですか?

Python REPLを起動/終了すると、私のCtrlVマッピングに影響するのはなぜですか(他のマッピングでは発生しません)。マッピング操作を開始するには、自分のプロファイルを2回インポートする必要があるのはなぜですか?


以下は実行のサンプル出力ですstty -a | grep lnext

~ $ stty -a | grep lnext
    lnext = <undef>; min = 1; quit = ^\; reprint = ^R; start = ^Q;
~ $ python3
Python 3.8.2 (v3.8.2:7b3ab5921f, Feb 24 2020, 17:52:18)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
~ $ stty -a | grep lnext
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
~ $ source ~/.bash_profile
~ $ stty -a | grep lnext
    lnext = <undef>; min = 1; quit = ^\; reprint = ^R; start = ^Q;
~ $ source ~/.bash_profile
~ $ stty -a | grep lnext
    lnext = <undef>; min = 1; quit = ^\; reprint = ^R; start = ^Q;

python3以下は、python.orgインストーラとbashHomebrewからインポートされた私のシステムに関するいくつかの情報です。

~ $ which python3
/usr/local/bin/python3
~ $ python3 --version
Python 3.8.2
~ $ which bash
/usr/local/bin/bash
~ $ bash --version
GNU bash, version 5.0.17(1)-release (x86_64-apple-darwin19.4.0)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
~ $ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.5
BuildVersion:   19F101

私のシステムに関する追加情報は次のとおりです。

~ $ echo $BASH_VERSION
5.0.17(1)-release
~ $ lsof -p $$
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF                NODE NAME
bash    78982 eero  cwd    DIR    1,5     1568              359056 /Users/eero
bash    78982 eero  txt    REG    1,5   991320             4660332 /usr/local/Cellar/bash/5.0.17/bin/bash
bash    78982 eero  txt    REG    1,5  1568368 1152921500312627066 /usr/lib/dyld
bash    78982 eero    0u   CHR   16,2   0t3107                 985 /dev/ttys002
bash    78982 eero    1u   CHR   16,2   0t3107                 985 /dev/ttys002
bash    78982 eero    2u   CHR   16,2   0t3107                 985 /dev/ttys002
bash    78982 eero  255u   CHR   16,2   0t3107                 985 /dev/ttys002
~ $ /usr/local/bin/bash -li
~ $

答え1

REPL Pythonを離れてlnextを変更する問題を再現することはできません。
ただし、バインディングキーが機能するには(の出力)ファイルを2回インポートする必要があることを確認できますmapping works

以下を開始する必要があります。記録bashセッションを.bash_profile読むことができます。次のファイル:

$ cat ~/.bash_profile
echo bash_profile read
#stty lnext ^-
stty lnext ''

bashが呼び出されたときにのみ有効ですbash -lbash_profile readbashを起動したときにそれが得られたことを確認してください。

解決策:

最善の方法は、ファイルにキーバインディングを設定することです~/.inputrc

$ cat ~/.inputrc
#bind -x '"\C-v": "echo mapping works"'
\C-v: "echo mapping works\C-m"

その後、読み取りバインディングを使用できます。Ctrl-x Ctrl-r他のものは必要ありません。一度実行すると、キーバインディングはbashで機能します。そしてbashが始まると読み込まれます。

それでも削除する必要がある場合同じttyのキーバインディング:

$ cat ~/.bash_profile
echo bash_profile read
#stty lnext ^-
stty lnext ''

IME を使用すると、lnext ''より一貫した結果が得られます。必要に応じてエコーを削除またはコメントアウトします。

次へ追加
bind -x実行を(完全に)模倣する方法はありません。シェル注文する。

しかし、コマンドとは何ですか? Enterで終わる文字列だけです。
それを入れて~/.inputrc

\C-v: "echo 'yes\!. It works.'\n"

~/.inputrcファイルをもう一度読んでみてください\C-v
(IME)を一緒に使用するのが最善です\C-m

コマンドを入力する前に行を消去するには、次のようにします。

\C-v: "\C-e\C-x\C-?echo 'yes\!. It works.'\C-m\C-y"

しかし、より複雑なバインディングは、未知の理由で失敗する可能性が高いことに注意してください。試してみてください。たぶんそれはあなたに役立ちます。その場合、正常との唯一の違いは、実行されたbind -xコマンドが履歴に保存されることです(IMHO、重要ではありません)。

関連:

答え2

@ISAACの回答正確でうまく動作しますが、最終的な解決策ははるかに簡単です。stty lnext ...私の行全体を削除する.bash_profileと、マッピングCtrlVは正常に機能します。

関連情報