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 :


fonte
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;)

eMPee584
fonte
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

Dylan Cali
fonte
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.

Jeremy Heslop
fonte
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)

user3034472
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.

Jetchisel
fonte
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.

Andrew_1510
fonte
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ê

marca
fonte
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)$ ...
Winklerrr
fonte