Получите максимум от своего терминала: подробное руководство по настройке WezTerm

Получите максимум от своего терминала: подробное руководство по настройке WezTerm

23 февраля 2023 г.

Терминалы с графическим процессором сейчас в моде. Соревнование между такими игроками, как Alacritty, Kitty, Foot, Warp и WezTerm накаляется, и до сих пор нет явного победителя. Хотя у них нет всех причудливых функций, которые есть у классических терминалов, таких как iTerm2 или Terminator, таких как хорошая поддержка растровых шрифтов и лигатур, они могут быстрее отображать и обновление больших объемов информации. И хотя обычный человек (не чемпион Counter Strike с монитором с частотой 240 Гц) медленно обрабатывает всю эту информацию, возможность оптимизировать производительность терминала может быть забавным способом показать свою занудную сторону 🤓.

Я решил перейти с iTerm2 на один из альтернативных вариантов с питанием... Теперь вопрос в том, какой из них мне выбрать? Но сначала я дам очень краткое изложение каждого из них.

Алакритти 💨

На мой взгляд, он самый медленный, и его стабильность сомнительна. Он имеет минималистичный стиль с простым пользовательским интерфейсом, в котором нет вкладок или панелей и отсутствуют лигатуры шрифтов. Некоторые люди сообщают, что он часто падает. Кроме того, автор известен своим тщательным вниманием к деталям, поэтому новые функции добавляются медленно. Несмотря на недостатки, у него в 2,5 раза больше звезд на Github, чем у нашего следующего варианта.

Китти 🐱

Терминал предлагает больше возможностей для настройки и может похвастаться задержкой 35 мс, с периодическими всплесками 7 мс, тогда как у Alacritty задержка составляет 50 мс. Терминал лучше отображает шрифты и поддерживает лигатуры, хотя их может потребоваться настроить. К сожалению, Kitty недоступна в Windows.

Нога 🦶

Менее известный вариант в этом районе. Несмотря на то, что у него нет поддержки графического процессора, я все же хотел упомянуть его, потому что он известен своим низким потреблением ресурсов. В моем тестировании он использовал только 13-19 МБ ОЗУ. Он обладает высокой производительностью благодаря продуманному дизайну, который сводит к минимуму задержку ввода даже без рендеринга с помощью графического процессора. Таким образом, терминал является одновременно высокопроизводительным и ресурсосберегающим. Автор тщательно объясняет недостатки производительности и сравнивает их с Alacritty.

Деформация 🌀

Поистине инновационная и переосмысленная версия классических терминалов, которая работает как редактор кода и поддерживает поиск команд с помощью ИИ на базе GPT-3. Благодаря новому рабочему процессу взаимодействия stdin/stdout и многим другим замечательным функциям это меняет правила игры для некоторых хипстеров (если вы не боитесь телеметрии).

ВезТерм 🤠

Мой любимый. Хотя ковбойский смайлик может указывать на связь с западным жанром, он не имеет ничего общего с самим терминалом. Имя Вез — это просто имя автора.

Если вы ищете терминал, одинаковый для Windows, Mac и Linux, то WezTerm — это то, что вам нужно. Построен с использованием Rust, как и Alacritty, поэтому может похвастаться высокой производительностью. Он загружен многими хорошо документированными функциями и легко настраивается с помощью конфигураций Lua, что делает его фаворитом среди пользователей Vim. Несмотря на то, что это относительно новый релиз, его документация уже на высшем уровне, лучше, чем у любого другого терминала.

Базовая конфигурация

При этом настройка WezTerm может быть сложной из-за отсутствия руководства по началу работы и ограниченного количества примеров. Когда вы впервые установите WezTerm, ваш файл ~/.wezterm.lua будет пустым, оставив вас в неведении относительно всех фантастических функций, которые предлагает терминал. Но не волнуйтесь! Вот тут-то и пригодится эта статья. Я расскажу вам о своей конфигурации, подробно объяснив каждую строку и предоставив полный пример, который вы можете использовать или изменить в соответствии со своими потребностями.

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

Модуль wezterm обеспечивает доступ к настройке и управлению WezTerm в вашем конфигурационном файле. Рекомендуется поместить эту строку в начало файла конфигурации.

local wezterm = require 'wezterm'

Теперь добавим еще две переменные. Модуль wezterm.mux управляет уровнем мультиплексора, который отвечает за все, что связано с панелями, вкладками, окнами и рабочими пространствами, но не за сам терминал. А модуль wezterm.action помогает нам связать ключи с действиями. Технически, action — это конкретный конструктор перечисления, а mux — отдельный модуль Lua, но пока это не имеет значения.

local mux = wezterm.mux
local act = wezterm.action

Пойдем немного дальше.

Функция wezterm.on запускает обратный вызов после определенного события. Как видите, событие gui-startup вызывает function(cmd). Проще говоря, функция запускается сразу после запуска терминала. Это довольно просто.

