gist - Manage your gist like a pro
Getting started
# fetch your gists and clone them into ~/gist as git repos
gist fetch
# show the list of your gists
gist
# create a new gist
gist new
# create private gist with files 'foo' and 'bar'
gist new -p foo bar
# get the path of cloned repo of your third gist
gist 3
# cd to the cloned repo
cd `gist 3`
# push changes in your third gist to the remote repo
gist push 3
# update the description of your third gist
gist edit 3
# delete gists with index 3, 4 and 5
gist delete 3 4 5
# or use Brace Expansion
gist delete {3..5}
# Import your third gist as a new Github repo with web page
gist github 3
# For more detail, read the helper message
gist help
## Commands
Update information and clone gists from Github
Run gist fetch
to fetch your all gists with Github API and keep short information for each gist in a index file inside a given folder. (default to ~/gist/index
)
- Automatically Clone/Pull each gist with git into a given folder. (default to ~/gist/
)
- Run gist fetch star
to fetch you starred gist
- If token is not being set, then you cannot fetch your private gist
List your gists
Run gist
to read index file (default to ~/gist/index
) and list your gists with the folloing format:
[index] [gist-URL] [files-number] [comments-number] [description]
like following:

- Use
gist star
to show your starred gist - Index with prefix
s
is a starred gist, index with prefixp
is a private gist - There are colorful hints for each gist in the following cases:
- working: some changes are made locally but not yet do
git commit
, or you are not inmaster
branch - ahead: your local head is yet to be applied to upstream
- outdated: your local head is differs from the last fetched gists, do
gist fetch
to refresh index file and pull if needed
- working: some changes are made locally but not yet do
Create a new gist
Run gist new
to create a new gist
- You can create a new gist with 3 different ways:
1. type the content by hand, run gist new
2. use existig files, run gist new <file1> <file2>...
3. from STDIN, like <command> | gist new
- You can specify filename with --file
, and description with --desc
, like gist new --file new --desc 'a new gist'
- If you don’t specify filename or description, a prompt will shows up!
Modify a gist
Run gist <index-of-gist>
to use default editor to open files in local repo (by default action). Also use cd $(gist <index-of-gist>)
to cd to that repo. You can do some trick to simplify it.(See action and Tips)
Since now a gist is a local cloned repo, it is your business to do git commit and git push. Use gist push <index-of-gist>
is not recommended.
Clean unnecessary local repos
Say you delete gists with command gist delete <index-of-gist>...
, the local git repositories are still at ~/gist/
. Run gist clean
to move them into /tmp
Configuration
gist
stores your configuraion inside ~/.config/gist.conf
, with <key>=<value>
format for each line. And just do source ~/.config/gist.con
at runtime. This file is created automatically when you do the first configuration, and only allows current user to read and write (permission 600).
Valid keys are user
, token
, folder
, auto_sync
, action
, EDITOR
and protocol. Use the following commads to set value:
gist config <key> <value>
# Remove current value from a key
gist config <key>
# Or just modify ~/.config/gist.conf directly
gist config
Each key is for the following use cases:
user
Your Github username
If you use command which needs username and user
is not being set, a prompt will shows up and requires your username and API token
.
Use gist config user <your-github-username>
to set the value if needed.
token
Your Github API token for the given username. It’s scope should be with gist
.
If you use command which needs it and it is not being set, A prompt will shows up and requires it. You can choose going to web page to create a new token, or just input an existing one directly.
Use gist config toekn <your-github-api-token>
to set the value if needed.
folder
[Optional] The folder you stores index file and git repos for each your gists and starred gists. Default to ~/gist/
if not being set.
Use gist config folder <prefered-directory>
to set the value if needed.
auto_sync
[Optional] Automatically clone/update your gists and starred gists as git repos when doing gist fetch
. Default to be true
.
Use gist config auto_sync false
to disable this feature.
action
[Optional] A custom action is performed when you do gist <index-of-gist>
(like gist 3
for your third gist). If is being set, gist
will cd
to the cloned repo, and just simply use eval
to perform action.
For example, you can use the following command to set the action for: print the filename and its content of all files inside the given gist
gist config action 'tail -n +1 *'
or do
gist config action '${EDITOR:-vi} .'
That is, use default editor or vi (if not being set) to open the cloned repo.
Also, if you run gist <index-of-gist>
with --no-action
, then action would be ignored.
EDITOR
[Optional] Editor to open ~/.config/gist.conf
. Default to be vi
.
For example, use gist config EDITOR code
to use VSCode instead.
protocol
[Optional] Protocol to clone git repo. Default to HTTPS valid values are: - https - ssh
For example, use gist config protocol ssh
to use SSH protocol instead.
Tips
Git Branching
Each gist is a git repository. Although there are some limits on git push
, like sub-directory. But guess what? Push another branch to github.com
is allowed. So why not use this feature for your gist workflow?
Jump to gist repo
Sometimes you want to switch to the gist repo as working directory with given index.
But since gist
is a bash script which goes in subshell, if you want to achieve this, it is necessary to configure shell setting by yourself.
gist <index-of-gist>
will return the path of repo, so you can put the following function into your ~/.bashrc
or ~/.zshrc
to apply it.
function cdgist() {
local dir=$(gist $1 --no-action)
[[ -d $dir ]] && cd $dir
}
And run cdgist 3
to jump to the repo of your third gist.
Suppress hint
If action is not configured, there is always a hint to show how to configure it. The following command can suppress it with a simple action that does nothing.
gist config action 'true'
There are serveral environment variables can suppress hint or user confirm, like:
# show list without hint
hint=false gist
# just print the repo path with a given index
gist 3 --no-action
# delete your third gist without confirmation
gist delete 3 --force
Useful action for gist repo
I strongly recommend using tig
as action. It is the most powerful git CLI tool as far as I know, and also easy to get in most of the Linux distros or Homebrew for mac. Give it a try!
If tig
is installed, run the following command to configure it as custom action:
gist config action 'tig -all'