Використання VI клавіш для редагування команд оболонки в UNIX


28

У мене раніше був колега, який був дуже хорошим в UNIX.

Він показав мені, як використовувати прив'язки клавіш Vi для редагування команд оболонки.

Він помістив команду у файл, який запускався щоразу, коли я входив.

Відтоді я перейшов до іншого проекту.

На жаль, я не пам'ятаю, як це налаштувати.

Хтось тут знає, як використовувати прив’язки клавіш Vi для редагування команд у терміналі?

Як я можу зробити цей параметр постійним?

Відповіді:


31

Ви говорите про найбільшу особливість коли-небудь!

Ви можете використовувати команди vi для редагування команд оболонки (та історії команд), додавши це у свій .bashrcфайл:

set -o vi

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

Якщо ви не використовуєте bash, замініть відповідний файл rc для вашої оболонки.


Це дозволяє використовувати команди vi для редагування будь-якої команди ...

Ви також можете використовувати jта kпересуватись через історію (після натискання ESC).

Ви також можете використовувати /(після натискання ESC) для пошуку старих команд.

Іншими словами, щоб знайти ту надшвидку cpкоманду, яку ви зробили десять хвилин тому:

ESC/cpENTER

Потім ви можете переглядати всі відповідні команди в історії за допомогою nта N.

Все це робить мене в трильйонах разів більш продуктивним у командному рядку!


4
Що ж, насправді це не використання vi, це використання команд клавіатури у стилі vi для редагування рядків.

4
Звичайно ... Я здогадуюсь, що відповідна термінологія - vi bindings in the shellце найбільша риса, яку коли-небудь винайшли!
jahroy

Я перейшов би з прив’язки emacs до прив'язки vi, якби був спосіб відображення режиму. Ви знаєте спосіб зробити це?
іконоборство

Вони, є спосіб , щоб зв'язати jjз , ESCяк ми зазвичай робимо в Vim?
steveyang

@yangchenyun - Можливо, це питання допоможе в цьому: stackoverflow.com/questions/844862/… Я особисто не прив'язую / не змінюю жодну з команд, тому я не зовсім впевнений, що ви запитуєте.
jahroy

12

Якщо ви використовуєте bash, як вже відповіли jahroy і злий otto, ви можете використовувати

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), а потім виконує команду при виході з редактора. Перегляньте сторінку сторінки або help fcдеталі, або просто спробуйте.


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

6

Для редагування останньої вживаної команди in vim та виклику відредагованої версії після збереження та виходу редактора використовуйте fcвбудовану оболонку. Без жодних аргументів він зробить наступне:

  1. Створює тимчасовий файл у /tmpта заповнює його за допомогою останньої набраної команди
  2. Після нормального виходу редактора (з кодом виходу 0) він виконує команду, знайдену в цьому тимчасовому файлі, і видаляє цей файл. Відредагована версія зберігається в історії як звичайна команда (принаймні в zsh). Він нічого не виконує, якщо редактор не закриває код, інший ніж нуль (in vim цього можна досягти, вбивши його або використовуючи :cquit).

Команда працює як у bash, так і zsh.


5

Дійсно, це насправді найбільша особливість коли-небудь. Однак є більше:

Створіть файл з назвою

.editrc

містить рядок

bind -v

Editline - це бібліотека версій BSD з ліцензованою версією, яка надає послуги, схожі на читання ліній Цей .editrc встановить ваші прив'язки клавіш до режиму vi в оболонці командного рядка MySQL або будь-якій програмі, яка не використовує лінію читання.

З часом я почав забуватись, тому мій .zshrc видає обгортки для режиму vi, щоб показати мені, в якому режимі я перебуваю в командному рядку. Це гарно.

Я знаю, в zsh ви можете набрати

bindkey -L

і отримати список в'язків клавіш. Я впевнений, що у Баша має бути щось подібне. Не всі клавіші vi за замовчуванням пов'язані. Прив’яжіть їх, як вважаєте за потрібне, і ви вирушаєте на перегони.


Хочеться, щоб я міг підтвердити це 5 разів за прив'язку vi в MySQL!
jahroy

1

у терміналі введіть export EDITOR=vi.

Щоб зберегти цей параметр помістіть цей рядок у файл ~ / .profile


5
Це встановлює ваш редактор за замовчуванням (для команд, на які звертають увагу $EDITOR) на vi. Це не дозволяє редагувати команди оболонки за допомогою vi(принаймні, не безпосередньо).
Кіт Томпсон

2
@KeithThompson Zsh переходить у режим редагування vi, якщо він $EDITORміститься vi. Я думаю, що це єдина оболонка, яка робить це.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.