La modalità Ex ha qualche utilità pratica?


115

Vim ha una modalità Ex che può essere inserita entrando Qe una modalità della riga di comando che può essere inserita con q:. Una lamentela comune tra i nuovi utenti di VIM è che accedono a queste modalità accidentalmente quando provano a uscire da VIM. Pertanto, disabilito queste chiavi nel mio ~/.vimrcper impedirmi di colpirle accidentalmente (in particolare q:):

map q: <Nop>
nnoremap Q <nop>

Anche se ho letto la documentazione di VIM su Ex , sono un utente di Vim di media esperienza e capisco l'idea di base alla base, faccio ancora fatica a trovarne l'uso nel mio uso quotidiano di Vim. In generale sembra meno utile che inserire semplicemente un comando standard della riga di comando vim con prefisso :, poiché le modifiche non vengono ripetute immediatamente.

Ex ha qualche uso pratico quotidiano nella moderna Vim? C'è qualcosa che è più facile da fare in modalità Ex rispetto ai comandi standard? Qual è la differenza tra la modalità da riga di comando e la modalità ex?


13
Qe q:sono abbastanza diversi. Ti riferisci solo a Qgiusto?
Jamessan,

@Jamessan, in realtà, risulta che non ero sicuro ... hai ragione, sembrano fare cose diverse, anche se avevo ipotizzato che fossero sostanzialmente le stesse. Se rispondi a questa domanda, potrebbe essere utile chiarire qui, poiché sono ovviamente confuso.
Andrew Ferrier,

Questa domanda è in discussione su Meta .
200_successo

1
@AndrewFerrier Hai chiesto in modo q:specifico e lo hai menzionato come, tra le due sequenze chiave, quella con cui hai più problemi. E due delle risposte qui possono essere utili alle persone che la stanno cercando con il termine corretto.
Casuale 832

4
Quando imparerai cosa q/e cosa q:farai, probabilmente li considererai alcuni dei comandi più utili in Vim. E sì, sai già come usarli, semplicemente non sai ancora cosa fanno. Guarda questo screencast per scoprirlo.
Sato Katsura,

Risposte:


81

Qè, come hai trovato, modalità ex. Non è del tutto utile da usare in modo interattivo, ma esiste perché Vim può essere usato per emulare il vecchio exbinario. In effetti, molti sistemi forniscono il excomando semplicemente collegandolo a symlink vim.

q:o :<C-f>, invece, fornisce un modo per sfogliare la cronologia della riga di comando e modificarla come un normale buffer. Ciò semplifica la ricerca di un comando precedente eseguito, la modifica con i normali comandi Vim e quindi l'esecuzione del comando modificato. I comandi q/e q?esistono per fornire la stessa funzionalità per la cronologia delle ricerche.


64

Vim in modalità Ex è utile quando:

  • Hai bisogno di modificare (più) file in modo non interattivo (come parte dello script).
  • La tua connessione è molto lenta o lo schermo non viene aggiornato dopo le tue azioni.
  • Mappature e abbreviazioni sono disabilitate.
  • Tasti comuni come Escapeo Controlnon funzionano correttamente.

Fondamentalmente viè la modalità visiva per excui Vim Ex Mode è solo emulazione di ex(eseguono ancora lo stesso codice), quindi è possibile arrivare alla modalità di comando exda vi e viceversa. Esistono in realtà due modalità: la modalità Ex ( vim -e) e la modalità Ex migliorata che consente comandi più avanzati rispetto alla modalità Ex compatibile ( vim -E). Vedi: Qual è la differenza tra la modalità Ex e la modalità Ex migliorata?

Ex è la radice di una famiglia di editori: edit, exe vi. Ex è un super-set di ed, con l'estensione più notevole è una funzione di modifica del display. ex (1)

La modifica dei file in modo non interattivo è l'uso più comune e le persone lo usano in modo simile in quanto sede awk, tuttavia sono più orientati al flusso - leggono solo il file in avanti dall'inizio alla fine (non sono progettati per funzionare con più righe ) mentre vimè orientato al buffer: puoi spostarti avanti e indietro nel file come preferisci, il che lo rende così potente.

Fondamentalmente:

sedè un S tream ED itor, non un editor di file.

Tuttavia, la gente sembra abusarne per aver provato a modificare i file e la verità è che non modifica i file. In secondo luogo, le sue opzioni come sul posto ( -i) sono estensioni di FreeBSD non standard e potrebbero non essere disponibili su altri sistemi operativi. Quindi, se si desidera evitare codice non portabile, sovraccarico I / O e effetti collaterali dannosi (come la distruzione di collegamenti simbolici), è necessario utilizzare exl'editor di comandi UNIX standard (insieme a ed) BashFAQ .


