Usando chaves VI para editar comandos de shell no UNIX


28

Eu costumava ter um colega de trabalho muito bom no UNIX.

Ele me mostrou como usar as teclas de atalho Vi para editar meus comandos de shell.

Ele colocou o comando em um arquivo que era executado toda vez que eu fazia login.

Desde então, mudei para um projeto diferente.

Infelizmente, não me lembro de como configurar isso.

Existe alguém aqui que sabe como usar as combinações de teclas Vi para editar comandos no terminal?

Como posso tornar essa configuração permanente?

Respostas:


31

Você está falando sobre o melhor recurso de todos os tempos!

Você pode usar os comandos vi para editar comandos do shell (e histórico de comandos) adicionando isto ao seu .bashrcarquivo:

set -o vi

Você também pode executar esse comando na linha de comando para afetar apenas sua sessão atual.

Se você não usar o bash, substitua o arquivo rc apropriado pelo seu shell.


Isso permite que você use os comandos vi para editar qualquer comando ...

Você também pode usar je kpara percorrer seu histórico (depois de pressionar ESC).

Você também pode usar /(depois de pressionar ESC) para procurar comandos antigos.

Em outras palavras, para encontrar o cpcomando super longo que você fez dez minutos atrás:

ESC/cpENTER

Depois, você pode percorrer todos os comandos correspondentes do seu histórico com ne N.

Tudo isso me torna 10 trilhões de vezes mais produtivo na linha de comando!


4
Bem, não está realmente usando o vi, está usando comandos de teclado no estilo vi para edição de linha.

4
Claro ... Acho que a terminologia apropriada é vi bindings in the shella maior característica já inventada!
jahroy

Eu mudaria de ligações do emacs para ligações do vi se houvesse uma maneira de exibir o modo. Você conhece uma maneira de fazer isso?
iconoclasta

Eles, há uma maneira de vincular jjcom ESCcomo costumamos fazer no vim?
22412 steveyang

@yangchenyun - Talvez esta pergunta ajude com isso: stackoverflow.com/questions/844862/… Eu não vinculo / altero pessoalmente nenhum dos comandos, por isso não tenho muita certeza do que você está perguntando.
jahroy

12

Se você estiver usando o bash, como jahroy e evil otto já responderam, você pode usar

set -o vi

para fazer com que o bash use comandos de edição no estilo vi.

Depois de fazer isso, você pode digitar Esc vpara iniciar o editor vi com um arquivo temporário contendo uma cópia da linha de comando atual. Você pode editar o comando, mesmo substituindo-o por várias linhas; quando você salvar o arquivo ( :wq), o shell executará os comandos editados.

Se você preferir

set -o emacs

você pode usar Ctl-XCtl-Epara fazer a mesma coisa. Ele usará seu editor preferido $EDITOR, não necessariamente o emacs.

(Pessoalmente, eu uso o vi (na verdade, vim) na maior parte da minha edição, mas prefiro set -o emacsno shell; alternar entre o modo de inserção e saída é ótimo para editar arquivos, mas estranho para comandos interativos. YMMV.)


você sabe como voltar ao modo de edição normal, evitando o estilo vi? Lembro-me de ter conseguido com Bl Num, mas agora não mais; o que estou perdendo?
Piertoni

@piertoni: Não set -o emacsfaz o que você quer?
Keith Thompson

Sim, Ele faz o trabalho, eu perdi o ponto, graças
piertoni

10

Você pode usar set -o vipara alterar seus comandos de edição de linha como @jahroy postado, mas você pode estar pensando no fccomando (disponível no bash e acho que ksh, mas provavelmente não tcsh), que colocará o comando anterior em um editor (FCEDIT ou EDITOR , que você provavelmente configurou para vi) e, em seguida, executa o comando quando você sai do editor. Veja a página de manual ou help fcpara detalhes, ou apenas experimente.


5
alias r='fc -e -'é um alias valioso para executar novamente comandos anteriores. fcpor si só se originou na casca Korn, eu acredito. Você pode especificar comandos por número ( fc 123 129para editar os números de comando 123 a 129 no histórico). Você pode especificar números relativos ( fc -10 -1para editar os últimos 10 comandos digitados). Você pode listar comandos anteriores com fc -l. Você pode especificar um comando por prefixo com o ralias ( r makeexecuta a última invocação de make; o mesmo acontece r mse você não tiver executado um mvcomando desde a última execução make, etc.).
31812 Jonathan Leffler

6

Para editar o comando usado mais recentemente no vim e chamar uma versão editada após o editor salvar e sair, use o fcshell interno. Sem argumentos, ele fará o seguinte:

  1. Cria um arquivo temporário /tmpe o preenche com o comando digitado mais recentemente
  2. Depois que o editor sai normalmente (com o código de saída 0), ele executa o comando encontrado nesse arquivo temporário e remove esse arquivo. A versão editada é salva no histórico como um comando usual (pelo menos no zsh). Ele não executa nada se o editor sair com um código diferente de zero (no vim, isso pode ser alcançado matando-o ou usando-o :cquit).

O comando funciona no bash e no zsh.


5

De fato, essa é de fato a maior característica de todos os tempos. Mas há mais:

Crie um arquivo chamado

.editrc

contendo a linha

bind -v

Editline , é uma biblioteca de versões licenciadas BSD que fornece serviços semelhantes a readline. Esse .editrc configurará suas combinações de teclas para o modo vi no shell de linha de comando do MySQL ou em qualquer aplicativo que não use o readline.

Eu me esqueci um pouco com o passar dos anos, então meu .zshrc fornece alguns wrappers para o modo vi, para me mostrar em que modo estou na linha de comando. É legal.

Eu sei no zsh você pode digitar

bindkey -L

e obtenha a lista de combinações de teclas. Tenho certeza que o bash deve ter algo semelhante. Nem todas as chaves do vi estão vinculadas por padrão. Amarre-os como achar melhor e você estará pronto para as corridas.


Gostaria de poder votar isso 5 vezes para vi bindings no MySQL!
jahroy

1

no seu terminal, digite export EDITOR=vi.

Para salvar esta configuração. coloque esta linha no arquivo ~ / .profile


5
Isso define seu editor padrão (para comandos que prestam atenção $EDITOR) em vi. Não permite editar comandos do shell com vi(pelo menos não diretamente).
Keith Thompson

2
Defaults @KeithThompson Zsh a vi modo de edição, se $EDITORcontém vi. Eu acho que é a única concha que faz isso.
Gilles 'SO- stop be evil'
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.