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

20

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

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

Лео Леопольд Герц 준영
источник
@Masi: свяжите свои учетные записи, чтобы после миграции перенесенные сообщения были связаны с вашей учетной записью SU.
Грег Хьюгилл

Ответы:

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чтобы увидеть сценарий в действии.

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


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

kenorb
источник
22

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

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

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

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

vim -E -s bob.html <<-EOF
   :%substitute/home.html/index.html/
   :update
   :quit
EOF
Джек М.
источник
7
Полная и более краткая реализация будет for file in *.html; do vim -es -c '%s/home\.html/index.html/g' -c wq "$file"; done.
интуитивно
6

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

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

u0b34a0f6ae
источник
2
Это кажется надуманным, но это точно разумно и умно! +1
Тарраш
1

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

still_dreaming_1
источник
Было бы здорово получить несколько примеров в виде видеороликов, чтобы показать полезность экс-режима. Я никогда не осознавал этого, потому что я могу использовать диспетчер окон Linux, визуальный режим vim и :!pythonт. Д.
Léo Léopold Hertz 준영