19

В учебнике упоминается, что Ex-режим предназначен для пакетной обработки. Поскольку для меня это скорее неприятность, чем инструмент, я хотел бы увидеть некоторые практические примеры. Кто это использует? Зачем?

Для чего нужен EX-режим для пакетной обработки?

4 ответа4

22

Ex-Mode в основном предназначен для выполнения одного и того же действия с несколькими файлами.

Скажем, у вас есть 25 файлов .html, все с:

<a href="/home.html"> ...

Вместо того, чтобы открывать каждый из них, вы можете использовать Ex-режим, чтобы изменить все это на index.html:

vim -E -s bob.html <<-EOF
   :%substitute/home.html/index.html/
   :update
   :quit
EOF
5

Начиная с недавней версии 7.3, которая в качестве постоянной поддержки отмены, ex-режима и других форм пакетной обработки vim превосходит другие не-vim методы, так как она не будет загромождать историю отмен.

Добавление: «постоянная отмена», если включено, сохраняет все изменения в файле (до предела) в истории отмены в течение сеансов редактирования vim. Если файл отредактирован внешней программой, vim сбросит историю отмен при обнаружении по контрольной сумме, что он изменился. vim -E позволит вам пакетно-отредактировать файл, и редактирование будет в истории отмен.

4

Vim в режиме Ex (также известный как ex) полезен, когда:

  • Вам необходимо редактировать (несколько) файлов не в интерактивном режиме (как часть сценария).
  • Ваше соединение очень медленное или экран не обновляется после ваших действий.
  • Отображения и сокращения отключены.
  • Общие клавиши, такие как Escape или Control , не работают должным образом.

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

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

Ex является корнем семейства редакторов: edit, ex и vi. Ex - это набор ed, наиболее заметным из которых является средство редактирования экрана. ех (1)


Пример 1

Вот простой пример изменения 127 на 128 вашего файла hosts и распечатки вывода:

ex -s +%s/127/128/g +%p +q! /etc/hosts

эквивалентно:

sed s/127/128/g /etc/hosts

Для более продвинутого решения вы можете иметь файл с командами vim и использовать его более классическим подходом к перенаправлению ввода / вывода:

echo :%s/127/128/g > cmds.vim
echo :%print >> cmds.vim
echo :%quit! >> cmds.vim
ex -s /etc/hosts < cmds.vim # The same as: vim -s cmds.vim /etc/hosts

Пример 2

Вы также можете использовать плагины vim для выполнения некоторых задач.

Например, следующий однострочный конвертирует ваш файл исходного кода в html, используя один из стандартных плагинов:

ex -s '+let g:html_no_progress=1' '+syntax on' '+set ft=c' '+runtime syntax/2html.vim' -cwqa my_code.c

Он сгенерирует HTML-файл (с подсветкой синтаксиса) из вашего кода (написанный на любом поддерживаемом языке), который готов к печати или публикации на вашем веб-сайте.


Пример 3

Или реальный пример из спецификации RPM :

vim -E -s Makefile <<-EOF
   :%substitute/CFLAGS = -g$/CFLAGS =-fPIC -DPIC -g/
   :%substitute/CFLAGS =$/CFLAGS =-fPIC -DPIC/
   :%substitute/ADAFLAGS =$/ADAFLAGS =-fPIC -DPIC/
   :update
   :quit
EOF

Пример 4

Следующий скрипт создаст новый html-файл, загрузив html сайта Example и заменив его тело автоматически сгенерированной таблицей 20x20 со случайными числами в ней:

" table.vim
%!curl -s example.com 
let @t='<table>'.repeat('<tr>'.repeat('<td>_</td>',20).'</tr>',20).'</table>'
/<body
norm!vitd"tP
%s/_/\=system('echo $RANDOM')/g
wq

Использование:

ex -s table.html < table.vim

Это будет работать на * nix-подобных системах с установленным curl. Добавьте -V чтобы увидеть скрипт в действии.

Больше примеров:


Смотрите также:

1

Это не отвечает на ваш вопрос о пакетной обработке, но это еще один способ объяснить, что такое Ex-режим. Вы знаете, как вы нажимаете : чтобы перейти в режим командной строки и вводить команды? Ну и Ex-режим также позволяет вам вводить те же команды, за исключением того, что Vim не выходит из Ex-режима после ввода команды, он остается в режиме Ex и вы можете ввести другую команду. Так что это похоже на REPL (чтение, оценка, печать, цикл), но без печати (так что просто REL ...). Я вернусь к тому, почему вы могли бы хотеть такого рода REL позже. Вот почему он называется режимом Ex, он позволяет вводить команды Ex, что аналогично режиму командной строки, он позволяет вводить команду Ex. Другой способ объяснить это, это то, что он позволяет вам вводить и немедленно выполнять код Vimscript/VimL. Vimscript/VimL - это язык, который вы можете использовать для написания плагинов Vim. Это также язык, на котором вы пишете свой файл конфигурации (вероятно, .vimrc). Это также язык, который вы используете при вводе команд Ex из режима командной строки или режима Ex. Таким образом, с этой точки зрения Ex-mode можно рассматривать как VimL REL. Почему вы хотите VimL REL? По той же причине людям нравятся REPL для других языков. Они могут быть очень полезны для отладки кода или экспериментов с языком, чтобы увидеть, как все работает, особенно если вы пишете плагины в VimL или сильно настраиваете свой конфигурационный файл (что, вероятно, означает, что вы нарушаете принцип SRP и должны разбить его на плагинов).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .