Чи має режим Ex практичне використання?


115

Vim має режим Ex, який можна ввести, ввівши Q, і режим командного рядка, в який можна ввести q:. Поширена скарга серед нових користувачів vim полягає в тому, що вони вводяться в ці режими випадково, намагаючись вийти з vim. Як такий, я відключаю ці клавіші в моєму, ~/.vimrcщоб зупинити себе випадково (особливо q:):

map q: <Nop>
nnoremap Q <nop>

Хоча я читав документацію на vim на Ex , я є досвідченим користувачем Vim і розумію основну ідею, яка стоїть за ним, я все ще намагаюся знайти будь-яку користь для цього у своєму щоденному використанні vim. Взагалі це здається менш корисним, ніж просто введення стандартної команди командного рядка vim з префіксом :, оскільки зміни не повторюються одразу.

Чи має Ex щоденне практичне використання у сучасному Vim? Чи є щось легше зробити в режимі Ex, ніж зі стандартними командами? Яка різниця між режимом командного рядка та колишнім режимом?


13
Qі q:зовсім інші. Ви маєте на увазі лише Qправо?
jamessan

@jamessan, насправді, виявляється, я не був впевнений ... ти маєш рацію, вони, здається, роблять різні речі, хоча я припускав, що вони в основному однакові. Якщо ви відповісте на це запитання, можливо, це допоможе уточнити, оскільки я, очевидно, розгублений.
Ендрю Фер’є


1
@AndrewFerrier Ви q:конкретно запитали і згадали про це, як серед двох ключових послідовностей, з вами найбільше проблеми. І дві відповіді тут можуть бути корисні людям, які шукають її правильним терміном.
Випадково832

4
Коли ви дізнаєтеся, що q/і q:робити, ви, ймовірно, вважатимете їх одними з найкорисніших команд у Vim. І так, ви вже знаєте, як ними користуватися, ви просто ще не знаєте, що вони роблять. Слідкуйте за цим екраном, щоб дізнатися.
Сато Кацура

Відповіді:


81

Qце, як ви знайшли, колишній режим. Інтерактивно використовувати не зовсім корисно, але він існує, оскільки Vim можна використовувати для емуляції старого exбінарного файлу. Насправді багато систем надають exкоманду, просто посилаючись на неї vim.

q:або :<C-f>натомість надає спосіб переглядати історію командного рядка та редагувати її як звичайний буфер. Це дозволяє легко знайти попередню команду, яку ви виконували, відредагувати її за допомогою звичайних команд Vim, а потім виконати змінену команду. Команди q/і q?існують, щоб забезпечити однаковий функціонал для історії пошуку.


63

Vim в режимі Ex корисний, коли:

  • Вам потрібно редагування (декількох) файлів неінтерактивно (як частина сценарію).
  • Підключення дуже повільне або екран не оновлюється після ваших дій.
  • Відображення та скорочення вимкнено.
  • Загальні клавіші, такі як Escapeабо Controlне працюють належним чином.

В основному viце візуальний режим, exтому Vim Ex Mode - це просто емуляція ex(вони все ще виконують один і той же код), тому можна потрапити в командний режим exзсередини vi і навпаки. Насправді є два режими: Ex-режим ( vim -e) та покращений режим Ex, який дозволяє виконувати більш досконалі команди, ніж vi-сумісний Ex-режим ( vim -E). Див.: Яка різниця між режимом Ex та поліпшеним режимом Ex?

Ex є коренем сімейства редакторів: edit, exі vi. Ex - це супер-набір ed, найбільш помітне розширення - це програма редагування дисплеїв. колишній (1)

Неінтерактивне редагування файлів - це найпоширеніше використання, і люди користуються ним аналогічно, як sedі awk, однак вони більш орієнтовані на потоки - вони читають файл лише вперед від початку до кінця (вони не розроблені для роботи з кількома рядками ) Хоча vimбуфер орієнтований - ви можете рухатись уперед та назад у файлі, як вам подобається, що робить його таким потужним.

В основному:

sed- це S tream ED itor , а не редактор файлів.

