티스토리 뷰

목차

    반응형

    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() {

    }


    마지막

    어떻습니까?

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


    즐거운 코딩 하세요~



    반응형