2011-12-02 25 views

Odpowiedz

12

Zgodnie z normą ECMA-48 dla terminali, kod numer 9 SGR (Select Graphic Rendition) ma na celu włączenie przekreślonego tekstu. Jednak strona wikipedii ANSI escape code mówi, że nie jest szeroko obsługiwana i nie jestem tego świadomy. Podejrzewam, że to dlatego, że DEC's VTxxx series didn't support it.

+0

Moje 'libvterm' /' pangoterm' może zrobić to dobrze. Zobacz drugi zrzut ekranu w [link] (http://leonerds-code.blogspot.com/2011/09/libvtermpangoterm-and-tickit.html) – LeoNerd

+3

Właściwie dobry zestaw głównego terminala powłoki wydaje się go wspierać (obejmuje to '' guake'', '' terminator'', '' gnome-terminal'', ...). http://misc.flogisoft.com/bash/tip_colors_and_formatting#terminals_compatibility. Szybki test: "echo -e" \ e [9mtest \ e [0m "'. – vaab

4

Alternatywnym rozwiązaniem dla aplikacji napisanych w C11 lub C++ 11 jest użycie znaku Unicode combining long stroke overlay.

w C++ 11 można napisać kod coś takiego:

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

Kod prefiksów każdy znak na wejściu text z udarem nakładki \u0336. Zauważ, że funkcja zakłada, że ​​kod text jest kodowany w kodowaniu jednobajtowym, takim jak ASCII lub łaciński. Jeśli wejście jest w UTF-8, najpierw musi zostać przekonwertowane na UTF-32, aby uzyskać granice znaków.

Dane wyjściowe to s̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h w terminalu obsługującym UTF-8. Nie wiem, dlaczego pierwsza postać nie ma żadnego przejścia, musi być kwestią terminala. Mógłbym obejść to, drukując przynajmniej jeden znak przed wywołaniem funkcji przekreślenia.

Rozwiązanie Unicode generuje również nieco inne blokowanie w moim terminalu (terminator) w porównaniu do sekwencji eskportowej ANSI wspomnianej powyżej. Ta pierwsza powoduje, że linia jest dokładnie w środku tekstu, podczas gdy druga sprawia, że ​​jest nieco poniżej.

Powiązane problemy