tools/vim

Learn Vimscript The Hard Way - 35. List

seul chan 2020. 4. 15. 00:48

Lists

우리는 많은 변수를 작업했지만, 아직 이를 합친 적은 없었다. vim은 두 가지 aggregate type을 지원하는데, 그 중 첫 째는 리스트이다.

vimscript의 list는 순서가 있다.

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

vim 리스트는 중첩도 가능하다.

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

Indexing

vimscript 리스트는 파이썬같이 zero-indexed 방식 사용한다. 인덱싱 방식도 비슷하다.

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

파이썬처럼 뒤에서 인덱싱도 가능하다.

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

Slicing

슬라이싱도 파이썬 개발자에게는 아주 익숙해 보이겠지만 항상 같지는 않다.

파이썬에서는 마지막 범위를 제외하는 대신에 vim에서는 포함시킨다. 아래 예시는 파이썬에서는 ['a', 'b']를 반환한다.

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

안전하게 최대값을 높게 입력해도 작동한다

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

음수로 슬라이싱도 가능하다.

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

시작이나 끝을 쓰지 않고 사용이 가능하다.

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

string도 인덱싱이 가능하다.

:echo "abcd"[0:2]
abc

string에 음수 인덱싱은 사용할 수 없다. 하지만 슬라이싱시에는 음수를 사용할 수 있다 (왜지..?)

" 아무것도 리턴되지 않는다
:echo "abcd"[-1]

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

Concatenation

vim의 리스트를 +를 사용해서 합칠 수 있다.

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

vimscript의 리스트는 딱히 더 얘기할 것이 없다. 다른 언어들과 비교하면 놀랄만큼 정상적이다. (고 하는데 왜 그런건지는 잘.. 다른 vimscript의 문법에 비하면 훨씬 낫긴 하다)

List Functions

vim은 리스트에서 사용할 수 있는 여러 빌트인 함수를 가지고 있다.

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

add 함수로 쉽게 리스트에 값을 추가할 수 있다.

len도 사용이 가능.

:echo len(foo)
2

아래와 같이 get으로 해당 인덱스를 가져올 수 있고, default 값도 줄 수 있다.

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

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

index 함수는 해당 값이 존재하는 첫 번쨰 인덱스를 반환한다. 없다면 -1을 반환

:echo index(foo, 'b')
1

:echo index(foo, 'nope')
-1

이제 join을 사용해보자.

:echo join(foo)
a b

:echo join(foo, '---')
a---b

:echo join([1, 2, 3], '')
123

join은 두 번째 인자로 받은 값으로 해당 리스트의 값을 join해 주고 주어지지 않으면 기본으로 space를 사용한다.

reverse 함수는 해당 리스트의 순서를 역순으로 바꿔준다.

:call reverse(foo)
:echo foo
['b', 'a']

:call reverse(foo)
:echo foo
['a', 'b']

Exercises

  • Read :help List. All of it. Notice the capital L.

  • Read :help add().

  • Read :help len().

  • Read :help get().

  • Read :help index().

  • Read :help join().

  • Read :help reverse().

  • Skim :help functions to find some other list-related functions I haven't mentioned yet. Run :match Keyword /\clist/ to case-insensitively highlight the word list to make it easier to find what you're looking for.