受到《Go 終極指南:編寫(xiě)一個(gè) Go 工具》的啟發(fā),萌生了把 gomodifytags 封裝成emacs-plugin的想法, 然后經(jīng)過(guò)兩周的努力,誕生了emacs-go-tag。 emacs-go-tag 實(shí)現(xiàn)了兩個(gè)命令: go-tag-add 添加結(jié)構(gòu)體字段tag, go-tag-remove 刪除結(jié)構(gòu)體字段tag。
安裝依賴(lài)
emacs-go-tag 有兩個(gè)依賴(lài)項(xiàng), gomodifytags 和 go-mode.el,若使用emacs做Go開(kāi)發(fā) go-mode.el 應(yīng)該已經(jīng)在使用了。 gomodifytags安裝如下:
go get -u github.com/fatih/gomodifytags
安裝
目前emacs-go-tag已發(fā)布到了MELPA上,可使用如下命令安裝:
M-x package-install [RET] go-tag [RET]
若是沒(méi)發(fā)現(xiàn)go-tag,你需要使用如下命令來(lái)刷新,然后在使用上面的命令進(jìn)行安裝:
M-x package-refresh-contents [RET]
配置
目前 gomodifytags 支持三種轉(zhuǎn)換如下:
- snakecase: BaseDomain -> base_domain
- camelcase: BaseDomain -> baseDomain
- lispcase: BaseDomain -> base-domain
默認(rèn)使用 snakecase , 若你準(zhǔn)備使用 camelcase, 可配置如下:
(setq go-tag-args (list "-transform" "camelcase"))
快捷鍵配置示例:
(with-eval-after-load 'go-mode
(define-key go-mode-map (kbd "C-c t") #'go-tag-add)
(define-key go-mode-map (kbd "C-c T") #'go-tag-remove))
使用說(shuō)明
若是你有使用 vim-go 的 GoAddTags 和 GoRemoveTags 命令的經(jīng)驗(yàn), 那么你會(huì)很快上手 emacs-go-tag, 因?yàn)閮烧叩男袨橥耆恢拢ㄈ粲胁煌?,?qǐng)反饋)。
go-tag-add
:[range] go-tag-add [key],[option] [key1],[option] …
為結(jié)構(gòu)體字段添加tag。如果在一個(gè)結(jié)構(gòu)中調(diào)用,會(huì)自動(dòng)添加json字段tag。 若在結(jié)構(gòu)體之外調(diào)用,或者文件格式不正確,則會(huì)給出錯(cuò)誤消息。
如果給出 [range] ,則只有選定的字段將被改變。
默認(rèn)的json可以通過(guò)提供一個(gè)或多個(gè) [key] 參數(shù)來(lái)改變。 添加xml和db的例子是:
:go-tag-add xml db
若提供了 [option] 也提供了,會(huì)在添加tag時(shí),一同添加 option , 或者修改已存在的tag。 如下:
:go-tag-add json,omitempty
也可以定義一個(gè)常數(shù)值而不是默認(rèn)的基于字段的值。 例如,以下命令將添加`valid:"1"`到所有字段。
:go-tag-add valid=1

go-tag-remove
:[range] go-tag-add [key],[option] [key1],[option] …
移除結(jié)構(gòu)字段的字段標(biāo)記。 如果在一個(gè)結(jié)構(gòu)中調(diào)用,它會(huì)自動(dòng)刪除所有的字段tag。 如果在結(jié)構(gòu)體定義之外調(diào)用,或者文件格式不正確,則會(huì)給出錯(cuò)誤消息。
如果給出 [range] ,則只有選定的字段將被改變。
如果給出 [key] ,則只會(huì)刪除這些key相關(guān)的tag。 如下只刪除json相關(guān)的tag:
:go-tag-remove json
如果 [option] 和 [key] 一同傳遞,則只會(huì)刪除 option 。 例如,下面命令只會(huì)從包含json的字段中刪除omitempty選項(xiàng):
:go-tag-remove json,omitempty

最后
感謝 GoCN每日新聞 的每日推送,讓我得以讀到 《Go 終極指南:編寫(xiě)一個(gè) Go 工具》, 然后得以完成這個(gè)emacs-plugin。 項(xiàng)目地址:https://github.com/brantou/emacs-go-tag, 歡迎大家來(lái)使用和來(lái)提問(wèn)題,若是你覺(jué)得對(duì)你有幫助, 就給顆星 吧。