2012-09-04 3 views
8

In breve, ho bisogno di sapere in un Makefile se `make sia invocata dal ViM o meno. Esiste una certa variabile (come ENVIRONMENT o qualcosa), che ViM dovrebbe impostare su un valore specifico ?.Come comunicare in un Makefile se `make` viene richiamato dal ViM?

La ragione per cui ho bisogno di questo è la seguente:

Se chiamato da bash, ho potuto fare tutti i tipi di roba meravigliosa per l'utente (o io), come dare messaggi su quale sottosistema si sta costruendo e mettendo in evidenza errori e avvertenze.

Il problema è però che, quando viene chiamato da Vim, i messaggi di errore già vengono catturati e introducendo \x1b comandi (per il colore) rende i messaggi incomprensibili a vim. Quello che voglio fare è fondamentalmente colorazione disabilita quando :make è rilasciato in vim.

Anche se avrei preferito il Makefile risolverlo, io sono aperto ad altre soluzioni.

risposta

2

All'interno Vim, è possibile impostare le variabili d'ambiente che vengono ereditate dai gusci aperti; per esempio.

:let $INSIDE_VIM = 1 

Se questo è solo di :make, è possibile manipolare la 'makeprg' che determina ciò che viene richiamato:

:set makeprg=export\ INSIDE_VIM=1;make 

Se siete solo preoccupati per le sequenze di escape per la colorazione, si può solo impostare $TERM a qualcosa che non capisce i colori (dumb forse?) e se la colorazione non è hard-coded (che purtroppo è un grande se in molti strumenti), dovrebbe obbedire alle impostazioni del terminale e non stampare le sequenze di escape.

+0

Ho una configurazione che dice se utilizzare build o meno. Il check in Makefile quindi semplicemente sovrascrive la configurazione. Non avevo pensato di verificare se il terminale può mostrare o meno i colori, però (grazie per averlo indicato). Ciononostante, probabilmente la modifica di 'TERM' stessa non è così buona dato che altri programmi (bash per esempio) possono fare affidamento su di esso. – Shahbaz

+0

Il 'let $ INSIDE_VIM ​​= 1' è fantastico! – Shahbaz

+0

Finché non si cambia 'xterm' in' dtterm', ma si "downgrade" le funzionalità del terminale, dovrebbe andare bene. Ma non sono esperto sui terminali, e probabilmente non funzionerà tutto il tempo; l'ho appena aggiunto per completezza. –

1

È possibile modificare il binding di vim a SOURCE="vim" make, quindi nel proprio makefile la variabile $$SOURCE è impostata su "vim".

Edit: Vedo che sei, infatti, non utilizzando le associazioni di vim, è possibile utilizzarli con la seguente riga nel .vimrc (o /etc/vimrc) come questo:

:nmap <F5> <CR>SOURCE="vim" :make<CR> 

Questo legherà F5 per quello che vuole

+0

Perché il doppio '$'? Inoltre, potrei alias ': make' in' SOURCE = "vim" make', invece? – Shahbaz

+0

è quello che mi serviva nel mio Makefile per stampare il contenuto della variabile SOURCE 'all: echo" $$ SOURCE "' che ha stampato con la mia invocazione – jolivier

1

Si potrebbe verificare MYVIMRC o VIMRUNTIME variabili d'ambiente. Sulla mia distribuzione GNU/Linux, il valore SHLVL è 1 da bash e 2 quando make viene richiamato da vim.

+0

Queste sono belle e facili. Tuttavia, 'MYVIMRC' potrebbe non essere definito se' .vimrc' non esiste. 'VIMRUNTIME' può comunque essere definito da un utente (anche se improbabile). 'SHLVL' non è così robusto, dato che' vim' potrebbe non essere stato eseguito da un bash di livello 1. Aspetterò altre risposte, ma 'VIMRUNTIME' finora sembra essere la soluzione più affidabile. – Shahbaz

4

Direi esplicitamente al makefile che non vuoi colorarlo o filtrarlo. Se si tenta di indovinare all'interno del makefile, è probabile che si interrompa quando si utilizza un editor o shell diverso o si modifica l'ambiente.

La mia preferenza sarebbe quella di filtrare solo i caratteri non stampabili:

:set makeprg=make\ $*\ \\\|filter 

dal momento che questo non richiede soluzioni alternative espliciti nel makefile. Tuttavia, il filtro richiesto non è banale: si veda ad esempio this question su unix.stackexchange.

In alternativa, come già suggerito, il modo più semplice per dire al vostro makefile esplicitamente è quello di aggiungere una variabile alla vostra invocazione:

:set makeprg=make\ NO_COLOUR=1 

o qualsiasi altra cosa (make dovrebbe essere il valore corrente di makeprg).

.

Problemi correlati