Продолжение публикации. Начало здесь.
Настройки, плагины и скрипты.
-
1. Запуск на исполнение текущего файла.
inoremap <F5> <Esc>:w:source ~/.vim/ftplugin/run.vim
nnoremap <F5> :w:source ~/.vim/ftplugin/run.vimПо нажатию
F5запускаем скрипт~/.vim/ftplugin/run.vim.F5- мой произвольный выбор, вы можете выбрать для сопоставления любую другую функциональную клавишу или буквосочетание.
Краткая расшифровка сопоставления: map - сопоставление, nore - без рекурсии, i или n - режим соответственно вставки или нормальный. Последовательность команд Вима при нажатии F5: Esc - переход в нормальный режим, :w - сохранение файла, :source ~/.vim/ftplugin/run.vim - запускает простой плагин ~/.vim/ftplugin/run.vim, который мы сейчас и разберем:
" плагин run.vim
" В зависимости от типа файла запускает соответствующий
" интерпретатор (компилятор)
if !exists("b:current_syntax") echoe "Ошибка при запуске. Данный синтаксис не обрабатывается" finish endif
if b:current_syntax == 'ruby' !ruby % elseif b:current_syntax == 'python' !python % elseif b:current_syntax == 'asm' !fasm % % elseif b:current_syntax == 'java' !java % endif
В переменной b:current_syntax содержится строка, определяющая синтаксис редактируемого файла. Далее эта строка анализируется и запускается соответствующий интерпретатор (компилятор). Читатель может легко изменить или дополнить этот код, подстроив его для своих файлов.
Отлично, мы можем теперь запускать программу на исполнение прямо из режима вставки или нормального режима Vim.
-
2. Работа с многофайловым проектом.
Идея такова: имена файлов проекта храним в отдельном файле. Назовем его для определенности
project. Мы хотим, чтобы по командеvim projectоткрылись бы для редактирования все файлы, перечисленные в нем, и далее проект был бы доступен для запуска из среды редактирования. Причем запуск на исполнение должен быть возможен из любого места проекта.
Чтобы всё это реализовать, необходимо сделать четыре вещи:- сформировать структуру проекта;
- создать файл project с именами файлов проекта;
- правильно открыть его;
- настроить Vim для запуска нашего проекта.
Приступим.
Шаг первый: сформировать структуру проекта.
Можно сформировать структуру каталогов и файлов проекта вручную. Но для разных языков имеются утилиты, автоматически создающие структуру. Например, в Ruby можно из папки с предполагаемым проектом запустить гем Bundle. Он создаст кучу разных правильных папок. Из них нас интересуют всего две: ./lib с исходниками и опционально ./bin со скриптами. Для Python, если структура сгенерирована Setuptools, будем использовать ./src.
Шаг второй: создать файл project с именами файлов проекта.
Файл project также можно сделать вручную либо использовать скрипт~/.local/bin/create-project.sh (Bash):
#!/bin/bash
#
# Запускается из папки с проектом: cteate-project.sh <папки с файлами проекта>
# Пример: cteate-project.sh ./lib ./bin
#
# Если строка параметров пустая:
if [ $# -eq 0 ]; then
echo Задайте параметры: папки с файлами проекта
exit 1
fi
# $* - строка параметров
# Удаляем файл project, если он существует
if [ -f "project" ]; then
rm project
fi
# Добавляем имена файлов, найденных в папках $*, в файл проекта
for file in `find $* -type f`; do
if [ $file != "./project" ]; then # кроме project
echo "$file" >> project
fi
done
Сделаем скрипт исполняемым:
chmod 755 create-project.sh
Повторимся, перед запуском желательно отредактировать ~/.bashrc, добавив путь ~/.local/bin/ в переменную среды $PATH (об этом говорилось в первой части):
export PATH="$PATH:~/.local/bin"
Чтобы изменения в ~/.bashrc вступили в силу, перезагружаемся или запускаем команду
$ source ~/.bashrc
Файлы в табах будут открываться в порядке, перечисленном в project. Поэтому надо позаботиться, чтобы строчка с именем главного файла стояла на первом месте. Кроме того, можно здесь же убрать ненужные файлы или добавить новые. Перезапускать Vim не нужно.
Шаг третий: заставить Vim правильно открыть проект. Этим занимается скрипт ~/.vim/plugin/project.vim:
" Срабатывает при открытии буфера
autocmd BufReadPost project call Start_project()
function! Start_project()
" Имя открываемого файла
let s:name = expand('%:t')
if s:name == "project"
" в файле project находятся имена файлов проекта
let s:count = line('$') " число строк в файле project
" ищем среди них непустые
let s:is_f = 0
for s:n in range(1,s:count)
if getline(s:n) =~ '[a-zA-Z]' let s:is_f = 1 " имеются файлы проекта
break
endif
endfor
if s:is_f == 1 " составляем из имен файлов проекта список let s:filenames = [] for s:n in range(1,s:count) let s:filenames += [getline(s:n)] endfor " и открываем их в отдельных вкладках for fil in s:filenames execute 'tabedit ' . fil " устанавливаем тип файла и раскрашиваем if stridx(fil, '.py') > 0 execute 'set filetype=python'
elseif stridx(fil, '.java') > 0 execute 'set filetype=java'
elseif stridx(fil, '.rb') > 0 execute 'set filetype=ruby'
endif endfor endif endifendfunction
Этот скрипт срабатывает только тогда, когда мы запускаем проект (vim project). Со всеми остальными файлами Vim работает как обычно. Файлы, имена которых перечислены в project, как я уже говорил, открываются в табах. Переключаться можно по-разному; я предпочитаю Ctrl-j (следующий таб) - Ctrl-k (предыдущий). Вот настройка сопоставлений для этих клавиш в ~/.vimrc для режима вставки и нормального:
inoremap <C-j> :tabni inoremap <C-k> :tabpi nnoremap <C-j> :tabn nnoremap <C-k> :tabp
Также можно переключаться по Ctrl-PgUp, Ctrl-PgDn (не требуют настройки, работают во всех режимах).
Шаг четвертый: запуск проекта на исполнение.
В первой части мы уже упоминали о сопоставлениях для запуска проекта:
" Ctrl-F5 - запуск проекта
inoremap <C-F5> :w<Enter>:source ~/.vim/ftplugin/runproject.vim
nnoremap <C-F5> :w<Enter>:source ~/.vim/ftplugin/runproject.vim
Скрипт ~/.vim/ftplugin/runproject.vim работает так: в файле project ищем первую строку. Это имя главного файла проекта. Его и запускаем:
" ~/.vim/ftplugin/runproject.vim" запомнить текущую вкладку
let g:current_tab = tabpagenr()
" открыть первую вкладку
execute "tabnext " 1
" получить содержимое первой строки
let line_text = [getline(1)]
" вернуться на сохраненную вкладку
execute "tabnext " g:current_tab
" определить синтаксис и запустить
if stridx(line_text[0], '.rb') > 0
execute '!ruby '. line_text[0]
elseif stridx(line_text[0], '.py') > 0
execute '!python '. line_text[0]
endif
Подведем итоги второй части статьи.
С помощью простых скриптов и сопоставлений мы смогли настроить Vim так, что можем теперь запустить из редактора как одиночную программу, так и многофайловый проект. И всё это работает для разных языков программирования.
Перейти к части 3.
winorun
У vim есть команда make которая вполне заменяет Ваш
runproject.vim.Под прошлой статьей писал, что для программирования лучше использовать neovim. Так вот одной из приятных мелочей программы является удобный плагин для навигации по каталогу проекта. В Вашем решении если количество открытых вкладок будет больше хотя бы 20, Вы устанете