Il modo più veloce (s) per spostare il cursore su una riga di comando del terminale?


157

Qual è il modo migliore per spostarsi su una determinata linea di comando molto lunga nel terminale?

Di 'che ho usato il tasto freccia o Ctrl- Rper ottenere questa lunga riga di comando:

./cmd --option1 --option2 --option3 --option4 --option5 --option6 --option7 --option8 --option9 --option10 --option11 --option12 --option13 --option14 --option15 --option16 --option17 --option18 --option19 --option20 --option21 --option22 --option23 --option24 --option25 --option26 --option27 --option28 --option29 --option30 --option31 --option32 --option33 --option34 --option35 --option36 --option37 --option38 --option39 --option40 --option41 --option42 --option43 --option44 --option45 --option46 --option47 --option48 --option49 --option50 

Ora ho bisogno di spostare (a partire dall'inizio o la fine della riga) il cursore --option25per modificare qualcosa lì.

Qual è il modo più veloce per arrivarci? Quello che faccio di solito è Ctrl- Aper arrivare all'inizio e poi ripetutamente Alt- Fper andare avanti, parola per parola (o Ctrl- Eper andare alla fine e Alt- Bper poi tornare indietro). Ma su una lunga fila che richiede troppo tempo. Ci deve essere un modo per cercare e saltare direttamente alla parte che devo modificare, ad es. option25?

Risposte:


108

Dal momento che questo non è stato ancora chiuso, qui ci sono alcune altre opzioni.

  • Utilizzare Ctrl+ xseguito da Ctrl+ eper aprire la riga corrente nell'editor specificato da $FCEDITo $EDITORo emacs(provato in quell'ordine).
  • Se hai eseguito il comando in precedenza, premi Ctrl+ rper una ricerca cronologica inversa e digita option25(in questo caso). Verrà visualizzata la linea. Premi Tabper iniziare la modifica a questo punto.
  • Usa l'espansione della cronologia con il s///modificatore. Ad esempio !-2:s/--option25/--newoption/, eseguirà nuovamente il comando penultimo, ma sostituisce l'opzione25. Per modificare l'ultimo ./cmdcomando, utilizzare la !stringsintassi: !./cmd:s/--option25/--newoption/
    Qualsiasi delimitatore può essere utilizzato al posto di / nella sostituzione.
  • Se si modifica la riga precedente, è possibile utilizzare la sostituzione rapida: ^--option25^--newoption
  • Ricerca del personaggio. Questo è stato menzionato da Pax e può essere fatto in modalità emacs normale con Ctrl+ ]per la ricerca in avanti e Ctrl+ Alt+ ]per la ricerca all'indietro.

Raccomando la seconda opzione. Ctrl+ rè davvero utile e veloce, non si scherza con gli editor e si vedono i risultati prima dell'esecuzione del comando (a differenza delle espansioni della cronologia).


203

Per essere chiari, non si desidera un "modo rapido per spostare il cursore su una riga di comando del terminale ". Quello che vuoi effettivamente è un modo veloce per navigare sulla riga di comando nel tuo programma di shell .

Bash è una shell molto comune, per esempio. Utilizza la libreria Readline per implementare l'input dalla riga di comando. E per così dire, è molto comodo conoscere i binding di Readline poiché viene utilizzato non solo in bash. Ad esempio, gdb utilizza anche Readline per elaborare l'input.

Nella documentazione di Readline puoi trovare tutti i binding relativi alla navigazione (e altro): http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

Breve copia-incolla se il link sopra scende:

Stretto necessario

  • Ctrl-b Torna indietro di un carattere.
  • Ctrl-f Sposta in avanti di un carattere.
  • [DEL] o [Backspace] Elimina il carattere a sinistra del cursore.
  • Ctrl-d Elimina il carattere sotto il cursore.
  • Ctrl-_ o Cx Cu Annulla l'ultimo comando di modifica. Puoi annullare fino a una riga vuota.

Movimento

  • Ctrl-a Sposta all'inizio della riga.
  • Ctrl-e Sposta alla fine della riga.
  • Meta-f Sposta in avanti di una parola, in cui una parola è composta da lettere e cifre.
  • Meta-b Sposta indietro di una parola.
  • Ctrl-l Cancella lo schermo, ristampando la riga corrente in alto.

Uccidi e strattona

  • Ctrl-k Uccide il testo dalla posizione corrente del cursore alla fine della riga.
  • Md Uccidi dal cursore alla fine della parola corrente o, se tra le parole, alla fine della parola successiva. I confini delle parole sono gli stessi di quelli usati da Mf.
  • M- [DEL] Elimina dal cursore l'inizio della parola corrente o, se tra le parole, all'inizio della parola precedente. I confini delle parole sono gli stessi di quelli usati da Mb.
  • Ctrl-w Uccide dal cursore allo spazio bianco precedente. Questo è diverso da M- perché i confini delle parole differiscono.
  • Ctrl-y Riporta il testo ucciso più di recente nel buffer sul cursore.
  • Il mio Ruota l'anello di uccisione e strappa la nuova cima. Puoi farlo solo se il comando precedente è Cy o My.

