Имеет ли Ex-режим какое-либо практическое применение?

115

Vim имеет режим Ex, в который можно войти, введя Q, и режим командной строки, в который можно войти q:. Распространенная жалоба среди новых пользователей vim заключается в том, что они случайно входят в эти режимы при попытке выйти из vim. Таким образом, я отключаю эти ключи в моем, ~/.vimrcчтобы предотвратить случайное нажатие (особенно q:):

map q: <Nop>
nnoremap Q <nop>

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

Есть ли у Ex практическое повседневное использование в современном Vim? Есть ли что-нибудь, что проще сделать в режиме Ex, чем стандартными командами? В чем разница между режимом командной строки и режимом ex?

Эндрю Ферье
источник
13
Qи q:совсем разные. Вы имеете в виду только Qправо?
Jamessan
@jamessan, на самом деле, получается, что я не был уверен ... ты прав, они, кажется, делают разные вещи, хотя я предполагал, что они были в основном одинаковыми. Если вы ответите на этот вопрос, это может помочь прояснить ситуацию, поскольку я, очевидно, растерялся.
Эндрю Ферье
Этот вопрос обсуждается на Meta .
200_success
1
@AndrewFerrier Вы задали q:конкретный вопрос и упомянули его как одну из двух ключевых последовательностей, с которой у вас больше всего проблем. И два из ответов здесь могут быть полезны для людей, которые ищут его по правильному термину.
Random832
4
Когда вы узнаете, что q/и как q:делаете, вы, вероятно, считаете их одними из самых полезных команд в Vim. И да, вы уже знаете, как их использовать, вы просто еще не знаете, что они делают. Посмотрите этот скринкаст, чтобы узнать.
Сато Кацура

Ответы:

81

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

q:или :<C-f>вместо этого предоставляет способ просмотреть историю командной строки и отредактировать ее как обычный буфер. Это позволяет легко найти предыдущую команду, которую вы запустили, отредактировать ее с помощью обычных команд Vim, а затем запустить измененную команду. q/И q?команды существуют , чтобы обеспечить такую же функциональность для истории поиска.

jamessan
источник
64

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 , а не редактором файлов.

Тем не менее, люди, кажется, злоупотребляют им за попытку редактирования файлов, и правда в том, что он не редактирует файлы. Во-вторых, его параметры, такие как in-place ( -i), являются нестандартными расширениями FreeBSD и могут быть недоступны в других операционных системах. Поэтому, если вы хотите избежать непереносимого кода, издержек ввода-вывода и плохих побочных эффектов (таких как уничтожение символических ссылок), вам следует использовать exстандартный редактор UNIX (наряду с ed) BashFAQ .


Другие вещи, которые я нахожу полезными в режиме 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не является exPOSIX-совместимым методом (как описано в руководстве ), поэтому вы можете использовать его findвместо. !Используются для принудительного переключения буферов без сохранения ( в противном случае генерируется предупреждение).

Первый, который я использую, чтобы обрезать конечные пробелы во всех моих исходных файлах, например:

trim **/*.php

Второй преобразует все вкладки в пробелы (рекурсивно), например:

retab **/*.php

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

Следует отметить , что приведенные выше примеры с использованием ЗШ / bash4 подстановку ( **), поэтому убедитесь , что ваша оболочка поддерживает его и он включен.

Для более практичных примеров (таких как анализ файлов HTML), проверьте:

Также узнайте больше о Ex-mode по адресу:

kenorb
источник
Можете ли вы опубликовать пример « для редактирования (несколько) файлов неинтерактивно» операция , которая проще достичь с exчем с ed, sedили awk?
Сато Кацура
1
@SatoKatsura Добавлены два практических способа использования нескольких файлов.
Кенорб
Я копался в документации, чтобы лучше понять exрежим. Я не понимаю, почему !в вашей команде trimпсевдонимов есть bang ( ) bufdo. Разве это не отменит все изменения во всех файлах, кроме последнего? Если нет, то почему?
Wildcard
@Wildcard Без в !принципе не будет работать, так как каждый раз, когда буфер переключается, exбудет жаловаться на несохраненные изменения (и мы сохраняем изменения в самом конце xa). Предупреждение можно отключить, но добавить его гораздо проще !.
Кенорб
Понятно ... Я полагаю, что я неправильно понимаю документацию; он указывает , что без! команда потерпит неудачу , если буфер не может быть оставлена, но это явно не указано , что !заставит буфер не быть отброшено .... Таким образом, делает «заброшен» в данном случае означает «упал , потому что он не содержит ничего не записанного на диск "? Или что? (Я смотрю :help bufdo)
Уайлдкарт
18

Я редко использую экс-режим, но когда мне это нужно, я благодарен за его существование.

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

