2015-04-08 16 views
5

Una semplice domanda GNU m4, ma non riesco a trovare la risposta corretta. Mi piacerebbe stampare un'intestazione Markdown di partenza/terminare una sezione di codice:GNU m4: inversioni di escape (`)

``` 
echo Hello 
``` 

Come si crea una macro GNU M4 contenente i 3 backticks? qualcosa come

define(`md_code',````') 
md_code 
echo Hello 
md_code 

risposta

5

ottenuto una risposta di Eric Blake sulla mailing list M4: http://lists.gnu.org/archive/html/m4-discuss/2015-04/msg00004.html

changequote è tuo amico. Questo lo farà:

define(`md_code', changequote([, 
])[changequote([,])```changequote(`,')]changequote(`,')) 

devo cambiare citazioni due volte: una volta in giro per la definizione della macro, dal momento che definizione stessa intende utilizzare (backtick) in modo sbilanciato; e di nuovo nell'espansione macro, poiché l'espansione invierà i backtick in modo sbilanciato ; per ogni citazione modificata, le virgolette originali devono essere ripristinate . Ciò presuppone che il quoting predefinito rimanga a (backtick) ' durante l'esecuzione di m4.

Anche se nel tuo caso, mi consiglia di utilizzare changequote davanti a qualcos'altro, e scrivere a livello globale l'input sotto quelli citando regole al posto del default (backticks) 'citando regole. Ricorda che autoconf. è andato intenzionalmente con [] come caratteri di virgolette, perché era molto probabile che venissero bilanciati in uscita, al contrario di (backtick) e 'non presenti in coppie bilanciate negli script di shell. In effetti, scegliere stringhe di quoting a 2 o 3 byte è ancora meno ambiguo, anche se richiede quindi una maggiore digitazione.