GitHubをEmacsで操作する

GitHubGit リポジトリをホスティングして開発をする場合、通常は Git の機能だけではなく、イシューやプルリクエストといった GitHub の機能も合わせて利用する事が多い。これらの機能は Git の機能ではないから、当然 Git クライアントには、それらに相当する操作はない。 git コマンドを使い CLI で操作していると、ブランチの push まではできても、プルリクエストを作るにはブラウザを開いてWeb UIで操作する必要がある。これは出来れば CLI で完結したい。そのために GitHubgh というCLIツールを提供していて、これを使用すると CLIGitHub の操作ができる。

Emacs での Git の操作については、 Magit というライブラリが人気だ。これは git コマンドを利用して動作する。 MagitGit クライアントだから、当然 GitHub の機能(つまり gh の機能)をサポートしない。

僕は、GitもGitHubもできればEmacsで使用したい。だから gh を利用し GitHub の操作を行う、ユーティリティライブラリを実装する事にした。

magh.el

;;; magh --- the MAgical GitHub command line interface for Emacs. -*- lexical-binding: t -*-

;; Copyright (C) 2022 TakesxiSximada

;; Author: TakesxiSximada <[email protected]>
;; Maintainer: TakesxiSximada <[email protected]>
;; Version: 1
;; Package-Version: 20240131.0000
;; Package-Requires: ((emacs "27.1"))
;; Date: 2023-01-31

;; This file is part of magh.

;; magh is free software: you can redistribute it and/or
;; modify it under the terms of the GNU Affero General Public License as
;; published by the Free Software Foundation, either version 3 of the
;; License, or (at your option) any later version.

;; magh is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;; Affero General Public License for more details.

;; You should have received a copy of the GNU Affero General Public
;; License along with this program.  If not, see
;; <https://www.gnu.org/licenses/>.

;;; Code:

;;; Customization
(defgroup magh nil
  "the MAgical GitHub command line interface for Emacs."
  :prefix "magh-"
  :group 'tools
  :link '(url-link :tag "Source" "https://blog.symdon.info/emacs/1706700260/magh.el"))

(defcustom magh-gh-executable "gh"
  "Executables of gh command."
  :type 'string)

;;;###autoload
(defun magh ()
  (interactive)
  nil)


;;;###autoload
(defun magh-pr-list ()
  (interactive)
  (let ((vterm-shell "gh pr list")
	(vterm-buffer-name "*Github*")
	(vterm-kill-buffer-on-exit nil))
    (vterm)))

(provide 'magh)
;;; magh.el ends here