Делаем так, чтобы терминал летал (часть 1)

  • Tutorial


Одним утром, работая в терминале, я задумался о том, что мой эмулятор терминала недостаточно быстрый и удобный, поэтому решил искать альтернативу старику gnome-terminal. Облазив половину интернета, а также репозитории с dotfile'ами, я нашёл достойную замену, и готов рассказать и показать как перейти с надоедливого gnome-terminal (который к тому же и медленный) на более новые эмуляторы терминала.


C чего стоит начать?


Первое, что я усвоил за 3 года работы на Linux — не пытайтесь написать все конфиги сами. Рук не хватит. В наше время каждая программа имеет свой собственный формат конфигурации будь-то .json, .cson, .vimrc, и так далее. Написать всё под себя, не пытаясь ничего перенять у других — пытка для вашего ума. Инструменты созданы (в основном) для того чтобы на них работать, а не всю жизнь их настраивать.


А что не так с Gnome-terminal?


Лично мне не нравится в нём многое: внешний вид, скорость, функциональность, время подгрузки оболочки. Мне терминал нужен для того, чтобы редактировать мелкие скрипты, иногда с мультиплексором. Я часто открываю и закрываю терминал, поэтому он должен прогружаться быстро. Также я использую Vim, как основной редактор, так что он должен быть полностью совместим с новым эмулятором терминала.


Скорость


