해결책:

해결책:

나는 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매핑에 영향을 미치는 이유는 무엇입니까(다른 매핑에서는 발생하지 않음)? 매핑 작업을 시작하려면 내 프로필을 두 번 가져와야 하는 이유는 무엇입니까?


다음은 실행의 샘플 출력입니다 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를 변경하는 문제를 재현할 수 없습니다.
하지만 바인딩 키가 작동하려면(의 출력) 파일을 두 번 가져와야 한다는 것을 확인할 수 있습니다 mapping works.

다음을 시작해야 합니다.기록bash 세션을 .bash_profile읽을 수 있습니다. 다음과 같은 파일:

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

bash가 호출될 때만 유효합니다 bash -l. bash_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이 제대로 작동합니다.

관련 정보