Anda akan melihat bahwa ketika Anda menjalankan cat
prompt shell pada terminal, cat
yang seharusnya menulis ke stdout apa yang dibaca dari stdin, dan tekan a, Anda melihat a
gema kembali oleh driver terminal, tetapi cat
tidak menulis itu a
(Anda lihat hanya satu a
, yang digaungkan oleh driver terminal).
Namun, jika Anda mengetik a Backspace b Enter, Anda tidak melihat cat
keluaran a\010b\015
, tetapi b\012
( b
dan baris baru).
Itu karena driver terminal (kita berbicara perangkat lunak di kernel, bukan di terminal emulator suka xterm
) mengimplementasikan editor baris yang sangat dasar ketika dalam mode kanonik . Driver terminal dapat dikonfigurasi menggunakan ioctl()
panggilan sistem seperti saat menggunakan stty
perintah. Misalnya, untuk meninggalkan mode kanonik, Anda bisa melakukannya stty -icanon
. Jika kamu melakukan:
stty -icanon; cat
Kemudian, Anda akan melihat echo
(yang bisa dinonaktifkan dengan Anda stty -echo
) dan cat
output pada saat yang sama.
Editor itu adalah editor baris. Yaitu, bagi pengguna untuk mengedit satu baris teks sampai dikirim ke aplikasi membaca perangkat terminal setelah menekan Enter.
Kemampuan mengedit editor itu sangat terbatas. Dalam sebagian besar implementasi, hanya ada 4 tombol pengeditan (sebenarnya karakter) yang dapat dikonfigurasi dengan stty
:
- erase (
^H
atau ^?
biasanya): hapus karakter sebelumnya
- bunuh (
^U
biasanya): kosongkan (bunuh) garis yang dimasukkan sejauh ini
- werase (
^W
): hapus kata sebelumnya
- lnext (
^V
): masukkan karakter berikutnya secara harfiah (batalkan makna khusus semua hal di atas)
Kembali di masa lalu, diperkirakan bahwa editor garis driver terminal akan diperluas dengan kemampuan yang lebih bagus. Itulah sebabnya mengapa tidak ada shell awal yang memiliki kemampuan pengeditan baris perintah (Anda akan mendapatkan kemampuan pengeditan baris yang sama pada prompt shell daripada saat menjalankan cat
seperti yang kami lakukan di atas).
Namun, itu benar-benar tidak pernah terjadi, mungkin sebagian alasannya adalah kekacauan dengan terminal yang berbeda tidak mengirim karakter yang sama pada beberapa penekanan tombol yang membuatnya menjadi jelas bahwa itu tidak boleh diimplementasikan dalam ruang kernel.
Jadi beberapa shell mulai menjatuhkan mode kanonik driver terminal dan menerapkan editor baris mereka sendiri. Pada saat itu, emacs
dan vi
merupakan editor teks visual paling populer dengan mode operasi dan pengikatan tombol yang sama sekali berbeda. Di vi
, Anda memiliki satu mode untuk memasukkan teks, dan satu untuk mengedit. Di emacs
, Anda selalu masuk mode teks , tetapi pengeditan dilakukan dengan menekan kombinasi tombol (seperti ^b
untuk memindahkan karakter ke belakang).
Tidak ada gunanya kerang pada saat itu datang dengan pengikatan kunci yang berbeda. Itu akan menyebabkan frustrasi bagi orang untuk harus belajar yang berbeda. Namun, memilih satu ( emacs
atau vi
) gaya di atas yang lain akan menjadi cara yang pasti untuk mengasingkan pengguna editor lain .
Menurut https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.a :
Fitur pengeditan sebaris populer (mode vi dan emacs) dari ksh dibuat oleh pengembang perangkat lunak di Bell Laboratories; mode edit garis vi oleh Pat Sullivan, dan mode edit baris emacs oleh Mike Veach. Masing-masing telah secara mandiri memodifikasi shell Bourne untuk menambahkan fitur-fitur ini, dan keduanya berada di organisasi yang ingin menggunakan ksh hanya jika ksh memiliki inline editor masing-masing. Awalnya ide menambahkan pengeditan baris perintah ke ksh ditolak dengan harapan bahwa pengeditan baris akan pindah ke driver terminal. Namun, ketika menjadi jelas bahwa ini tidak mungkin terjadi segera, kedua mode pengeditan baris diintegrasikan ke dalam ksh dan dibuat opsional sehingga mereka dapat dinonaktifkan pada sistem yang menyediakan pengeditan sebagai bagian dari antarmuka terminal.
Jadi sebagai gantinya, mereka mengimplementasikan keduanya dan sebuah antarmuka bagi pengguna untuk memilih di antara keduanya. ksh
kemungkinan besar yang pertama di awal 80-an (menggunakan kembali kode yang telah ditulis secara terpisah untuk menambahkan mode vi dan mode emacs ke shell Bourne seperti yang terlihat di atas) diikuti oleh tcsh
( tcsh
awalnya hanya memiliki emacs
pengikatan kunci, vi
mode ditambahkan kemudian) dan kemudian bash
dan zsh
di awal 90-an.
Anda beralih di antara dua mode di bash
, zsh
atau ksh
dengan set -o vi
atau set -o emacs
, dan dengan bindkey -e
atau bindkey -v
di tcsh
atau zsh
.
POSIX sebenarnya menentukan vi
mode dan bukan emacs
mode untuk sh
(ceritanya Richard Stallman keberatan dengan POSIX menentukan emacs
mode untuksh
).
Modus default untuk bash
, domain publik varian dari ksh
(pdksh, mksh, oksh), tcsh
dan zsh
merupakan modus emacs (meskipun dengan zsh
, itu vi
jika Anda $EDITOR
yaitu vi
), sedangkan di AT & T ksh
, itu adalah bodoh modus kecuali $EDITOR
atau $VISUAL
menyebutkan vi
atau emacs
.
ksh
juga kemudian menambahkan gmacs
mode untuk mengakomodasi pengguna Gosling emacs
yang ditangani secara Ctrl+Tberbeda.
Sekarang penanganan ^W
dalam emacs
atau dalam tcsh
mode emacs mungkin mendahului werase
karakter dalam editor baris terminal, jadi kita tidak bisa menyalahkan mereka untuk itu dan pernyataan saya tentang "berangkat ..." dapat dilihat sebagai menyesatkan. Hanya saja saya merasa menjengkelkan ketika hal-hal suka emacs
, tcsh
atau info
berperilaku berbeda dari yang lainnya saat Anda mengetik Ctrl-W. Anda dapat membayangkan saya merasa jauh lebih menjengkelkan ketika beberapa aplikasi mulai menutup jendela mereka ketika Anda mengetik Ctrl-W.