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 :
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 :
Respostas:
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;)
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
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
Inputrc tem uma opção para mostrar um +
para inserir e :
para o modo normal, adicionando set 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 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 -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 :
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 _
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 tty
significado, 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.
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ê
.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)$ ...