Gist on Emacs

## みなさん、Emacsで Gist 使ってますか？
私も気軽に使っているのですが [GitHub Gist](https://note.com/ojk/n/nc18e9a15af2a) の Webページを開いて直接コード書き込んだりコピペするというのは何げに中途半端ですね。


ローカルに cloneして git管理するという Tipsも見かけましたが、そもそもバージョン管理がしたいのであればGistにこだわらず、素直にリポジトリで管理すれば済むことです。

## 何がしたいのか整理してみる

1. Emacsで開いている Buffer（or Region）からそのまま即 POSTしたい。
2. Diredからも POSTしたい。
3. POSTに成功したら、結果をブラウザで開いてほしい。
4. 自分の GitHub Gist ページを一発で開きたい。

gist.elを使えば簡単なのですが、全ての操作をEmacsでやりたいのではなく、基本的には上記のPOST機能だけで十分なので簡単な関数を作ってみました。稚拙な emacs-lispなのでもう少しスマートなやり方があれば教えてください。

## ターミナルで gist コマンドが扱えること

このTipsは、ターミナルからコマンドラインで gist が扱えるように設定済であることが前提です。

* [コマンドラインでgistを操作できる "gist"](https://qiita.com/minoruGH/items/6a81af6e35a8ba896a02) 

ターミナルで `gist -help` を打つといろいろオプションパラメターがわかります。

```shell
Usage: gist [-o|-c|-e] [-p] [-s] [-R] [-d DESC] [-u URL]
                          [--skip-empty] [-P] [-f NAME|-t EXT]* FILE*
       gist --login
       gist [-l|-r]

        --login                      Authenticate gist on this computer.
    -f, --filename [NAME.EXTENSION]  Sets the filename and syntax type.
    -t, --type [EXTENSION]           Sets the file extension and syntax type.
    -p, --private                    Makes your gist private.
        --no-private
    -d, --description DESCRIPTION    Adds a description to your gist.
    -s, --shorten                    Shorten the gist URL using git.io.
    -u, --update [ URL | ID ]        Update an existing gist.
    -c, --copy                       Copy the resulting URL to the clipboard
    -e, --embed                      Copy the embed code for the gist to the clipboard
    -o, --open                       Open the resulting URL in a browser
        --no-open
        --skip-empty                 Skip gisting empty files
    -P, --paste                      Paste from the clipboard to gist
    -R, --raw                        Display raw URL of the new gist
    -l, --list [USER]                List all gists for user
    -r, --read ID [FILENAME]         Read a gist and print out the contents
        --delete [ URL | ID ]        Delete a gist
    -h, --help                       Show this message.
    -v, --version                    Print the version.
```
## Emacsの設定
Emacsに設定するのは下記の４つのコマンドだけです。

### 1. gist-region-or-buffer
名前の通り Emacsで開いている Buffer（or region）を postしてくれます。
Descriptionはミニバッファーから入力し、bufferファイル名を自動取得してファイ名にします。
regionからPOSTするときは、Descriotionとファイル名のどちらもミニバッファーから入力しています。

### 2. dired-do-gist
Emacsで開いているDiredからカーソル位置のファイルを gist postするための設定です。

### 3. chromium-gist
プラウザで自分のGistページを開くための設定です。`<gist-user>` にユーザー名をいれます。

### 4. open-lepton
クライアントアプリ Leptonを開くための設定です。私の場合、編集や削除などはLeptonでしています。

---
### init.elへの設定
```emacs-lisp
(leaf my:gist-configuration
  :config
  (bind-key "@" 'dired-do-gist dired-mode-map)
  (bind-key "C-c g" 'gist-region-or-buffer)
  (bind-key "C-c v" 'chromium-gist)
  (bind-key "C-c l" 'lepton)
  :init
  (defun gist-description ()
	(shell-quote-argument (read-from-minibuffer "Gist description: ")))
   (defun gist-filename ()
	"The character string entered in minibuffer is used as file-name.
If enter is pressed without file-name, file-name will be buffer-file-neme."
	(let ((file (file-name-nondirectory (buffer-file-name (current-buffer)))))
	  (read-from-minibuffer (format "File name (%s): " file) file)))
 
  (defun gist-region-or-buffer ()
	"If region is selected, input file-name in minibuffer then post from region.
If region isn't selected, use buffer-file-name to post from buffer."
	(interactive)
	(let ((file (buffer-file-name)))
	  (if (not (use-region-p))
		  (compile (concat "gist -od " (gist-description) " " file))
		(compile (concat "gist -oPd " (gist-description) " -f " (gist-filename)))))
	(delete-other-windows))

  (defun dired-do-gist ()
	"Dired-get-filename do gist and open in browser."
	(interactive)
	(let ((file (dired-get-filename nil t)))
	  (compile (concat "gist -od " (gist-description) " " file)))
	(delete-other-windows))

  (defun chromium-gist ()
	"Open GitHub Gist page with browse-url."
	(interactive)
	(browse-url "https://gist.github.com/<gist-user>"))

  (defun lepton ()
	"Open Lepton application."
	(interactive)
	(compile "~/Appimage/Lepton-1.10.0.AppImage")
	(delete-other-windows)))
```

## クライアントアプリの紹介
もう少しビジュアルにGistを管理したいという方には、マルチプラートホームで利用可能な [Lepton](https://github.com/hackjutsu/Lepton) というアプリがお薦めです。WEBページよりは見やすいですし、編集、削除も可能です。New fileをコピペして投稿することもできます。ただ新規のPOSTは、上述した `gist-buffer-or-region` の方が遥かに便利です。

* [https://github.com/hackjutsu/Lepton#readme](https://github.com/hackjutsu/Lepton#readme) 

私はAppImage版をダウンロードして使っています

```shell
## makefile for install Lepton.AppImage
lepton: ## Init lepton
	mkdir -p ${HOME}/Appimage
	cd ${HOME}/Appimage && \
	wget https://github.com/hackjutsu/Lepton/releases/download/v1.10.0/Lepton-1.10.0.AppImage
	chmod a+x Lepton-1.10.0.AppImage
	ln -vsfn {${PWD},${HOME}}/.local/share/applications/lepton.desktop
```