Найти тему
Vim

VimScript 36 [ списки ]

Оглавление

| ч35. оператор grep часть 3 | Содержание | ч37. циклы |

До сих пор мы много работали с переменными, но мы еще не говорили о массивах вообще! В Vim есть два основных типа массивов, и сейчас мы рассмотрим первый: списки.

Списки Vimscript - это упорядоченные, разнотипные наборы элементов. Выполните следующую команду:

:echo ['foo', 3, 'bar']

Vim отобразит список.

Список, конечно может быть вложенным. Выполните следующую команду:

:echo ['foo', [3, 'bar']]

Vim отобразит список.

Индексирование

Списки Vimscript имеют нулевую индексацию, и вы можете получить доступ к элементам обычным способом. Выполните эту команду:

:echo [0, [1, 2]][1]

На выходе получаем:[ 1, 2 ].

Вы также можете индексировать с конца списка, как в Питон. Попробуйте выполнить эту команду:

:echo [0, [1, 2]][-2]

На выходе получаем: 0.

Индекс -1 ссылается на последний элемент в списке, -2 является предпоследним и так далее.

Разделение

Списки Vim также можно разделить. Выполните эту команду:

:echo ['a', 'b', 'c', 'd', 'e'][0:2]

На выходе получаем: ['a', 'b', 'c']

Vim отобразит элементы 0, 1 и 2. Вы можете безопасно выходить за пределы верхней границы. Попробуйте выполнить эту команду:

:echo ['a', 'b', 'c', 'd', 'e'][0:100000]

Vim просто отобразит весь список.

Индексы разделения могут быть отрицательными. Попробуйте выполнить эту команду:

:echo ['a', 'b', 'c', 'd', 'e'][-2:-1]

На выходе получаем: ['d', 'e']

Помните что -1 это ссылается на последний элемент, а -2 это предпоследний элемент.

При разделении списков вы можете опустить первый индекс, чтобы он означал "начало", и / или последний индекс, чтобы он означал "конец". Выполните следующие команды:

:echo ['a', 'b', 'c', 'd', 'e'][:1]
:echo ['a', 'b', 'c', 'd', 'e'][3:]

На выходе получаем: ['a', 'b'] и ['d', 'e'].

Как и Python, Vimscript также позволяет индексировать и разделять строки. Выполните следующую команду:

:echo "abcd"[0:2]

На выходе получаем: abc.

Вы не можете использовать отрицательные голые индексы со строками. Но вы можете использовать отрицательные индексы при отрезании строки! Выполните следующую команду:

:echo "abcd"[-1] . "abcd"[-2:]

На выходе получаем: [ cd ].

Так как "abcd"[-1] имеет отрицательный индекс, то она автоматически приводится к пустой строке. А индекс [ -2: ] отрезал строку с конца.

Конкатенация

Вы можете объединять списки с помощью оператора плюс.

Попробуйте выполнить эту команду:

:echo ['a', 'b'] + ['c']

На выходе получаем: ['a', 'b', 'c'].

Тут нет каких то странностей, так что здесь больше нечего сказать - списки Vimscript на удивление логичны так что идем дальше.

Список функций

Vim есть ряд встроенных функций для работы со списками. Выполните следующие команды:

:let foo = ['a']
:call add(foo, 'b')
:echo foo

На выходе получаем: Измененный список foo, выводит список.

Vim изменяет список foo с помощью встроенной функции add, что бы добавить символ 'b' в конце он выводит наш обновленный список ['a', 'b']. Теперь выполните эту команду:

:echo len(foo)

На выходе получаем: 2

Vim показывает что длина списка теперь равна 2.

Теперь попробуйте эти команды:

:echo get(foo, 0, 'default')
:echo get(foo, 100, 'default')

На выходе получаем: [ a ] и [ default ].

Функция get ( список, индекс, значение по умолчанию). выводит заданный элемент, если индекс находится вне диапазона выводится значение по умолчанию.

Запустите эту команду:

:echo index(foo, 'b')
:echo index(foo, 'nope')

На выходе получаем: [ 1 ] и [ -1 ].

В первом случаи функция index возвращает индекс где находится наш элемент 'b'. Если функция index не находит элемент в списке то он возвращает [ -1 ]

Теперь выполните эту команду:

:echo join(foo)
:echo join(foo, '---')
:echo join([1, 2, 3], '') ps/ тут не двойная кавычка а две одинарные

На выходе получаем: [ a b ], [ a---b ], и [ 123 ]. Список не меняет.

Функция join (список, разделитель) объединяет элементы в строку разделенную элементом разделителем. Если разделитель не указан, то по умолчанию в качестве разделителя используется пробел.

Выполните следующие команды:

:call reverse(foo)
:echo foo
:call reverse(foo)
:echo foo

На выходе получаем: ['b', 'a'], а затем ['a', 'b']

функция reverse переворачивает список.

Упражнения

Прочитать :help List. Все это. Обратите внимание на столицу L.

Прочитать :help add().

Прочитать :help len().

Прочитать :help get().

Прочитать :help index().

Прочитать :help join().

Прочитать :help reverse().

Изучите :help functions, чтобы найти другие функции, связанные со списками, о которых я еще не упоминал.

| ч35. оператор grep часть 3 | Содержание | ч37. циклы |