Почему в Vim для навигации используются клавиши hjkl

b16f10f02834dc34e2e831f5a9206b72.png

Многие новички, перешедшие в vim с других текстовых редакторов, сталкиваются с определенными сложностями. Vim в значительной степени отличается от привычных большинству пользователей редакторов текстов с системами меню. Многих может особенно удивить то, что для навигации по тексту используются клавиши «hjkl», хотя никто не запрещает пользоваться привычными клавишами со стрелками. Разберемся, почему используются именно эти клавиши, и почему не рекомендуется перемещаться по тексту при помощи стрелок.

О редакторе vim

Vim (от Vi IMproved) является клоном классического текстового редактора vi для Unix-подобных операционных систем. Vim обладает намного более широкими возможностями, чем свой предшественник. На данным момент это мощный текстовый редактор с полной свободой настройки и автоматизации. Некоторые скажут: «Зачем мне какой-то Vim, если есть любимая IDE, в которой все работает?» Приведем некоторые причины:

  • Базовый Vim без плагинов поддерживает более 200 языков программирования и форматов конфигурационных файлов (подсветка синтаксиса, автоматическое определение величины отступа для строк). IDE же обычно поддерживает только несколько языков/платформ. С плагинами же в vim можно работать со всем на свете — главное, чтобы создатель плагина сделал поддержку специфических для ЯП вещей. Так что можно и код пописать, и текст в LaTex поверстать, и многое другое.

  • Некоторые IDE очень прожорливые и требуют мощной рабочей станции (вспомним хотя бы монструозную Visual Studio). VIM, даже с кучей плагинов, штука довольно шустрая. 

  • Vim работает в режиме консоли, поэтому может быть использован в качестве тонкого клиента. Если вы работаете на древней машине 10-летней давности, на которой современные IDE будут тормозить, всю разработку и прогон тестов можно вести на сервере. 

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

О том, почему именно vim, подробней можно почитать тут. Из-за широких возможностей настройки и эффективности работы vim предпочитают многие профессиональные программисты.  Однако vim совсем не интуитивен и требует предварительного обучения (обычно vim устанавливается вместе с обучающей программой vimtutor, которую крайне рекомендуем). 

Один из вариантов кастомизации vimОдин из вариантов кастомизации vim

Одной из вещей, которые удивляют новичков, является то, что для навигации по тексту используются клавиши «hjkl». Перемещаться стрелками можно, но не рекомендуется. Можно выделить несколько причин, почему используются именно эти клавиши.

Как отсюда выйти? (нажать :q)Как отсюда выйти? (нажать : q)

Немного истории 

Самое распространенное объяснение — таким образом пальцы располагаются на «домашнем ряду» клавиатуры. Это действительно удобно: вам не нужно постоянно двигать кистью в сторону клавиш со стрелками. Рука устает значительно меньше, повышается эффективность работы. Однако, если копнуть поглубже в историю, причины такого выбора клавиш окажутся более интересными.

Билл Джой, автор оригинального редактора vi, работал в терминале ADM-3A, в котором не было специальных клавиш со стрелками. Если взглянуть на клавиатуру ADM, обнаружится, что стрелки расположены на клавишах hjkl. Итак, Джой использовал ту же логику для vi, которая привела в дальнейшем к vim.

Клавиатура ADMКлавиатура ADM

Однако странно, что в ADM для клавиш со стрелками использовались hjkl. Почему именно эти буквы?

Для этого есть очень веская причина. Вот версия таблицы ASCII 1967 года:

5c974efd2b8e3d94f2bfffc33bf44e38.png

Для кодировки каждого символа используются 7 бит. Первые две строчки (первые 32 символа) — это «управляющие символы», которые важны для коммуникации, но не являются настоящими символами. Компьютерные клавиатуры, созданные по образцу пишущих машинок QWERTY, нуждались в способе использования ввода этих символов при сохранении той же раскладки. Проблему решили с помощью дополнительной «контрольной» клавиши для изменения ввода с физических символов на управляющие символы. Удерживание клавиши управления обнулит 6-й и 7-й старшие биты нажатой клавиши. Если вы хотите использовать управляющий символ Backspace, нужно удерживать ctrl + H (или ^H). По этой же причине bash удалит символ при нажатии ^H. Это действие преобразовывает биты 100 1000 кодировки буквы H в 000 1000 — кодировку символа Backspace. Точно так же для разделителя строк нужно нажать ^J.

Если мы посмотрим руководство к ADM, то увидим, что ADM использовал «backspace» для обозначения «переместить курсор влево» без удаления текущего символа. Поскольку ^H и ^J уже используются как левая и нижняя стрелка, имеет смысл превратить ^ K и ^ L в верхнюю и правую стрелки. Это означает, что пользователи ADM уже использовали hjkl для навигации, а Билл Джой просто последовал примеру при разработке vi.

Про backspace

Удаление символа производилось с помощью кнопки RUBOUT, которая физически присутствовала на клавиатуре. Ранние компьютеры не использовали соглашение о том, что backspace должен удалять символ.

Клавиши hjkl vs клавиши со стрелками

В vim существует несколько режимов работы. Наиболее часто используются режим вставки, в котором осуществляется непосредственный ввод текста, и режим управления, в котором производятся такие действия, как удаление, перемещение, копирование текста. Чтобы перейти в режим управления из любого другого, нужно нажать клавишу Esc. 

Возникает вопрос, почему не рекомендуется использовать для навигации клавиши со стрелками? Дело в том, что в ОС Unix стрелочные клавиши генерируют последовательность байтов, начинающуюся с кода Esc (27); любая такая последовательность может быть воспринята редактором как требование на переход в командный режим и несколько команд-символов, причем единственный способ отличить Esc-последовательность, порожденную нажатием клавиши, от такой же последовательности, введенной пользователем — это измерение времени между приходом кода Esc и следующего за ним. При работе на медленной линии связи (например, при удаленном редактировании файла в условиях медленной или неустойчивой работы сети) этот способ может давать неприятные сбои.

Дата-центр ITSOFT — размещение и аренда серверов и стоек в двух дата-центрах в Москве. За последние годы UPTIME 100%. Размещение GPU-ферм и ASIC-майнеров, аренда GPU-серверов, лицензии связи, SSL-сертификаты, администрирование серверов и поддержка сайтов.

© Habrahabr.ru