Ви помітите, що коли ви запускаєте 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.