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?
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.NewFeaturesinReadline
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.
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:
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.
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.
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 _
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.
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.
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)
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.
Respostas:
Fresh bash 4.3 e readline 6.3 têm algo para vocês .. do changelog:
Então colocando
em / etc / inputrc ou ~ / .inputrc (thx stooj) deve afetar todos os seus programas habilitados para leitura;)
fonte
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:
Mais detalhes, incluindo como instalar, estão disponíveis em https://github.com/calid/bash
fonte
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.
fonte
Prompt multilinha e
.inputrc
Inputrc tem uma opção para mostrar um
+
para inserir e:
para o modo normal, adicionandoset show-mode-in-prompt on
o~/.inputrc
como 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 chamadoPROMPT_COMMAND
.As strings de prompt usuais não estão disponíveis no eco de printf. O
-e
serve para interpretar códigos de cores, e não é necessário adicionar\[
ou\]
, que não funciona de qualquer maneira.Modo de inserção :
Modo normal :
Pressionando tab , apenas o PS1 é repetido, o que faz sentido para mim:
(Fonte)
fonte
vi-cmd-mode-string
ouvi-ins-mode-string
, elas devem ser prefixadas\1
e pós-fixadas por\2
. Veja aqui . Além disso,\[
e\[
ainda deve ser emitido, mas você precisará de\\[
e\\]
dentro de printf.Isso é o que eu tenho em
~/.inputrc
O modo de inserção é colorido em azul.
O modo de comando é colorido em amarelo.
A desvantagem é que ele não exibe um
tty
significado, ele só funciona em um emulador de terminal apenas nas cores.fonte
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.
fonte
para prompt Multiline como esta imagem
meu trabalho é assim
meu prompt bash
.inputrc
espero que isso tenha ajudado você
fonte
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
:Em seguida, coloque as seguintes linhas em
~/.inputrc
: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:
fonte