다른 vi 편집 모드에 대한 다른 bash 프롬프트?


113

Bash와 함께 vi 모드 (set -o vi)를 사용할 때 현재 사용중인 모드 (삽입 또는 명령)에 따라 달라지는 프롬프트가 있으면 좋을 것입니다. 이 편집 모드를 어떻게 알 수 있습니까?

Btw, 이것은 ZSH 에서 가능한 것 같습니다 .

bash  prompt 

이것에 대해서도 궁금합니다. bash 문서를 살펴 보았지만 아무것도 찾지 못했습니다.
Andrew Ferrier

답변:


67

신선한 bash 4.3과 readline 6.3은 여러분을위한 무언가를 가지고 있습니다.

4.  New Features in Readline
j.  New user-settable variable, show-mode-in-prompt, adds a characters to the
    beginning of the prompt indicating the current editing mode.

그래서 퍼팅

set show-mode-in-prompt on

/ etc / inputrc 또는 ~ / .inputrc (thx stooj)로 들어가면 모든 readline 지원 프로그램에 영향을 미칩니다.)


이것에 대한 어떤 상태? 나는 이와 같은 것을 찾으려고합니다 (bash가 아니라 내가 사용하는 다른 readline 기반 프롬프트). 인터넷 검색을했지만 다른 업데이트를 찾지 못했습니다 (이 문서와 참조한 기사 제외하고 )
Mike HR

4
eMPee584에서 추가하십시오-bash 4.3 이상을 실행중인 경우 ~ / .inputrc 파일 세트에 다음을 추가하십시오. show-mode-in-prompt 편집 모드에있는 경우 프롬프트 맨 왼쪽에 +가 추가됩니다. , a : 명령 모드 인 경우.
stooj

3
그래서 이것이 작동하는 동안; 이 vi 모드 캐릭터가 프롬프트에서 앉는 위치를 이동할 수있는 방법이 있습니까? 여러 줄로 된 프롬프트 (사용자 정의)가있는 경우 잘 작동하지 않습니다. :)
James Mills

4.3의 경우 항상 프롬프트의 시작 부분에 있으며 불행히도 readline은 여러 줄 프롬프트의 마지막 줄만 다시 그립니다. 해결 방법은 "Multiline prompt and .inputrc"답변을 참조하거나 bash 4.3을 4.4의 수정 사항으로 패치하는 방법에 대한 답변을 참조하십시오.
studgeek

20

Bash 4.4 / Readline 7.0 은 사용자 설정 가능 모드 문자열에 대한 지원을 추가합니다 .

베타 버전을 사용해 볼 수 있지만 현재로서는 약간 버그가있는 것 같습니다. 그들은 또한 프롬프트에서 모드 표시기를 발생시킬 위치를 지정하는 것을 아직 지원하지 않습니다 (제가 생각하기에 킬러 기능이라고 생각합니다).

기다리지 않고 약간의 컴파일을 두려워하지 않는다면,이 기능을 지원하는 bash 4.3 및 readline 6.3 패치 버전을 github에 게시했습니다.

패치 된 버전을 사용하면 다음과 같은 작업을 수행 할 수 있습니다.

여기에 이미지 설명 입력

설치 방법을 포함한 자세한 내용은 https://github.com/calid/bash 에서 확인할 수 있습니다.


19

google을 검색하고 bash man 페이지를 살펴본 다음 bash 소스 코드 (lib / readline / vi_mode.c)를 살펴보면 삽입 모드에서 명령 모드로 이동할 때 프롬프트를 쉽게 변경할 수있는 방법이없는 것 같습니다. 소스에서 모드를 시작하고 중지하기위한 호출이 있기 때문에 누군가가 bash 소스를 패치 할 수있는 기회가있을 수 있습니다.

귀하의 게시물을 보았을 때 bash vi 모드 설정에 관심이 생겼습니다. 나는 vi를 좋아하고 왜 명령 줄에 있지 않을까요? 그러나 우리는 즉각적인 변경없이 삽입 모드에 있는지 추적해야 할 것 같습니다 (많은 포럼 게시물이 그렇습니다). ESC를 누르지 않는 한 항상 삽입 모드에있는 것이 가치있는 일입니다. 조금 더 쉽게 만들지 만 항상 직관적 인 것은 아닙니다.

나는 이것이 어디로 가는지보고 싶어서 귀하의 질문을 올리고 있습니다.


7

여러 줄 프롬프트 및 .inputrc

INPUTRC는 표시 할 수있는 옵션이 +삽입과 :추가하여, 정상 모드 set show-mode-in-prompt on~/.inputrceMPee584가 쓴, 그러나이 프롬프트 (배쉬와 readline에 이전 버전의) 여러 잘 작동하지 않습니다.

