Como mostrar o modo Vi atual ao usar as combinações de teclas Vi no shell?


15

Eu uso o vi keybindings no meu shell tcsh.

Agora, não sei em qual modo vi estou ( insert modo ou command modo), o que leva a muita frustração.

Alguém sabe de uma maneira de mostrar o modo vi atual no shell? (incluindo no prompt ou algo assim)

Respostas:


4

Eu não acredito que haja qualquer maneira de determinar visualmente em que modo você está, mas se você modificar um pouco seu comportamento, isso não importará.

Se você deseja estar no modo de comando, pressione ESC antes de digitar um comando.

Se você deseja estar no modo de inserção, pressione ESC ei antes de digitar o conteúdo.

Você vai acabar pressionando muito o ESC, mas todo usuário vi que eu já conheci faz isso de qualquer maneira.


1
O problema é que, no shell, os ESCs extras não são ignorados - quando eu der um ESC extra, então digite um comando (diga h para mover para a esquerda), ele simplesmente emitirá um sinal sonoro e não fará nada.
sundar

2
Por "ESC extra", quero dizer pressionando ESC quando eu já estou no modo de comando - o que eu faço muito desde que eu não sei em que modo eu estou.
sundar

Você está certo. Eu usei isso por tanto tempo que nem percebo esse comportamento por mais tempo. Mais uma vez, a resposta mais simples. Se você apertar ESC eh e nada acontecer, aperte h novamente. Eu acho que isso abre outra questão. Por que pressionar ESC enquanto no modo 'command' das vi keybindings faz com que o próximo caractere não seja interpretado corretamente? O próprio vi não faz isso. Eu posso digitar ESC 10 vezes e o próximo comando ainda funciona como previsto.
Bob Weber

Outra dica, desligue o sino. É incrivelmente irritante apenas pelo motivo que você descreve - e porque ele apita na conclusão da tabulação. Existem várias maneiras de fazer isso, dependendo do seu ambiente.
Bob Weber

1
Ok, atualmente estou testando essa solução. Mapeamento O Caps Lock to Escape tornou a implementação mais fácil, mas ainda estou me acostumando com o ESC-i para o modo de inserção. Espero que em breve. & gt; Se você apertar ESC eh e nada acontecer, pressione h novamente. O problema é que isso é bastante frustrante e quebra muito o fluxo. É uma coisa extra que tenho que pensar além do comando que estou formando. Eu prefiro o vi keybindings pela mesma razão que eles estão na minha memória muscular e dão uma coisa a menos para pensar - esse tipo de quebra que se propõem ...
sundar

3

Eu dei uma olhada na documentação, e eu tenho que dizer que não consegui encontrar nenhuma maneira de detectar e exibir o modo vi atual. Espero que você tenha uma agradável surpresa e alguém encontre uma solução, mas eu certamente não vejo uma maneira de fazer o que você pede.

Eu acho que há uma maneira de fazer isso, mas é um exagero enorme para um pequeno aborrecimento, e eu não acho que é isso que você tinha em mente quando você fez essa pergunta. Se isso for verdade, pare de ler agora e aproveite sua vida.

OTOH, se este é realmente o seu animal de estimação, e está deixando você louco, e você realmente quer desesperadamente bater no problema, aqui está minha ideia de como fazer isso:

  1. Obtenha uma cópia do Programação Avançada no Ambiente UNIX (R) por W. Richard Stevens.
  2. Leia os capítulos sobre Córregos e Terminal I / O.
  3. Faça o download do Código fonte ao livro acima mencionado, que inclui um exemplo de um fluxo que pode ser colocado em camadas em um terminal.
  4. Implemente sua manipulação para a combinação de teclas Esc (ou ambas as teclas de mudança de modo) e indique-a por meio de uma campainha ou manipulação de plano de fundo da linha atual.

Em resumo, o Unix implementa o terminal I / O como um fluxo de E / S full-duplex entre o driver do dispositivo e o processo do usuário, no qual os módulos podem ser inseridos. Ele é organizado como uma pilha, para que você possa colocar quantos fluxos desejar. A soma dos fluxos injetados cria seu comportamento de E / S terminal.

Quando um personagem é inserido, o primeiro módulo começa a inspecioná-lo e passá-lo (se quiser). Quando a resposta chega na direção oposta, ela recebe novamente a chance de inspecioná-la e transmiti-la. É assim que um Ctrl-C é manipulado em um nível mais alto para uma chave de caractere normal.

Você pode criar um binário implementando um módulo de fluxo, que, quando chamado, é executado silenciosamente no primeiro plano, inspecionando e transmitindo todos os pressionamentos de tecla, executando sua ação preferida nos pressionamentos de teclas de que você gosta. Para todos os efeitos, vai parecer que você está trabalhando no shell. Oooh Você pode invocar este binário na última (ou primeira, ou qualquer outra) linha do seu .tcshrc e você nem saberia que está lá.

Há um bom primer Aqui , mas não consegui encontrar muita coisa sobre esse assunto, provavelmente porque já passou do seu auge.


2

Esta página tem um script bastante detalhado que configura o que você quer (e mais) em zsh . Talvez ele possa ser adaptado para funcionar com o tcsh (não estou muito familiarizado com esse shell).


Eu não estou familiarizado com o tcsh, mas acho que a página que você mostrou usa widgets zsh (com zle). Eu não acho que outros shells tenham isso, mas se eles fizerem, isso definitivamente faria o truque.
BrianH

0

Edição de linha de comando com tcsh

Existem dois modos principais para editar a linha de comando,
com base nos dois editores de texto mais usados, Emacs e vi.

Com o vi ligações, você deve alternar entre inserir e comando modos;
comandos diferentes são úteis em cada modo.

vi modo tem dois submodos, inserir e comando modo.

  • O modo padrão é inserir .
  • Você pode alternar entre os modos pressionando Esc.
  • Alternativamente, em comando modo,
    digitar 'a' (acrescentar) ou 'i' (inserir) retornará você para inserir modo
    .

Mais notas no tcsh costumização página já vinculada acima.


2
Seus links vão para os livros da O'Reilly com copyright ...
BrianH

0

Eu tive o mesmo problema exato e por acaso encontrei a solução. Embora esse segmento seja antigo, não consegui encontrar nenhum outro site que oferecesse uma solução, então suponho que a postagem nesse tópico esteja correta.

Basta redefinir as configurações do seu programa de terminal ou shell. No momento, estou usando o PuTTY e acabei de excluir minhas configurações salvas da conexão salva e recriou uma sessão salva. Trabalhou como um encanto.

Espero que isto ajude!


0

Por favor, veja minha resposta em ASSIM . O Bash 4.4 / Readline 7.0 irá adicionar suporte para esta funcionalidade e, no ínterim, eu publiquei versões corrigidas do Bash 4.3 / Readline 6.3 para github .


0

Para qualquer um que tenha esse problema exato (como eu): encontrei uma solução stackoverflow . Aparentemente, há suporte nativo para isso em readline, então você pode simplesmente adicionar o seguinte ao seu ~/.inputrc:

set show-mode-in-prompt on

E para personalizar o uso real do personagem:

set vi-ins-mode-string "custom-ins"
set vi-cmd-mode-string "custom-cmd"
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.