私はfzfを使ってVimでファイルを開く関数にCtrlVmyをマッピングしました。.bash_profile
うまくいきますが、Python REPLを終了するたびに、次のようになるまでマッピングは機能しません。.bash_profile
二重または、新しいシェルセッションを開始します。
再現段階:
.bash_profile
問題を再現するには、次の最小限のアプローチを使用してください。stty lnext ^- bind -x '"\C-v": "echo mapping works"'
Bashセッションを開始します。
- >を押してCtrlV出力を表示します
mapping works
。ランニング
python3
。REPLを使用
exit()
または終了します。CtrlDCtrlVデフォルトの動作に戻ります。
source ~/.bash_profile
マッピングはまだ機能しませんか?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インストーラとbash
Homebrewからインポートされた私のシステムに関するいくつかの情報です。
~ $ 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 -l
。bash_profile read
bashを起動したときにそれが得られたことを確認してください。
解決策:
最善の方法は、ファイルにキーバインディングを設定することです~/.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は正常に機能します。