솔루션에는 한 줄 PS1( >)과 프롬프트 전에 무언가를 에코하는 함수가 있습니다. bash에 내장되어 있으며 PROMPT_COMMAND.

function prompt {
    PS1=' > '
    echo -e "$(date +%R)  $PWD"
}

PROMPT_COMMAND='prompt' 

일반적인 프롬프트 문자열은 printf의 echo에서 사용할 수 없습니다. 는 -einterprete 색상 코드로이며, 추가 할 필요가 없습니다 \[또는 \]어쨌든 작동하지 않는다.

삽입 모드 :

20:57   /home/sshbio/dotfiles/bash
+ > _

일반 모드 :

20:57   /home/sshbio/dotfiles/bash
: > _

Tab 키를 누르면 PS1 만 반복됩니다.

20:57   /home/sshbio/dotfiles/bash
+ > ls _
bashrc      bash_profile     inputrc
+ > ls _

시사 (출처)


vi-cmd-mode-string또는 vi-ins-mode-string에서 색상을 사용하는 경우 접두사 \1및 뒤에를 붙여야 합니다 \2. 여기를 참조 하십시오 . 또한, \[\[여전히 방출해야한다,하지만 당신은해야 \\[하고 \\]내부의 printf.
Tom Hale

1

이것은 내가 가진 것입니다 ~/.inputrc

set show-mode-in-prompt on
set vi-ins-mode-string \1\e[34;1m\2└──[ins] \1\e[0m\2
set vi-cmd-mode-string \1\e[33;1m\2└──[cmd] \1\e[0m\2

삽입 모드는 파란색입니다.

└──[ins]

명령 모드는 노란색으로 표시됩니다.

└──[cmd]

단점은 tty터미널 에뮬레이터에서만 작동한다는 의미로 표시되지 않는다는 것입니다.


0

나는 또한 BASH vi 모드에 대한 표시기를 얻으려고 노력하고 있으며, 여러분 모두는 그것이 간단하고 아직 할 방법이 없다는 것을 배웠습니다.

내 현재 접근 방식은 : 어떤 모드인지 확실하지 않을 때 'a'를 누르십시오. BASH PROMOT 후 'a'가 나타나면 'INSERT'모드임을 알 수 있습니다. 그런 다음 'RETURN'을 누르고 계속합니다. 이것은 제가 작은 성가심을 해결하는 쉬운 방법입니다.

그건 그렇고, 나는 'alias a ='cal ', 또는 빈 히트'a '에 약간의 유용성을 부여하는 다른 것입니다.


2
a보다는 "esc || c- ["를 누르는 것이 나에게 더 합리적 일 것입니다. 그러면 어떤 모드인지 알 필요가 없습니다. 또는 제거해야하는 원치 않는 문자를 삽입하십시오 (또는 Return을 누르십시오)
wom

0

이미지 와 같은 여러 줄 프롬프트

내 작업 arround는 다음과 같습니다.

내 bash 프롬프트

export PS1=" ┌錄 \[\e[32m\]\u\[\e[m\]\[\e[32m\]@\[\e[m\]\[\e[32m\]\h\[\e[m\] \w \\$ \n "

.inputrc

set show-mode-in-prompt on
set vi-ins-mode-string " └──錄 (ins):"
set vi-cmd-mode-string " └──錄 (cmd):"

이것이 당신을 도왔기를 바랍니다


0

다른 프롬프트 및 커서 스타일을 통해 .inputrc

먼저 다음보다 높은 bash 버전을 실행하고 있는지 확인해야합니다 4.3.

$ bash --version
GNU bash, version 4.4

그런 다음 다음 줄을 입력하십시오 ~/.inputrc.

#################### VIM ####################
# FOR MORE INFORMATION CHECK:
# https://wiki.archlinux.org/index.php/Readline

# TURN ON VIM (E.G. FOR READLINE)
set editing-mode vi

# SHOW THE VIM MODE IN THE PROMPT (COMMAND OR INSERT)
set show-mode-in-prompt on

# SET THE MODE STRING AND CURSOR TO INDICATE THE VIM MODE
#   FOR THE NUMBER AFTER `\e[`:
#     0: blinking block
#     1: blinking block (default)
#     2: steady block
#     3: blinking underline
#     4: steady underline
#     5: blinking bar (xterm)
#     6: steady bar (xterm)
set vi-ins-mode-string (ins)\1\e[5 q\2
set vi-cmd-mode-string (cmd)\1\e[1 q\2

명령 모드에서는 커서가 블록으로 표시됩니다.
삽입 모드에서는 커서가 세로 막대로 표시됩니다.

프롬프트 자체는 모드에 따라 다음과 같이 표시됩니다.

(cmd)$ ... 
(ins)$ ...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.