В такие моменты визуальная обратная связь и обновления экрана становятся все более помехой, потому что то, что я вижу, задерживается (эффект отчасти напоминает разговор в микрофон, но с динамиками далеко, как на спортивном стадионе. и иногда путают из-за задержки обратной связи).

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

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

Джон О'М.
источник
13

Окно командной строки полезно для написания длинных сложных команд. Поскольку история команд открывается как окно, вы можете использовать любую навигацию или редактирование команды / отображения vim.

Допустим, вы хотите отредактировать длинную команду замещения, которую вы запустили один раз, но допустили ошибку:

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

Чтобы изменить строку поиска, вы не можете использовать движения vim, как bв строке Ex, для навигации (хотя я считаю, что для этой навигации существуют сопоставления клавиш). Вместо этого большинство людей нажимали клавишу со стрелкой влево несколько раз.

Лучший способ: нажмите, q:чтобы перейти в окно командной строки, kперейти к последней команде и перейти с обычными движениями к той части команды, которую вы хотите изменить. Хотите сменить слово целиком, без проблем ciw.

bsmith89
источник
Хорошо спасибо. Вы уверены, что q: это командная строка Ex? В справке используется только фраза «Ex» для режима Q, который вызывается, но он не поддерживает стандартное редактирование vim, на которое вы ссылаетесь - только q:делает, которое справка просто называет «Режим командной строки». Я знаю, что сначала я их перепутал, но нам, вероятно, следует убедиться, что мы четко понимаем разницу.
Эндрю Ферье
1
Я искал, :help q:прежде чем решил использовать эту фразу, но я мог быть смущен терминологией.
bsmith89
1
Я тоже запутался в этой терминологии. Я обычно говорю о наборе команды Ex как о чем-то следующем :, но я мог бы использовать это неправильно.
bsmith89
3
Содержание вашего ответа все правильно, но то, как вы используете терминологию, (для меня) немного сбивает с толку. Я думаю, что вы немного неправильно интерпретируете документацию. q:не открывает командную строку Ex. Он открывает окно истории команд , в котором можно редактировать текущие и предыдущие команды Ex. Командная строка Ex - это то, что вы получаете при нажатии :в обычном режиме.
Богатый
3
FWIW Я думаю, что документация Vim тоже немного запутана, поскольку местами она относится ко всем :командам как к командам «Ex». ИМХО на самом деле только команды, которые фактически доступны в Ex, должны рассматриваться как команды Ex.
Богатый
6

Человек с частичным зрением, который ослеп, сказал мне, что он переключается на бывшего, так что это одно из его применений. Я сам значительно старше vi, и я давно перешел с ed на ex (да, я знаю, «ed - это стандартный редактор»). Единственное, что я делаю в режиме vi, это% -пропускание, чтобы соответствовать пареням при написании кода на Лиспе.

Джон Коуэн
источник
Напоминает мне об этом интервью . Я не помню, было ли exупомянуто конкретно.
Мартин Турной
Отличное понимание, я бы никогда не подумал об этом. Большое спасибо, отличный ответ.
Эндрю Ферье
2

Помимо уже упомянутых здесь случаев, ex также является способом редактирования файлов на консоли linux, если это происходит на платформе S / 390 и консоль ориентирована на строку, а не на экран.

Томас
источник
0

Имеет ли Ex-режим какое-либо практическое применение?

Возможно нет. Однако, хотя вход в режим Ex не очень полезен, изучение команд Ex по-прежнему полезно, особенно потому, что вы используете команды редактирования ex с :g/глобальными командами для работы с совпадающими строками.

Ли Райан
источник
-1

Первоначально «ex» был обновленной версией «ed» текстового редактора в Unix. В 2BSD был добавлен визуальный режим, и новый редактор назывался «vi».

Если кто-то захочет использовать командную строку ex, он переключится в командный режим с помощью клавиши «:». Так что в моем лучшем понимании ex на самом деле не для ностальгии, это часть для обеспечения командного режима.

Вы также можете войти в режим вставки с помощью

 :i 

затем нажмите «введите и введите свой текст. Выйдите с помощью ^ c. Или введите все это в одной командной строке, например,

 :i my multiline text \with a second line.^c
if2
источник
1
Учитывая, что Ex-режим не совсем то же самое, что и режим командной строки , это, похоже, не отвечает на вопрос. И как дополнительное примечание: командный режим является неудачным синонимом для обычного режима, а не режима командной строки.
8bittree
Пункт «Командный режим» взят. Только извините, когда мы изменили на vi новое дополнение, мы были введены как «визуальный» (не существующий визуальный режим vim) в отличие от «команды» - теперь ex. С другой стороны, командная строка, кажется, вызывает тот же do_cmdline (), что и ex. Не то чтобы это предполагало какое-либо «практическое использование», которое я признаю.
if2