본문 바로가기
C++ 200제/코딩 IT 정보

vim 빨리 코딩하는 방법: JSON DB HTTP 패턴 적용

by vicddory 2020. 4. 24.

Vim을 사용하면 코딩을 빨리할 수 있다고 생각하는 분들 많죠?

오늘은 Postfix Code Completion 이라는 방법을 사용하여 코딩을 빨리하는 노하우 소개합니다.

sonictemplate-vim-sample.gif

Postfix Code Completion

입력한 표현식 주위에 템플릿 코드를 자동으로 추가하는 포스트 픽스 자동 완성 기능입니다.

후위 보완 방법이라고도 합니다.


예) (a == b)에 대해 if를 사용

(a == b).if 라고 입력하면 if (a == b) { } 식으로 자동 완성됩니다.


뒤에 코드 if가 앞의 코드 (a == b)에 붙는 개념입니다.

이를 적극적으로 사용하면 더 빠르게 코딩할 수 있습니다.

Vim에서 Postfix Code Completion 사용 방법

Vim에는 sonictemplate.vim 이라는 플러그인이 지원됩니다.

기본적으로 Postfix의 패턴 파일이 준비되어 있습니다. <C-y><C-b> 가 있어서 패턴을 사용할 수 있습니다.

물론, 패턴 파일을 추가 / 수정 / 편집 할 수도 있습니다.


우선, 내가 사용할 템플릿 디렉터리를 설정합니다. 저는 ~/.vim/sonictemplate 입니다.


let g:sonictemplate_vim_template_dir = expand('~/.vim/sonictemplate')


다음엔 언어별로 디렉토리를 만듭니다. 디렉토리 이름은 파일 타입의 이름과 똑같은 게 좋습니다.

js 라면 javascript라는 디렉토리를 만듭니다. 이 포스트에선 Go 언어의 템플릿을 만듭니다.


$ mkdir ~/.vim/sonictemplate/go


다음, Postfix 패턴 파일을 만듭니다. 파일 이름은 pattern.stpl로 해주세요.


$ vim ~/.vim/sonictemplate/go/pattern.stpl


위의 go.stpl 패턴을 추가하세요.


패턴 작성 방법

다음과 같이 첫 번째 줄에 패턴, 두 번째 행에 자동 완성 이후 추가될 코드를 작성합니다. 2행 이후에는 탭이 필요합니다.


\(\S\+\)\.var$
    var {{$1}} = {{_cursor_}}


여러 패턴은 빈 줄로 구분됩니다.


\(\S\+\)\.var$
    var {{$1}} = {{_cursor_}}

\(\S\+\)\.iferr$
    if {{$1}} != nil {
        return {{$1}}
    }
    {{_cursor_}}


패턴은 정규표현식으로도 구현할 수 있습니다. 그리고 확장된 코드에선 {{ }} 둘러싼 플러그인 고유의 구문도 사용할 수 있습니다.

위의 예에서는 {{$1}} 후위 참조 ( \(\S\+\) 부분) 이라 정의되어 있습니다. {{_cursor_}} 는 완성 후 커서 위치를 지정합니다.

{{}} 를 사용한 구문 정의 방법은 많습니다. 도움말을 참조하세요.

패턴 예시

몇 가지 패턴을 소개합니다.


db 열기

패턴


db.open\.\(".*"\)\.\(".*"\)$
    db, err := sql.Open({{$1}}, {{$2}})
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    {{_cursor_}}


코드


// 실행 전
db.open."sqlite3"."test.db"

// 실행 후
db, err := sql.Open("sqlite3", "test.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()


쿼리 발행

패턴


db\.query\.\(.*\)$
    rows, err := db.Query({{$1}})
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    {{_cursor_}}


코드


// 실행 전
db.query."select * from todos"

// 실행 후
rows, err := db.Query("select * from todos")
if err != nil {
log.Fatal(err)
}
defer rows.Close()

JSON 인코딩

패턴

json\.encode\.\(\S\+\)\.\(\S\+\)$
    if err := json.NewEncoder({{$1}}).Encode({{$2}}); err != nil {
        {{_cursor_}}
    }


코드


// 실행 전
json.encode.writer.&gorilla

// 실행 후
if err := json.NewEncoder(writer).Encode(&gorilla); err != nil {

}


JSON 디코드

패턴


json\.decode\.\(\S\+\)\.\(\S\+\)$
    if err := json.NewDecoder({{$1}}).Decode({{$2}}); err != nil {
        {{_cursor_}}
    }


코드


// 실행 전
json.decode.reader.&gorilla

// 실행 후
if err := json.NewDecoder(reader).Decode(&gorilla); err != nil {

}


Append

패턴


\(\S\+\)\.append\.\(\S\+\)$
    {{$1}} = append({{$1}}, {{$2}})
    {{_cursor_}}


코드


// 실행 전
gorillas.append.gorilla

// 실행 후
gorillas = append(gorillas, gorilla)


HTTP 서버

패턴


http\.server\.\(\S\+\)$
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        {{_cursor_}}
    })
    log.Println("start http server :{{$1}}")
    log.Fatal(http.ListenAndServe(":{{$1}}", nil))


코드


// 실행 전
http.server.8080

// 실행 후
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

})

log.Println("start http server :8080")
log.Fatal(http.ListenAndServe(":8080", nil))

main

패턴


^main$
    package main

    func main() {
        {{_cursor_}}
    }


코드


// 실행 전
main

// 실행 후
package main

func main() {

}


마지막

어떻습니까?

이 포스트를 읽고 조금이라도 빨리 코딩할 수 있게 되길 바랍니다.


즐거운 코딩 하세요~



댓글