Затем мы создаем новое окно, используя mux.spawn_window, который возвращает объекты, связанные с этим окном. Хотя мы можем не использовать эти возвращенные значения, их все равно необходимо зафиксировать. Вот как это работает. Если вам нужно более точное понимание, вы можете найти определения доступных функций на странице поиска веб-сайта WezTerm.

Кроме того, мне нравится сразу разворачивать окно.

wezterm.on('gui-startup', function()
 local tab, pane, window = mux.spawn_window({})
 window:gui_window():maximize()
end)

Следующая существенная заключительная часть начинается с оператора return.

return {
 default_prog = { '/usr/local/bin/fish', '-l' }
 window_decorations = "RESIZE"
 ...

}

Да, в структуре WezTerm нам нужен return результат нашей конфигурации, чтобы остальная часть конфигурации была заключена в скобки return.

С помощью default_prog мы устанавливаем нашу любимую оболочку. Моя - рыба. Флаг -l означает запуск, как если бы он запускался как оболочка входа в систему. Установив для window_decorations значение RESIZE, мы достигнем минималистского дизайна, отключив строку заголовка и включив изменяемые размеры границ. Когда мы откроем WezTerm, мы получим развернутое окно без строки заголовка, именно так, как нам нравится. п

It maximizes quickly.

Хорошо, понял. Давайте повеселимся с панелями WezTerm. Вы можете изменить цвет фона, но, чтобы избежать проблем со здоровьем из-за отсутствия дизайнерских навыков, для настройки доступны только параметры насыщенности и яркости. Это сделано специально для WezTerm, поэтому вы можете легко увидеть, на какой панели вы сейчас находитесь, когда переключаетесь между ними.

inactive_pane_hsb = {
 saturation = 0.8
 brightness = 0.7
}

Давайте проверим желаемый результат.

You'll see that the background color changes as you switch.

Фактический стиль будет зависеть от цветовой схемы, поэтому мы переходим к следующему фрагменту конфигурации, называемому темой. Hardcore — хорошая тема, но вы можете найти 746 других на свой вкус на сайте Официальный веб-сайт. Не нужно ничего устанавливать. Просто поместите название темы под color_scheme.

color_scheme = 'Hardcore'
font = wezterm.font('JetBrainsMono Nerd Font')
font_size = 14
line_height = 1.2

Шрифт имеет большое значение для хакеров. Мне нравится JetBrainsMono Nerd, потому что он первоклассный и бесплатный. Мне может больше понравиться Berkeley Mono, но это слишком дорого.

Размер, который я установил на 14, зависит от вашего монитора и личных предпочтений. Для меня шрифт идеален, когда он слишком мелкий, но недостаточно мелкий. Высота следует тому же правилу, я думаю. Но лучше оставить высоту равной 1, потому что разработчик шрифта не обрадуется, если вы ее измените. Шрифт был разработан с его первоначальной высотой, и если вы испортите его, вы можете испортить то, что задумал создатель.

Далее.

use_dead_keys = false
scrollback_lines = 5000

Вы можете не знать о мертвых ключах. Если да, позвольте представить вам Википедию. Эти клавиши могут вызвать некоторые проблемы в редакторах Vim и определенных горячих клавишах оболочки. Во-вторых, строки прокрутки относятся к количеству строк, которые вы хотите видеть на вкладке. Я не помню, чтобы мне нужно было хранить более 5000 строк.

Затем давайте настроим размер шрифта, чтобы избежать проблем при использовании мозаичных оконных менеджеров, таких как Yabai (которым я пользуюсь). Что касается второго варианта, я не уверен, что мне нужно что-то добавить.

adjust_window_size_when_changing_font_size = false
hide_tab_bar_if_only_one_tab = true

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

window_frame = {
 font = wezterm.font { family = 'Noto Sans', weight = 'Regular' },
}

Конфигурация горячих клавиш

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

disable_default_key_bindings = true

Клавиша лидера — это комбинация клавиш, которая позволяет пользователям быстро получать доступ к различным функциям и командам в программе с помощью сочетаний клавиш. В VSCode клавиша лидера по умолчанию обычно имеет значение Ctrl в Windows или Linux и Cmd на Mac. Однако это можно настроить в соответствии с индивидуальными предпочтениями. Это работает следующим образом: сначала вы нажимаете ведущую клавишу, а затем нажимаете другую клавишу, чтобы активировать определенную функцию. Это отличается от горячих клавиш, которые требуют одновременного нажатия нескольких клавиш.

leader = { key = 'b', mods = 'CMD', timeout_milliseconds = 2000 }

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

Следующий кусок огромен. Большинство значений взяты из значений по умолчанию. Скажу только о ключах, которые я менял.

