Найти тему
Vim

VimScript 15 [Локальные буферы и сокращения{iabbrev}]

| ч14. Автокоманды | Содержание | ч16. группы автокоманд {autocmd} |

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

Снова откройте файлы foo и bar, переключитесь на foo и выполните следующую команду:

:iabbrev <buffer> --- &mdash;

Находясь в файле 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 или &ldquo; и &rdquo; для 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} |