2011-12-02 15 views

risposta

12

Secondo lo standard ECMA-48 per i terminali, il codice SGR (Select Graphic Rendition) numero 9 deve consentire il testo barrato. Tuttavia, la pagina di wikipedia ANSI escape code dice che non è ampiamente supportata, e io non ne sono a conoscenza. Sospetto che sia dovuto alla serie VTxxx di DEC didn't support it.

+0

Il mio 'libvterm' /' pangoterm' può farlo bene. Guarda il secondo screenshot in [link] (http://leonerds-code.blogspot.com/2011/09/libvtermpangoterm-and-tickit.html) – LeoNerd

+3

In realtà un buon set del terminale principale della shell sembra supportarlo (questo include '' guake'', '' terminator'', '' gnome-terminal'', ...). http://misc.flogisoft.com/bash/tip_colors_and_formatting#terminals_compatibility. Test rapido: '' echo -e "\ e [9mtest \ e [0m" ''. – vaab

4

Una soluzione alternativa per applicazioni scritte in C11 o C++ 11 consiste nell'utilizzare il carattere Unicode combining long stroke overlay.

In C++ 11 è possibile scrivere codice simile a questo:

#include <iostream> 
#include <string> 

std::string strikethrough(const std::string& text) { 
    std::string result; 
    for (auto ch : text) { 
    result.append(u8"\u0336"); 
    result.push_back(ch); 
    } 
    return result; 
} 

int main() { 
    std::cout << strikethrough("strikethrough") << std::endl; 
} 

Il codice prefissi ogni carattere nell'input text con l'overlay ictus \u0336. Si noti che la funzione presuppone che text sia codificato in una codifica singlebyte come ASCII o Latin. Se l'input è in UTF-8, prima deve essere convertito in UTF-32 per ottenere i limiti del personaggio.

L'uscita è quindi s̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h in un terminale con funzionalità UTF-8. Non so perché il primo personaggio non ha strike-through, deve essere un problema terminale. Potrei aggirare questo stampando almeno un carattere prima della chiamata di funzione barrata.

La soluzione Unicode genera anche un blocco leggermente diverso nel mio terminale (terminator) rispetto alla sequenza di escape ANSI menzionata sopra. Il primo rende la linea esattamente nel mezzo del testo, mentre il secondo lo rende un po 'più in basso.

Problemi correlati