Давайте посмотрим сколько времени требуется каждой консоли для выведения всех символов от 1 до 1,000,000 (шрифты везде одинаковые, так что погрешность времени прогрузки шрифта ± одинакова.


Alacritty (с включенным tmux + zsh)



Gnome-terminal + zsh



Hyper + zsh



Функциональность и использование памяти


В Gnome-terminal банально нет копирования при выделении мышью, при создании нового экземпляра этот монстр жрёт плюс 20 мегабайт памяти только на создание нового окна.
При включении zsh при старте, эмулятор gnome'a долго его грузил, что для меня уже недопустимо.


Решение проблемы


Облазив некоторые ресурсы (ссылки на которые будут приведены в конце), я понял что gnome-terminal никуда не годится. Мне нужен продуктивный эмулятор терминала, который можно настроить так, чтобы он буквально понимал меня с полуслова. Также терминал должен быстро прогружать связку tmux+zsh.


Hyper


Hyper — эмулятор терминала, который построен на веб-технологиях. Его можно видоизменять с помощью стилей CSS. Он расширяемый и быстрый.



Уже настроенный Hyper


Alacritty


Alacritty — эмулятор терминала, который считается самым быстрым (по заявлению разработчика). Его работа ускоряется за счёт видео карты, он умеет выдерживать большие нагрузки (как видно, он даже с включенным tmux + zsh справился быстрее, нежели gnome + zsh)



Уже настроенный Alacritty


Конфигурация


Конфигурацию я выложил на Github по ходу того, как писал (и пишу) её, а также переводил, если брал у кого-то кусочки или брал примеры из документации. По своему усмотрению вы сами можете твикать всё как захотите. Не стесняйтесь делать pull-запросы, если у вас есть предложения. Моя цель — собрать удобную конфигурацию, которая бы смогла удовлетворить почти всех, а также с помощью одного скрипта, программист мог спокойно взять и начать работать, а не находится в поисках "где там я свою конфигурацию потерял".


Также в репозитории приложены два файла fastconfig.sh и fastconfig_arch.sh. 1-й для Debian/Ubuntu, второй для Arch/Manjaro.


Пишем свою конфигурацию


Я начну с Alacritty.


# Всё, что выделяется мышью сразу идёт в буфер обмена
save_to_clipboard: true # или false

window: 
  padding:
# Отступы от самой рамки терминала по x,y. У меня отступов нет.
    x: 0 
    y: 0
  dynamic_padding: false
# Под декорациями имеется ввиду вид окна (transparent сделает края невидимыми)
  decorations: full 

  startup_mode: Fullscreen # Windowed - оконный, Maximized - оконный на весь экран, Fullscreen - на весь экран

# # # # # # # # # # # # # # # # # #    Прокрутка    # # # # # # # # # # # # # # # # # #
scrolling:
          history: 10000
          multiplier: 3 # Сколько строк пропускается за один сдвиг колёсика мыши
          faux_multiplier: 3
          auto_scroll: true # При появлении новой строки в терминале, он прокручивается вниз

#####################    Настройка шрифтов    #####################
font:
    normal:
      family: "Fira Code"
    bold:
      family: "Fira Code"
    italic:
      family: "Fira Code"

    size: 15.0 # Размер шрифта

#Отступы у шрифта
    offset:
      x: 0
      y: 0

    glyph_offset:
      x: 0
      y: 0

    # Печатать жирный текст яркими шрифтами
    draw_bold_text_with_bright_colors: true

###########################    Темы    ##########################
# Темы были взяты отсюда https://github.com/eendroroy/alacritty-theme

#Цвета (Base16 Default Dark) 
  colors:
    # Default colors
    primary:
      background: '0x181818'
      foreground: '0xd8d8d8'

    # Colors the cursor will use if `custom_cursor_colors` is true
    cursor:
      text: '0xd8d8d8'
      cursor: '0xd8d8d8'

    # Normal colors
    normal:
      black:   '0x181818'
      red:     '0xab4642'
      green:   '0xa1b56c'
      yellow:  '0xf7ca88'
      blue:    '0x7cafc2'
      magenta: '0xba8baf'
      cyan:    '0x86c1b9'
      white:   '0xd8d8d8'

    # Bright colors
    bright:
      black:   '0x585858'
      red:     '0xab4642'
      green:   '0xa1b56c'
      yellow:  '0xf7ca88'
      blue:    '0x7cafc2'
      magenta: '0xba8baf'
      cyan:    '0x86c1b9'
      white:   '0xf8f8f8'

########################    Шелл    ##########################
shell:
          program: /bin/bash
          args:
                  - -c
                  - tmux

#######################    Хоткеи    ##########################
key_bindings:
  - { key: V,        mods: Command,       action: Paste                        }
  - { key: C,        mods: Command,       action: Copy                         }
  - { key: Q,        mods: Command,       action: Quit                         }
  - { key: N,        mods: Command,       action: SpawnNewInstance             }
  - { key: Return,   mods: Command,       action: ToggleFullscreen             }

  - { key: Home,                          chars: "\x1bOH",   mode: AppCursor   }
  - { key: Home,                          chars: "\x1b[H",   mode: ~AppCursor  }
  - { key: End,                           chars: "\x1bOF",   mode: AppCursor   }
  - { key: End,                           chars: "\x1b[F",   mode: ~AppCursor  }
  - { key: Equals,   mods: Command,       action: IncreaseFontSize             }
  - { key: Minus,    mods: Command,       action: DecreaseFontSize             }
  - { key: Minus,    mods: Command|Shift, action: ResetFontSize                }
  - { key: PageUp,   mods: Shift,         chars: "\x1b[5;2~"                   }
  - { key: PageUp,   mods: Control,       chars: "\x1b[5;5~"                   }
  - { key: PageUp,                        chars: "\x1b[5~"                     }
  - { key: PageDown, mods: Shift,         chars: "\x1b[6;2~"                   }
  - { key: PageDown, mods: Control,       chars: "\x1b[6;5~"                   }
  - { key: PageDown,                      chars: "\x1b[6~"                     }
  - { key: Left,     mods: Shift,         chars: "\x1b[1;2D"                   }
  - { key: Left,     mods: Control,       chars: "\x1b[1;5D"                   }
  - { key: Left,     mods: Alt,           chars: "\x1b[1;3D"                   }
  - { key: Left,                          chars: "\x1b[D",   mode: ~AppCursor  }
  - { key: Left,                          chars: "\x1bOD",   mode: AppCursor   }
  - { key: Right,    mods: Shift,         chars: "\x1b[1;2C"                   }
  - { key: Right,    mods: Control,       chars: "\x1b[1;5C"                   }
  - { key: Right,    mods: Alt,           chars: "\x1b[1;3C"                   }
  - { key: Right,                         chars: "\x1b[C",   mode: ~AppCursor  }
  - { key: Right,                         chars: "\x1bOC",   mode: AppCursor   }
  - { key: Up,       mods: Shift,         chars: "\x1b[1;2A"                   }
  - { key: Up,       mods: Control,       chars: "\x1b[1;5A"                   }
  - { key: Up,       mods: Alt,           chars: "\x1b[1;3A"                   }
  - { key: Up,                            chars: "\x1b[A",   mode: ~AppCursor  }
  - { key: Up,                            chars: "\x1bOA",   mode: AppCursor   }
  - { key: Down,     mods: Shift,         chars: "\x1b[1;2B"                   }
  - { key: Down,     mods: Control,       chars: "\x1b[1;5B"                   }
  - { key: Down,     mods: Alt,           chars: "\x1b[1;3B"                   }
  - { key: Down,                          chars: "\x1b[B",   mode: ~AppCursor  }
  - { key: Down,                          chars: "\x1bOB",   mode: AppCursor   }
  - { key: Tab,      mods: Shift,         chars: "\x1b[Z"                      }
  - { key: F1,                            chars: "\x1bOP"                      }
  - { key: F2,                            chars: "\x1bOQ"                      }
  - { key: F3,                            chars: "\x1bOR"                      }
  - { key: F4,                            chars: "\x1bOS"                      }
  - { key: F5,                            chars: "\x1b[15~"                    }
  - { key: F6,                            chars: "\x1b[17~"                    }
  - { key: F7,                            chars: "\x1b[18~"                    }
  - { key: F8,                            chars: "\x1b[19~"                    }
  - { key: F9,                            chars: "\x1b[20~"                    }
  - { key: F10,                           chars: "\x1b[21~"                    }
  - { key: F11,                           chars: "\x1b[23~"                    }
  - { key: F12,                           chars: "\x1b[24~"                    }
  - { key: Back,                          chars: "\x7f"                        }
  - { key: Back,     mods: Alt,           chars: "\x1b\x7f"                    }
  - { key: Insert,                        chars: "\x1b[2~"                     }
  - { key: Delete,                        chars: "\x1b[3~"                     }

В следующей части проделаем то же самое с XTerm и Hyper. А также настроим Tmux и Vim.


Ссылки

Сравнение эмуляторов терминала на Slant
Alacritty.yml для примера
Темы на Alacritty

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 17

    +1
    Все 3 «терминала» из статьи — эмуляторы терминала.

    мой терминал недостаточно быстрый и удобный

    Нет важного уточнения, для каких задач «недостаточно быстрый и удобный»?

    Делаем так, чтобы терминал летал

    Вопрос «зачем» не раскрыт.
      0

      Подредактировал. Спасибо за уточнение.

      +8
      эмм… я всё правильно понял, что Gnome Terminal обвиняется в монструозности и жоре памяти (20 мегабайт), а альтернативой ему предлагается Hyper на базе Electron?
      чем скорость мерили, time с format?
      • UFO just landed and posted this here
          +1
          Я часто открываю и закрываю терминал, поэтому он должен прогружаться быстро.

          Эмм, даже на моём железе терминал открывается моментально. Может быть вам стоит приобрести SSD?

          Скорость запуска gnome-terminal на моём железе:
          real 0m0,162s
          user 0m0,111s
          sys 0m0,024s


          В Gnome-terminal банально нет копирования при выделении мышью

          Вообще, для вставки текста после выделения достаточно нажать на колёсико мыши. К сожалению, не многие знают про эту фичу, но я пользуюсь ею ежедневно. Попробуйте.

            +2

            Да и без мышки можно. Ctrl+sift+c / Ctrl+shif+v

            +2
            Долго открывается? хм… не закрывайте и всё. Или поставить что-то из tilda, yakukake. Я вот поставил yakukake (это из КДЕ, для фанатов гнома наверное не подойдёт) — и окно всплывает по горячей клавише практически мгновенно.
              0

              В Gnome для этого есть guake. Всю жизнь им пользуюсь, даже кнопку на ~ (тильду) настраиваю. И да, без анимации открываться моментально.

                0
                С ужасом сейчас осознал, что в КДЕ совсем убрали возможность отключить некоторые эффекты окон. Раньше была галочка для отключения всех эффектов, теперь не могу нигде найти.
                Кстати, если на тильду настроить, как потом в CS/CSGO играть? Не вылезает поверх этот терминал? Ведь на тильде в этих играх стоит своя консоль, и ей активно пользуются.

                P.S. хоть анимация появления окна и снижает скорость его полного появления, это не влияет на возможность ввода туда. Т.е. даже если окно ещё полностью не проявилось, можно вводить туда команды. Я проверил на ll (ls -l). анимация около 250-300мс, за это время ввожу ll, Enter — и пока появится, уже есть результат. Или проще ввести команду, и при следующем вызове терминала нажать просто enter — сразу понятно, что до полного отображения окна ввод уже работает.
                  0

                  Промахнулся окном ответа.

              0
              Кстати, если на тильду настроить, как потом в CS/CSGO играть?

              Не знаю, не играю в CS/CSGO. Его нельзя просто поменять в настройках?


              Вот когда это действительно бывает проблемой, так это когда мне нужен обратный апостроф (он на той же кнопке что и тильда). Но терминалом я пользуюсь на порядки чаще, чем апострофом, так что ввожу его или через Ctrl+Shift+U, 60, Enter, либо настраиваю хоткей под него.

                0
                А ещё там буква Ё, и собственно тильда. Мне вот они все нужны, хоть и не часто апостроф использую, но уж Ё часто и тильду тоже.
                  0
                  Да уж, в латехе без тильды с апострофом не понабираешь особо.
                  А насчет эмулятора терминала — какой-то уж очень убогий обзор получился. Мне, например, нравится xfce4-terminal (хоть сам xfce4 я не использую, у меня i3 везде). Запускается за сотые доли секунды. И потребляет мало: на работе постоянно открыто минимум 4 эмулятора терминала на разных рабочих столах, плюс в каждом по нескольку вкладок. И на фоне qt-creator'а и браузеров вообще потребления ресурсов не видно.
                  Да и вообще, что может быть «тормозного» в обычном эмуляторе терминала? Это ж не браузер какой-нибудь, гигабайты памяти отжирающий…
                    0

                    Так с тильдой как раз нету проблем, потому что она с шифтом набирается и guake на эту комбинацию не реагирует.


                    А вместо ё я использую е.

                  +1

                  Добрались до точки, когда для выигрыша в скорости при отрисовке CLI используют графический процессор… Что дальше по списку?

                    +1
                    А дальше на каждый PID по асику!
                    0

                    Признанные чемпионы по быстродействию среди терминалов — evilvte и st.

                    Only users with full accounts can post comments. Log in, please.