2011-12-03 3 views
9

두 작업을 하나의 키 바인딩으로 결합하는 방법이 있습니까 (함수로는 작동하지 않을 것이라고 생각합니다). 전체를 호출 한 후,bash의 복잡한 키 바인딩

  1. 텍스트를 삽입
  2. 또는 -

    가 나는 키 바인딩을하고 싶습니다

    가합니다 (Ctrl-X 말) :

    는 내가하고 싶은 것입니다 메뉴 전체 ​​내가 (~/.inputrc에서)를 지정할 수 있다는 사실을 알고

완성을위한 기초로 삽입 된 텍스트를 사용하여,

( C-X: "ls")
  • 텍스트의
    • 삽입 실행의 readline 명령 (C-SPACE: menu-complete)

  • 하지만이 당신을 위해 작동 할 수 있습니다 함께

    답변

    13

    이에 대한 트릭은 당신의 키를 리 바인드 함수를 호출하는 것입니다. 내 예제에서 나는 텍스트를 삽입 C-B를 사용하는 것 대신 C-X의 메뉴 완성 전화. 내 예에서는 키를 희생해야합니다. C-t

    In.bashrc에, 또는 bash는 파일이 어떻게 작동

    set_Cb_to_insert_text() { 
        bind '"\C-m": accept-line' 
        bind '"\C-b":"ls \C-t1"' 
        bind -x '"\C-t1":set_Cb_to_complete' 
    } 
    set_Cb_to_complete() { 
        bind '"\C-m":"\C-t2\C-t3"' 
        bind '"\C-b": menu-complete' 
        bind '"\C-t2": accept-line' 
        bind -x '"\C-t3":set_Cb_to_insert_text' 
    } 
    set_Cb_to_insert_text 
    

    를 공급한다 : bind를 사용하면 세 가지 중 하나를 수행 키를 결합 할 수

    ,하지만 그들 중 어떤 조합 :

    • readline 명령을 실행하십시오 : bind '"key": command'
    • 일련의 키 입력을 실행하십시오 : bind '"key":"keystrokes"'
    • 쉘 명령을 실행하십시오 :당신이이 세 가지를 결합하려는 경우

    그래서, 당신이 내 예제에서 (키 입력의 개별 조합에 각각 결합해야합니다 코네티컷 {1, 2, 3 })이 모든 키 입력을 실행하기 위해 키를 바인드합니다. 예에서

    :

    C-B 제 인서트 차례로 menu-completeC-B을 바인드 set_Cb_to_complete 실행 ls 및 "프레스"C-t1,. 도에를 입력 재설정 set_Cb_to_insert_text 함수를 호출하여, ls을 삽입의 Cb을 라인을 그대로 사용하고 를 재설정 : 그것은 또한 가 CM, 캐리지 리턴, 또는 지금이 일을해야하기 때문에,를 입력 리 바인드 그것은 정상적으로 사용됩니다.

    내가 코네티컷 당신이 코네티컷 누르면, readline에 당신이 1, 2, 또는 바운드 키 중 하나를 누르려고하는 경우에보고 기다릴 것입니다, "희생"할 수 있다고 말했다 이유 시퀀스, 어떤 행동을 취하기 전에. 그러나 처음에 C-t을이 용도로 사용하면 모든 읽기 라인 속임수를 처리하기 위해 많은 양의 키 입력을위한 초기 키로 사용할 수 있습니다.

    충고 :이 글을 쓰고 테스트하는 동안 갑자기 뭔가 잘못된 장소에서 체인이 끊어 지거나 명령을 실행하지 않고 터미널에 걸렸으므로 accept-line에 대체 키를 바인딩하십시오.

    +0

    아이디어, 예제 및 자세한 대답을 주셔서 대단히 감사합니다. (예,하지만 당신은 bash + readline 프레임 워크와 그 한계 내에서 작업했습니다.) 내 게시물 이후 1 년 동안 나는 막연하게 내가 큰 그림에서 무엇을하려했는지 기억할 수 있습니다 ... 그래서 방금 당신의 예제가 작동하지만 이전에 성취하려고했던 것을 재현하는 데 더 많은 시간을 투자 할 것입니다 - 고마워요! – nhed

    4

    이러한을 넣어하는 방법을 잘 모르겠습니다 :

    "\ex": menu-complete 
    "\ez": "ls \ex" 
    

    ~/.inputrc 파일에 다음 내용을 포함하십시오.

    이 줄은 Alt-x를 menu-complete, Alt-z를 lsspacemenu-complete으로 설정합니다. 이렇게하면 디렉토리의 첫 번째 파일이 제공되고 Alt-x를 사용하여 한 번에 나머지 파일을 순환합니다.

    매크로의 더 많은 예제는 here을 참조하십시오.

    bind -p 또는 bind -Pbind -s을 호출하여 readline 명령을 체크하면 이미 가지고있는 매크로가 표시됩니다. 바인드 명령에 대해서는 here을 참조하십시오. 또한 매크로를 해제 할 수도 있습니다 (here 참조). 환경 변수가 /etc/Inputrc로 설정하고 내 개인 버전이 호출되고 있지 않았기 때문에 마지막으로 .inputrc 파일을 읽을되고 있음을 확인, 나는 문제가 있었다. 그것은 많은 작성한 Readline 명령에 대해 이미 사용으로

    은 BTW Control-X를 피하다.

    +0

    이것은 거의 트릭을하지만 후속 호출에는 2 개의 키 콤보가 필요합니다. 이미 텍스트 삽입을 묶는 법과 메뉴를 바인딩하는 방법에 대한 지식을 이미 가지고있었습니다. "Alt-z"두 번째로 디스플레이에'ls '을 표시하고 싶지만'ls ls '... – nhed

    +0

    이것은 동일한 키 조합으로 동작 전환을 원한다는 것을 암시합니다. readline 라이브러리의 문서를 읽을 때 유일한 조건절 교훈은 bash, emacs, ftp와 같은'mode '와 관련이 있습니다 ... 아마도이 경우에는 새로운 readline 함수를 작성해야 할 것입니다. [here] (http : // cnswww .cns.cwru.edu/php/chet/readline/readline.html # SEC23). BTW 이런 식으로 봐라. Alt-x와 Alt-z는 백만 킬로미터 떨어져 있지 않다. (물론 내 키보드에는 없다.) 메뉴 완성을위한 키 조합은 일반적으로 도움이된다. – potong

    +0

    사실, 내 Mac에서 언급 한 keycombos는 Esc-x, Esc-z에만 반응하며 후행하는 "\ ex"는 실제로 아무 것도하지 않는 것 같습니다 – nhed