Comandi Bash all'interno di vi


33

È possibile digitare un comando bash all'interno di vi e ottenere lo stdout?

Trovo spesso noioso chiudere e riaprire vi solo perché voglio cercare qualcosa nella shell.

Risposte:


45

Sì, ad es. Se vuoi farlo ls, prova:

:!ls

Per generare una shell, usa

:shell


fantastico, come potrei vivere senza questo?
arpa

3
In effetti qualcosa che faccio spesso è dimenticare di eseguire vi come root quando si modifica qualcosa. Questo comando mi ha salvato da lunghe riscritture più volte di quanto possa ricordare. :w !sudo tee %
Segna D l'

1
Vorrei che ci fosse un modo per farlo in nano
GNU

1
e poi come si torna all'editor dopo aver usato: shell?
Va

@VaTo: per tornare indietro, puoi digitare: esci
Raman Kathpalia

12

Tendo a usare ctrl+zvi per dormire vi, eseguire ciò di cui ho bisogno nella shell, quindi fgper riprendere vi. Non è esattamente una risposta alla tua domanda, ma trovo che sia un modo molto veloce di lavorare.

Se si dimentica che vi è aperto in background (ciò può accadere quando si è occupati), quando si tenta di disconnettersi dalla shell utilizzando ctrl+dsi verrà avvisati che sono in esecuzione lavori in background e è possibile chiuderli, oppure premi di nuovo ctrl + d per uscire. Inoltre, se si tenta di riaprire due volte lo stesso file, viene visualizzato un avviso di recupero, quindi è possibile premere aper interrompere ed eseguire fg per tornare a vi.


1
Questo può diventare appiccicoso se vieni coinvolto in ciò che stai facendo sulla riga di comando e dimentichi di avere vim in background.
Eliot Ball,

1
Sì, è possibile, l'ho fatto da solo. Per me vale la pena avere costanza della conchiglia. Aggiornerò la mia risposta per tenere conto del tuo commento
Rqomey,

1
Penso che staresti meglio usando lo schermo gnu.
user606723

1
Uso tmux da solo ... ma per la velocità, e se si accede a un server senza tmux o schermo, è utile
Rqomey,

11

Dato che hai menzionato "get the stdout", nota che puoi farlo

:r! command

e l'output del comando verrà aggiunto al file, o

:<range>!command

avere il contenuto dell'intervallo filtrato tramite il comando [es. :1,$!wc]


:%!commandsembra abbastanza utile
Eliot Ball

Lo uso spesso per le linee di smistamento [es. :.,+20 !sort]
Walter A

5

Il mio linguaggio preferito è

!!command

che è una scorciatoia per

:.!command

che convoglia la linea corrente attraverso il comando e inserisce l'output nel file. Il caso più comune per me è modificare il comando con vi ed eseguire:

!!sh

O

!<motion>command

come (ad esempio)

!apsh

per eseguire l'intero paragrafo corrente attraverso la shell.


2
Nota per !}te deve essere posizionato all'inizio del paragrafo, prova !ap. (Non so se questo è in ogni vi o solo vim)
Random832

4

Usando i due punti e il punto esclamativo è possibile eseguire qualsiasi comando nel percorso della shell e negli script della shell, tenere presente che il comando viene eseguito sotto l'utente che esegue il programma vi / vim e utilizzando il suo ambiente.

:!<command>

Poiché vi utilizza l'ambiente che era attivo al momento dell'esecuzione, utilizza lo stesso percorso che era nel comando parent. Tieni presente che alcune shell mantengono una cache dei programmi nel percorso e vi potrebbe non funzionare con questa cache (dipende dalla shell che utilizza e dalla sua versione), quindi potresti finire con l'esecuzione del binario sbagliato nel caso in cui tu ne abbia di più di un binario con lo stesso nome.


4

Puoi vedere l'output di un comando digitando, ad esempio, :!ls -lhin modalità comando.

Se desideri inserire l'output del comando nel file che stai modificando, aggiungi semplicemente un r. Ad esempio :r!which perl,.


1

L'uso !è ovviamente la risposta corretta, ma se si passa avanti e indietro frequentemente, anche qualcosa come schermo o tmux potrebbe essere utile.


0

Ho questo nel mio .vimrc. Trovato su Stack Overflow qualche tempo fa:

" Executes the current line in a bash shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>

0

Lo farei e lo farei facilmente in Linux aprendo due finestre della riga di comando del terminale, eseguendo vi in ​​una e l'altra disponibili per altri lavori contemporaneamente.

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.