Bạn sẽ nhận thấy rằng khi bạn chạy cat
ở dấu nhắc shell trên thiết bị đầu cuối, cat
được cho là viết để xuất bản những gì nó đọc từ stdin và nhấn a, bạn sẽ thấy a
trình điều khiển thiết bị đầu cuối bị dội lại, nhưng cat
bạn không viết điều đó a
(bạn thấy chỉ có một a
, một tiếng vang bởi trình điều khiển thiết bị đầu cuối).
Tuy nhiên, nếu bạn nhập a Backspace b Enter, bạn không thấy cat
xuất ra a\010b\015
, nhưng b\012
( b
và dòng mới).
Đó là bởi vì trình điều khiển thiết bị đầu cuối (chúng ta đang nói phần mềm trong kernel, không phải trong trình giả lập thiết bị đầu cuối như xterm
) thực hiện trình chỉnh sửa dòng rất cơ bản khi ở chế độ chính tắc . Trình điều khiển đầu cuối có thể được cấu hình bằng ioctl()
các cuộc gọi hệ thống như khi sử dụng stty
lệnh. Ví dụ, để rời khỏi chế độ chính tắc, bạn có thể làm stty -icanon
. Nếu bạn làm:
stty -icanon; cat
Sau đó, bạn sẽ thấy cả echo
(mà bạn có thể đã tắt stty -echo
) và cat
đầu ra cùng một lúc.
Biên tập viên đó là một biên tập viên dòng. Nghĩa là, người dùng sẽ chỉnh sửa một dòng văn bản cho đến khi nó được gửi đến ứng dụng đọc thiết bị đầu cuối khi nhấn Enter.
Khả năng chỉnh sửa của biên tập viên đó rất hạn chế. Trong hầu hết các triển khai, chỉ có 4 phím chỉnh sửa (thực tế là các ký tự) cũng có thể được cấu hình với stty
:
- erase (
^H
hoặc ^?
thường): xóa ký tự trước
- kill (
^U
thường): trống (kill) dòng đã nhập cho đến nay
- werase (
^W
): xóa từ trước đó
- lnext (
^V
): nhập ký tự tiếp theo theo nghĩa đen (hủy bỏ ý nghĩa đặc biệt của tất cả các mục trên)
Quay trở lại những ngày xưa, người ta đã nghĩ rằng trình chỉnh sửa dòng trình điều khiển đầu cuối sẽ được mở rộng với khả năng của người hâm mộ. Đó là lý do tại sao không có trình bao đầu tiên nào có bất kỳ khả năng chỉnh sửa dòng lệnh nào (bạn sẽ có cùng khả năng chỉnh sửa dòng tại dấu nhắc trình bao so với khi chạy cat
như chúng tôi đã làm ở trên).
Tuy nhiên, điều đó thực sự không bao giờ xảy ra, có thể một phần lý do là sự lộn xộn với các thiết bị đầu cuối khác nhau không gửi cùng một ký tự khi nhấn một số phím, điều đó chứng minh rằng không nên thực hiện trong không gian kernel.
Vì vậy, một số shell bắt đầu bỏ chế độ chính tắc của trình điều khiển đầu cuối và thực hiện trình soạn thảo dòng riêng của họ. Vào thời điểm đó, emacs
và vi
là các trình soạn thảo văn bản trực quan phổ biến nhất với chế độ thao tác và ràng buộc phím hoàn toàn khác nhau. Trong vi
, bạn có một chế độ để nhập văn bản và một chế độ để chỉnh sửa. Trong emacs
, bạn luôn ở chế độ văn bản , nhưng việc chỉnh sửa được thực hiện bằng cách nhấn tổ hợp phím (muốn ^b
di chuyển ký tự lùi lại).
Không có điểm nào cho đạn pháo vào thời điểm đó để đưa ra ràng buộc khóa khác nhau của riêng họ. Điều đó sẽ gây ra sự thất vọng cho mọi người khi phải học một cách khác. Tuy nhiên, chọn một ( emacs
hoặc vi
) kiểu này so với kiểu khác sẽ là một cách chắc chắn để xa lánh người dùng của trình chỉnh sửa khác .
Theo https://www.usenix.org/legacy/publications/lvern/proceedings/vhll/full_ con / korn.ksh.a :
Các tính năng chỉnh sửa nội tuyến phổ biến (chế độ vi và emacs) của ksh đã được tạo bởi các nhà phát triển phần mềm tại Phòng thí nghiệm Bell; chế độ chỉnh sửa dòng vi của Pat Sullivan và chế độ chỉnh sửa dòng emacs của Mike Veach. Mỗi người đã sửa đổi độc lập trình vỏ Bourne để thêm các tính năng này và cả hai đều ở trong các tổ chức muốn sử dụng ksh chỉ khi ksh có trình soạn thảo nội tuyến tương ứng. Ban đầu ý tưởng thêm chỉnh sửa dòng lệnh vào ksh đã bị từ chối với hy vọng rằng chỉnh sửa dòng sẽ chuyển sang trình điều khiển đầu cuối. Tuy nhiên, khi rõ ràng điều này sẽ không xảy ra sớm, cả hai chế độ chỉnh sửa dòng được tích hợp vào ksh và được tùy chọn để chúng có thể bị vô hiệu hóa trên các hệ thống cung cấp chỉnh sửa như một phần của giao diện đầu cuối.
Vì vậy, thay vào đó, họ đã triển khai cả hai và một giao diện để người dùng lựa chọn giữa hai. ksh
có lẽ là lần đầu tiên vào đầu những năm 80 (sử dụng lại mã được viết riêng để thêm chế độ vi và chế độ emacs vào vỏ Bourne như đã thấy ở trên), sau đó tcsh
( tcsh
ban đầu chỉ có emacs
ràng buộc khóa, vi
chế độ được thêm vào sau) và sau đó bash
và zsh
vào đầu những năm 90.
Bạn chuyển đổi giữa hai chế độ trong bash
, zsh
hoặc ksh
với set -o vi
hoặc set -o emacs
, và với bindkey -e
hoặc bindkey -v
trong tcsh
hoặc zsh
.
POSIX thực sự chỉ định vi
chế độ chứ không phải emacs
chế độ cho sh
(câu chuyện mà Richard Stallman phản đối POSIX chỉ định emacs
chế độ chosh
).
Chế độ mặc định cho bash
, các biến thể miền công cộng của ksh
(pdksh, mksh, oksh) tcsh
và zsh
là chế độ emacs (mặc dù với zsh
, đó là vi
nếu $EDITOR
là của bạn vi
), trong khi ở AT & T ksh
, đó là chế độ câm trừ khi $EDITOR
hoặc $VISUAL
đề cập đến vi
hoặc emacs
.
ksh
sau đó cũng đã thêm một gmacs
chế độ để phù hợp với người dùng của Gosling emacs
xử lý Ctrl+Tkhác nhau.
Bây giờ việc xử lý ^W
trong emacs
hoặc trong tcsh
chế độ emacs có thể có trước werase
nhân vật trong trình chỉnh sửa dòng thiết bị đầu cuối, vì vậy chúng tôi thực sự không thể đổ lỗi cho họ về điều đó và tuyên bố của tôi về "khởi hành ..." có thể bị coi là sai lệch. Chỉ là tôi thấy khó chịu khi những thứ như emacs
, tcsh
hoặc info
cư xử khác với mọi thứ khác khi bạn gõ Ctrl-W. Bạn có thể tưởng tượng tôi thấy nó khó chịu hơn rất nhiều khi một số ứng dụng bắt đầu đóng cửa sổ của chúng khi bạn gõ Ctrl-W.