Pertanyaan ini mengikuti langsung dari jawabannya . Dalam hal ini saya secara khusus tidak dapat memahami bagian yang mengatakan:
Dalam hal itu, perilakunya lebih dekat dengan emacs 'daripada dengan mode bash (readline) / ksh / zsh emacs, tetapi berangkat dari editor baris driver terminal tertanam (dalam mode kanonik), di mana Ctrl-Wmenghapus kata sebelumnya (werase, juga di vi ).
Di sini kita berbicara tentang shell dan bukan editor yang merupakan dua program yang sama sekali berbeda. Apa artinya mengatakan shell dalam beberapa mode editor?
PS: Anda dapat mendasarkan jawaban Anda pada premis bahwa saya mengerti apa itu shell dan bagaimana menggunakan vim untuk pengeditan dasar.
shell
command-line
vim
keyboard-shortcuts
vi-mode
Kutu buku
sumber
sumber
Jawaban:
Dalam mode "vi" Anda dapat mengedit / menavigasi pada prompt shell saat ini seperti baris di editor vi. Anda dapat melihatnya seperti file teks satu baris. Secara analogi dalam mode "emacs" Anda dapat mengedit / menavigasi baris perintah saat ini menggunakan (beberapa) pintasan Emacs.
Contoh
Misalnya dalam mode-vi Anda dapat melakukan sesuatu seperti (dalam bash):
Dalam mode-emacs Anda dapat menekan misalnya Ctrl+ Auntuk melompat pada awal baris (vi: Ctrl+ [, 0atau ESC, 0). Anda dapat mengaktifkan mode emacs via
set -o emacs
(dalam bash, ksh, zsh dll.).Readline
Banyak program baris perintah interaktif (termasuk bash ) menggunakan pustaka readline . Dengan demikian, Anda dapat mengonfigurasi mode input mana yang akan digunakan (vi atau emacs) dan opsi lain di satu tempat sehingga setiap program yang menggunakan readline memiliki antarmuka pengeditan / navigasi yang sama persis.
Misalnya konfigurasi readline saya terlihat seperti:
Sebagai contoh zsh / ksh tidak menggunakan readline sejauh yang saya tahu, tetapi juga mendukung mode vi / emacs yang sangat mirip dengan bash / readline.
Tentu saja, mode vi / emacs dalam shell baris perintah hanyalah sebagian dari set fitur editor lengkap. Tidak semua fitur masuk akal dalam shell baris perintah, dan beberapa fitur lebih rumit untuk didukung daripada yang lain.
Mode Canonical
Sebelum mode vi / emacs dari shell baris perintah interaktif 'ditemukan', shell Anda hanya akan menggunakan mode kanonik dari terminal Anda yang hanya menyediakan serangkaian perintah pengeditan yang terbatas (misalnya Ctrl+ Wuntuk menghapus kata terakhir.
sumber
set -o | grep 'emacs\|vi'
. Di zsh (di mana saya memiliki mode-vi) ini tidak bekerja, meskipun.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 melihata
gema kembali oleh driver terminal, tetapicat
tidak menulis itua
(Anda lihat hanya satua
, yang digaungkan oleh driver terminal).Namun, jika Anda mengetik a Backspace b Enter, Anda tidak melihat
cat
keluarana\010b\015
, tetapib\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 menggunakanioctl()
panggilan sistem seperti saat menggunakanstty
perintah. Misalnya, untuk meninggalkan mode kanonik, Anda bisa melakukannyastty -icanon
. Jika kamu melakukan:Kemudian, Anda akan melihat
echo
(yang bisa dinonaktifkan dengan Andastty -echo
) dancat
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
:^H
atau^?
biasanya): hapus karakter sebelumnya^U
biasanya): kosongkan (bunuh) garis yang dimasukkan sejauh ini^W
): hapus kata sebelumnya^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
danvi
merupakan editor teks visual paling populer dengan mode operasi dan pengikatan tombol yang sama sekali berbeda. Divi
, Anda memiliki satu mode untuk memasukkan teks, dan satu untuk mengedit. Diemacs
, 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
atauvi
) 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 :
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 olehtcsh
(tcsh
awalnya hanya memilikiemacs
pengikatan kunci,vi
mode ditambahkan kemudian) dan kemudianbash
danzsh
di awal 90-an.Anda beralih di antara dua mode di
bash
,zsh
atauksh
denganset -o vi
atauset -o emacs
, dan denganbindkey -e
ataubindkey -v
ditcsh
atauzsh
.POSIX sebenarnya menentukan
vi
mode dan bukanemacs
mode untuksh
(ceritanya Richard Stallman keberatan dengan POSIX menentukanemacs
mode untuksh
).Modus default untuk
bash
, domain publik varian dariksh
(pdksh, mksh, oksh),tcsh
danzsh
merupakan modus emacs (meskipun denganzsh
, ituvi
jika Anda$EDITOR
yaituvi
), sedangkan di AT & Tksh
, itu adalah bodoh modus kecuali$EDITOR
atau$VISUAL
menyebutkanvi
atauemacs
.ksh
juga kemudian menambahkangmacs
mode untuk mengakomodasi pengguna Goslingemacs
yang ditangani secara Ctrl+Tberbeda.Sekarang penanganan
^W
dalamemacs
atau dalamtcsh
mode emacs mungkin mendahuluiwerase
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 sukaemacs
,tcsh
atauinfo
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.sumber
pdksh
juga mem$EDITOR
- parsingvi
dan mengganti mode pada saat startup; Saya menghapus itu untukmksh
(terutama karena saya hanya benar-benar mempertahankan mode Emacs pula).^W
menutup jendela).