Shell avec de meilleures capacités d'édition

11

Les shells (du moins ce que je sais) ont de très mauvaises capacités d'édition de commandes.

Par exemple:

  • Je ne peux pointer le curseur sur aucun point de la commande.
  • Je ne peux pas sélectionner et reculer / supprimer / remplacer le texte dans la commande.

Actuellement, elles sont si distrayantes que j'utilise gedit pour modifier les commandes avant de les coller sur le terminal.

Y a-t-il une solution qui est bonne pour ces derniers?

UniversallyUniqueID
la source
3
Vous confondez un terminal avec un shell.
JdeBP

Réponses:

13

Bash est en fait assez bon dans ce domaine. Vous avez juste besoin d'apprendre ses raccourcis. Par exemple (dans le mode emacs par défaut):

  • Ctrl+ A: passer au début de la ligne.
  • Ctrl+ E: passer à la fin de la ligne.
  • Ctrl+ B: recule d'un personnage.
  • Ctrl+ F: avancez d'un personnage.
  • Alt+ B: reculer d'un mot.
  • Alt+ F: avancez d'un mot.
  • Ctrl+ K: supprime (coupe) tout jusqu'à la fin de la ligne.
  • Alt+ D: supprimer (couper) le mot après le curseur.
  • Ctrl+ W: supprime (coupe) le mot devant le curseur.
  • Ctrl+ Y: tirez (collez) ce qui est dans le tampon (ce que vous coupez avec Ctrl+ Kou Alt+ Dpar exemple)

Et il y en a beaucoup plus. Lisez man readlinepour voir ce qui est disponible d'autre. Vous pouvez attribuer différents raccourcis en les plaçant ~/.inputrc. Par exemple, pour faire Ctrl+ Leftreculer d'un mot et Ctrl+ Rightavancer d'un mot, ajoutez ceci à votre ~/.inputrc:

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

Pour savoir ce que ces codes étranges signifient, appuyez sur Ctrl+ V, puis appuyez sur la touche que vous souhaitez utiliser. Si vous essayez avec Ctrl+ Right, vous verrez ^[[1;5C. Remplacez ^[par \ein ~/.inputrc.


Vous pourriez également vouloir examiner d'autres coquilles. Les coques «modernes», riches en fonctionnalités, incluent:

terdon
la source
Avec gnome-terminalvous devez utiliser le ESCbouton au lieu de ALT pour naviguer un mot en avant et en arrière. . .. ou basculez vers un terminal qui n'utilise pas Alt pour son menu d'application. . . comme xterm ou sakura
Sergiy Kolodyazhnyy
@Serg n'est pas sur mon système, merci. Je ne sais pas si vous l'avez configuré de cette façon ou s'il s'agit d'un réglage par défaut d'Ubuntu. Esc est cependant souvent utilisé comme synonyme d'Alt.
terdon
Pas de partage de tampons de coupe entre les terminaux cependant.
Craig Hicks
7

Vous pouvez modifier une commande vide ou partiellement tapée dans l'éditeur de votre choix en définissant EDITORl'éditeur de votre choix et en appuyant sur CTRL+ X+ Eou CTRL+ X/ CTRL+ E, ce qui ouvre la ligne en cours d'édition dans EDITOR;

Par exemple, le réglage EDITORsur geditfera CTRL+ X+ Eet CTRL+ X/ CTRL+ Eouvrir la ligne actuelle dans Gedit.

Pour en faire une solution permanente, vous pouvez définir EDITORdans ~/.bashrc.

Cela permet d'utiliser même un éditeur de texte graphique complet pour modifier la commande; pour exécuter la commande modifiée, enregistrez et fermez simplement le document.


La même fonctionnalité peut être activée dans Zsh en ajoutant ce qui suit à ~/.zshrc:

autoload -U edit-command-line
zle -N edit-command-line
bindkey '^xe' edit-command-line
bindkey '^x^e' edit-command-line
kos
la source
2
Cela peut également être invoqué avec la fccommande si la variable FCEDIT est définie. Bonne réponse !
Sergiy Kolodyazhnyy
1
@Serg Merci, fcouvre cependant la commande précédente (qui est encore plus nette d'une certaine manière). Je n'en savais rien, merci!
kos
6

Les terminaux n'ont eux-mêmes aucune capacité d'édition de texte. Les terminaux fournissent une zone de texte et connectent le clavier à quelque chose. Mais ce que vous exécutez à l'intérieur du terminal détermine ce qu'il peut faire.

Les shells tels que bashsont généralement la première chose que vous trouverez à exécuter à l'intérieur d'un terminal. Comme les shells fonctionnent sur la base de commandes, vous ne pouvez modifier que la commande actuelle. offre une excellente édition des commandes par rapport au shell Bourne ou cshbien kshce n'est pas quelque chose avec lequel vous voudriez éditer même une courte histoire.

Les éditeurs de texte sont l'une des commandes que vous pouvez invoquer dans le shell. Les principaux exemples sont et . vimou emacsvous donnera la possibilité de modifier presque n'importe quoi. Les deux comprennent des environnements de programmation intégrés pour étendre leurs capacités à n'importe quel problème que vous rencontrez.

La solution consiste donc à mieux comprendre ce que ces outils font et ce qu'ils sont censés faire et à choisir le bon pour le travail .

poussins
la source
Je connais la différence, mais peut-on faire quelque chose pour améliorer l'édition des commandes de bash?
UniversallyUniqueID
1
le mettre dans un script?
poussins
0

Habituellement, les terminaux permettent la sélection de texte avec la souris, mais le shell n'en est pas informé. Donc , malheureusement ni bash, zsh, fishni espeut prendre en charge l' édition basée sur la souris. Je pense que pour ce faire, ils devraient prendre un plus grand contrôle sur le terminal.

Cependant (et c'est un peu exagéré) si vous ouvrez Vim ou GVim, puis entrez des commandes shell en utilisant:

:!...

alors vous pouvez cliquer sur votre souris pour aller n'importe où sur la ligne . (Vous devrez d' :set mouse=aabord le faire si ce n'est déjà fait.) Les touches d'édition dans ce mode peuvent être vues avec:help cmdline-editing

Vim dispose également d'un mode d'historique de commandes assez puissant, qui peut être atteint en appuyant sur q:. De là, vous pouvez extraire, supprimer et coller à l'aide des commandes en mode normal de Vim. Dans ce mode, vous pouvez obtenir la sélection avec la souris, puis supprimer la fonction souhaitée (en appuyant sur d).

Une mise en garde importante ici est que Vim ne maintient pas réellement une session shell en direct. Chaque commande que vous exécutez sera exécutée dans un processus enfant. Ainsi, toutes les modifications apportées aux variables d'environnement ou aux options du shell par le processus enfant seront perdues.

Cela dit, vous pouvez modifier les variables d'environnement de l' intérieur du processus Vim, et les utiliser de la ligne de commande de Vim, et ils seront même être exportés vers des processus enfants:

: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

Donc, si vous êtes prêt à prétendre que Vim est en fait une sorte de shell étrange, alors vous pouvez profiter de ses fonctionnalités d'édition avancées! Le plus gros inconvénient est probablement que vous devrez démarrer chaque commande en tapant soit :!ouq:

Oh et au fait, si vous voulez obtenir la sortie de la commande shell dans votre tampon Vim actuel, vous pouvez le faire comme ça (mais attention, cela encombrera votre ligne actuelle):

:,!ls
joeytwiddle
la source