Найти тему
Блокнот математика

Рубрика "Секреты Вим". Конфигурация под одну задачку

Всем привет, сегодня я расскажу, как настроил Вим для работы над одной специфической задачей.

Оглавление рубрики

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

Под рукой надо иметь также файл с параметрами, которые я меняю перед каждым запуском, и ещё кое-какую информацию: в двух-трех файлах.

Запусков очень много! Каждый занимает секунды, а запускаю я почти непрерывно целый день. Нужно предельно сократить движения рук.

После отработки надо нарисовать график, который покажет, годно получилось или опять ерунда. Рисую в R, который тоже должен быть под рукой.

Как я это сделал? Расскажу. Вообще, Вим как IDE может работать, про это была отдельная заметка. А это частный случай, под особую задачу.

  1. Файлы открыты во вкладках (:tabnew файл). Сессия сохранена (:mksession!), чтобы легко восстановить (vim -S) конфигурацию вкладок и окон.
  2. Написан makefile, что позволяет пересобирать исполняемый файл прямо из Вим командой :make, а если ошибки, то они сразу показываются (к следующей ошибке переходит :cnext).
  3. Во вкладке с файлом параметров несколько окон. Внизу окно терминала: команда :term. Это окно, в котором работает bash. В нем запущен R. Окно с параметрами может быть расщеплено (:vsplit) на два, если я хочу сравнить параметры двух экспериментов. Для подсвечивания изменений можно включить режим различий (:set diff)
  4. Создана сложная команда, привязанная к клавише F12. Нажатие на нее сохраняет файл параметров, запускает расчет и переходит в терминал, в котором достаточно запустить R-скрипт для отрисовки. Команда такая:
map <F12> :w <CR>\|:!./My_proggo.x %<CR> \|:wincmd j<CR>
2 imap <F12> <ESC>:w <CR>\|:!./My_proggo %<CR> \|:wincmd j<CR>

Обсудим первую команду; вторая для режима вставки и отличается только тем, что выходит сначала из него.

Используется конвейер | (точнее, \|, так как | будет считаться частью команды), который объединяет команды и выполняет их по очереди.

Сначала выполняется сохранение: :w, обратите внимание на символ ввода "энтер". Затем выполнение команды bash, а именно, запуск выполняемого файла из текущего каталога. Моей программе передается, как параметр командной строки, текущий файл (символ %), а это обычно файл с параметрами, в котором только что сделаны изменения. После выполняется переход в окно с R. В нормальном режиме это <C-W>j, но из командной строки приходится прибегать к посредству команды :wincmd. Параметр j означает "вниз". Команда j нормального режима тоже, собственно, заменяет стрелку вниз.

Таким образом, изменив параметры (либо в режиме вставки или замены, а то и инкрементом <C-A>, <C-X> или точечной заменой r) я нажимаю F12, и попадаю в R, всё уже посчитано, и осталось только нажать клавишу "верх", вызывая предыдущую команду, и запустить скрипт для отрисовки.

Мне не надо выходить из режима вставки, сохранять файл, запускать прогон, переходить в окно — делать много телодвижений. Я доволен! Может быть, я бы и не решил эту задачу, если бы не созданная конфигурация! Она на рисунке.

Слева графическое окошко R. права Вим: видны вкладки с кодом и кое-чем еще. Открыта вкладка с файлами параметров: можно сравнивать, править, и тут же запускать прогон. Внизу окошко с башем (зеленая строка информации), в котором работает R. Скрипт doplot() делает рисунок. А можно что угодно, например, сохранить удачный рисунок в файл или сделать какой-то расчет.
Слева графическое окошко R. права Вим: видны вкладки с кодом и кое-чем еще. Открыта вкладка с файлами параметров: можно сравнивать, править, и тут же запускать прогон. Внизу окошко с башем (зеленая строка информации), в котором работает R. Скрипт doplot() делает рисунок. А можно что угодно, например, сохранить удачный рисунок в файл или сделать какой-то расчет.

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

Удачи, коллеги!

Путеводитель по каналу