Этот вопрос следует непосредственно из ответа . В этом случае я специально не могу понять ту часть, которая гласит:
В связи с этим его поведение ближе к emacs ', чем в режиме emacs bash (readline) / ksh / zsh, но отходит от встроенного редактора строк драйвера терминала (в каноническом режиме), где Ctrl-Wудаляет предыдущее слово (werase, также в vi). ).
Здесь речь идет о оболочках, а не редакторах, которые представляют собой две совершенно разные программы. Что значит сказать, что оболочка в каком-то режиме редактора?
PS: Вы можете основать свой ответ на предпосылке, что я понимаю, что такое оболочка и как использовать vim для базового редактирования.
Ответы:
В режиме «vi» вы можете редактировать / перемещаться по текущему приглашению оболочки, как в редакторе vi. Вы можете посмотреть на это как однострочный текстовый файл. Аналогично в режиме "emacs" вы можете редактировать / перемещаться по текущей командной строке, используя (некоторые) ярлыки Emacs.
пример
Например, в режиме vi вы можете сделать что-то вроде (в bash):
В Emacs-режиме вы можете нажать клавишу , например Ctrl+ , Aчтобы перейти в начало строки (VI: Ctrl+ [, 0или ESC, 0). Вы можете включить режим emacs через
set -o emacs
(в bash, ksh, zsh и т. Д.).Readline
Многие интерактивные программы командной строки (включая bash ) используют библиотеку readline . Таким образом, вы можете настроить, какой режим ввода использовать (vi или emacs) и другие параметры в одном месте, чтобы каждая программа, использующая readline, имела одинаковый интерфейс редактирования / навигации.
Например, моя конфигурация readline выглядит так:
Например, zsh / ksh не использует readline, насколько я знаю, но также поддерживает режимы vi / emacs, которые очень похожи на режим bash / readline.
Конечно, режим vi / emacs в командной строке является лишь подмножеством полного набора функций редактора. Не каждая функция имеет смысл в командной строке, и некоторые функции сложнее поддерживать, чем другие.
Канонический режим
До того, как режимы интерактивных командных строк vi / emacs «были изобретены», ваша оболочка использовала только канонический режим вашего терминала, который предоставляет только ограниченный набор команд редактирования (например, Ctrl+ Wдля удаления последнего слова.
источник
set -o | grep 'emacs\|vi'
. В zsh (где у меня есть vi-mode) это не работает.Вы заметите, что когда вы запускаете
cat
приглашение командной строки на терминале,cat
который должен записать в stdout то, что он читает из stdin, и нажимаете a, вы видитеa
ответное сообщение от драйвера терминала, ноcat
не записывает этоa
(вы видите только одинa
, который повторяется драйвером терминала).Однако, если вы печатаете a Backspace b Enter, вы не видите
cat
выводa\010b\015
, ноb\012
(b
и перевод строки).Это потому, что драйвер терминала (мы говорим о программном обеспечении в ядре, а не в эмуляторе терминала
xterm
) реализует очень простой редактор строк в каноническом режиме. Драйвер терминала можно настроить с помощьюioctl()
системных вызовов, например, при использованииstty
команды. Например, чтобы выйти из канонического режима, вы можете сделатьstty -icanon
. Если вы делаете:Затем вы увидите одновременно и то,
echo
что вы могли бы отключить,stty -echo
иcat
вывод.Этот редактор является линейным редактором. То есть пользователь должен редактировать одну строку текста до тех пор, пока она не будет отправлена приложению, читающему оконечное устройство, после нажатия Enter.
Возможности редактирования этого редактора очень ограничены. В большинстве реализаций есть только 4 ключа редактирования (фактически символы), которые также можно настроить с помощью
stty
:^H
или^?
обычно): стереть предыдущий символ^U
обычно): пусто (kill) введенная строка^W
): стереть предыдущее слово^V
): буквально введите следующий символ (отмените специальное значение всего вышеперечисленного)В прежние времена считалось, что этот редактор строки драйвера терминала будет расширен с более изощренными возможностями. Вот почему ни одна из ранних оболочек не имеет никаких возможностей редактирования командной строки (вы получите те же возможности редактирования строк в командной строке, что и при запуске,
cat
как мы делали выше).Однако этого на самом деле никогда не происходило, возможно, одна из причин - беспорядок с разными терминалами, которые не посылали одинаковые символы при некоторых нажатиях клавиш, что давало понять, что это не должно быть реализовано в пространстве ядра.
Поэтому некоторые оболочки начали отбрасывать канонический режим драйвера терминала и реализовывать собственный редактор строк. В то время
emacs
иvi
были наиболее популярны визуальные текстовые редакторы с совершенно другой привязкой клавиш и режимом работы. Вvi
, у вас есть один режим для ввода текста и один для редактирования. Вemacs
, вы всегда находитесь в режиме ввода текста , но редактирование осуществляется нажатием комбинации клавиш (например,^b
чтобы переместить символ назад).В то время оболочкам не было смысла придумывать свою собственную привязку ключей. Это вызвало бы разочарование у людей, которым пришлось бы учиться другому. Однако выбор одного (
emacs
илиvi
) стиля поверх другого был бы верным способом оттолкнуть пользователей другого редактора.Согласно https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.a :
Таким образом, вместо этого они реализовали оба и интерфейс для пользователей, чтобы выбрать между ними.
ksh
Скорее всего, он был первым в начале 80-х годов (повторное использование кода, который был написан отдельно для добавления режима vi и режима emacs в оболочку Bourne, как показано выше), за которым следовалиtcsh
(tcsh
первоначально имелась толькоemacs
привязка клавиш,vi
режим был добавлен позже) и позжеbash
иzsh
в начале 90-х годов.Вы переключаетесь между двумя режимами в
bash
,zsh
илиksh
с помощьюset -o vi
илиset -o emacs
, и с помощьюbindkey -e
илиbindkey -v
вtcsh
илиzsh
.На самом деле POSIX указывает
vi
режим, а неemacs
режимsh
(история гласит, что Ричард Столлман возражал против того, чтобы POSIX указывалemacs
режимsh
).Режим по умолчанию
bash
, общественное достояние вариантыksh
(pdksh, МКШ, oksh),tcsh
иzsh
является режим Emacs (хотя и сzsh
, это ,vi
если ваш$EDITOR
естьvi
), в то время как в AT & Tksh
, это немой режим , если$EDITOR
или$VISUAL
нет упоминанийvi
илиemacs
.ksh
Также позже добавилиgmacs
режим для размещения пользователей Гослинга,emacs
который обрабатывается по- Ctrl+Tразному.Теперь обработка
^W
inemacs
или вtcsh
emacs режиме, вероятно, предшествуетwerase
символу в редакторе строки терминала, поэтому мы не можем винить их за это, и мое утверждение об «уходе ...» может быть воспринято как вводящее в заблуждение. Просто я нахожу это раздражающим, когда вещи нравятсяemacs
,tcsh
илиinfo
ведут себя иначе, чем все остальное, когда ты печатаешь Ctrl-W. Вы можете себе представить, что я нахожу гораздо более раздражающим, когда некоторые приложения начинают закрывать свое окно, когда вы печатаете Ctrl-W.источник
pdksh
также разбирает$EDITOR
дляvi
и переключает режимы при запуске; Я удалил это дляmksh
(тем более, что я все равно действительно поддерживаю режим Emacs).^W
закрытия окон).