Test di vimscript


1

Sto hackerando un framework di test per vimscript (un esercizio di futilità, lo so; umorizzami). Alcuni plugin vim effettuano chiamate alla shell (con la system()funzione o il !comando). Voglio che il collaudatore sia in grado di prendere quelle chiamate e restituire dati precotti.

Per quanto ne so, vim's system()fa un fork ed esegue il comando in una subshell. In teoria, dovrebbe essere possibile fare qualcosa del genere

alias ls="echo one\ntwo\nthree"

in modo che possiamo fare un test sulla falsariga di:

:.!ls

e controlla che l'output sia

one
two
three

In pratica, sembra che vim stia creando una subshell che non rispetta alcun alias temporaneo. In altre parole, crea un nuovo ambiente di shell pulito usando la shell dell'utente (zsh, bash, qualunque cosa) ma non le impostazioni della shell dell'utente (globale o locale).

Conosci un modo per eseguire VIM in un ambiente in modo tale che determinate chiamate di sistema siano controllate dall'utente?

Risposte:


3

Le shell non interattive non passano attraverso tutte le inizializzazioni di una shell interattiva. Vedi la sezione INVOCATION della bashpagina del manuale (o qualunque shell tu stia prendendo di mira) per i dettagli.

D'altra parte, bash cercherà uno script chiamato $BASH_ENVed eseguirà prima di avviare una shell non interattiva. Usalo per configurare il tuo ambiente per le fughe della shell di Vim. Dimostrazione della riga di comando:

% bash -c 'alias'
<no output>
% export BASH_ENV=./special.aliases 
% bash -c 'alias'
this=that

Ma in realtà puoi fare molto meglio di così: imposta la SHELLvariabile su un programma /bin/echoche preferisci , forse solo , e vim lo chiamerà invece di lanciare una shell difficile da controllare. Funziona anche se il tuo comando include una pipeline o altri metacaratteri della shell, quindi lo consiglio vivamente. (Otterrai quel -cche vim inserisce quando biforchi la "shell", ma sono sicuro che puoi farcela).


Eccezionale. Una domanda: esiste un equivalente zsh? È difficile sapere in quale shell vim girerà, e so che non posso supportarli tutti, ma colpire tutti i grandi giocatori sarebbe bello.
So8res,

Dovrai cercarlo tu stesso nel manuale di zsh. Oppure usa il secondo metodo (ridefinisci $ SHELL), come ho raccomandato. La shell in cui vim è in esecuzione è irrilevante: Vim si avvierà qualunque cosa gli dice $ SHELL.
alexis,
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.