M è la chiave Meta. Per Max OS X Terminal puoi abilitare "Usa opzione come meta chiave" in Impostazioni / Tastiera per questo. Per Linux è più complicato.

Aggiornare

Si noti inoltre che Readline può funzionare in due modalità:

  • modalità emacs (che è l'impostazione predefinita)
  • modalità vi

Per cambiare Bash per usare la modalità vi:

$ set -o vi

Personalmente preferisco la modalità vi poiché uso vim per la modifica del testo.

indennità

Nell'app macOS Terminal (e anche in iTerm) è possibile fare clic tenendo premuto il tasto Opzione per spostare il cursore (il cursore si sposterà nella posizione selezionata). Funziona anche dentro vim.


3
Preferisco questa risposta perché diminuisce il modo in cui [input / root / reason dietro] funziona l'input da tastiera bash (da dove viene), cioè Readline.
Eugenevd,

6
Nel terminale Ubuntu standard, Meta (M) è Alt + Shift, a meno che non si disabiliti le scorciatoie da tastiera per l'accesso al menu, nel qual caso è solo Alt.
brianpeiris,

2
A Kde in Konsole la Meta (M) è chiave alt
Pipo

Il problema è che Meta + F non funziona se Meta è ALT poiché ALT dà accesso al menu del programma in esecuzione (in questo caso terminale). C'è un'alternativa?
Pithikos,

1
cos'è Mf, quindi non usi il controllo qui, quindi cos'è?
Positivo

33

Tieni premuto il tasto Opzione e fai clic sul punto in cui desideri spostare il cursore e il Terminale accelera il cursore in quel punto preciso.


2
Hai appena duplicato la mia efficienza
Lay González,

In quali ambienti funziona? Immagino solo in Mac OS?
Abdull

Funziona su ssh linux remoto, anche attraverso un jump server.
John Jiang,

10

Tendo a preferire la modalità di editing vi (poiché quei tasti sono ora incorporati nel mio midollo spinale (il cervello non è affatto usato), insieme a CTRL-K, CTRL-X di WordStar 3.3 :-). È possibile utilizzare la riga di comando set -o viper attivarla (e set -o emacsper ripristinare).

In Vi sarebbe (ESC-K per ottenere la fila prima ovviamente) " f5;;B" (senza le doppie virgolette).

Certo, devi capire cosa c'è sulla linea per cavartela. Fondamentalmente lo è

f5 to find the first occurrence of "5" (in --option5).
;  to find the next one (in --option15).
;  to find the next one (in --option25).
B  to back up to the start of the word.

Vediamo se gli appassionati di emacs possono trovare una soluzione migliore, meno di 5 sequenze di tasti (anche se non voglio iniziare una guerra religiosa).

Hai mai pensato di voler inserire questo comando orrendamente lungo in una sceneggiatura? :-)

In realtà, posso andare meglio di così: " 3f5B" per trovare la terza occorrenza di "5", quindi tornare all'inizio della parola.


Non c'è bisogno di uno script: basta premere "v" in modalità vi e aprire la riga di comando in un editor. È possibile formattare la riga di comando, err, "script" più bene con le nuove righe e non è necessario alcun file di temp. :) Quindi, "v / 25" ti porta lì in 4 caratteri.
dannysauer,

Tuttavia, per eseguirlo è necessario più del tasto <Invio>. @dannysauer
CDR

9

Usa Meta-b / Meta-f per spostarti rispettivamente indietro / avanti di una parola.

In OSX, Meta si traduce in ESC, il che fa schifo.

Ma in alternativa, puoi aprire le preferenze del terminale -> impostazioni -> profilo -> tastiera e selezionare "usa l'opzione come meta chiave"


8

Dopo aver eseguito il comando una volta, eseguire fc

Verrà avviato $EDITORcon il comando precedente, quindi è possibile utilizzare l'editor normale per modificare il comando. Quando salvi ed esci, il file verrà eseguito.

..ma come ha detto Pax - la riga di comando non è particolarmente adatta per la modifica di righe assurdamente lunghe - perché non trasformare il comando in uno script?


4

Se vuoi andare avanti di un certo numero di parole, premi M-<n>( M-è per Meta e di solito è il tasto Esc) quindi premi un numero. Questo invia un argomento di ripetizione a readline, in modo da poter ripetere qualunque comando tu voglia - se vuoi andare avanti premi M-<n> M-fe il cursore si sposterà in avanti di un <n>numero di parole.

