tmux
Narzędzie o multiplikowania i zapisywania stanu sesji. Możemy wygodnie przełączać się pomiędzy kilkoma sesjami oraz nadawać im nazwy dla wygodniejszej pracy. Po zamknięciu konsoli możemy wygodnie powrócić do ostatniej konfiguracji.
sudo apt-get install tmux
Aby powrócić do ostatniej sesji:
tmux a
Screenshot
Skróty
Skrót | Opis |
---|---|
Ctrl + b; s | Widok wszystkich sesji z możliwością przełączania |
Ctrl + b; w | Widok wszystkich sesji i okien z możliwością przełączania |
Ctrl + b; $ | Zmiana nazwy aktywnej sesji |
Skrót | Opis |
---|---|
Ctrl + b; c | Otwarcie nowego okna w aktywnej sesji |
Ctrl + b; $ | Zmiana nazwy aktywnej sesji |
Ctrl + b; , | Zmiana nazwy aktywnego okna |
Ctrl + d | Zamknięcie otwartego okna |
Ctrl + b; n | Przełączenie do kolejnego okna w sesji |
Ctrl + b; p | Przełączenie do poprzedniego okna w sesji |
Ctrl + b; f | Znajdź okno |
Skrót | Opis |
---|---|
Ctrl + b; % | Podziel widok horyzontalnie |
Ctrl + b; " | Podziel widok wertykalnie |
Ctrl + b; o | Przełączenia pomiędzy oknami w danym widoku |
Skrót | Opis |
---|---|
Ctrl + b; ? | Wyświetlenie pomocy |
Ctrl + b; : | Konsola komend tmux, pozwala na bardziej zaawansowane operacja |
Komendy
Komenda | Opis |
---|---|
:swap-pane -U | Przenieś okno w górę (na liście okien) |
:swap-pane -D | Przenieś okno w dół (na liście okien) |
Linki
- GitHub home page (opens new window)
- How to Use tmux for Remote & Local Development (opens new window)
- Cheatsheet (opens new window)
CPP insights (link (opens new window))
Kompilator c++
wyświetlający kod pośredni. Jeśli kiedykolwiek zastanawiałeś się, jak kompilator zoptymalizuje dane wyrażenie, to dzięki
temu narzędziu możesz to sprawdzić.
Możesz sprawdzić:
- jak closure są przekazywane do lambdy
- jak kompilator optymalizuje wartość zwracaną z funkcji
- jakie iteratory są używane przy
for eatch
Screenshot
Przykłady
Mając poniższy kod:
#include <cstdio>
#include <vector>
int main()
{
std::vector<int> vec = {1,2,3,4};
const int value_1 = 33;
auto cb = [&](auto a) {
return value_1 * a;
};
for(auto item : vec) {
printf("%d", cb(item));
}
}
Otrzymujemy poniższy wynik. Możemy łatwo zaobserwować:
- vector jako template jest instancjowany nie tylko typem elementu, ale też domyślnym alokatorem
- lambda jest osobną klasą
- domknięcia używane przez lambdę to pola prywatne klasy ustawiane w konstruktorze
- pętla
for
korzysta z iteratorów w tym przypadku nie const
#include <cstdio>
#include <vector>
int main()
{
std::vector<int, std::allocator<int> > vec = std::vector<int, std::allocator<int> >{std::initializer_list<int>{1, 2, 3, 4}, std::allocator<int>()};
const int value_1 = 33;
class __lambda_9_14
{
public:
template<class type_parameter_0_0>
inline /*constexpr */ auto operator()(type_parameter_0_0 a) const
{
return value_1 * a;
}
#ifdef INSIGHTS_USE_TEMPLATE
template<>
inline /*constexpr */ int operator()<int>(int a) const
{
return value_1 * a;
}
#endif
private:
const int & value_1;
public:
__lambda_9_14(const int & _value_1)
: value_1{_value_1}
{}
};
__lambda_9_14 cb = __lambda_9_14{value_1};
{
std::vector<int, std::allocator<int> > & __range1 = vec;
__gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > > __begin1 = __range1.begin();
__gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > > __end1 = __range1.end();
for(; __gnu_cxx::operator!=(__begin1, __end1); __begin1.operator++()) {
int item = __begin1.operator*();
printf("%d", cb.operator()(item));
}
}
return 0;
}