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


Одним утром, работая в терминале, я задумался о том, что мой эмулятор терминала недостаточно быстрый и удобный, поэтому решил искать альтернативу старику 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

Источник: habr.ru