Shell com melhores recursos de edição

11

Os shells (pelo menos o que eu sei) têm recursos de edição de comando muito ruins.

Por exemplo:

  • Não consigo apontar o cursor para nenhum ponto do comando.
  • Não consigo selecionar e retroceder / excluir / substituir texto no comando.

Atualmente, isso é tão perturbador que eu uso o gedit para editar comandos antes de colá-los no terminal.

Existe alguma solução que seja boa para isso?

UniversallyUniqueID
fonte
2
Você está confundindo um terminal com uma concha.
JdeBP

Respostas:

13

Bash é realmente muito bom nisso. Você só precisa aprender seus atalhos. Por exemplo (no modo emacs padrão):

  • Ctrl+ A: move para o início da linha.
  • Ctrl+ E: move para o final da linha.
  • Ctrl+ B: move um caractere para trás.
  • Ctrl+ F: move um personagem para a frente.
  • Alt+ B: move uma palavra para trás.
  • Alt+ F: move uma palavra para a frente.
  • Ctrl+ K: exclui (recorta) tudo até o final da linha.
  • Alt+ D: apaga (recorta) a palavra após o cursor.
  • Ctrl+ W: apaga (recorta) a palavra antes do cursor.
  • Ctrl+ Y: puxa (cola) o que está no buffer (o que você corta com Ctrl+ Kou Alt+ Dpor exemplo)

E há muito mais. Leia man readlinepara ver o que mais está disponível. Você pode atribuir atalhos diferentes, colocando-os ~/.inputrc. Por exemplo, para fazer Ctrl+ Leftvoltar uma palavra e Ctrl+ Rightavançar uma palavra, adicione-o ao seu ~/.inputrc:

"\e[1;5D": backward-word 
"\e[1;5C": forward-word

Para descobrir o que significam esses códigos estranhos, pressione Ctrl+ Ve, em seguida, pressione a tecla que você deseja usar. Se você tentar com Ctrl+ Right, verá ^[[1;5C. Substitua ^[com \eno ~/.inputrc.


Você também pode querer procurar outras conchas. Os reservatórios "modernos" e ricos em recursos populares incluem:

Terdon
fonte
Com gnome-terminalvocê, use o ESCbotão em vez de ALT navegar uma palavra para frente e para trás. . .. ou mude para um terminal que não usa Alt no seu menu de aplicativos. . . como xterm ou sakura #
Sergiy Kolodyazhnyy
@ Berg não está no meu sistema, obrigado. Não sei se você configurou dessa maneira ou se é algum padrão ajustado pelo Ubuntu. Esc é frequentemente usado como sinônimo de Alt.
terdon
Não há compartilhamento de buffers de corte entre o terminal.
Craig Hicks
7

Você pode editar um comando vazio ou parcialmente digitado no editor de sua escolha, definindo EDITORo editor de sua escolha e pressionando CTRL+ X+ Eou CTRL+ X/ CTRL+ E, que abre a linha atualmente editada EDITOR;

Por exemplo, definir EDITORa geditfará CTRL+ X+ Ee CTRL+ X/ CTRL+ Eabrir a linha atual em Gedit.

Para tornar esta uma solução permanente, você pode definir EDITORno ~/.bashrc.

Isso permite usar até mesmo um editor de texto gráfico completo para editar o comando; Para executar o comando editado, basta salvar e fechar o documento.


O mesmo recurso pode ser ativado no Zsh adicionando o seguinte a ~/.zshrc:

autoload -U edit-command-line
zle -N edit-command-line
bindkey '^xe' edit-command-line
bindkey '^x^e' edit-command-line
kos
fonte
2
Isso também pode ser chamado com o fccomando se a variável FCEDIT estiver configurada. Boa resposta !
Sergiy Kolodyazhnyy 07/12/2015
1
@Serg Obrigado, no entanto, fcabre o comando anterior (que é ainda mais limpo de uma certa maneira). Eu não sabia disso, obrigado!
kos
6

Os terminais não possuem capacidade de edição de texto. Os terminais fornecem uma área de texto e conectam o teclado a alguma coisa. Mas a coisa que você executa dentro do terminal determina o que ele pode fazer.

Conchas , como bashnormalmente são a primeira coisa que você vai encontrar para ser executado dentro de um terminal. Como os shells funcionam com base em comandos, você só pode editar o comando atual. fornece uma excelente edição de comandos em comparação com o shell Bourne cshou kshainda não é algo com o qual você gostaria de editar, mesmo uma pequena história.

Os editores de texto são um dos comandos que você pode chamar no shell. Os exemplos principais são e . vimou emacsvocê poderá editar quase tudo. Ambos incluem ambientes de programação embutidos para estender suas habilidades a qualquer problema que você enfrenta.

Portanto, a solução é entender melhor o que essas ferramentas estão fazendo e pretendem fazer e escolher a correta para o trabalho .

pintinhos
fonte
Eu sei a diferença, mas algo pode ser feito para melhorar a edição de comandos do bash?
UniversallyUniqueID
1
colocá-lo em um script?
chicks
0

Normalmente, os terminais permitem a seleção de texto com o mouse, mas o shell não é informado disso. Então, infelizmente, nem bash, zsh, fishnem espode suportar edição baseada em mouse. Eu acho que, para isso, eles precisariam ter maior controle sobre o terminal.

No entanto (e isso é um pouco exagerado) se você abrir o Vim ou o GVim e inserir os comandos do shell usando:

:!...

então você pode clicar com o mouse para pular para qualquer lugar da linha . (Você precisará :set mouse=aprimeiro se isso ainda não estiver ativado.) As teclas de edição neste modo podem ser vistas com:help cmdline-editing

O Vim também possui um modo de histórico de comandos bastante poderoso, que pode ser alcançado pressionando q:. A partir daí, você pode puxar, excluir e colar usando os comandos do modo normal do Vim. Nesse modo, você pode obter o botão selecionar e excluir o recurso desejado (pressionando d).

Uma ressalva importante aqui é que o Vim, na verdade, não mantém uma sessão de shell ativo em execução. Cada comando que você executa será executado em um processo filho. Portanto, quaisquer alterações feitas nas variáveis ​​de ambiente ou nas opções de shell pelo processo filho serão perdidas.

Dito isso, você pode modificar variáveis ​​de ambiente no processo Vim e usá-las na linha de comando do Vim, e elas serão exportadas para processos filhos:

:let $FOO="bar"        " the $ and the quotes are mandatory here

:echo $FOO             " Vim's own echo command
bar

:!echo "$FOO"          " Passing the variable to a shell command
bar

:!bash                 " Opening a child shell
$ echo "$FOO"
bar

Portanto, se você estiver disposto a fingir que o Vim é realmente algum tipo de shell estranho, poderá aproveitar seus recursos avançados de edição! Provavelmente, a maior desvantagem é que você terá que iniciar todos os comandos digitando um :!ouq:

Ah, a propósito, se você deseja obter a saída do comando shell no seu buffer Vim atual, você pode fazer isso assim (mas cuidado, ele atrapalhará sua linha atual):

:,!ls
joeytwiddle
fonte