Тим не менш, люди, здається, зловживають цим, намагаючись редагувати файли, і правда полягає в тому, що він не редагує файли. По-друге, його параметри, такі як in-place ( -i), є нестандартними розширеннями FreeBSD і можуть бути недоступні для інших операційних систем. Отже, якщо ви хочете уникнути неподатливого коду, накладних витрат на введення / виведення та поганих побічних ефектів (наприклад, знищення символьних посилань), вам слід скористатися exстандартним редактором на основі команд UNIX (разом із BashFAQed ) .


Інші речі, які мені здаються корисними в режимі Ex, - це використовувати його як ігровий майданчик (подібний до pythonконсолі), де ви можете виконувати багато команд поспіль, працюючи / налагоджуючи регулярні вирази, перевіряючи конфігурацію vim, виконуючи зовнішні команди чи працюючи з регістрами тощо .

Наприклад:

let @d = '<td></td>'
let @r = '<tr>' . repeat(@d, 5) . '</tr>'
echo @r
let @t = '<table>' . repeat(@r, 5) . '</table>'
reg

що в режимі Ex простіше, ніж у звичайному (там ви бачите лише останню команду).


Практичні звичаї

У мене є такі псевдоніми .bash_aliases:

alias trim="ex +'bufdo!%s/\s\+$//e' -scxa"
alias retab="ex +'set ts=2' +'bufdo retab' -scxa"

Примітка: Використання bufdoне exсумісний з POSIX методом (відповідно до інструкції ), тож ви можете використовувати його findзамість цього. !Використовуються для примусового перемикання буферів без збереження ( в іншому випадку генерується попередження).

Перший, який я використовую для обрізки пробілів у всіх своїх вихідних файлах, наприклад:

trim **/*.php

Другий перетворює всі вкладки в пробіли (рекурсивно), наприклад:

retab **/*.php

Для мене , використовуючи retabдосить, але є деякі недоліки , описані в тут . Додайте додатковий -Vдля збільшення випромінювання.

Слід зазначити , що наведені вище приклади з використанням ЗШ / bash4 підстановку ( **), тому переконайтеся , що ваша оболонка підтримує його і він включений.

Для отримання більш практичних прикладів (як розбір html-файлів) перевірте:

Дізнайтеся також більше про Ex-режим на:


Чи можете ви опублікувати приклад « для редагування (кілька) файлів неінтерактивному» операція , яка простіше досягти з exчим з ed, sedабо awk?
Сато Кацура

1
@SatoKatsura Додано два практичні звичаї, які стосуються кількох файлів.
kenorb

Я перебирав документацію, щоб краще зрозуміти exрежим. Я не розумію, чому !у вашій команді trimпсевдоніму вибух ( ) bufdo. Хіба це не просто відмовиться від усіх змін у всіх файлах, крім останнього? Якщо ні, то чому б і ні?
Wildcard

@Wildcard В !основному не спрацює, оскільки кожен раз, коли буфер перемикається, exбуде скаржитися на незбережені зміни (і ми зберігаємо зміни в самому кінці з xa). Попередження можна відключити, але набагато простіше додати !.
kenorb

Я бачу ... Напевно, я неправильно читаю документацію; він вказує , що без! команда зазнає невдачі , якщо буфер не може бути залишена, але це явно не вказано , що !змусить буфер НЕ бути відкинуто .... Таким чином, робить «покинутий» в даному випадку означає «впав , тому що він не містить нічого, що не записано на диск "? Або те, що? ( :help bufdo
Wildcard

18

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

Я іноді отримую доступ до систем через ssh через VPN, і ці підключення іноді можуть бути повільними. Погіршуючи проблему, мені іноді потрібно редагувати файл на віддаленій стороні, який, крім того, що знаходиться за ssh та VPN, перебуває через повільне послідовне з'єднання (так, 9600 бод плюс велика затримка в мережі).

