Prompt de bash diferente para modo de edição de vi diferente?


113

Ao usar o modo vi (definir -o vi) com o Bash, seria bom ter um prompt que dependesse do modo em que você está atualmente (inserir ou comando). Como descobrir esse modo de edição?

A propósito, isso parece ser possível no ZSH :

bash  prompt 

Também estou curioso sobre isso. Estive procurando na documentação do bash, mas não encontrei nada.
Andrew Ferrier de

Respostas:


67

Fresh bash 4.3 e readline 6.3 têm algo para vocês .. do changelog:

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.

Então colocando

set show-mode-in-prompt on

em / etc / inputrc ou ~ / .inputrc (thx stooj) deve afetar todos os seus programas habilitados para leitura;)


algum status sobre isso? Estou tentando encontrar algo assim (não para o bash, mas para outros prompts baseados em readline que eu uso). Tenho pesquisado no Google e não encontrei nenhuma outra atualização (além desta e do artigo que você referiu )
Mike HR

4
Apenas adicionando a partir do eMPee584 - se você estiver executando o bash 4.3 ou superior, adicione o seguinte ao conjunto de arquivos ~ / .inputrc show-mode-in-prompt Isso adiciona um + à esquerda do prompt se você estiver no modo de edição , e a: se você estiver no modo de comando.
stooj

3
Então, enquanto isso funciona; existe uma maneira de mover para onde este personagem do modo vi senta no prompt? Se você tiver prompts de várias linhas (personalizados), isso não funciona muito bem :)
James Mills,

Para 4.3, está sempre no início do prompt e, infelizmente, readline irá redesenhar apenas a última linha de um prompt multilinha. Veja a resposta "Multiline prompt e .inputrc" para uma solução alternativa ou veja a resposta sobre patch do bash 4.3 com a correção do 4.4 para isso.
studgeek

20

O Bash 4.4 / Readline 7.0 adicionará suporte para strings de modo configuráveis ​​pelo usuário .

Você pode tentar as versões beta, mas elas parecem um pouco problemáticas no momento. Eles também não suportam especificar onde no prompt você deseja que o indicador de modo ocorra (que eu acho que é o recurso matador).

Se você não quiser esperar e não tem medo de uma pequena compilação, publiquei versões corrigidas do bash 4.3 e readline 6.3 no github que suportam essa funcionalidade.

Com as versões corrigidas, você pode fazer coisas como:

insira a descrição da imagem aqui

Mais detalhes, incluindo como instalar, estão disponíveis em https://github.com/calid/bash


19

Depois de pesquisar no google, examinar a página do manual do bash e, em seguida, examinar o código-fonte do bash (lib / readline / vi_mode.c), parece que não há uma maneira fácil de alterar o prompt ao passar do modo de inserção para o modo de comando. Parece que pode haver uma oportunidade aqui para alguém corrigir a fonte do bash, já que existem chamadas para iniciar e parar os modos na fonte.

Ao ver sua postagem, fiquei interessado na configuração do modo bash vi. Eu amo o vi e porque não na linha de comando. No entanto, parece que teremos que manter o controle se estamos no modo de inserção sem uma mudança imediata (assim dizemos muitos posts do fórum). Por que vale a pena você está sempre no modo de inserção, a menos que pressione ESC. Torna um pouco mais fácil, mas nem sempre tão intuitivo.

Estou levantando sua pergunta porque estou interessado em ver até onde isso vai dar.


7

Prompt multilinha e .inputrc

Inputrc tem uma opção para mostrar um +para inserir e :para o modo normal, adicionando set show-mode-in-prompt ono ~/.inputrccomo o eMPee584 escreveu, mas isso não funciona bem com prompt multilinha (com versões mais antigas do bash e readline).

Uma solução é ter uma única linha PS1( >) e uma função que ecoa algo antes do prompt. Ele é integrado ao bash e chamado PROMPT_COMMAND.

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

PROMPT_COMMAND='prompt' 

As strings de prompt usuais não estão disponíveis no eco de printf. O -eserve para interpretar códigos de cores, e não é necessário adicionar \[ou \], que não funciona de qualquer maneira.

Modo de inserção :

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

Modo normal :

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

Pressionando tab , apenas o PS1 é repetido, o que faz sentido para mim:

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

Antevisão (Fonte)


Se usar cores em vi-cmd-mode-stringou vi-ins-mode-string, elas devem ser prefixadas \1e pós-fixadas por \2. Veja aqui . Além disso, \[e \[ainda deve ser emitido, mas você precisará de \\[e \\]dentro de printf.
Tom Hale

1

Isso é o que eu tenho em ~/.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

O modo de inserção é colorido em azul.

└──[ins]

O modo de comando é colorido em amarelo.

└──[cmd]

A desvantagem é que ele não exibe um ttysignificado, ele só funciona em um emulador de terminal apenas nas cores.


0

Tento obter um indicador para o modo BASH vi também, e todos vocês aprenderam que parece simples e não há como fazer isso ainda.

Minha abordagem atual é: aperte 'a' quando não tiver certeza de qual modo é. SE 'a' aparecer após o BASH PROMOT, descubro que estou no modo 'INSERIR'. ENTÃO, clico em 'RETORNAR' e continuo. Esta é uma maneira fácil de resolver o pequeno incômodo.

A propósito, eu 'alias a =' cal ', ou qualquer outra coisa para dar ao hit vazio' um 'pouco de utilidade.


2
Faria mais sentido para mim apenas pressionar "esc || c- [" em vez de a. Então você não precisa olhar para saber em que modo está; ou insira caracteres indesejados que você precisa remover (ou pressione Enter)
wom

0

para prompt Multiline como esta imagem

meu trabalho é assim

meu prompt 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):"

espero que isso tenha ajudado você


0

Estilo diferente de prompt e cursor via .inputrc

Primeiro, você deve se certificar de que está executando uma versão do bash superior a 4.3:

$ bash --version
GNU bash, version 4.4

Em seguida, coloque as seguintes linhas em ~/.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

No modo de comando, o cursor é exibido como um bloco.
No modo de inserção, o cursor é exibido como uma barra vertical.

O prompt em si ficará assim, dependendo do modo:

(cmd)$ ... 
(ins)$ ...
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.