tools/vim

Learn Vimscript The Hard Way - 37. Dictionaries

seul chan 2020. 4. 17. 23:57

Dictionaries

vimscript의 마지막 변수 타입은 dictionary이다. vimscript의 dictionary는 python의 dict, Ruby의 hash, Javascript의 object와 비슷하다.

dictionary는 중괄호 ({})로 만들어진다. 값은 여러가지 타입이 들어올 수 있지만, key는 string만이 들어올 수 있다.

:echo {'a': 1, 100: 'foo'}
{'a': 1, '100': 'foo'}

vimscript가 100을 '100'으로 변환한 것을 볼 수 있다.

또한 vimscript는 Javascript와는 달리 딕셔너리 마지막에 trailing comma를 추가할 수 있다.

:echo {'a': 1, 100: 'foo',}
{'a': 1, '100': 'foo'}

이 책에서는 (특히 여러줄로 정의할 경우에는 더욱) 반드시 dictionary에 trailng comma를 붙일 것을 권장하고 있다.

Indexing

key로 딕셔너리를 탐색하는 문법은 대부분의 언어와 비슷하다.

:echo {'a': 1, 100: 'foo',}['a']
1

:echo {'a': 1, 100: 'foo',}[100]
foo

위에서 정의할 때와 같이 100'100'으로 변환해서 처리해준다.

vimscript는 Javascript 스타일의 dot 방식도 지원한다.

:echo {'a': 1, 100: 'foo',}.a
1

:echo {'a': 1, 100: 'foo',}.100
foo

Assigning and Adding

dictionary에 값을 추가하는 것은 간단하다.

:let foo = {'a': 1}
:let foo.a = 100
:let foo.b = 200
:let foo['c'] = 300
:echo foo
{'a': 100, 'b': 200, 'c': 300}

Removing Entries

dictionary에서 값을 제거하는 방법은 두가지가 있다.

:let test = remove(foo, 'a')
:unlet foo.b
:echo foo
{'c': 300}

:echo test
100

remove 함수는 해당 키로 제거한 값을 변수로 사용 가능하고, unlet은 불가능하다.

dictionary에 키가 없는 경우에는 에러가 발생한다.

:unlet foo["asdf"]

removeunlet은 대개는 개인의 취향이다. 글쓴이는 remove가 더 유연하기 때문에 이를 더 선호한다고 한다

Dictionary Functions

list와 비슷하게 vim은 dictionary에 사용하는 많은 빌트인 함수가 있다.

:echom get({'a': 100}, 'a', 'default')
100

:echom get({'a': 100}, 'b', 'default')
default

또한 해당 키가 존재하는지도 확인이 가능하다.

:echom has_key({'a': 100}, 'a')
1

:echom has_key({'a': 100}, 'b')
0

key, value 쌍을 리스트 형태로 끄집어 낼 수도 있다.

:echo items({'a': 100, 'b': 200})
[['a', 100], ['b', 200]]

vimscript의 dictionary는 순서가 없기 때문에 items가 실행되어도 특정한 순서를 기대하면 안된다.

Exercises

  • Read :help Dictionary. All of it. Notice the capital D.

  • Read :help get().

  • Read :help has_key().

  • Read :help items().

  • Read :help keys()

  • Read :help values()