Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue 82/comment default config #87

Merged
merged 6 commits into from
Feb 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions .gitmux.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
tmux:
# The symbols section defines the symbols printed before specific elements
# of Git status displayed in tmux status string.
symbols:
# current branch name.
branch: "⎇ "
# Git SHA1 hash (in 'detached' state).
hashprefix: ":"
# 'ahead count' when local and remote branch diverged.
ahead: ↑·
# 'behind count' when local and remote branch diverged.
behind: ↓·
# count of files in the staging area.
staged: "● "
# count of files in conflicts.
conflict: "✖ "
# count of modified files.
modified: "✚ "
# count of untracked files.
untracked: "… "
# count of stash entries.
stashed: "⚑ "
# count of inserted lines (stats section).
insertions: Σ
# count of deleted lines (stats section).
deletions: Δ
# Shown when the working tree is clean.
clean: ✔

# Styles are tmux format strings used to specify text colors and attributes
# of Git status elements. See the STYLES section of tmux man page.
# https://man7.org/linux/man-pages/man1/tmux.1.html#STYLES.
styles:
# Clear previous style.
clear: "#[fg=default]"
# Special tree state strings such as [rebase], [merge], etc.
state: "#[fg=red,bold]"
# Local branch name
branch: "#[fg=white,bold]"
# Remote branch name
remote: "#[fg=cyan]"
# 'divergence' counts
divergence: "#[fg=yellow]"
# 'staged' count
staged: "#[fg=green,bold]"
# 'conflicts' count
conflict: "#[fg=red,bold]"
# 'modified' count
modified: "#[fg=red,bold]"
# 'untracked' count
untracked: "#[fg=magenta,bold]"
# 'stash' count
stashed: "#[fg=cyan,bold]"
# 'insertions' count
insertions: "#[fg=green]"
# 'deletions' count
deletions: "#[fg=red]"
# 'clean' symbol
clean: "#[fg=green,bold]"

# The layout section defines what components gitmux shows and the order in
# which they appear on tmux status bar.
#
# Allowed components:
# - branch: local branch name. Examples: `⎇ main`, `⎇ :345e7a0` or `[rebase]`
# - remote-branch: remote branch name, for example: `origin/main`.
# - divergence: divergence between local and remote branch, if any. Example: `↓·2↑·1`
# - remote: alias for `remote-branch` followed by `divergence`, for example: `origin/main ↓·2↑·1`
# - flags: symbols representing the working tree state, for example `✚ 1 ⚑ 1 … 2`
# - stats: insertions/deletions (lines), for example`Σ56 Δ21`
# - some string `foo`: any other character of string is directly shown, for example `foo` or `|`
layout: [branch, " ", remote-branch, divergence, " - ", flags]

# Additional configuration options.
options:
# Maximum displayed length for local and remote branch names.
branch_max_len: 0
# Trim left or right end of the branch (`right` or `left`).
branch_trim: right
# Character indicating whether and where a branch was truncated.
ellipsis: …
72 changes: 37 additions & 35 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,51 +156,54 @@ In `tmux` status bar, `gitmux` output immediately reflects the changes you make

### Symbols

The `symbols` section describes the symbols `gitmux` prints for the various components of the status string.
The `symbols` section defines the symbols printed before specific elements
of Git status displayed in `tmux` status string:

```yaml
symbols:
branch: '⎇ ' # Shown before a branch
hashprefix: ':' # Shown before a Git hash (in 'detached HEAD' state)
ahead: ↑· # Shown before the 'ahead count' when local and remote branch diverge
behind: ↓· # Shown before the 'behind count' when local/remote branch diverge
staged: '● ' # Shown before the 'staged' files count
conflict: '✖ ' # Shown before the 'conflicts' count
modified: '✚ ' # Shown before the 'modified' files count
untracked: '… ' # Shown before the 'untracked' files count
stashed: '⚑ ' # Shown before the 'stash' count
insertions: Σ # Shown before the count of insertied lines (stats sections).
deletions: Δ # Shown before the count of deletions lines (stats sections).
clean: ✔ # Shown when the working tree is clean (empty staging area)
branch: "⎇ " # current branch name.
hashprefix: ":" # Git SHA1 hash (in 'detached' state).
ahead: ↑· # 'ahead count' when local and remote branch diverged.
behind: ↓· # 'behind count' when local and remote branch diverged.
staged: "● " # count of files in the staging area.
conflict: "✖ " # count of files in conflicts.
modified: "✚ " # count of modified files.
untracked: "… " # count of untracked files.
stashed: "⚑ " # count of stash entries.
insertions: Σ # count of inserted lines (stats section).
deletions: Δ # count of deleted lines (stats section).
clean: ✔ # Shown when the working tree is clean.
```


### Styles