keys = {
  { key = 'l', mods = 'CMD|SHIFT', action = act.ActivateTabRelative(1) }
  { key = 'h', mods = 'CMD|SHIFT', action = act.ActivateTabRelative(-1) }
  { key = 'j', mods = 'CMD', action = act.ActivatePaneDirection 'Down', }
  { key = 'k', mods = 'CMD', action = act.ActivatePaneDirection 'Up', }
  { key = 'Enter', mods = 'CMD', action = act.ActivateCopyMode }
  { key = 'R', mods = 'SHIFT|CTRL', action = act.ReloadConfiguration }
  { key = '+', mods = 'CTRL', action = act.IncreaseFontSize }
  { key = '-', mods = 'CTRL', action = act.DecreaseFontSize }
  { key = '0', mods = 'CTRL', action = act.ResetFontSize }
  { key = 'C', mods = 'SHIFT|CTRL', action = act.CopyTo 'Clipboard' }
  { key = 'N', mods = 'SHIFT|CTRL', action = act.SpawnWindow }
  { key = 'U', mods = 'SHIFT|CTRL', action = act.CharSelect{ copy_on_select = true, copy_to =  'ClipboardAndPrimarySelection' } }
  { key = 'v', mods = 'CMD', action = act.PasteFrom 'Clipboard' }
  { key = 'PageUp', mods = 'CTRL', action = act.ActivateTabRelative(-1) }
  { key = 'PageDown', mods = 'CTRL', action = act.ActivateTabRelative(1) }
  { key = 'LeftArrow', mods = 'SHIFT|CTRL', action = act.ActivatePaneDirection 'Left' }
  { key = 'RightArrow', mods = 'SHIFT|CTRL', action = act.ActivatePaneDirection 'Right' }
  { key = 'UpArrow', mods = 'SHIFT|CTRL', action = act.ActivatePaneDirection 'Up' }
  { key = 'DownArrow', mods = 'SHIFT|CTRL', action = act.ActivatePaneDirection 'Down' }
  { key = 'f', mods = 'CMD', action = act.SplitVertical { domain = 'CurrentPaneDomain' }, }
  { key = 'd', mods = 'CMD', action = act.SplitHorizontal { domain = 'CurrentPaneDomain' }, }
  { key = 'h', mods = 'CMD', action = act.ActivatePaneDirection 'Left', }
  { key = 'l', mods = 'CMD', action = act.ActivatePaneDirection 'Right', }
  { key = 't', mods = 'CMD', action = act.SpawnTab 'CurrentPaneDomain' }
  { key = 'w', mods = 'CMD', action = act.CloseCurrentTab{ confirm = false } }
  { key = 'x', mods = 'CMD', action = act.CloseCurrentPane{ confirm = false } }
  { key = 'b', mods = 'LEADER|CTRL', action = act.SendString 'x02', }
  { key = 'Enter', mods = 'LEADER', action = act.ActivateCopyMode, }
  { key = 'p', mods = 'LEADER', action = act.PastePrimarySelection, }
  { key = 'k', mods = 'CTRL|ALT', action = act.Multiple
    {
      act.ClearScrollback 'ScrollbackAndViewport'
      act.SendKey { key = 'L', mods = 'CTRL' }
    }
  }
  { key = 'r', mods = 'LEADER', action = act.ActivateKeyTable { name = 'resize_pane', one_shot = false, }, }
}

Переключиться между вкладками

Переключение вкладок в браузерах всегда выполнялось с помощью Ctrl + Tab и Ctrl + Shift + < code>Tab горячие клавиши. Так было до тех пор, пока я не изучил Neovim и не нашел способ получше. Вместо использования традиционного метода вы можете нажать Ctrl + Shift + H, чтобы перейти на правую вкладку, и Ctrl + Shift + L на левую вкладку. Этот способ переключения вкладок быстрее, потому что он требует использования обеих рук, что упрощает переключение между вкладками, как профессионал. Это плюс, если вы являетесь пользователем Neovim и вам нужно переключаться между вкладками как в Neovim, так и в WezTerm во время работы с вашей оболочкой. И станет еще лучше, если вы настроите свой браузер (я использую Chrome) с такими же горячими клавишами, что позволит вам плавно переключать вкладки, не сильно двигая пальцами по клавиатуре.

н

BLAZINGLY FAST!!1 switching between tabs.

Создание вкладок

Проверенный метод использования Ctrl + Tab для открытия новой вкладки и Ctrl + W чтобы закрыть, он без проблем работает с браузерами. Ваша мышечная память поблагодарит вас за использование этой знакомой техники.

Разделить панели

Очень просто. Аналогичен iTerm2, но, вероятно, более доступен, поскольку вам всегда нужны два пальца. Просто Cmd + F, чтобы разделить панель по вертикали, и Cmd + D, чтобы разделить панель по горизонтали. Вы можете закрыть панель с помощью Ctrl + X, однако оболочка Ctrl + D также работает.

Копирование текста

Вы можете использовать клавишу Enter, если вам лень, но WezTerm так же удобен с мышью. В этом случае дважды щелкните (или выделите) текст, и он сразу же будет скопирован без нажатия Ctrl + C или чего-либо подобного.


Вот, наверное! Напоминаем, что вы можете настроить ключи для разных разделов, таких как copy_mode, search_mode и т. д. Я не вдаюсь в подробности, так как в основном использую значения по умолчанию. Я надеюсь, что это руководство помогло вам поднять настройку терминала WezTerm на новый уровень.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE