abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 03:33 | IT novinky

    Google postupně zpřístupňuje českým uživatelům Režim AI (AI Mode), tj. nový režim vyhledávání založený na umělé inteligenci. Režim AI nabízí pokročilé uvažování, multimodalitu a možnost prozkoumat jakékoliv téma do hloubky pomocí dodatečných dotazů a užitečných odkazů na weby.

    Ladislav Hagara | Komentářů: 0
    včera 18:11 | Nová verze

    Programovací jazyk Python byl vydán v nové major verzi 3.14.0. Podrobný přehled novinek v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 2
    včera 16:33 | IT novinky

    Bylo oznámeno, že Qualcomm kupuje Arduino. Současně byla představena nová deska Arduino UNO Q se dvěma čipy: MPU Qualcomm Dragonwing QRB2210, na kterém může běžet Linux, a MCU STM32U585 a vývojové prostředí Arduino App Lab.

    Ladislav Hagara | Komentářů: 1
    včera 15:55 | Nová verze

    Multiplatformní open source voxelový herní engine Luanti byl vydán ve verzi 5.14.0. Podrobný přehled novinek v changelogu. Původně se jedná o Minecraftem inspirovaný Minetest v říjnu loňského roku přejmenovaný na Luanti.

    Ladislav Hagara | Komentářů: 0
    včera 13:22 | Nová verze

    Byla vydána nová stabilní verze 6.10 (YouTube) multiplatformního frameworku a GUI toolkitu Qt. Podrobný přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    6.10. 23:55 | Komunita

    Ubuntu 26.04 LTS bude (𝕏) Resolute Raccoon (rezolutní mýval).

    Ladislav Hagara | Komentářů: 5
    6.10. 21:00 | Nová verze

    Netwide Assembler (NASM) byl vydán v nové major verzi 3.00. Přehled novinek v poznámkách k vydání v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 0
    6.10. 20:11 | Komunita

    Linuxová distribuce Frugalware (Wikipedie) ke konci roku 2025 oficiálně končí.

    Ladislav Hagara | Komentářů: 0
    6.10. 17:22 | Nová verze

    Byla vydána nová verze 3.0.6 svobodné aplikace pro úpravu a vytváření rastrové grafiky GIMP (GNU Image Manipulation Program). Přehled novinek v oznámení o vydání a v souboru NEWS na GitLabu. Nový GIMP bude brzy k dispozici také na Flathubu.

    Ladislav Hagara | Komentářů: 0
    6.10. 16:11 | IT novinky

    Americký výrobce čipů AMD uzavřel s americkou společností OpenAI smlouvu na několikaleté dodávky vyspělých mikročipů pro umělou inteligenci (AI). Součástí dohody je i předkupní právo OpenAI na přibližně desetiprocentní podíl v AMD.

    Ladislav Hagara | Komentářů: 1
    Jaké řešení používáte k vývoji / práci?
     (39%)
     (45%)
     (15%)
     (18%)
     (21%)
     (15%)
     (18%)
     (15%)
     (15%)
    Celkem 194 hlasů
     Komentářů: 13, poslední dnes 07:41
    Rozcestník

    Dotaz: [C++] ANSI Colors a reset

    hermes avatar 4.11.2021 19:34 hermes | skóre: 6 | blog: Elektro | BA
    [C++] ANSI Colors a reset
    Přečteno: 473×
    Ahojte, robím na jednej konzolovej utilite. kôli zjednodušeniu orientácie tam používam farby.Tie volím cez ANSI escape sekvencie. Inšpiroval som týmto článkom (je to v pythone, ale pre inšpiráciu to stačí).

    Do tabuľky vypisujem rôzne hodnoty a veličiny a stringy, skladám cez std::stringstream.

    No a zaujímalo by ma, či neexistuje nejaká escape sekvencia, ktorá by dokázala vyresetovať farbu, ale nie na defaultnú farbu ako cez "\x1B[0m", ale na predchádzajúcu farbu. Viete o niečom takom? alebo ANSI nič také nepodporuje? Mohol by som si aktuálnu farbu niekam ukladať a potom sa k nej vrátiť, ale to by mi zbytočne skomplikovalo kód (ale ak to nepojde nejakou escape sekvenciou, tak to tak asi spravím)

    Řešení dotazu:


    Odpovědi

    Řešení 1× (Вherzet)
    4.11.2021 20:29 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: [C++] ANSI Colors a reset
    Ja som o tom nikdy nepočul, o takej feature. Escape sekvencie je LOW level interface, takže predpokladom, že priamo v ňom nie. Uvidí sa, čo iný.
    debian.plus@protonmail.com
    Řešení 1× (Andrej)
    11.11.2021 06:57 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: [C++] ANSI Colors a reset

    C++ má přesně k takovým účelům (udržování kontextu a návrat do původního stavu) své standardní mechanismy. Předchozí barva se dá jednoduše ukládat na zásobník a pak nechat obnovit destruktorem.

    Uvedený příklad není (kvůli statické proměnné) thread-safe, nicméně to by nemuselo vadit, protože terminál bývá jeden.

    Taky to podporuje jenom 256 barev místo 24-bitových, ale to se dá celkem triviálně doplnit.

    #include <cstdint>
    #include <ios>
    #include <iostream>
    #include <string>
    #include <string_view>
    #include <utility>
    
    using std::uint8_t;
    using std::size_t;
    
    class Color {
      class Value {
        const std::string code_;
       public:
        Value(std::string_view code);      // C++20: constexpr
        std::ostream& operator ()(std::ostream &out) const;
      };
    
      Color(std::ostream *out, const Value &previous,
            const Value &value, bool value_owned);
      std::ostream& operator ()(std::ostream &out);
      static const Value *_current;
      std::ostream *out_;
      const Value &previous_;
      const Value &value_;
      const bool value_owned_;
      friend std::ostream& operator <<(std::ostream& out, Color &&color);
    
     public:
      Color(Value &&value);
      Color(const Value &value);
      Color(std::ostream &out, Value &&value);
      Color(std::ostream &out, const Value &value);
      static Value custom(uint8_t color);  // C++20: constexpr
      ~Color();
    
      static const Value THICK;            // C++20: constexpr
      static const Value RESET;            // C++20: constexpr
      static const Value BLACK;            // C++20: constexpr
      static const Value RED;              // C++20: constexpr
      static const Value GREEN;            // C++20: constexpr
      static const Value YELLOW;           // C++20: constexpr
      static const Value BLUE;             // C++20: constexpr
      static const Value MAGENTA;          // C++20: constexpr
      static const Value CYAN;             // C++20: constexpr
      static const Value WHITE;            // C++20: constexpr
    };
    
    Color::Value::Value(std::string_view code) : code_{code} {}
    std::ostream& Color::Value::operator ()(std::ostream &out) const {
      return out << code_;
    }
    
    Color::Color(std::ostream *out, const Value &previous,
                 const Value &value, bool value_owned) :
        out_{out}, previous_{previous}, value_{value}, value_owned_(value_owned) {}
    std::ostream& Color::operator ()(std::ostream& out) {
      out_ = &out;
      _current = &value_;
      return value_(out);
    }
    Color::Color(Value &&value) :
        Color{nullptr, *_current, *new Value{std::move(value)}, true} {}
    Color::Color(const Value &value) :
        Color{nullptr, *_current, value, false} {}
    Color::Color(std::ostream &out, Value &&value) :
        Color{&out, *_current, *new Value{std::move(value)}, true} {
      _current = &value_;
      value(out);
    }
    Color::Color(std::ostream& out, const Value& value) :
        Color{&out, *_current, value, false} {
      _current = &value_;
      value(out);
    }
    
    Color::Value Color::custom(uint8_t color) {
      return Value("\u001B[38;5;" + std::to_string(color) + 'm');
    }
    
    Color::~Color() {
      if (out_) previous_(*out_);
      _current = &previous_;
      if (value_owned_) delete &value_;
    }
    
    std::ostream& operator <<(std::ostream& out, Color &&color) {
      return color(out);
    }
    
    const Color::Value Color::RESET{"\u001B[0m"};
    const Color::Value Color::THICK{"\u001B[0;1m"};
    const Color::Value Color::BLACK{"\u001B[30;1m"};
    const Color::Value Color::RED{"\u001B[31;1m"};
    const Color::Value Color::GREEN{"\u001B[32;1m"};
    const Color::Value Color::YELLOW{"\u001B[33;1m"};
    const Color::Value Color::BLUE{"\u001B[34;1m"};
    const Color::Value Color::MAGENTA{"\u001B[35;1m"};
    const Color::Value Color::CYAN{"\u001B[36;1m"};
    const Color::Value Color::WHITE{"\u001B[37;1m"};
    const Color::Value *Color::_current = &Color::RESET;
    
    void recursion(size_t base, size_t shift) {
      if (shift < 16) {
        Color next{std::cout, Color::custom(base + shift)};  // overflow intended
        std::cout << shift;
        recursion(base, shift + 1);
        std::cout << shift;
      } else {
        std::cout << " █ ";
        std::cout << Color{Color::BLACK} << 'K'
                  << Color{Color::RED} << 'R'
                  << Color{Color::GREEN} << 'G'
                  << Color{Color::YELLOW} << 'Y'
                  << Color{Color::BLUE} << 'B'
                  << Color{Color::MAGENTA} << 'M'
                  << Color{Color::CYAN} << 'C'
                  << Color{Color::WHITE} << 'W';
        std::cout << " █ ";
      }
    }
    
    int main() {
      std::cout << std::hex << '\n';
      std::cout << Color{Color::THICK} << '>'
                << Color{Color::BLACK} << "black"
                << Color{Color::THICK} << '<'
                << Color{Color::RED} << " red"
                << Color{Color::GREEN} << " green"
                << Color{Color::YELLOW} << " yellow"
                << Color{Color::BLUE} << " blue"
                << Color{Color::MAGENTA} << " magenta"
                << Color{Color::CYAN} << " cyan"
                << Color{Color::WHITE} << " white";
      std::cout << "\n\n";
      std::cout << "This is the default.\n";
      {
        Color red{std::cout, Color::RED};
        std::cout << "This is red.\n";
        {
          Color green{std::cout, Color::GREEN};
          std::cout << "This is green.\n";
          {
            Color blue{std::cout, Color::BLUE};
            std::cout << "This is blue.\n";
            std::cout << Color{Color::YELLOW} << "This is yellow.\n";
            std::cout << "This is blue.\n";
          }
          std::cout << "This is green.\n";
        }
        std::cout << "This is red.\n";
      }
      std::cout << "This is the default.\n\n";
      for (size_t color = 0; color < 256; ++color) {
        recursion(color, 0);
        std::cout << '\n';
      }
      std::cout << '\n';
      {
        Color thick{std::cout, Color::THICK};
        std::cout << "This is fucking thick!!!\n";
        std::cout << Color{Color::custom(77)} << "And this is almost green.\n";
        std::cout << "Thick again.\n";
        Color orange{std::cout, Color::custom(208)};
        std::cout << "This is an arbitrary orange color.\n";
      }
      std::cout << "And this is the default again!\n\n";
    }
    

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.