let s:count = line("$") -- считаем количество строк в файле
2
3 let s:line1 = "--------------"
4 let s:line2 = printf("Lines count : %d", s:count)
5
6 call append(s:count, [s:line1, s:line2])
7
8 unlet s:count s:line1 s:line2
А теперь рассмотрим построчно скрипт примера.
В начале мы получаем количество строк в текущем буфере с помощью встроенной функции line(). В зависимости от строки, переданной в качестве аргумента этой функции, line() может выполнять разные задачи. Если ей передать строку "$", как в данном примере, то мы получим количество строк в буфере. Если передать параметр ".", то функция вернет номер строки, на которой находится курсор. Так же с помощью этой функции можно получать номера строк для установленных меток. Подробнее про эту функцию и ее аргументы советую почитать в справке:
:help line
Многие другие функции используют те же строки-параметры, что и функция line().
После того, как мы узнали количество строк, создаются две строковые переменные, первая из них s:line1 содержит просто несколько знаков '-', чтобы отделить текст буфера от будущего количества строк, а вторая переменная s:line2 содержит текст с количеством строк. Как вы поняли, переменные эти видимы только внутри скрипта. Многие из вас, наверное, обрадовались, увидев знакомую с детства по языкам C/C++ функцию printf(). Работает она почти точно так же (только функция printf здесь возвращает полученную строку, а не выводит ее на экран), поэтому про нее тоже не стоит долго рассказывать, тем более, что про одну эту функцию можно написать целую статью. Тех, кто не знаком с этой замечательной функцией, отправлю в справку, где про нее все подробно написано:
:help printf
Затем мы используем другую новую для нас функцию Vim - append(), которая добавляет строку или строки в текущий буфер. Первый ее параметр определяет номер строки, после которой нам нужно вставить новые строки, а второй аргумент должен быть строкой или списком строк, которые будут добавлены. В нашем примере мы используем список, составленный из только что созданных строк s:line1 и s:line2.
Обратите внимание на команду call, которая обозначает, что мы хотим вызвать функцию, которая следует за ним. Как я уже говорил, наличие этого оператора необходимо из-за того, что в начале строки обязательно должен быть какой-нибудь оператор. Так как функция append() значение 1 в случае невозможности добавления строк, и 0 при их успешном добавлении, то мы могли бы переписать эту строку следующим образом:
let s:failed = append (s:count, [s:line1, s:line2])
Исходник
Здесь используется оператор let, и необходимость в операторе call отпала. В дальнейшем мы могли бы проверить успешность выполнения функции append() и вывести при необходимости ошибку, но мы пока этого делать не будем.
В конце скрипта удаляем все наши переменные с помощью оператора unlet.
На этом мы пока прервемся. В следующей части мы будем разбираться со списками.