나는 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매핑에 영향을 미치는 이유는 무엇입니까(다른 매핑에서는 발생하지 않음)? 매핑 작업을 시작하려면 내 프로필을 두 번 가져와야 하는 이유는 무엇입니까?
다음은 실행의 샘플 출력입니다 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를 변경하는 문제를 재현할 수 없습니다.
하지만 바인딩 키가 작동하려면(의 출력) 파일을 두 번 가져와야 한다는 것을 확인할 수 있습니다 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이 제대로 작동합니다.