Per esempio

 $|echo "two three four five six seven"
 $ M-4
 (arg: 4) echo "two three four five six seven"
 $ M-f
 $ echo "two three four| five six seven"

Quindi, per il tuo esempio dal cursore all'inizio della linea, colpiresti, M-26 M-fe il cursore si troverebbe in --option25|-o-- dalla fine della linea M-26 M-bposizionerebbe il cursore su--|option25


2

Ricerca cronologica incrementale

nel terminale inserire:

gedit  ~/.inputrc

quindi copia incolla e salva

"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char

tutto quello che devi fare per trovare un comando precedente è inserire diciamo che le prime 2 o 3 lettere e la freccia verso l'alto ti porteranno lì rapidamente dicendo che voglio:

for f in *.mid ; do timidity "$f"; done

tutto quello che devo fare è entrare

fo

e premere il comando freccia verso l'alto apparirà presto


1

Un'opzione è usare M-x shellin emacs. Ciò fornisce tutte le funzionalità di modifica e le sequenze di tasti che emacsha, quindi C-spuò essere utilizzato per cercare il testo option25, ad esempio.

(Ma preferirei comunque essere nella vera shell del terminale, invece, se qualcuno può indicarmi una buona ricerca e funzioni di modifica.)


0

Usa il mouse

A volte, il modo più semplice per modificare una riga di comando è usare un mouse. Alcune risposte precedenti danno un comando per aprire la riga corrente in $ EDITOR. Per me (zhs con grml config) quella combinazione è Alt+e. Se abiliti il ​​mouse nel tuo editor, puoi utilizzarlo.

Per abilitare il mouse in Vim, aggiungilo al tuo ~ / .vimrc

set mouse=a
set ttymouse=xterm2

Se poi vuoi fare una selezione di testo nel terminale (invece di passare il mouse per vim), tieni premuto Maiusc mentre fai clic; questo è specifico per il terminale, ovviamente.

Gli amministratori di sistema non devono avere paura del mouse.


0

In Cygwin, è possibile attivare tale funzione facendo clic con il pulsante destro del mouse sulla finestra. Nella finestra pop-up, selezionare Opzioni ... -> Mouse -> attiva Clic posiziona cursore linea di comando -> Applica.

D'ora in poi, semplicemente facendo clic con il pulsante sinistro del mouse in una posizione all'interno della riga di comando posizionerà il cursore lì.


0

primo: export EDITOR = 'nano -m'

quindi: CTRL + X CTRL + E in sequenza.

La riga corrente si aprirà in nano editor con l'abilitazione del mouse. Puoi fare clic in qualsiasi parte del testo e modificarlo

quindi CTRL + X per uscire e y per confermare il salvataggio.


0

Ho creato uno script per spostare il cursore della riga di comando al clic del mouse :

  1. Abilita i rapporti di tracciamento del mouse xterm
  2. Imposta i collegamenti readline per utilizzare la sequenza di escape generata dai clic

Si può trovare su Github

Maggiori informazioni su un altro post

Funzionerà se echo -e "\e[?1000;1006;1015h" # Enable trackingstampa sequenze di escape sul terminale quando si fa clic con il mouse


0

Potrebbe non essere il più veloce, ma questo deve essere qui, alcune letture sui movimenti del cursore ANSI

Le sequenze di escape ANSI consentono di spostare il cursore sullo schermo a piacimento. Questo è più utile per le interfacce utente a schermo intero generate dagli script della shell, ma può essere utilizzato anche nei prompt . Le sequenze di escape del movimento sono le seguenti:

- Position the Cursor:
  \033[<L>;<C>H
     Or
  \033[<L>;<C>f
  puts the cursor at line L and column C.
- Move the cursor up N lines:
  \033[<N>A
- Move the cursor down N lines:
  \033[<N>B
- Move the cursor forward N columns:
  \033[<N>C
- Move the cursor backward N columns:
  \033[<N>D

- Clear the screen, move to (0,0):
  \033[2J  or \033c
- Erase to end of line:
  \033[K

- Save cursor position:
  \033[s
- Restore cursor position:
  \033[u

(...)

Prova a inserire la seguente riga di codice al prompt (è un po 'più chiaro cosa fa se il prompt è più righe lungo il terminale quando lo inserisci): echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"Questo dovrebbe spostare il cursore di sette righe sullo schermo, stampare la parola "BASH ", quindi tornare al punto in cui ha iniziato a produrre un prompt normale.


Esempi :

Sposta il cursore indietro di 7 righe:

echo -e "\033[7A"

Spostare il cursore sulla riga 10, colonna 5:

echo -e "\033[10;5H"

Fai eco rapidamente ai codici colori , per colorare un programma:

echo -e "\033[35;42m" ; ifconfig
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.