$yanutetsu->{blog}

プログラマ三大美徳なPM

EmacsでGolangをエレガントに開発する

やぬてつです。

この記事はEmacsでGo開発をしている人を対象としています。

「あーもう少しエレガントにGolangの開発がしたいなー」

皆さんそう思いますよね。

特に、テストを書いている時に、バッファを切り替えるのがメンドクサイくて、キーバインド一発で切り替えたいですよね?よね?

はい、だから、プログラムファイルとテストファイルをトグル表示するコマンドを作成しました。

(defun file-name-sans-extension-underbar (filename)
  (save-match-data
    (let ((file (file-name-sans-versions (file-name-nondirectory filename)))
      directory)
      (if (and (string-match "_[^._]*\\'" file)
           (not (eq 0 (match-beginning 0))))
      (if (setq directory (file-name-directory filename))
          (concat directory (substring file 0 (match-beginning 0)))
        (substring file 0 (match-beginning 0)))
    filename))))

(defun file-name-extension-underbar (filename &optional period)
  (save-match-data
    (let ((file (file-name-sans-versions (file-name-nondirectory filename))))
      (if (and (string-match "_[^._]*\\'" file)
           (not (eq 0 (match-beginning 0))))
          (substring file (+ (match-beginning 0) (if period 0 1)))
        (if period
            "")))))

(defun go--counterpart-name (name)
  (let ((ext (file-name-extension name))
        (base (file-name-sans-extension name)))
    (if (equal ext "go")
        (let ((ext2 (file-name-extension-underbar base))
              (base2 (file-name-sans-extension-underbar base)))
          (if (equal ext2 "test")
              (concat base2 ".go")
            (concat base "_test.go")))
      (concat base ".go"))))

(defun go-open-testfile ()
  (interactive)
  (find-file (go--counterpart-name (buffer-file-name))))

(define-key go-mode-map (kbd "C-c C-c") 'go-open-testfile)

基本的にはAngularのファイルを開くコマンドを作ったときと同じです。

だいぶエレガントになりましたね。

まとめ

みなさんもエレガントなEmacsで、どんどん開発スピードを上げていきましょう!