Ви помітите, що коли ви запускаєте 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
. Якщо ти зробиш:
stty -icanon; cat
Потім ви побачите одночасно echo
(і ви могли б відключити stty -echo
), і cat
вихід.
Цей редактор - це редактор рядків. Тобто, користувач повинен редагувати один рядок тексту, поки він не буде надісланий програмі, що читає термінальний пристрій, після натискання Enter.
Можливості редагування цього редактора дуже обмежені. У більшості реалізацій є лише 4 клавіші редагування (фактично символи), які також можна налаштувати за допомогою stty
:
- стерти (
^H
або ^?
зазвичай): стерти попередній символ
- kill (
^U
зазвичай): порожній (вбити) рядок, що вводиться до цього часу
- werase (
^W
): видалити попереднє слово
- lnext (
^V
): введіть наступний символ буквально (скасуйте спеціальне значення усього перерахованого вище)
Ще в старі часи вважалося, що цей редактор ліній драйверів терміналу буде розширений з більш чудовими можливостями. Ось чому жодна з ранніх оболонок не має жодних можливостей редагування командного рядка (ви отримаєте ті самі можливості редагування рядків у рядку оболонки, ніж при запуску, cat
як ми це робили вище).
Однак цього насправді ніколи не бувало, можливо, частиною причини є безлад з різними терміналами, що не надсилають одних і тих же символів на деякі клавіші, що дало зрозуміти, що це не повинно бути реалізовано в просторі ядра.
Тож деякі снаряди почали скидати канонічний режим драйвера терміналу та впроваджувати власний редактор рядків. У той час emacs
і vi
були найпопулярнішими візуальні текстові редактори з абсолютно різними клавішами прив’язки та режиму роботи. У vi
вас є один режим для введення тексту та один для редагування. В emacs
, ви завжди в час написання тексту режим, але редагування здійснюється натисканням комбінації клавіш (наприклад , ^b
для переміщення персонажа назад).
У той час для снарядів не було сенсу придумувати своє власне інше клювання. Це могло б викликати розчарування у людей, які повинні вивчити інше. Однак вибір одного ( emacs
або vi
) стилю над іншим був би вірним способом відчуження користувачів іншого редактора.
Відповідно до https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.a :
Популярні вбудовані функції редагування (vi та emacs режим) ksh були створені розробниками програмного забезпечення в Bell Laboratories; режим редагування ліній VI Пат Салліван та режим редагування рядків emacs Майком Веач. Кожен незалежно модифікував оболонку Bourne, щоб додати ці функції, і обидві були в організаціях, які хотіли використовувати ksh, лише якщо ksh мав відповідний вбудований редактор. Спочатку ідея додавання редагування командного рядка до ksh була відхилена з надією, що редагування рядків перейде в драйвер терміналу. Однак, коли з’ясувалося, що це, швидше за все, не відбудеться, обидва режими редагування рядків були інтегровані в ksh і стали необов'язковими, щоб їх можна було відключити в системах, які забезпечували редагування як частина термінального інтерфейсу.
Тому замість цього вони реалізували обидва та інтерфейс, щоб користувачі могли обирати між ними. ksh
найімовірніше, був першим на початку 80-х (повторне використання коду, який було написано окремо для додавання режиму vi та режиму emacs до оболонки Борна, як видно вище), після чого 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 & T ksh
, це німий режим , якщо $EDITOR
або $VISUAL
немає згадок vi
або emacs
.
ksh
пізніше також додали gmacs
режим для розміщення користувачів Gosling, emacs
які керували по- Ctrl+Tрізному.
Тепер обробка ^W
в режимі emacs emacs
або в ньому, tcsh
ймовірно, передує werase
символу в редакторі лінійки терміналів, тому ми не можемо насправді звинувачувати їх у тому, і моє твердження про "відхід ..." може розглядатися як оманливе. Це просто , що я знаходжу це дратує , коли речі , як emacs
, tcsh
або info
поводяться по- різному від решти , коли ви набираєте Ctrl-W. Ви можете собі уявити, що мені було набагато більше дратувати, коли деякі програми почали закривати своє вікно під час введення Ctrl-W.