Vim을 사용하면 코딩을 빨리할 수 있다고 생각하는 분들 많죠?
오늘은 Postfix Code Completion 이라는 방법을 사용하여 코딩을 빨리하는 노하우 소개합니다.
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() {
}
마지막
어떻습니까?
이 포스트를 읽고 조금이라도 빨리 코딩할 수 있게 되길 바랍니다.
즐거운 코딩 하세요~