Из того, что я видел, оба set -o emacs
и bindkey -e
используются для изменения поведения вашего редактора строки терминала для эмуляции, emacs
тогда как set -o vi
и bindkey -v
используются для эмуляции vi
сочетаний клавиш. Поскольку оба set -o
и, bindkey
похоже, делают одно и то же, мне стало интересно, в чем разница между ними и есть ли она вообще.
Кажется, set -o
работает для большинства оболочек, тогда как bindkey
это zle
конкретная команда. Это единственное отличие? Кроме того, они привязывают одни и те же клавиши или есть некоторые клавиши, которые set -o
и bindkey
привязывают к разным операциям?
решение1
bindkey -v/-e
— это tcsh
синтаксис ( bindkey
встроенная функция была добавлена в tcsh в 5.19PL2 в 1990 году), а set -o vi/emacs
— синтаксис ksh (уже присутствовал в ksh85, возможно, раньше, поскольку ksh имел режим emacs/vi по крайней мере еще в 1983 году).
В zsh
, bindkey
был добавлен в 2.0 в 1991 году, который вышел с первой версией zle (1.0 предыдущая версия использовала readline
заимствованное из bash
).
zsh
, поскольку первая версия 1.0 должна была setopt
устанавливать параметры (в дополнение к параметрам, передаваемым в командной строке, как в csh
/Bourne), тогда как (t)csh
и bash
вместо этого использовали специальные переменные. В 2.0 -o
параметр (как для интерпретатора, так и для set
встроенного) был добавлен для совместимости с ksh
( bash
сам преобразовал свои специальные переменные в параметры, установленные с помощью нового shopt
встроенного параметра в 2.0 в 1996 году; это отдельный набор параметров от тех, которые установлены set -o
там; set -o
поддержка была добавлена около 1990 года).
И vi
" emacs
опции" не былидобавлено в zsh до 2003 годаХотя в версии 4.1.1. Парадигма «опции» не очень подходит для этого, так как при установке опции режим emacs
отключается vi
.
Вы заметите, что zsh -o emacs
в zsh -o vi
настоящее время zsh не работает должным образом, так как сообщает zsh: invalid module name `zsh/zle'
о запуске (aошибка).
Большинство оболочек, включая , zsh
также выбирают режим редактирования по умолчанию на основе значений переменных окружения $EDITOR
и $VISUAL
, чтобы попытаться сопоставить режим редактирования строки с предпочтениями редактора пользователя.