Использование клавиш VI для редактирования команд оболочки в UNIX

28

Раньше у меня был сотрудник, который был действительно хорош в UNIX.

Он показал мне, как использовать привязки клавиш Vi для редактирования команд моей оболочки.

Он поместил команду в файл, который запускался при каждом входе в систему.

С тех пор я перешел в другой проект.

К сожалению, я не помню, как это настроить.

Есть ли здесь кто-нибудь, кто знает, как использовать привязки клавиш Vi для редактирования команд в терминале?

Как я могу сделать эту настройку постоянной?

user919860
источник

Ответы:

31

Вы говорите о величайшей функции когда-либо!

Вы можете использовать команды vi для редактирования команд оболочки (и истории команд), добавив это в свой .bashrcфайл:

set -o vi

Вы также можете запустить эту команду из командной строки, чтобы повлиять только на ваш текущий сеанс.

Если вы не используете bash, замените соответствующий rc-файл для вашей оболочки.


Это позволяет вам использовать команды vi для редактирования любой команды ...

Вы также можете использовать jи kдля перемещения по вашей истории (после нажатия ESC).

Вы также можете использовать /(после нажатия ESC) для поиска старых команд.

Другими словами, чтобы найти эту сверхдлинную cpкоманду, которую вы сделали десять минут назад:

ESC/срENTER

Затем вы можете перебирать все соответствующие команды в вашей истории с помощью nи N.

Все это делает меня в 10 триллионов раз более продуктивным в командной строке!

jahroy
источник
4
Ну, на самом деле он не использует vi, а использует команды клавиатуры в стиле vi для редактирования строк.
4
Конечно ... Я думаю, что подходящая терминология - vi bindings in the shellэто величайшая особенность, когда-либо изобретенная!
Джахрой
Я бы переключился с привязок emacs на привязки vi, если бы был способ отобразить режим. Вы знаете, как это сделать?
иконоборчество
Они, есть способ , чтобы связать jjс , ESCкак мы обычно делаем в Vim?
Steveyang
@yangchenyun - Может быть, этот вопрос поможет с этим: stackoverflow.com/questions/844862/… Я лично не связываю / не изменяю ни одну из команд, поэтому я не совсем уверен, что вы спрашиваете.
Джахрой
12

Если вы используете bash, как уже ответил Джахрой и злой отто, вы можете использовать

set -o vi

заставить bash использовать команды редактирования в стиле vi.

Как только вы это сделаете, вы можете набрать, Esc vчтобы запустить редактор vi с временным файлом, содержащим копию текущей командной строки. Вы можете редактировать команду, даже заменяя ее несколькими строками; когда вы сохраняете файл ( :wq), оболочка выполнит отредактированные команды.

Если вы предпочитаете

set -o emacs

Вы можете использовать, Ctl-XCtl-Eчтобы сделать то же самое. Он будет использовать ваш предпочитаемый редактор $EDITOR, не обязательно emacs.

(Лично я использую vi (фактически vim) для большей части моего редактирования, но я предпочитаю set -o emacsв оболочке; переключение в режим вставки и выход из него отлично подходит для редактирования файлов, но неудобно для интерактивных команд. YMMV.)

Кит Томпсон
источник
Вы знаете, как вернуться в обычный режим редактирования, избегая стиля vi? Я помню успех с Bl Num, но теперь не больше; что мне не хватает?
пиртони
@piertoni: set -o emacsне делает то, что ты хочешь?
Кит Томпсон
Да, это работает, я упустил момент, спасибо
piertoni
10

Вы можете использовать, set -o viчтобы изменить свои команды редактирования строки как @jahroy, но вы можете подумать о fcкоманде (доступной в bash, и я думаю, что ksh, но, вероятно, не tcsh), которая поместит предыдущую команду в редактор (FCEDIT или EDITOR). , который вы, вероятно, установили на vi) и затем выполняете команду при выходе из редактора. Смотрите man-страницу или help fcдля деталей, или просто попробуйте.

злой отто
источник
5
alias r='fc -e -'является ценным псевдонимом для повторного запуска предыдущих команд. fcсам по себе возник в оболочке Korn, я считаю. Вы можете указать команды по номеру ( fc 123 129для редактирования команд с номерами от 123 до 129 в истории). Вы можете указать относительные числа ( fc -10 -1для редактирования последних 10 введенных команд). Вы можете перечислить предыдущие команды с помощью fc -l. Вы можете указать команду с помощью префикса с rпсевдонимом ( r makeзапускает последний вызов make; также, r mесли вы не запускали mvкоманду с момента последнего запуска и makeт. Д.).
Джонатан Леффлер
6

Чтобы отредактировать последнюю использованную команду в vim и вызвать отредактированную версию после сохранения и выхода из редактора, используйте fcвстроенную оболочку. Без каких-либо аргументов будет сделано следующее:

  1. Создает временный файл /tmpи заполняет его последней набранной командой
  2. После обычного выхода из редактора (с кодом выхода 0) он выполняет команду, найденную во временном файле, и удаляет этот файл. Отредактированная версия сохраняется в истории как обычная команда (по крайней мере, в zsh). Он не выполняет ничего, если редактор выходит с кодом, отличным от нуля (в vim это может быть достигнуто либо уничтожением, либо использованием :cquit).

Команда работает как в bash, так и в zsh.

ZYX
источник
5

На самом деле, это на самом деле величайшая особенность когда-либо. Есть еще кое-что:

Создайте файл с именем

.editrc

содержащий строку

bind -v

Editline , это библиотека лицензированных версий BSD, которая предоставляет сервисы, похожие на readline. Этот .editrc установит ваши сочетания клавиш в режим vi в оболочке командной строки MySQL или в любом приложении, которое не использует readline.

Я несколько забывался с годами, поэтому мой .zshrc предоставляет некоторые обертки для режима vi, чтобы показать мне, в каком режиме я нахожусь в командной строке. Мило.

Я знаю в зш можно набрать

bindkey -L

и получите список сочетаний клавиш. Я уверен, что у bash должно быть что-то похожее. Не все клавиши vi связаны по умолчанию. Свяжите их так, как считаете нужным, и отправляйтесь в гонки.

chiggsy
источник
Жаль, что я не смогу проголосовать 5 раз за привязки vi в MySQL!
Джахрой
1

в вашем терминале введите export EDITOR=vi.

Чтобы сохранить эту настройку. поместите эту строку в файл ~ / .profile


источник
5
Это устанавливает ваш редактор по умолчанию (для команд, на которые обращают внимание $EDITOR) vi. Он не позволяет редактировать команды оболочки с помощью vi(по крайней мере, не напрямую).
Кит Томпсон,
2
@KeithThompson Zsh по умолчанию работает в режиме редактирования vi, если он $EDITORесть vi. Я думаю, что это единственная оболочка, которая делает это.
Жиль "ТАК - перестань быть злым"