В заметке кратко описан новый редактор кода Helix, которой является продолжением философии модальных редакторов Vim или NeoVim.
Цитата с официального сайта разработчиков: Начав с нуля, мы смогли извлечь уроки из нашего опыта работы с Vim и внести некоторые кардинальные изменения. Результатом является гораздо меньшая кодовая база и современный набор значений по умолчанию. Легче начать работу, если вы никогда раньше не использовали модальный редактор, и надо будет гораздо меньше возиться с файлами конфигурации. Helix использует традиционную для Vim модель редактирования с режимами (normal, insert, visual и т.д.), что позволяет эффективно выполнять различные операции над текстом. Helix стремится предоставить пользователям больше возможностей "из коробки", избавляя от необходимости устанавливать множество плагинов, как это часто бывает в Vim.
Helix написан на Rust, без Electron, без VimScript, без JavaScript. Helix устанавливается не голым чистым листом, предназначенным для дальнейшей доработки напильником. Он уже заряжен и готов к работе. Для примера посмотрим что у нас есть "из коробки":
Из коробки доступны все темы для NeoVim с первой страницы по популярности. Пишем ":theme " и щелкаем "tab" в поисках того, что глаз радует, или вводим первые буквы своей любимой темы.
Это вообще за гранью добра и зла. Жмем "Shift-с" и появляется второй курсор, еще раз "Shift-с" и еще один. Хоть 100500 курсоров делай, жми "," чтобы вернуться к одному курсору.
Это Language Server Protocol, к Helix все прикручивается само, нужно набрать в терминале helix --health, чтобы увидеть список доступных LSP, DAP, Formatter, Highlight, Textobject, Indent. Затем установить нужный пакет, автодополнение работает, аргументы функции при вводе подсвечиваются, и документация подтягивается. У меня прикручен LSP для markdown под названием Marksman. Хорошо работает навигация по заголовкам в документе по Space + s. Также есть автодополнение для ссылок, заголовков и списков; проверка ссылок и заголовков; поддержка перекрёстных ссылок между файлами. Если видишь ссылку на другой раздел или файл, наведи курсор на неё и нажми gd, чтобы перейти. Для поиска конкретного слова или фразы используй space + f. Если документ большой, используй закладки для быстрого возврата к важным разделам (установи закладку: m + буква, перейди к закладке: ' + буква).
Для настройки LSP необходимо править файл конфигурации language.toml, вот пример для сервера markdown-oxide:
[language-server]
markdown-oxide = { command = "markdown-oxide", args = [] }
[[language]]
name = "markdown"
scope = "text.markdown"
file-types = ["md", "markdown"]
auto-format = true
indent = { tab-width = 2, unit = " " }
language-servers = ["markdown-oxide"]
[[grammar]]
name = "markdown"
scope = "text.markdown"
source = { git = "https://github.com/tree-sitter/tree-sitter-markdown", rev = "d648397d155ea7f96e71da5cc707a1d7a12abf86" }Helix использует tree-sitter для парсинга кода, что обеспечивает точное и быстрое выделение синтаксиса, а также возможность выполнять сложные операции над кодом на основе его структуры.
Измененные/удаленные/добавленные строки подсвечиваются по-умолчанию. В строке статуса показывает название ветки и статус файла.
После Vim никакой конфиг нам не страшен. Но некоторые конфиги приятно удивляют своей простотой и понятностью. А тут еще и краткостью. Думаю рабочий конфиг Helix-a будет где-то в 10-50 раз меньше вашего конфига в Vim. И было очень приятно увидеть простые команды :config-open, :config-reload.
Пример конфига:
theme = "emacs"
[editor]
color-modes = true
auto-save = true
bufferline = "multiple"
completion-replace = true
mouse = true
true-color = true
[editor.soft-wrap]
enable = true
wrap-indicator = ""
[editor.statusline]
left = [
"mode",
"spinner",
"file-modification-indicator",
"version-control"
]
center = ["file-name", "read-only-indicator"]
right = [
"diagnostics",
"selections",
"position",
"file-encoding",
"file-line-ending",
"file-type"
]
mode.normal = "NORMAL"
mode.insert = "INSERT"
mode.select = "SELECT"
[editor.cursor-shape]
insert = "bar"
normal = "block"
select = "underline"В составных командах, типа "gg", после нажатия первой клавиши появляется окно с хоткеями.
Все клавиатурные команды редактора доступны на специальной странице сайта с документацией. Ниже кратко основные.
Helix использует несколько режимов для работы с текстом. Каждый режим имеет свои ключевые сочетания для выполнения различных команд.
| Режим | Описание |
|---|---|
| Normal | Режим для навигации и редактирования текста |
| Insert | Режим для вставки текста. |
| Visual | Режим для выделения текста. |
| Command | Режим для выполнения команд. |
Эти подрежимы доступны из нормального режима и обычно возвращают к нормальному режиму после выполнения команды.
| Клавиша | Описание |
|---|---|
v |
Войти в режим выделения (расширенное выделение) |
g |
Войти в режим перехода |
m |
Войти в режим соответствия |
w |
Войти в оконный режим |
Space |
Войти в режим пространства "picker" |
| Клавиша | Описание |
|---|---|
w |
Переключение между окнами |
Ctrl-w |
Переход в предыдущее окно |
Ctrl-q |
Закрытие текущего окна |
Ctrl-t |
Открытие нового окна |
Alt-w |
Разделить окно по вертикали |
Alt-v |
Разделить окно по горизонтали |
| Клавиша | Описание |
|---|---|
: |
Перейти к строке по номеру. |
g |
Перейти к символу на строке. |
Ctrl-] |
Перейти к следующей функции/методу в файле. |
Ctrl-[ |
Вернуться к предыдущей функции/методу в файле. |
m |
Перейти к маркеру в файле. |
f |
Перейти к символу в текущей строке. |
Ctrl-f |
Перейти к следующему вхождению символа в файле. |
Ctrl-b |
Перейти к предыдущему вхождению символа в файле. |
Helix имеет множество команд для выполнения различных действий в редакторе. Каждая команда связана с конкретной задачей.
| Команда | Описание |
|---|---|
:w |
Сохранить файл. |
:q |
Закрыть редактор. |
:wq |
Сохранить и выйти. |
:e файл |
Открыть указанный файл. |
В Helix доступны различные команды для эффективной навигации по тексту.
| Команда | Описание |
|---|---|
gg |
Перейти в начало файла. |
G |
Перейти в конец файла. |
Ctrl + f |
Прокрутить вниз по странице. |
Ctrl + b |
Прокрутить вверх по странице. |
| Команда | Описание |
|---|---|
r |
Заменить символ на другой. |
R |
Заменить символ на текст, который был скопирован. |
~ |
Переключить регистр выделенного текста. |
` |
Преобразовать выделенный текст в нижний регистр. |
Alt- |
Преобразовать выделенный текст в верхний регистр. |
i |
Вставить до выделения. |
a |
Вставить после выделения. |
I |
Вставить в начало строки. |
A |
Вставить в конец строки. |
o |
Открыть новую строку ниже выделения. |
O |
Открыть новую строку выше выделения. |
. |
Повторить последнюю вставку. |
u |
Отменить изменения. |
U |
Повторить изменения. |
Alt-u |
Переместиться назад по истории изменений. |
Alt-U |
Переместиться вперед по истории изменений. |
y |
Скопировать выделение. |
p |
Вставить после выделения. |
P |
Вставить перед выделением. |
"+reg |
Выбрать регистр для копирования или вставки. |
> |
Сделать отступ для выделения. |
< |
Убрать отступ для выделения. |
= |
Отформатировать выделение (с помощью LSP). |
d |
Удалить выделение. |
Alt-d |
Удалить выделение без копирования в буфер обмена. |
c |
Изменить выделение (удалить и войти в режим вставки). |
Alt-c |
Изменить выделение (удалить и войти в режим вставки без копирования) |
Ctrl-a |
Увеличить число под курсором. |
Ctrl-x |
Уменьшить число под курсором. |
| Команда | Описание |
|---|---|
s |
Выбрать все совпадения в выделении. |
S |
Разделить выделение на несколько частей. |
Alt-s |
Разделить выделение по строкам. |
Alt-minus |
Объединить несколько выделений. |
Alt-_ |
Объединить последовательные выделения. |
& |
Выровнять выделения по столбцам. |
_ |
Удалить пробелы в выделении. |
; |
Сжать выделение в один курсор. |
Alt-; |
Перевернуть курсор и выделение. |
Alt-: |
Переместить выделение вперед. |
, |
Оставить только основное выделение. |
Alt-, |
Удалить основное выделение. |
C |
Копировать выделение на следующую строку. |
Alt-C |
Копировать выделение на предыдущую строку. |
( |
Повернуть выделение назад. |
) |
Повернуть выделение вперед. |
Alt-( |
Повернуть содержимое выделения назад. |
Alt-) |
Повернуть содержимое выделения вперед. |
% |
Выбрать весь файл. |
x |
Выделить текущую строку. |
X |
Расширить выделение до границ строки. |
Alt-x |
Сжать выделение до границ строки. |
J |
Соединить строки в выделении. |
Alt-J |
Соединить строки и добавить пробел. |
K |
Сохранить выделения. |
Alt-K |
Удалить выделения. |
Ctrl-c |
Закомментировать или раскомментировать выделение. |
В Helix есть команды для быстрого редактирования текста, такие как удаление, замена и вставка.
| Команда | Описание |
|---|---|
x |
Удалить символ под курсором. |
dw |
Удалить слово перед курсором. |
d$ |
Удалить до конца строки. |
yy |
Копировать строку. |
Helix поддерживает мощные функции поиска для быстрого нахождения текста.
| Команда | Описание |
|---|---|
/ |
Найти текст вперед по файлу. |
? |
Найти текст назад по файлу. |
n |
Перейти к следующему результату поиска. |
N |
Перейти к предыдущему результату поиска. |
Helix поддерживает визуальные команды для выделения текста и работы с ним.
| Команда | Описание |
|---|---|
v |
Включить визуальный режим для выделения текста |
V |
Включить визуальный режим по строкам. |
Ctrl + v |
Включить визуальный режим по столбцам. |
d |
Удалить выделенный текст. |
Модификаторы помогают изменять поведение команд в Helix.
| Команда | Описание |
|---|---|
Ctrl |
Используется для дополнительных действий |
(например, Ctrl + f для прокрутки вниз). |
|
Alt |
Может быть использован для специальных команд. |
Shift |
Используется для изм. регистра и других операций |
Helix поддерживает команды для отмены и повторения действий.
| Команда | Описание |
|---|---|
u |
Отменить последнее действие. |
Ctrl + r |
Повторить отмененное действие. |
Helix поддерживает команды для открытия и сохранения файлов, что позволяет быстро работать с различными проектами.
| Команда | Описание |
|---|---|
:e <файл> |
Открыть файл. |
:w |
Сохранить файл. |
:q |
Закрыть редактор. |
:wq |
Сохранить и выйти. |
Helix поддерживает работу с буфером обмена для копирования и вставки текста.
| Команда | Описание |
|---|---|
y |
Копировать выделенный текст. |
p |
Вставить скопированный текст после курсора. |
P |
Вставить скопированный текст перед курсором. |
d |
Удалить выделенный текст и скопировать его в буфер |
Helix позволяет работать с несколькими окнами одновременно, что увеличивает удобство при работе с большим количеством файлов.
| Команда | Описание |
|---|---|
:split |
Разделить окно на два. |
Ctrl + w |
Переключение между окнами. |
:vsplit |
Разделить окно вертикально. |
Ctrl + w + q |
Закрыть текущее окно. |
Helix позволяет работать с несколькими задачами одновременно для повышения продуктивности.
| Команда | Описание |
|---|---|
:tabnew |
Открыть новый таб. |
:tabnext |
Перейти к следующему табу. |
:tabprev |
Перейти к предыдущему табу. |
:tabclose |
Закрыть текущий таб. |