| ч14. Автокоманды | Содержание | ч16. группы автокоманд {autocmd} |
Возможно вы немного подустали, давайте займемся чем нибудь попроще. Мы видели, как определять локальные сопоставления и параметры буфера, поэтому давайте применим ту же идею к сокращениям.
Снова откройте файлы foo и bar, переключитесь на foo и выполните следующую команду:
:iabbrev <buffer> --- —
Находясь в файле foo в режиме вставка введите следующий текст:
Hello --- world.
Vim заменит --- на &mdash. Теперь переключитесь на bar и попробуйте ввести тот же текст. Неудивительно, что он не заменяется, потому что мы определили сокращение как локальную для foo.
Автокоманды и сокращения
Давайте объединим эти локальные сокращения в буфере с автокомандами, чтобы настроить их так, чтобы получилась небольшая система "отрезков".
Выполните следующие команды:
:autocmd FileType python :iabbrev <buffer> iff if:<left>
:autocmd FileType javascript :iabbrev <buffer> iff if ()<left>
Откройте файл Javascript и попробуйте использовать сокращение iff . Затем откройте файл Python и проделайте с ним то же. Vim выполнит соответствующее сокращение в зависимости от типа текущего файла.
Упражнения
Создайте еще несколько "отрезков" сокращений, которые вы чаще всего вводите в ваших файлах. Начните с определения отрезка для return, или function для javascript или “ и ” для HTML-файлов.
Кстати можно даже сделать базовую структуру класса как VisualStudio при наборе ctor [ autocmd FileType cpp :iabbrev ctor class Noname {<CR>Noname();<CR>~Noname();<esc>2kb:.,+2s/Noname/ ] Если хочется что то посложнее то можно вставить шаблон из файла *.tpl
ps 2kb:.,+2s/Noname = >
[ 2k ]- переместиться на 2 строчки вверх
[ b ]- выбрать предыдущее слово
[ : ]- перейти в командный режим
[ .,+2 ]- начать поиск с текущей строки (.) плюс 2 строки (+2) ниже
[ s/Noname/MyNewClass ]- найти слово Noname и заменить на MyNewClass
ps после набора ctor вставляется не нужный нам пробел. Что бы этого избежать можно в конце набора ctor нажать <c-]> Если такой путь вам не нравиться тогда надо перехватить этот пробел.
function! Eatchar(pat)
let c = nr2char(getchar(0))
return (c =~ a:pat) ? '' : c
endfunction
Тогда наш "отрезок" становиться уже жутковатым.. но рабочим: (писать в одну строку) Давайте еще больше жути нагоним...
autocmd FileType cpp :iabbrev ctor class Noname {<CR>private:<CR><CR>public:<CR>Noname();<CR>~Noname(); <esc>5kb<esc>:.,+5s/Noname/<c-r>=Eatchar('\s')<cr>
Теперь пробел не будет печататься при вводе ctor. Что бы это все было более менее читабельно еще раз напомню что для сложных вещей используй шаблоны tpl
| ч14. Автокоманды | Содержание | ч16. группы автокоманд {autocmd} |