MyTetra Share
Делитесь знаниями!
Скрипт добавления количества строк файла запуском скрипта
Время создания: 15.06.2017 20:41
Раздел: vim - vimscript - Примеры
Запись: xintrea/mytetra_db_mcold/master/base/1497548495u5voq7adl5/text.html на raw.githubusercontent.com

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.

На этом мы пока прервемся. В следующей части мы будем разбираться со списками.

 
MyTetra Share v.0.59
Яндекс индекс цитирования