Styles are tmux format strings used to specify text colors and attributes.
See [`tmux` styles reference](https://man7.org/linux/man-pages/man1/tmux.1.html#STYLES).
Styles are tmux format strings used to specify text colors and attributes of Git
status elements.
See the [`STYLES` section](https://man7.org/linux/man-pages/man1/tmux.1.html#STYLES) of `tmux` man page.

```yaml
styles:
clear: '#[fg=default]' # Style clearing previous styles (printed before each component)
state: '#[fg=red,bold]' # Style of the special states strings like [rebase], [merge], etc.
branch: '#[fg=white,bold]' # Style of the local branch name
remote: '#[fg=cyan]' # Style of the remote branch name
divergence: "#[fg=yellow]" # Style of the 'divergence' string
staged: '#[fg=green,bold]' # Style of the 'staged' files count
conflict: '#[fg=red,bold]' # Style of the 'conflicts' count
modified: '#[fg=red,bold]' # Style of the 'modified' files count
untracked: '#[fg=magenta,bold]' # Style of the 'modified' files count
stashed: '#[fg=cyan,bold]' # Style of the 'stash' entries count
insertions: '#[fg=green]' # Style of the 'inserted lines' count
deletions: '#[fg=red]' # Style of the 'deleted lines' count
clean: '#[fg=green,bold]' # Style of the 'clean' symbol
clear: '#[fg=default]' # Clear previous style.
state: '#[fg=red,bold]' # Special tree state strings such as [rebase], [merge], etc.
branch: '#[fg=white,bold]' # Local branch name
remote: '#[fg=cyan]' # Remote branch name
divergence: "#[fg=yellow]" # 'divergence' counts
staged: '#[fg=green,bold]' # 'staged' count
conflict: '#[fg=red,bold]' # 'conflicts' count
modified: '#[fg=red,bold]' # 'modified' count
untracked: '#[fg=magenta,bold]' # 'untracked' count
stashed: '#[fg=cyan,bold]' # 'stash' count
insertions: '#[fg=green]' # 'insertions' count
deletions: '#[fg=red]' # 'deletions' count
clean: '#[fg=green,bold]' # 'clean' symbol
```

### Layout components

The layout is a list of the components `gitmux` shows, and the order in
which they appear on `tmux` status bar.
The `layout` section defines what components `gitmux` shows and the order in which
they appear on `tmux` status bar.


For example, the default `gitmux` layout shows is:

Expand All @@ -223,18 +226,17 @@ the remote branch, etc.
But you can anyway choose to never show some components if you wish, or to present
them in a different order.

This is the list of the possible components of the `layout`:
This is the list of the possible keywords for `layout`:

| Layout component | Description | Example |
| Layout keywords | Description | Example |
| :--------------: | :------------------------------------------------- | :------------------: |
| `branch` | local branch name | `main` |
| `remote-branch` | remote branch name | `origin/main` |
| `divergence` | divergence local/remote branch, if any | `↓·2↑·1` |
| `remote` | alias for `remote-branch` followed by `divergence` | `origin/main ↓·2↑·1` |
| `flags` | Symbols representing the working tree state | `✚ 1 ⚑ 1 … 2` |
| `stats` | Insertions/deletions (lines). Disabled by deafult | `Σ56 Δ21` |
| any string `foo` | Any other string is directly shown | `foo` |

| `stats` | Insertions/deletions (lines). Disabled by default | `Σ56 Δ21` |
| any string `foo` | Non-keywords are shown as-is | `hello gitmux` |


Some example layouts:
Expand Down
24 changes: 24 additions & 0 deletions config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package main

import (
_ "embed"
"fmt"

"github.com/arl/gitmux/tmux"
"gopkg.in/yaml.v3"
)

// Config configures output formatting.
type Config struct{ Tmux tmux.Config }

// default config (decoded in init)
var defaultCfg Config

//go:embed .gitmux.yml
var cfgBytes []byte

func init() {
if err := yaml.Unmarshal(cfgBytes, &defaultCfg); err != nil {
panic(fmt.Sprintf("default config is invalid: %v", err))
}
}
13 changes: 0 additions & 13 deletions formater.go

This file was deleted.

11 changes: 2 additions & 9 deletions gitmux.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,6 @@ Options:
-V prints gitmux version and exits.
`

// Config configures output formatting.
type Config struct{ Tmux tmux.Config }

var _defaultCfg = Config{Tmux: tmux.DefaultCfg}

func parseOptions() (ctx context.Context, cancel func(), dir string, dbg bool, cfg Config) {
var (
dbgOpt = flag.Bool("dbg", false, "")
Expand All @@ -60,13 +55,11 @@ func parseOptions() (ctx context.Context, cancel func(), dir string, dbg bool, c
}

if *printCfgOpt {
enc := yaml.NewEncoder(os.Stdout)
check(enc.Encode(&_defaultCfg), *dbgOpt)
enc.Close()
os.Stdout.Write(cfgBytes)
os.Exit(0)
}

cfg = _defaultCfg
cfg = defaultCfg

if *cfgOpt != "" {
f, err := os.Open(*cfgOpt)
Expand Down
39 changes: 0 additions & 39 deletions tmux/formater.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,45 +91,6 @@ type options struct {
Ellipsis string `yaml:"ellipsis"`
}

// DefaultCfg is the default tmux configuration.
var DefaultCfg = Config{
Symbols: symbols{
Branch: "⎇ ",
Staged: "● ",
Conflict: "✖ ",
Modified: "✚ ",
Untracked: "… ",
Stashed: "⚑ ",
Clean: "✔",
Ahead: "↑·",
Behind: "↓·",
HashPrefix: ":",
Insertions: "Σ",
Deletions: "Δ",
},
Styles: styles{
Clear: "#[fg=default]",
State: "#[fg=red,bold]",
Branch: "#[fg=white,bold]",
Remote: "#[fg=cyan]",
Divergence: "#[fg=default]",
Staged: "#[fg=green,bold]",
Conflict: "#[fg=red,bold]",
Modified: "#[fg=red,bold]",
Untracked: "#[fg=magenta,bold]",
Stashed: "#[fg=cyan,bold]",
Clean: "#[fg=green,bold]",
Insertions: "#[fg=green]",
Deletions: "#[fg=red]",
},
Layout: []string{"branch", " ", "remote-branch", "divergence", " - ", "flags"},
Options: options{
BranchMaxLen: 0,
BranchTrim: dirRight,
Ellipsis: "…",
},
}

// A Formater formats git status to a tmux style string.
type Formater struct {
Config
Expand Down