Altre cose che trovo utili in modalità Ex sono usarlo come un parco giochi (simile alla pythonconsole) in cui è possibile eseguire molti comandi di seguito, lavorare / eseguire il debug di espressioni regolari, controllare la configurazione di VIM, eseguire comandi esterni o lavorare con i registri, ecc. .

Per esempio:

let @d = '<td></td>'
let @r = '<tr>' . repeat(@d, 5) . '</tr>'
echo @r
let @t = '<table>' . repeat(@r, 5) . '</table>'
reg

che è più semplice in modalità Ex che in modalità normale (dove puoi vedere solo l'ultimo comando).


Usi pratici

Ho i seguenti alias nel mio .bash_aliases:

alias trim="ex +'bufdo!%s/\s\+$//e' -scxa"
alias retab="ex +'set ts=2' +'bufdo retab' -scxa"

Nota: l'utilizzo bufdonon è un exmetodo conforme a POSIX (come da manuale ), quindi è possibile prendere in considerazione l'utilizzo con find. La !viene utilizzato per forzare la commutazione dei buffer senza salvare (altrimenti avviso viene generato).

Il primo che sto usando per tagliare gli spazi finali in tutti i miei file sorgente, ad esempio:

trim **/*.php

Il secondo converte tutte le schede in spazi (ricorsivamente), ad esempio:

retab **/*.php

Per me usare retabè abbastanza, ma ci sono alcuni aspetti negativi descritti qui . Aggiungi extra -Vper una maggiore verbosità.

Si noti che gli esempi di cui sopra utilizzando zsh / bash4 globbing ( **), in modo da assicurarsi che la shell lo supporta ed è abilitato.

Per esempi più pratici (come l'analisi dei file html), controlla:

Ulteriori informazioni sulla modalità Ex su:


Potete per favore postare un esempio di "editing (multipla) file in modo non interattivo" operazione che è più semplice da raggiungere con exquanto lo sia con ed, sedo awk?
Sato Katsura,

1
@SatoKatsura Aggiunti due usi pratici che si occupano di più file.
Kenorb,

Ho cercato la documentazione per avere una migliore comprensione della exmodalità. Non capisco perché hai un botto ( !) nel tuo comando trimalias bufdo. Non abbandonerà solo tutte le modifiche in tutti i file tranne l'ultimo? In caso contrario, perché no?
Wildcard

@Wildcard Without !fondamentalmente non funzionerà, poiché ogni volta che si commuta il buffer si exlamenterebbe delle modifiche non salvate (e stiamo salvando le modifiche alla fine con xa). L'avviso può essere disabilitato, ma è molto più facile da aggiungere !.
Kenorb,

Vedo ... credo di aver letto male la documentazione, quindi; si specifica che , senza il !il comando non riuscirà se il buffer non può essere abbandonata, ma non esplicitamente specificare che !farà sì che il buffer non essere scartata .... Quindi, significa "abbandonato" in questo caso significare "caduto , perché non contiene nulla di non scritto su disco "? O cosa? (Sto guardando :help bufdo)
Wildcard

18

Uso raramente la modalità ex, ma quando ne ho bisogno sono grato per la sua esistenza.

A volte accedo ai sistemi tramite ssh su VPN e queste connessioni a volte possono rallentare. A peggiorare il problema, a volte ho bisogno di modificare un file sul lato remoto che, oltre a essere dietro a ssh e VPN, è su una connessione seriale lenta (quindi, 9600 baud più molta latenza di rete).

È in momenti come questo che avere feedback visivi e aggiornamenti dello schermo diventa più un ostacolo perché ciò che vedo è in ritardo (l'effetto è un po 'come parlare in un microfono ma con altoparlanti lontani, come in uno stadio sportivo. Le azioni diventano instabili e talvolta confuso a causa del feedback ritardato).

In questo caso, avere le modifiche non riecheggiate è un vantaggio utile, poiché posso fare di più in meno tempo quando non aspetto l'aggiornamento dello schermo.

Quando ho finito di apportare le modifiche, torno alla modalità visiva per un singolo aggiornamento dello schermo per rivedere il mio lavoro. Quindi posso tornare alla modalità ex o salvare perché ho finito.


13

La finestra della riga di comando è utile per scrivere comandi lunghi e complicati. Poiché la cronologia dei comandi si apre come una finestra, è possibile utilizzare qualsiasi tipo di navigazione o comando / mapping di VIM.

Supponi di voler modificare un lungo comando di sostituzione che hai eseguito una volta, ma che ha commesso un errore:

:%165,177s:here is a whole bunch of text I wnat to replace:here is the replacement:c

Per modificare la stringa di ricerca, non è possibile utilizzare i movimenti vim come bnella riga Ex per navigare (anche se credo che ci siano mappature chiave per questa navigazione). Invece, la maggior parte delle persone preme il tasto freccia sinistra un sacco di volte.

Un modo migliore: premi q:per kaccedere alla finestra della riga di comando, per spostarti all'ultimo comando e navigare con movimenti normali verso la parte del comando che desideri modificare. Vuoi cambiare una parola intera, nessun problema: ciw.


Ok grazie. Sei sicuro che q: sia la riga di comando Ex? L'aiuto usa solo la frase "Ex" per la modalità menzionata da Q, ma ciò non supporta la modifica standard di vim a cui ti riferisci - lo q:fa solo , che la guida chiama semplicemente "Modalità riga di comando". So di aver confuso i due all'inizio, ma probabilmente dovremmo assicurarci di essere chiari sulla distinzione qui.
Andrew Ferrier,

1
Ho cercato :help q:prima di decidere di usare quella frase, ma potrei essere confuso sulla terminologia.
bsmith89,

1
Sono stato confuso anche su questa terminologia. Di solito parlo di digitare un comando Ex come qualcosa di seguito :, ma potrei usarlo nel modo sbagliato.
bsmith89,

3
Il contenuto della tua risposta è tutto corretto, ma il modo in cui stai usando la terminologia è (per me) un po 'confuso. Penso che tu stia interpretando la documentazione in modo leggermente errato. q:non apre una riga di comando Ex. Apre la finestra della cronologia dei comandi , in cui è possibile modificare i comandi Ex attuali e precedenti. La riga di comando Ex è quella che ottieni quando premi :in modalità Normale.
Ricco

3
FWIW Penso che anche la documentazione di Vim sia un po 'confusa, poiché in alcuni punti si riferisce a tutti i :comandi come comandi "Ex". IMHO in realtà solo i comandi che sono effettivamente disponibili in Ex dovrebbero essere considerati comandi Ex.
Ricco

6

Mi è stato detto da una persona con vista parziale che sta diventando cieca che sta passando a ex, quindi è un suo uso. Io stesso sono considerevolmente più vecchio di vi, e sono passato da ed a ex molto tempo fa (sì, lo so, "ed è l'editor standard"). L'unica cosa che faccio in modalità vi è% -bouncing per abbinare le parentesi quando scrivo il codice Lisp.


Mi ricorda questa intervista . Non ricordo però se sia exstato specificamente menzionato.
Martin Tournoij,

Ottima intuizione, non ci avrei mai pensato. Grazie mille, ottima risposta.
Andrew Ferrier,

2

A parte gli usi già menzionati qui, ex è anche un modo per modificare i file sulla console linux se ciò accade sulla piattaforma S / 390 e la console è orientata alla linea invece che allo schermo.


0

La modalità Ex ha qualche utilità pratica?

Probabilmente no. Tuttavia, quando si accede alla modalità Ex non è davvero utile, l'apprendimento dei comandi Ex è comunque utile, soprattutto perché si utilizzano i comandi di modifica ex con :g/comandi globali per operare su linee corrispondenti.


-1

"Ex" originale era la versione aggiornata dell'editor di testo "ed" in Unix. In 2BSD è stata aggiunta una modalità visiva e il nuovo editor è stato chiamato "vi".

Se si desidera utilizzare la riga di comando ex, si passerà alla modalità di comando con il tasto ":". Quindi nella mia migliore comprensione ex non è in realtà lì per nostalgia, è la parte per fornire la modalità di comando.

È inoltre possibile accedere alla modalità di inserimento tramite

 :i 

quindi premi "Invio e digita il testo. Esci con ^ c. O digita tutto su una riga di comando, ad esempio

 :i my multiline text \with a second line.^c

1
Dato che la modalità Ex non è esattamente la stessa cosa della modalità riga di comando , questo non sembra rispondere alla domanda. E come nota a margine aggiuntiva: la modalità comando è uno sfortunato sinonimo di modalità normale, non della modalità riga di comando.
8bittree,

Punto "Modalità comando" preso. Solo scusa, quando abbiamo cambiato in vi la nuova aggiunta siamo stati intorudotti come "visivi" (non l'attuale modalità visiva vim) in contrapposizione a "comando" - ora es. D'altra parte la riga di comando sembra invocare lo stesso do_cmdline () di ex. Non che suggerisca un "uso pratico", lo ammetto.
if2
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.