Shell con migliori capacità di modifica


11

Le conchiglie (almeno quello che so) hanno capacità di modifica dei comandi davvero pessime.

Per esempio:

  • Non riesco a puntare il cursore su nessun punto del comando.
  • Non riesco a selezionare e backspace / elimina / sostituisci testo nel comando.

Attualmente sono così fastidiosi che uso gedit per modificare i comandi prima di incollarli sul terminale.

C'è qualche soluzione che va bene per questi?


3
Stai unendo un terminale con una shell.
JdeBP,

Risposte:


13

Bash è in realtà abbastanza bravo in questo. Hai solo bisogno di imparare le sue scorciatoie. Ad esempio (nella modalità emacs predefinita):

  • Ctrl+ A: passa all'inizio della riga.
  • Ctrl+ E: sposta alla fine della riga.
  • Ctrl+ B: sposta di un personaggio all'indietro.
  • Ctrl+ F: sposta un carattere in avanti.
  • Alt+ B: sposta di una parola all'indietro.
  • Alt+ F: sposta una parola in avanti.
  • Ctrl+ K: elimina (taglia) tutto fino alla fine della riga.
  • Alt+ D: elimina (taglia) la parola dopo il cursore.
  • Ctrl+ W: elimina (taglia) la parola prima del cursore.
  • Ctrl+ Y: yank (incolla) cosa si trova nel buffer (ad esempio cosa si taglia con Ctrl+ Ko Alt+ D)

E ce ne sono molti altri. Leggi man readlineper vedere cos'altro è disponibile. È possibile assegnare diverse scorciatoie inserendole in ~/.inputrc. Ad esempio, per fare Ctrl+ Lefttornare indietro di una parola e Ctrl+ Rightandare avanti di una parola, aggiungilo a ~/.inputrc:

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

Per scoprire cosa significano quegli strani codici, premi Ctrl+ Ve poi premi il tasto che desideri utilizzare. Se provi con Ctrl+ Right, vedrai ^[[1;5C. Sostituisci ^[con \ein ~/.inputrc.


Potresti anche voler esaminare altre shell. Le shell popolari "moderne" e ricche di funzionalità includono:


Con gnome-terminaldevi usare il ESCpulsante invece di ALT navigare di una parola in avanti e indietro. . .. o passa a un terminale che non usa Alt per il suo menu dell'applicazione. . . come xterm o sakura
Sergiy Kolodyazhnyy il

@Serg non sul mio sistema, grazie. Non so se lo hai impostato in questo modo o se è un po 'predefinito ottimizzato da Ubuntu. Esc è spesso usato come sinonimo di Alt.
terdon,

Tuttavia, nessuna condivisione interrompe i buffer tra i terminali.
Craig Hicks,

7

Puoi modificare un comando vuoto o parzialmente digitato nell'editor di tua scelta impostando EDITORl'editor di tua scelta e premendo CTRL+ X+ Eo CTRL+ X/ CTRL+ E, che apre la riga in fase di modifica EDITOR;

Ad esempio, l'impostazione EDITORsu geditfarà aprire CTRL+ X+ Ee CTRL+ X/ CTRL+ Ealla riga corrente in Gedit.

Per rendere questa una soluzione permanente, è possibile impostare EDITORin ~/.bashrc.

Ciò consente di utilizzare anche un editor di testo grafico completamente fleged per modificare il comando; per eseguire il comando modificato, è sufficiente salvare e chiudere il documento.


La stessa funzione può essere abilitata in Zsh aggiungendo quanto segue a ~/.zshrc:

autoload -U edit-command-line
zle -N edit-command-line
bindkey '^xe' edit-command-line
bindkey '^x^e' edit-command-line

2
Questo può anche essere invocato con il fccomando se è impostata la variabile FCEDIT. Buona risposta !
Sergiy Kolodyazhnyy,

1
@Serg Grazie, tuttavia fcapre il comando precedente (che è anche più ordinato in un certo modo). Non lo sapevo, grazie!
kos

6

I terminali non hanno abilità di modifica del testo stessi. I terminali forniscono un'area di testo e collegano la tastiera a qualcosa. Ma la cosa che si esegue all'interno del terminale determina che cosa può fare.

Conchiglie come in bashgenere sono la prima cosa che troverai all'interno di un terminale. Poiché le shell funzionano in base ai comandi, è possibile modificare solo il comando corrente. offre un eccellente editing dei comandi rispetto alla shell Bourne csho, ksheppure non è certo qualcosa con cui vorresti modificare neanche un racconto.

Gli editor di testo sono uno dei comandi che puoi invocare nella shell. Gli esempi principali sono ed . vimo emacsti darà la possibilità di modificare quasi tutto. Entrambi includono ambienti di programmazione integrati per estendere le loro capacità a qualunque problema tu debba affrontare.

Quindi la soluzione è capire meglio cosa stanno facendo questi strumenti e cosa intendevano fare e scegliere quello giusto per il lavoro .


Conosco la differenza, ma si può fare qualcosa per migliorare la modifica dei comandi di bash?
UniversallyUniqueID

1
metterlo in una sceneggiatura?
pulcini,

0

Di solito i terminali consentono la selezione del testo con il mouse, ma la shell non ne è consapevole. Così, purtroppo né bash, zsh, fishesin grado di supportare l'editing basato sul mouse. Penso che per farlo, avrebbero bisogno di avere un maggiore controllo sul terminale.

Tuttavia (e questo è un po 'allungato) se apri Vim o GVim, e quindi inserisci i comandi della shell usando:

:!...

quindi puoi fare clic con il mouse per passare a qualsiasi punto della linea . (Dovrai :set mouse=aprima se questo non è già abilitato.) I tasti di modifica in questa modalità possono essere visualizzati con:help cmdline-editing

Vim ha anche una modalità cronologia dei comandi abbastanza potente, che può essere raggiunta colpendo q:. Da lì puoi strappare, cancellare e incollare usando i comandi in modalità normale di Vim. In questa modalità, è possibile ottenere la selezione con il mouse e quindi eliminare la funzione desiderata (premendo d).

Un avvertimento significativo qui è che Vim in realtà non mantiene in esecuzione una sessione di shell live. Ogni comando eseguito verrà eseguito in un processo figlio. Pertanto, eventuali modifiche apportate alle variabili di ambiente o alle opzioni della shell dal processo figlio andranno perse.

Detto questo, è possibile modificare le variabili di ambiente all'interno del processo di Vim e utilizzarle dalla riga di comando di Vim e verranno persino esportate in processi figlio:

: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

Quindi, se sei disposto a far finta che Vim sia in realtà una sorta di strana shell, allora puoi goderti le sue funzionalità di editing avanzate! Probabilmente il più grande svantaggio è che dovrai avviare ogni comando digitando :!oq:

Oh, a proposito, se vuoi ottenere l'output del comando shell nel tuo attuale buffer Vim, puoi farlo in questo modo (ma attenzione che ostruirà la tua linea corrente):

:,!ls
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.