tools/vim

Learn Vimscript The Hard Way - 23: Functions

seul chan 2020. 3. 30. 08:04

Functions

vimscript에도 다른 많은 프로그래밍 언어처럼 함수가 있다.

일단 기본적인 사용법부터 알아보자.

다름 코멘드를 실행해보자.

:function meow()

meow() 함수가 만들어 질 것이라고 기대했지만, 아래와 같은 에러가 발생한다.

E128: Function name must start with a capital or "s:": meow()

Vimscript 함수는 scoping 되지 않았다면 반드시 대문자로 시작하여야 한다.

뒤에 나오는 것처럼 함수에 scope를 추가하더라도 대문자로 적기를 convention으로 권장하고 있다.

:function Meow()
:  echom "Meow!"
:endfunction

이제 위에서 만든 Meow 함수를 호출해보자.

:call Meow()

Meow!가 출력됨을 볼 수 있다.

이제 값을 리턴하는 함수를 만들어 보자. python처럼 return을 사용하면 된다.

:function GetMeow()
:  return "Meow String!"
:endfunction
:echom GetMeow()

위 명령어를 실행시키면 return된 Meow String!이 출력된다.

Calling Functions

위에서 이미 본 것 처럼, vimscript에서 함수 호출은 두 가지 방법이 있다.

첫 번째는 call method를 사용하여 직접적으로 호출하는 방법이다.

:call Meow()
:call GetMeow()

첫 번 째에는 Meow!가 출력되지만, 두 번 째 GetMeow()에서는 아무것도 출력되지 않는다.

두 번 째 방법은 구문으로 호출하는 방식이다. call을 사용하지 않고 함수명을 바로 사용 가능하다.
(대부분의 프로그래밍 언어에서는 이렇게 사용할것이다.)

:echom GetMeow()

Implicit Returning

다음 명령어를 실행해보자

:echom Meow()

Meow! 말고도 1까지 총 두 줄이 반환된다.

0은 vimscript 함수가 리턴 할 값이 없는 경우 명시적으로 0을 리턴하기 때문에 나타난 것이다.

이런 이점을 이용하여 다음 함수를 작성해보자.

:function TextwidthIsTooWide()
:  if &l:textwidth ># 80
:    return 1
:  endif
:endfunction

위 함수는 우리가 배운 많은 중요한 내용들을 다루고 있다.

  • if
  • vim 옵션을 value로 사용 (textwidth)
  • 옵션을 localizing (&l)
  • case-sensitive 비교 (>#)

위 내용이 익숙하지 않으면 이전 챕터를 다시 읽어보자.

이제 이를 이용해보자.

:set textwidth=80
:if TextwidthIsTooWide()
:  echom "WARNING: Wide text!"
:endif

위 예시는 textwidth가 80으로 설정되어 있어서 TextwidthIsTooWide0을 반환하여 아무것도 출력되지 않는다.

:setlocal textwidth=100
:if TextwidthIsTooWide()
:  echom "WARNING: Wide text!"
:endif

위를 실행하면 local textwidth가 100으로 설정되어 있어 TextwidthIsTooWide1을 반환하고, 경고 메세지가 출력된다.

Excersize

  • Read :help :call. Ignore anything about "ranges" for now. How many arguments can you pass to a function? Is this surprising?
    20개까지 arguments가 사용 가능하다. 무슨 제한이 걸려있는지? (이미 궁금해서 물어본 사람이있다. stackexchange 답변 참고.

  • Read the first paragraph of :help E124 and find out what characters you're allowed to use in function names. Are underscores okay? Dashes? Accented characters? Unicode characters? If it's not clear from the documentation just try them out and see.
    Only alphanumeric characters and _(underscores) are allowed.

  • Read :help return. What's the "short form" of that command (which I told you to never use)? Is it what you expected? If not, why not?
    약자는 retu이다. ret를 기대했는데, :help ret를 보니 이미 retab으로 사용중이라서 그런 것 같다.