Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Vim и Bash

Всем привет, с вами еженедельная рубрика "Секреты Вим". Часто бывает нужно что-то сделать вне Вима, в командной строке Линукс: операции с файлами, примонтировать удаленный диск, скомпилировать и запустить проект, посмотреть очередь задач, запустить однострочник на Перле --- да мало ли что!
Конечно, нынче, в оконной оболочке, нет проблемы открыть вкладку в консоли или новое окошко. Однако, по ssh

Всем привет, с вами еженедельная рубрика "Секреты Вим". Часто бывает нужно что-то сделать вне Вима, в командной строке Линукс: операции с файлами, примонтировать удаленный диск, скомпилировать и запустить проект, посмотреть очередь задач, запустить однострочник на Перле --- да мало ли что!

Конечно, нынче, в оконной оболочке, нет проблемы открыть вкладку в консоли или новое окошко. Однако, по ssh на кластере это уже не так удобно, да и не всегда удобно переключаться, искать рабочий каталог, вот это вот всё.

Я к чему? К способам выйти из Вима в Баш или другую командную строку, или выполнить команду.

Способ первый. Команда :sh. У меня она повешена на F5: map <F5> :sh<CR> в .vimrc. Вим запускает сеанс shell, bash, или какой интерпретатор стоит в у вас по умолчанию. Делайте там, что хотите, потом закройте его (exit, <C-D>) и вернетесь в Вим. Надо следить, чтобы не открыть новый Вим. Ничего страшного не будет, но вам это не надо. Можно посмотреть на открытые экземпляры Вим: ps ax | grep -i vim

Способ второй. Можно отправить Вим в фон командой <C-Z>. Стандартная возможность, но используется редко. Иногда делается случайно, и тогда надо знать, как вернуться. Вернуться позволяет команда fg (сокращение от foreground).

Способ третий. Можно выполнить (почти) любую команду из строки самого Вима, предварив ее восклицательным знаком. Например, так:

:!ls -lstr *.tex

Более того, восклицательный знак в этой роли может использоваться более хитро. Например, можно вставить в текст выдачу программы:

:r !ls

Поскольку программа может быть любой, в том числе скриптом на Перле, можно делать весьма сложные вещи. Программе можно передать текст как параметр, и тогда она работает как фильтр. Это бывает полезно, если надо, например, преобразовать числа в большом текстовом файле. Я обычно делаю это из bash скриптом на Перл, но можно и из Вим, особенно если речь не о всем тексте, а об абзаце, скажем. Есть и !!, пропускающий указанное число строк через фильтр.

UPDATE: Есть еще один способ, по счету шестой, но уместно его упомянуть здесь. Это команда :term (или :terminal), которая запускает терминал прямо в окне вим. В одном окне будет ваш текст, в другом командная строка.

Способ четвертый. Можно сохранить состояние Вим в сессии командой :mksession. Сохранются вкладки, окна, открытые файлы, позиции курсора и много другое. По умолчанию файл сессии называется Session.vim, но можно указать свой. Чтобы перезаписать старый, используйте форму :mksession! Восклицательный знак здесь --- часть команды))) Сохранив, можно выйти, поделать какие-то долгие дела, потом открыть Вим с сессией командой vim -S и продолжить работу с того же места. Можно открыть сессию из Вим: source file.

Файл Session.vim
Файл Session.vim

Сессии сохраняют не всё, правда. Функции пользователя, автокоманды --- не сохраняются (но их лучше занести в vimrc или другой файл). Скрипты, которые вы запускали, не запускаются сами. Например, я запускаю скрипт, который подсвечивает важные дела в моем списке --- этот скрипт приходится запускать самому. Но это не страшно. Хуже, что теряется история правок. Ее можно сохранить, но это отдельный разговор.

Способ пятый. Некоторые команды интегрированы в Вим. Например, make. Вызов :make лучше, чем выход в bash и вызов make оттуда, потому что Вим способен переместиться на строку с ошибкой. Потом можно ходить по ошибкам взад-вперед командами :cnext :cprev, первая из которых повешена у меня на F4: map <F4> :cnext<CR> Очень удобно для отладки.

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

Есть команда :compiler script. Скрипт --- это скрипт, для данного компилятора. Есть скрипты для различных фортранов, для си, для перла, для теха и других языков, и можно писать свои.

Есть команды :cd (меняет текущий каталог), :lcd (меняет каталог для окна только), :pwd (показывает текущий каталог).

Полагаю, довольно; наверное, есть и еще способы. Но этих --- более, чем достаточно!