Ось такі випадки, коли візуальний зворотний зв’язок та оновлення екрана стає більш перешкодою, тому що те, що я бачу, затримується (ефект схожий на розмову в мікрофон, але з динаміками далеко, як на спортивному стадіоні. Дії одного стають невмілими а іноді плутаються через затримку зворотного зв'язку).

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

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


13

Вікно командного рядка корисно для написання довгих складних команд. Оскільки історія команд відкривається як вікно, ви можете використовувати будь-яку навігаційну програму або редагування команд / відображення.

Скажіть, ви хочете відредагувати довгу команду заміни, яку ви запустили один раз, але помилилися:

:%165,177s:here is a whole bunch of text I wnat to replace:here is the replacement:c

Щоб змінити рядок пошуку, ви не можете використовувати переміщення vim, як bу рядку Ex, для навігації (хоча я вважаю, що для цієї навігації є ключові відображення). Натомість більшість людей купу ударів клавішею стрілки ліворуч.

Кращий спосіб: натисніть, q:щоб увійти у вікно командного рядка, kперейти до останньої команди та перейти звичайними рухами до тієї частини команди, яку потрібно змінити. Хочете змінити слово цілком, не проблема: ciw.


Добре, дякую. Ви впевнені q: , що командний рядок Ex? У довідці використовується лише фраза "Ex" для режиму, який він виховує Q, але це не підтримує стандартне редагування vim, на яке ви посилаєтесь - лише q:так, яке довідка просто називає "Режим командного рядка". Я знаю, що спочатку я переплутав це двоє, але, мабуть, ми повинні переконатися, що ми зрозуміли тут різницю.
Ендрю Фер’єр

1
Я шукав, :help q:перш ніж вирішив використати цю фразу, але мене, можливо, бентежить термінологія.
bsmith89

1
Мене теж бентежить ця термінологія. Я зазвичай говорю про введення команди Ex як будь-що наступне :, але я можу використовувати це неправильно.
bsmith89

3
Вміст вашої відповіді правильний, але спосіб використання термінології (для мене) трохи заплутаний. Я думаю, ви тлумачите документацію трохи неправильно. q:не відкриває командний рядок Ex. Відкриється вікно історії команд , в якому можна редагувати поточну та попередні команди Ex. Командний рядок Ex - це те, що ви отримуєте при натисканні :в звичайному режимі.
Багатий

3
FWIW Я думаю, що документація Vim теж трохи заплутана, оскільки місцями вона посилається на всі :команди як "Ex" команди. IMHO дійсно тільки команди, які фактично доступні в Ex, слід вважати Ex командами.
Багатий

6

Мені сказала людина з частковим зором, яка осліплює, що він переходить на колишню, тож це одне використання. Я сам значно старший від vi, і я давно перейшов з ed на ex (так, я знаю, "ed - це стандартний редактор"). Єдине, що я роблю в режимі vi - це% -прискорити, щоб відповідати паролям під час написання коду Lisp.


Нагадує мені це інтерв'ю . Я не пам'ятаю, чи exконкретно про це згадувалося.
Martin Tournoij

Чудове розуміння, я б ніколи про це не думав. Дуже дякую, чудова відповідь.
Ендрю Фер’є

2

Окрім згаданих тут звичаїв, ex - це також спосіб редагування файлів на консолі linux, якщо це трапляється на платформі S / 390, а консоль орієнтована на лінію, а не на екран.


-1

Оригінал "ex" був оновленою версією текстового редактора "ed" в Unix. У 2BSD був доданий візуальний режим, і новий редактор отримав назву "vi".

Якщо хтось хоче використовувати командний рядок ex, він перейде в командний режим за допомогою клавіші ":". Тож, наскільки я найкраще розумію, екс-насправді не існує ностальгії, це частина забезпечення командного режиму.

Ви також можете ввести його режим вставки шляхом

 :i 

потім натисніть "введіть і введіть текст. Вийдіть з ^ c. Або введіть все це в одному командному рядку, наприклад

 :i my multiline text \with a second line.^c

1
Зважаючи на те, що режим Ex-Ex - це не те саме, що в режимі командного рядка , схоже, це не відповідає на питання. І як додаткова бічна примітка: командний режим - невдалий синонім звичайного режиму, а не режиму командного рядка.
8bittree

Точка "Режим командування" взята. Тільки виправдання, коли ми змінили на vi нове доповнення, нас примушували як "візуальний" (не теперішній режим візуального візу) на відміну від "команди" - тепер колишній. З іншого боку, командний рядок, схоже, викликає той самий do_cmdline (), що і колишній. Не те, що це передбачає будь-яке "практичне використання", я визнаю.
if2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.