2011-12-02 25 views

Respuesta

12

De acuerdo con el estándar ECMA-48 para terminales, el código número 9 de SGR (Select Graphic Rendition) se supone que habilita el texto tachado. Sin embargo, la página de wikipedia ANSI escape code dice que no es ampliamente compatible, y no conozco ninguna que lo haga. Sospecho que es porque la serie VTxxx de DEC didn't support it.

+0

Mi 'libvterm' /' pangoterm' puede hacerlo bien. Vea la segunda captura de pantalla en [link] (http://leonerds-code.blogspot.com/2011/09/libvtermpangoterm-and-tickit.html) – LeoNerd

+3

En realidad, un buen conjunto de la terminal shell principal parece ser compatible (esto incluye '' guake'', '' terminator'', '' gnome-terminal'', ...). http://misc.flogisoft.com/bash/tip_colors_and_formatting#terminals_compatibility. Prueba rápida: '' echo -e "\ e [9mtest \ e [0m" ''. – vaab

4

Una solución alternativa para las aplicaciones escritas en C11 o C++ 11 es utilizar el carácter Unicode combining long stroke overlay.

En C++ 11 se puede escribir código o menos así:

#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; 
} 

El código prefijos cada carácter en la entrada text con la superposición de carrera \u0336. Tenga en cuenta que la función supone que text está codificado en una codificación de un solo byte, como ASCII o latín. Si la entrada está en UTF-8, primero debe convertirse a UTF-32 para obtener los límites del carácter.

La salida es s̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h en un terminal compatible con UTF-8. No sé por qué el primer personaje no tiene un ataque, debe ser un problema terminal. Podría solucionar esto imprimiendo al menos un caracter antes de la llamada a la función tachado.

La solución Unicode también genera un bloqueo ligeramente diferente en mi terminal (terminator) en comparación con la secuencia de escape ANSI mencionada anteriormente. El primero representa la línea exactamente en el medio del texto, mientras que el segundo lo representa un poco más abajo.

Cuestiones relacionadas