mirror of
https://codeberg.org/scip/tablizer.git
synced 2025-12-18 21:11:03 +01:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
687f4b7bb2 | ||
| 24b66b8a6b | |||
| d87c6878a4 | |||
| 4cdc4c8e18 | |||
| 9cb9a66332 | |||
| 24277cd716 | |||
| e51b141032 | |||
| 7af7304529 | |||
| b4c833a0ba | |||
| 1c36d93d65 | |||
|
|
ec864f42d6 | ||
|
|
4eaa676510 | ||
|
|
c600fb1136 | ||
|
|
abf9fac5c7 | ||
|
|
80dd6849ae |
96
.gh-dash.yml
Normal file
96
.gh-dash.yml
Normal file
@@ -0,0 +1,96 @@
|
||||
prSections:
|
||||
- title: Responsible PRs
|
||||
filters: repo:tlinden/tablizer is:open NOT dependabot
|
||||
layout:
|
||||
repoName:
|
||||
hidden: true
|
||||
|
||||
- title: Responsible Dependabot PRs
|
||||
filters: repo:tlinden/tablizer is:open dependabot
|
||||
layout:
|
||||
repoName:
|
||||
hidden: true
|
||||
|
||||
issuesSections:
|
||||
- title: Responsible Issues
|
||||
filters: is:open repo:tlinden/tablizer -author:@me
|
||||
layout:
|
||||
repoName:
|
||||
hidden: true
|
||||
|
||||
- title: Note-to-Self Issues
|
||||
filters: is:open repo:tlinden/tablizer author:@me
|
||||
layout:
|
||||
creator:
|
||||
hidden: true
|
||||
repoName:
|
||||
hidden: true
|
||||
|
||||
defaults:
|
||||
preview:
|
||||
open: false
|
||||
width: 100
|
||||
|
||||
keybindings:
|
||||
universal:
|
||||
- key: "shift+down"
|
||||
builtin: pageDown
|
||||
- key: "shift+up"
|
||||
builtin: pageUp
|
||||
prs:
|
||||
- key: g
|
||||
name: gitu
|
||||
command: >
|
||||
cd {{.RepoPath}} && /home/scip/bin/gitu
|
||||
- key: M
|
||||
name: squash-merge
|
||||
command: gh pr merge --rebase --squash --admin --repo {{.RepoName}} {{.PrNumber}}
|
||||
- key: i
|
||||
name: show ci checks
|
||||
command: gh pr checks --repo {{.RepoName}} {{.PrNumber}} | glow -p
|
||||
- key: e
|
||||
name: edit pr
|
||||
command: ~/.config/gh-dash/edit-gh-pr {{.RepoName}} {{.PrNumber}}
|
||||
- key: E
|
||||
name: open repo in emacs
|
||||
command: emacsclient {{.RepoPath}} &
|
||||
issues:
|
||||
- key: v
|
||||
name: view
|
||||
command: gh issue view --repo {{.RepoName}} {{.IssueNumber}} | glow -p
|
||||
- key: l
|
||||
name: add label
|
||||
command: gh issue --repo {{.RepoName}} edit {{.IssueNumber}} --add-label $(gum choose bug enhancement question dependencies wontfix)
|
||||
- key: L
|
||||
name: remove label
|
||||
command: gh issue --repo {{.RepoName}} edit {{.IssueNumber}} --remove-label $(gum choose bug enhancement question dependencies wontfix)
|
||||
- key: E
|
||||
name: open repo in emacs
|
||||
command: emacsclient {{.RepoPath}} &
|
||||
|
||||
theme:
|
||||
ui:
|
||||
sectionsShowCount: true
|
||||
table:
|
||||
compact: false
|
||||
showSeparator: true
|
||||
colors:
|
||||
text:
|
||||
primary: "#E2E1ED"
|
||||
secondary: "#6770cb"
|
||||
inverted: "#242347"
|
||||
faint: "#b0793b"
|
||||
warning: "#E0AF68"
|
||||
success: "#3DF294"
|
||||
background:
|
||||
selected: "#1B1B33"
|
||||
border:
|
||||
primary: "#383B5B"
|
||||
secondary: "#39386B"
|
||||
faint: "#8d3e0b"
|
||||
|
||||
repoPaths:
|
||||
:owner/:repo: ~/dev/:repo
|
||||
|
||||
pager:
|
||||
diff: delta
|
||||
4
.github/workflows/ci.yaml
vendored
4
.github/workflows/ci.yaml
vendored
@@ -16,7 +16,7 @@ jobs:
|
||||
id: go
|
||||
|
||||
- name: checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: build
|
||||
run: make
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: 1.23
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
- name: golangci-lint
|
||||
uses: golangci/golangci-lint-action@v6
|
||||
with:
|
||||
|
||||
2
.github/workflows/release.yaml
vendored
2
.github/workflows/release.yaml
vendored
@@ -10,7 +10,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v5
|
||||
|
||||
12
README.md
12
README.md
@@ -11,7 +11,13 @@ ignore certain column[s] by regex, name or number. It can output the
|
||||
tabular data in a range of formats (see below). There's even an
|
||||
interactive filter/selection tool available.
|
||||
|
||||
Usage:
|
||||
## Demo
|
||||
|
||||

|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
```default
|
||||
Usage:
|
||||
tablizer [regex,...] [file, ...] [flags]
|
||||
@@ -149,10 +155,6 @@ other separator, for instance: `-R '| |-|'`.
|
||||
|
||||
|
||||
|
||||
## Demo
|
||||
|
||||
[](https://asciinema.org/a/9FKc3HPnlg8D2X8otheleEa9t)
|
||||
|
||||
## Installation
|
||||
|
||||
There are multiple ways to install **tablizer**:
|
||||
|
||||
@@ -28,7 +28,7 @@ import (
|
||||
)
|
||||
|
||||
const DefaultSeparator string = `(\s\s+|\t)`
|
||||
const Version string = "v1.5.0"
|
||||
const Version string = "v1.5.4"
|
||||
const MAXPARTS = 2
|
||||
|
||||
var DefaultConfigfile = os.Getenv("HOME") + "/.config/tablizer/config"
|
||||
|
||||
@@ -6,7 +6,7 @@ NAME
|
||||
|
||||
SYNOPSIS
|
||||
Usage:
|
||||
tablizer [regex,...] [file, ...] [flags]
|
||||
tablizer [regex,...] [-r file] [flags]
|
||||
|
||||
Operational Flags:
|
||||
-c, --columns string Only show the speficied columns (separated by ,)
|
||||
@@ -41,12 +41,13 @@ SYNOPSIS
|
||||
-t, --sort-time sort according to time string
|
||||
|
||||
Other Flags:
|
||||
--completion <shell> Generate the autocompletion script for <shell>
|
||||
-f, --config <file> Configuration file (default: ~/.config/tablizer/config)
|
||||
-d, --debug Enable debugging
|
||||
-h, --help help for tablizer
|
||||
-m, --man Display manual page
|
||||
-V, --version Print program version
|
||||
-r --read-file <file> Use <file> as input instead of STDIN
|
||||
--completion <shell> Generate the autocompletion script for <shell>
|
||||
-f, --config <file> Configuration file (default: ~/.config/tablizer/config)
|
||||
-d, --debug Enable debugging
|
||||
-h, --help help for tablizer
|
||||
-m, --man Display manual page
|
||||
-V, --version Print program version
|
||||
|
||||
DESCRIPTION
|
||||
Many programs generate tabular output. But sometimes you need to
|
||||
@@ -441,7 +442,7 @@ AUTHORS
|
||||
var usage = `
|
||||
|
||||
Usage:
|
||||
tablizer [regex,...] [file, ...] [flags]
|
||||
tablizer [regex,...] [-r file] [flags]
|
||||
|
||||
Operational Flags:
|
||||
-c, --columns string Only show the speficied columns (separated by ,)
|
||||
@@ -476,12 +477,13 @@ Sort Mode Flags (mutually exclusive):
|
||||
-t, --sort-time sort according to time string
|
||||
|
||||
Other Flags:
|
||||
--completion <shell> Generate the autocompletion script for <shell>
|
||||
-f, --config <file> Configuration file (default: ~/.config/tablizer/config)
|
||||
-d, --debug Enable debugging
|
||||
-h, --help help for tablizer
|
||||
-m, --man Display manual page
|
||||
-V, --version Print program version
|
||||
-r --read-file <file> Use <file> as input instead of STDIN
|
||||
--completion <shell> Generate the autocompletion script for <shell>
|
||||
-f, --config <file> Configuration file (default: ~/.config/tablizer/config)
|
||||
-d, --debug Enable debugging
|
||||
-h, --help help for tablizer
|
||||
-m, --man Display manual page
|
||||
-V, --version Print program version
|
||||
|
||||
|
||||
`
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
all:
|
||||
LC_ALL=en_US.UTF-8 asciinema rec --cols 50 --row 30 -c ./demo.sh --overwrite tmp.cast
|
||||
agg tmp.cast tmp.gif
|
||||
31
demo/demo.sh
31
demo/demo.sh
@@ -1,31 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
prompt() {
|
||||
if test -n "$1"; then
|
||||
echo
|
||||
echo -n "% $*"
|
||||
sleep 1
|
||||
echo
|
||||
$*
|
||||
echo
|
||||
echo -n "% "
|
||||
else
|
||||
echo -n "% "
|
||||
fi
|
||||
}
|
||||
|
||||
PATH=..:$PATH
|
||||
clear
|
||||
while IFS=$'\t' read -r flags table msg source _; do
|
||||
echo "#"
|
||||
echo "# source tabular data:"
|
||||
cat $table
|
||||
echo
|
||||
echo "#"
|
||||
echo "# $msg:"
|
||||
prompt "tablizer $flags $table"
|
||||
|
||||
sleep 4
|
||||
clear
|
||||
done < <(yq -r tables.yaml \
|
||||
| yq -r '.tables[] | [.flags, .table, .msg, .source] | @tsv')
|
||||
@@ -1,4 +0,0 @@
|
||||
NAME DURATION COUNT WHEN
|
||||
beta 1d10h5m1s 33 3/1/2014
|
||||
alpha 4h35m 170 2013-Feb-03
|
||||
ceta 33d12h 9 06/Jan/2008 15:04:05 -0700
|
||||
@@ -1,3 +0,0 @@
|
||||
PID TTY TIME CMD
|
||||
30912 pts/0 00:00:00 bash
|
||||
49526 pts/0 00:00:00 ps
|
||||
@@ -1,54 +0,0 @@
|
||||
tables:
|
||||
# OUTPUTS
|
||||
- flags: -A
|
||||
table: table.demo1
|
||||
msg: default output mode
|
||||
- flags: -O
|
||||
table: table.demo1
|
||||
msg: orgmode output mode
|
||||
- flags: -M
|
||||
table: table.demo1
|
||||
msg: markdown output mode
|
||||
- flags: -S
|
||||
table: table.demo1
|
||||
msg: shell output mode
|
||||
- flags: -X
|
||||
table: table.demo1
|
||||
msg: extended output mode
|
||||
- flags: -Y
|
||||
table: table.demo1
|
||||
msg: yaml output mode
|
||||
- flags: -C
|
||||
table: table.demo1
|
||||
msg: CSV output mode
|
||||
|
||||
# SORTS
|
||||
- flags: -A -k 3
|
||||
table: table.demo1
|
||||
msg: sort by column 3
|
||||
- flags: -A -k 4 -t
|
||||
table: table.demo1
|
||||
msg: sort by column 4 and sort type time
|
||||
- flags: -A -k 2 -a
|
||||
table: table.demo1
|
||||
msg: sort by column 2 and sort type duration
|
||||
|
||||
# REDUCE
|
||||
- flags: -A -c 1,3
|
||||
table: table.demo1
|
||||
msg: only display column 1 and 3
|
||||
- flags: -A -c AM,RA
|
||||
table: table.demo1
|
||||
msg: only display columns matching /(RA|AM)/
|
||||
- flags: -X -c 1,3
|
||||
table: table.demo1
|
||||
msg: only display column 1 and 3 in extended mode
|
||||
|
||||
# SEARCH
|
||||
- flags: /20 -A
|
||||
table: table.demo1
|
||||
msg: only show rows matching /20
|
||||
- flags: /20 -A -v
|
||||
table: table.demo1
|
||||
msg: only show rows NOT matching /20
|
||||
|
||||
@@ -1,119 +0,0 @@
|
||||
{"version": 2, "width": 80, "height": 25, "timestamp": 1666890777, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}}
|
||||
[0.004618, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[0.010297, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[0.010898, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[0.011125, "o", "\r\n#\r\n"]
|
||||
[0.011177, "o", "# default output mode:\r\n"]
|
||||
[0.011219, "o", "\r\n% tablizer -A table.demo1"]
|
||||
[1.011851, "o", "\r\n"]
|
||||
[1.013635, "o", "NAME(1)\tDURATION(2)\tCOUNT(3)\tWHEN(4) \r\nbeta \t1d10h5m1s \t33 \t3/1/2014 \t\r\nalpha \t4h35m \t170 \t2013-Feb-03 \t\r\nceta \t33d12h \t9 \t06/Jan/2008 15:04:05 -0700\t\r\n"]
|
||||
[1.014021, "o", "\r\n% "]
|
||||
[5.015241, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[5.015339, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[5.015688, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[5.015776, "o", "\r\n#\r\n# orgmode output mode:\r\n\r\n% tablizer -O table.demo1"]
|
||||
[6.016322, "o", "\r\n"]
|
||||
[6.01823, "o", "+---------+-------------+----------+----------------------------+\r\n| NAME(1) | DURATION(2) | COUNT(3) | WHEN(4) |\r\n+---------+-------------+----------+----------------------------+\r\n| beta | 1d10h5m1s | 33 | 3/1/2014 |\r\n| alpha | 4h35m | 170 | 2013-Feb-03 |\r\n| ceta | 33d12h | 9 | 06/Jan/2008 15:04:05 -0700 |\r\n+---------+-------------+----------+----------------------------+\r\n"]
|
||||
[6.018497, "o", "\r\n% "]
|
||||
[10.020014, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[10.020112, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[10.020573, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[10.020643, "o", "\r\n#\r\n"]
|
||||
[10.02068, "o", "# markdown output mode:\r\n\r\n% tablizer -M table.demo1"]
|
||||
[11.021559, "o", "\r\n"]
|
||||
[11.023551, "o", "| NAME(1) | DURATION(2) | COUNT(3) | WHEN(4) |\r\n|---------|-------------|----------|----------------------------|\r\n| beta | 1d10h5m1s | 33 | 3/1/2014 |\r\n| alpha | 4h35m | 170 | 2013-Feb-03 |\r\n| ceta | 33d12h | 9 | 06/Jan/2008 15:04:05 -0700 |\r\n"]
|
||||
[11.023838, "o", "\r\n% "]
|
||||
[15.025244, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[15.025345, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[15.025829, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[15.025915, "o", "\r\n#\r\n# shell output mode:\r\n"]
|
||||
[15.025931, "o", "\r\n"]
|
||||
[15.025948, "o", "% tablizer -S table.demo1"]
|
||||
[16.026714, "o", "\r\n"]
|
||||
[16.028606, "o", "NAME(1)=\"beta\" DURATION(2)=\"1d10h5m1s\" COUNT(3)=\"33\" WHEN(4)=\"3/1/2014\"\r\nNAME(1)=\"alpha\" DURATION(2)=\"4h35m\" COUNT(3)=\"170\" WHEN(4)=\"2013-Feb-03\"\r\nNAME(1)=\"ceta\" DURATION(2)=\"33d12h\" COUNT(3)=\"9\" WHEN(4)=\"06/Jan/2008 15:04:05 -0700\"\r\n"]
|
||||
[16.029144, "o", "\r\n% "]
|
||||
[20.030593, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[20.030706, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[20.03121, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[20.031277, "o", "\r\n#\r\n# extended output mode:\r\n"]
|
||||
[20.031327, "o", "\r\n% tablizer -X table.demo1"]
|
||||
[21.032053, "o", "\r\n"]
|
||||
[21.033787, "o", " NAME(1): beta\r\nDURATION(2): 1d10h5m1s\r\n COUNT(3): 33\r\n WHEN(4): 3/1/2014\r\n\r\n NAME(1): alpha\r\nDURATION(2): 4h35m\r\n COUNT(3): 170\r\n WHEN(4): 2013-Feb-03\r\n\r\n NAME(1): ceta\r\nDURATION(2): 33d12h\r\n COUNT(3): 9\r\n WHEN(4): 06/Jan/2008 15:04:05 -0700\r\n\r\n"]
|
||||
[21.034132, "o", "\r\n% "]
|
||||
[25.035531, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[25.035585, "o", "#\r\n"]
|
||||
[25.035681, "o", "# source tabular data:\r\n"]
|
||||
[25.036179, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[25.036232, "o", "\r\n#\r\n"]
|
||||
[25.036274, "o", "# yaml output mode:\r\n\r\n% tablizer -Y table.demo1"]
|
||||
[26.036928, "o", "\r\n"]
|
||||
[26.038674, "o", "entries:\r\n - count: 33\r\n duration: \"1d10h5m1s\"\r\n name: \"beta\"\r\n when: \"3/1/2014\"\r\n - count: 170\r\n duration: \"4h35m\"\r\n name: \"alpha\"\r\n when: \"2013-Feb-03\"\r\n - count: 9\r\n duration: \"33d12h\"\r\n name: \"ceta\"\r\n when: \"06/Jan/2008 15:04:05 -0700\"\r\n"]
|
||||
[26.038975, "o", "\r\n% "]
|
||||
[30.040539, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[30.040659, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[30.041167, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[30.041246, "o", "\r\n#\r\n# CSV output mode:\r\n\r\n% tablizer -C table.demo1"]
|
||||
[31.042088, "o", "\r\n"]
|
||||
[31.043721, "o", "NAME,DURATION,COUNT,WHEN\r\nbeta,1d10h5m1s,33,3/1/2014\r\nalpha,4h35m,170,2013-Feb-03\r\nceta,33d12h,9,06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[31.043997, "o", "\r\n% "]
|
||||
[35.045523, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[35.04563, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[35.046209, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[35.046275, "o", "\r\n#\r\n# sort by column 3:\r\n\r\n% tablizer -A -k 3 table.demo1"]
|
||||
[36.047083, "o", "\r\n"]
|
||||
[36.048793, "o", "NAME(1)\tDURATION(2)\tCOUNT(3)\tWHEN(4) \r\nalpha \t4h35m \t170 \t2013-Feb-03 \t\r\nbeta \t1d10h5m1s \t33 \t3/1/2014 \t\r\nceta \t33d12h \t9 \t06/Jan/2008 15:04:05 -0700\t\r\n"]
|
||||
[36.049077, "o", "\r\n% "]
|
||||
[40.050739, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[40.050925, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[40.051481, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[40.051671, "o", "\r\n#\r\n# sort by column 4 and sort type time:\r\n\r\n% tablizer -A -k 4 -t table.demo1"]
|
||||
[41.052486, "o", "\r\n"]
|
||||
[41.05454, "o", "NAME(1)\tDURATION(2)\tCOUNT(3)\tWHEN(4) \r\nceta \t33d12h \t9 \t06/Jan/2008 15:04:05 -0700\t\r\nalpha \t4h35m \t170 \t2013-Feb-03 \t\r\nbeta \t1d10h5m1s \t33 \t3/1/2014 \t\r\n"]
|
||||
[41.054864, "o", "\r\n% "]
|
||||
[45.056297, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[45.056405, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[45.056895, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[45.056978, "o", "\r\n#\r\n"]
|
||||
[45.057023, "o", "# sort by column 2 and sort type duration:\r\n"]
|
||||
[45.057073, "o", "\r\n% tablizer -A -k 2 -a table.demo1"]
|
||||
[46.057895, "o", "\r\n"]
|
||||
[46.059684, "o", "NAME(1)\tDURATION(2)\tCOUNT(3)\tWHEN(4) \r\nalpha \t4h35m \t170 \t2013-Feb-03 \t\r\nbeta \t1d10h5m1s \t33 \t3/1/2014 \t\r\nceta \t33d12h \t9 \t06/Jan/2008 15:04:05 -0700\t\r\n"]
|
||||
[46.059988, "o", "\r\n% "]
|
||||
[50.061514, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[50.061622, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[50.062091, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[50.062188, "o", "\r\n#\r\n# only display column 1 and 3:\r\n\r\n% tablizer -A -c 1,3 table.demo1"]
|
||||
[51.062985, "o", "\r\n"]
|
||||
[51.066293, "o", "NAME(1)\tCOUNT(3) \r\nbeta \t33 \t\r\nalpha \t170 \t\r\nceta \t9 \t\r\n"]
|
||||
[51.066843, "o", "\r\n% "]
|
||||
[55.070781, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[55.071327, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[55.073499, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[55.073822, "o", "\r\n#\r\n# only display columns matching /(RA|AM)/:\r\n"]
|
||||
[55.074188, "o", "\r\n% tablizer -A -c AM,RA table.demo1"]
|
||||
[56.07636, "o", "\r\n"]
|
||||
[56.078603, "o", "NAME(1)\tDURATION(2) \r\nbeta \t1d10h5m1s \t\r\nalpha \t4h35m \t\r\nceta \t33d12h \t\r\n"]
|
||||
[56.078957, "o", "\r\n% "]
|
||||
[60.080574, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[60.080734, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[60.081286, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[60.081418, "o", "\r\n#\r\n# only display column 1 and 3 in extended mode:\r\n\r\n% tablizer -X -c 1,3 table.demo1"]
|
||||
[61.082844, "o", "\r\n"]
|
||||
[61.089822, "o", " NAME(1): beta\r\nCOUNT(3): 33\r\n\r\n NAME(1): alpha\r\nCOUNT(3): 170\r\n\r\n NAME(1): ceta\r\nCOUNT(3): 9\r\n\r\n"]
|
||||
[61.090969, "o", "\r\n% "]
|
||||
[65.096092, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[65.096571, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[65.098736, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[65.099085, "o", "\r\n#\r\n# only show rows matching /20:\r\n"]
|
||||
[65.099283, "o", "\r\n% tablizer /20 -A table.demo1"]
|
||||
[66.101537, "o", "\r\n"]
|
||||
[66.109112, "o", "NAME(1)\tDURATION(2)\tCOUNT(3)\tWHEN(4) \r\nbeta \t1d10h5m1s \t33 \t3/1\u001b[102;30m/20\u001b[0m14 \t\r\nceta \t33d12h \t9 \t06/Jan\u001b[102;30m/20\u001b[0m08 15:04:05 -0700\t\r\n"]
|
||||
[66.109405, "o", "\r\n% "]
|
||||
[70.11076, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
[70.110873, "o", "#\r\n# source tabular data:\r\n"]
|
||||
[70.111365, "o", "NAME DURATION COUNT WHEN\r\nbeta 1d10h5m1s 33 3/1/2014\r\nalpha 4h35m 170 2013-Feb-03\r\nceta 33d12h 9 06/Jan/2008 15:04:05 -0700\r\n"]
|
||||
[70.111469, "o", "\r\n#\r\n# only show rows NOT matching /20:\r\n\r\n% tablizer /20 -A -v table.demo1"]
|
||||
[71.112738, "o", "\r\n"]
|
||||
[71.120032, "o", "NAME(1)\tDURATION(2)\tCOUNT(3)\tWHEN(4) \r\nalpha \t4h35m \t170 \t2013-Feb-03\t\r\n"]
|
||||
[71.121127, "o", "\r\n% "]
|
||||
[75.126199, "o", "\u001b[H\u001b[2J\u001b[3J"]
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 243 KiB |
10
go.mod
10
go.mod
@@ -8,10 +8,10 @@ require (
|
||||
github.com/alecthomas/repr v0.5.1
|
||||
github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de
|
||||
github.com/charmbracelet/bubbles v0.21.0
|
||||
github.com/charmbracelet/bubbletea v1.3.4
|
||||
github.com/charmbracelet/bubbletea v1.3.6
|
||||
github.com/charmbracelet/lipgloss v1.1.0
|
||||
github.com/evertras/bubble-table v0.17.2
|
||||
github.com/gookit/color v1.5.4
|
||||
github.com/evertras/bubble-table v0.19.0
|
||||
github.com/gookit/color v1.6.0
|
||||
github.com/hashicorp/hcl/v2 v2.24.0
|
||||
github.com/lithammer/fuzzysearch v1.1.8
|
||||
github.com/olekukonko/tablewriter v1.0.9
|
||||
@@ -27,7 +27,7 @@ require (
|
||||
github.com/atotto/clipboard v0.1.4 // indirect
|
||||
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
|
||||
github.com/charmbracelet/colorprofile v0.3.1 // indirect
|
||||
github.com/charmbracelet/x/ansi v0.8.0 // indirect
|
||||
github.com/charmbracelet/x/ansi v0.9.3 // indirect
|
||||
github.com/charmbracelet/x/cellbuf v0.0.13 // indirect
|
||||
github.com/charmbracelet/x/term v0.2.1 // indirect
|
||||
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
|
||||
@@ -53,7 +53,7 @@ require (
|
||||
github.com/zclconf/go-cty v1.16.3 // indirect
|
||||
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
|
||||
golang.org/x/mod v0.21.0 // indirect
|
||||
golang.org/x/sync v0.14.0 // indirect
|
||||
golang.org/x/sync v0.15.0 // indirect
|
||||
golang.org/x/sys v0.33.0 // indirect
|
||||
golang.org/x/text v0.25.0 // indirect
|
||||
golang.org/x/tools v0.26.0 // indirect
|
||||
|
||||
22
go.sum
22
go.sum
@@ -12,14 +12,14 @@ github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiE
|
||||
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
|
||||
github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs=
|
||||
github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg=
|
||||
github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI=
|
||||
github.com/charmbracelet/bubbletea v1.3.4/go.mod h1:dtcUCyCGEX3g9tosuYiut3MXgY/Jsv9nKVdibKKRRXo=
|
||||
github.com/charmbracelet/bubbletea v1.3.6 h1:VkHIxPJQeDt0aFJIsVxw8BQdh/F/L2KKZGsK6et5taU=
|
||||
github.com/charmbracelet/bubbletea v1.3.6/go.mod h1:oQD9VCRQFF8KplacJLo28/jofOI2ToOfGYeFgBBxHOc=
|
||||
github.com/charmbracelet/colorprofile v0.3.1 h1:k8dTHMd7fgw4bnFd7jXTLZrSU/CQrKnL3m+AxCzDz40=
|
||||
github.com/charmbracelet/colorprofile v0.3.1/go.mod h1:/GkGusxNs8VB/RSOh3fu0TJmQ4ICMMPApIIVn0KszZ0=
|
||||
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
|
||||
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
|
||||
github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE=
|
||||
github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q=
|
||||
github.com/charmbracelet/x/ansi v0.9.3 h1:BXt5DHS/MKF+LjuK4huWrC6NCvHtexww7dMayh6GXd0=
|
||||
github.com/charmbracelet/x/ansi v0.9.3/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE=
|
||||
github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k=
|
||||
github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
|
||||
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
|
||||
@@ -30,16 +30,18 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
|
||||
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
|
||||
github.com/evertras/bubble-table v0.17.2 h1:4MtLO888s2xb94OG3KqJCIEav6gE3V4ob56hmOammf0=
|
||||
github.com/evertras/bubble-table v0.17.2/go.mod h1:ifHujS1YxwnYSOgcR2+m3GnJ84f7CVU/4kUOxUCjEbQ=
|
||||
github.com/evertras/bubble-table v0.19.0 h1:+JlXRUjNuBN1JI7XU1PapmW1wglbcqZUKkiPnVKPgrc=
|
||||
github.com/evertras/bubble-table v0.19.0/go.mod h1:ifHujS1YxwnYSOgcR2+m3GnJ84f7CVU/4kUOxUCjEbQ=
|
||||
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
|
||||
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
|
||||
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
|
||||
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0=
|
||||
github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w=
|
||||
github.com/gookit/assert v0.1.1 h1:lh3GcawXe/p+cU7ESTZ5Ui3Sm/x8JWpIis4/1aF0mY0=
|
||||
github.com/gookit/assert v0.1.1/go.mod h1:jS5bmIVQZTIwk42uXl4lyj4iaaxx32tqH16CFj0VX2E=
|
||||
github.com/gookit/color v1.6.0 h1:JjJXBTk1ETNyqyilJhkTXJYYigHG24TM9Xa2M1xAhRA=
|
||||
github.com/gookit/color v1.6.0/go.mod h1:9ACFc7/1IpHGBW8RwuDm/0YEnhg3dwwXpoMsmtyHfjs=
|
||||
github.com/hashicorp/hcl/v2 v2.24.0 h1:2QJdZ454DSsYGoaE6QheQZjtKZSUs9Nh2izTWiwQxvE=
|
||||
github.com/hashicorp/hcl/v2 v2.24.0/go.mod h1:oGoO1FIQYfn/AgyOhlg9qLC6/nOJPX3qGbkZpYAcqfM=
|
||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||
@@ -118,8 +120,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
|
||||
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
|
||||
golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
|
||||
@@ -204,8 +204,8 @@ func printASCIIData(writer io.Writer, conf cfg.Config, data *Tabdata) {
|
||||
Borders: tw.BorderNone,
|
||||
Symbols: styleTSV,
|
||||
Settings: tw.Settings{
|
||||
Separators: tw.Separators{BetweenRows: tw.Off, BetweenColumns: tw.On},
|
||||
Lines: tw.Lines{ShowFooterLine: tw.Off, ShowHeaderLine: tw.Off},
|
||||
Separators: tw.SeparatorsNone,
|
||||
Lines: tw.LinesNone,
|
||||
},
|
||||
})),
|
||||
tablewriter.WithConfig(tablewriter.Config{
|
||||
@@ -213,23 +213,18 @@ func printASCIIData(writer io.Writer, conf cfg.Config, data *Tabdata) {
|
||||
Formatting: tw.CellFormatting{
|
||||
AutoFormat: tw.Off,
|
||||
},
|
||||
Padding: tw.CellPadding{
|
||||
Global: tw.Padding{Left: "", Right: ""},
|
||||
},
|
||||
Padding: tw.CellPadding{Global: tw.Padding{Left: "", Right: " "}},
|
||||
},
|
||||
Row: tw.CellConfig{
|
||||
Formatting: tw.CellFormatting{
|
||||
AutoWrap: tw.WrapNone,
|
||||
Alignment: tw.AlignLeft,
|
||||
},
|
||||
Padding: tw.CellPadding{
|
||||
Global: tw.Padding{Left: "", Right: ""},
|
||||
},
|
||||
Padding: tw.CellPadding{Global: tw.Padding{Right: " "}},
|
||||
},
|
||||
|
||||
Debug: true,
|
||||
}),
|
||||
tablewriter.WithPadding(tw.PaddingNone),
|
||||
)
|
||||
|
||||
if !conf.NoHeaders {
|
||||
|
||||
@@ -77,10 +77,10 @@ var tests = []struct {
|
||||
numberize: true,
|
||||
name: "default",
|
||||
expect: `
|
||||
NAME(1) DURATION(2) COUNT(3) WHEN(4)
|
||||
beta 1d10h5m1s 33 3/1/2014
|
||||
alpha 4h35m 170 2013-Feb-03
|
||||
ceta 33d12h 9 06/Jan/2008 15:04:05 -0700`,
|
||||
NAME(1) DURATION(2) COUNT(3) WHEN(4)
|
||||
beta 1d10h5m1s 33 3/1/2014
|
||||
alpha 4h35m 170 2013-Feb-03
|
||||
ceta 33d12h 9 06/Jan/2008 15:04:05 -0700`,
|
||||
},
|
||||
{
|
||||
mode: cfg.CSV,
|
||||
@@ -173,10 +173,10 @@ DURATION(2): 33d12h
|
||||
numberize: true,
|
||||
desc: false,
|
||||
expect: `
|
||||
NAME(1) DURATION(2) COUNT(3) WHEN(4)
|
||||
ceta 33d12h 9 06/Jan/2008 15:04:05 -0700
|
||||
beta 1d10h5m1s 33 3/1/2014
|
||||
alpha 4h35m 170 2013-Feb-03`,
|
||||
NAME(1) DURATION(2) COUNT(3) WHEN(4)
|
||||
ceta 33d12h 9 06/Jan/2008 15:04:05 -0700
|
||||
beta 1d10h5m1s 33 3/1/2014
|
||||
alpha 4h35m 170 2013-Feb-03`,
|
||||
},
|
||||
{
|
||||
name: "sortbycolumn4",
|
||||
@@ -185,10 +185,10 @@ alpha 4h35m 170 2013-Feb-03`,
|
||||
desc: false,
|
||||
numberize: true,
|
||||
expect: `
|
||||
NAME(1) DURATION(2) COUNT(3) WHEN(4)
|
||||
ceta 33d12h 9 06/Jan/2008 15:04:05 -0700
|
||||
alpha 4h35m 170 2013-Feb-03
|
||||
beta 1d10h5m1s 33 3/1/2014`,
|
||||
NAME(1) DURATION(2) COUNT(3) WHEN(4)
|
||||
ceta 33d12h 9 06/Jan/2008 15:04:05 -0700
|
||||
alpha 4h35m 170 2013-Feb-03
|
||||
beta 1d10h5m1s 33 3/1/2014`,
|
||||
},
|
||||
{
|
||||
name: "sortbycolumn2",
|
||||
@@ -197,10 +197,10 @@ beta 1d10h5m1s 33 3/1/2014`,
|
||||
numberize: true,
|
||||
desc: false,
|
||||
expect: `
|
||||
NAME(1) DURATION(2) COUNT(3) WHEN(4)
|
||||
alpha 4h35m 170 2013-Feb-03
|
||||
beta 1d10h5m1s 33 3/1/2014
|
||||
ceta 33d12h 9 06/Jan/2008 15:04:05 -0700`,
|
||||
NAME(1) DURATION(2) COUNT(3) WHEN(4)
|
||||
alpha 4h35m 170 2013-Feb-03
|
||||
beta 1d10h5m1s 33 3/1/2014
|
||||
ceta 33d12h 9 06/Jan/2008 15:04:05 -0700`,
|
||||
},
|
||||
|
||||
// ----------------------- UseColumns Tests
|
||||
@@ -210,13 +210,13 @@ ceta 33d12h 9 06/Jan/2008 15:04:05 -0700`,
|
||||
numberize: true,
|
||||
usecolstr: "1,4",
|
||||
expect: `
|
||||
NAME(1) WHEN(4)
|
||||
beta 3/1/2014
|
||||
alpha 2013-Feb-03
|
||||
ceta 06/Jan/2008 15:04:05 -0700`,
|
||||
NAME(1) WHEN(4)
|
||||
beta 3/1/2014
|
||||
alpha 2013-Feb-03
|
||||
ceta 06/Jan/2008 15:04:05 -0700`,
|
||||
},
|
||||
{
|
||||
name: "usecolumns",
|
||||
name: "usecolumns2",
|
||||
usecol: []int{2},
|
||||
numberize: true,
|
||||
usecolstr: "2",
|
||||
@@ -227,7 +227,7 @@ DURATION(2)
|
||||
33d12h`,
|
||||
},
|
||||
{
|
||||
name: "usecolumns",
|
||||
name: "usecolumns3",
|
||||
usecol: []int{3},
|
||||
numberize: true,
|
||||
usecolstr: "3",
|
||||
@@ -238,16 +238,16 @@ COUNT(3)
|
||||
9`,
|
||||
},
|
||||
{
|
||||
name: "usecolumns",
|
||||
name: "usecolumns4",
|
||||
column: 0,
|
||||
usecol: []int{1, 3},
|
||||
numberize: true,
|
||||
usecolstr: "1,3",
|
||||
expect: `
|
||||
NAME(1) COUNT(3)
|
||||
beta 33
|
||||
alpha 170
|
||||
ceta 9`,
|
||||
NAME(1) COUNT(3)
|
||||
beta 33
|
||||
alpha 170
|
||||
ceta 9`,
|
||||
},
|
||||
{
|
||||
name: "usecolumns",
|
||||
@@ -255,10 +255,10 @@ ceta 9`,
|
||||
numberize: true,
|
||||
usecolstr: "2,4",
|
||||
expect: `
|
||||
DURATION(2) WHEN(4)
|
||||
1d10h5m1s 3/1/2014
|
||||
4h35m 2013-Feb-03
|
||||
33d12h 06/Jan/2008 15:04:05 -0700`,
|
||||
DURATION(2) WHEN(4)
|
||||
1d10h5m1s 3/1/2014
|
||||
4h35m 2013-Feb-03
|
||||
33d12h 06/Jan/2008 15:04:05 -0700`,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -304,7 +304,8 @@ func TestPrinter(t *testing.T) {
|
||||
|
||||
if got != exp {
|
||||
t.Errorf("not rendered correctly:\n+++ got:\n%s\n+++ want:\n%s",
|
||||
got, exp)
|
||||
strings.ReplaceAll(got, " ", "_"),
|
||||
strings.ReplaceAll(exp, " ", "_"))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -25,11 +25,18 @@ import (
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
"github.com/charmbracelet/lipgloss"
|
||||
"github.com/evertras/bubble-table/table"
|
||||
"github.com/mattn/go-isatty"
|
||||
"github.com/tlinden/tablizer/cfg"
|
||||
)
|
||||
|
||||
type FilterTable struct {
|
||||
Table table.Model
|
||||
// The context exists outside of the bubble loop, and is being used as
|
||||
// pointer reciever. That way we can use it as our primary storage
|
||||
// container.
|
||||
type Context struct {
|
||||
selectedColumn int
|
||||
showHelp bool
|
||||
descending bool
|
||||
data *Tabdata
|
||||
|
||||
// Window dimensions
|
||||
totalWidth int
|
||||
@@ -38,23 +45,53 @@ type FilterTable struct {
|
||||
// Table dimensions
|
||||
horizontalMargin int
|
||||
verticalMargin int
|
||||
}
|
||||
|
||||
// Execute tablizer sort function, feed it with fresh config, we do
|
||||
// NOT use the existing runtime config, because sorting is
|
||||
// configurable in the UI separately.
|
||||
func (ctx *Context) Sort(mode string) {
|
||||
conf := cfg.Config{
|
||||
SortMode: mode,
|
||||
SortDescending: ctx.descending,
|
||||
UseSortByColumn: []int{ctx.selectedColumn + 1},
|
||||
}
|
||||
|
||||
ctx.descending = !ctx.descending
|
||||
|
||||
sortTable(conf, ctx.data)
|
||||
}
|
||||
|
||||
// The actual table model, holds the context pointer, a copy of the
|
||||
// pre-processed data and some flags
|
||||
type FilterTable struct {
|
||||
Table table.Model
|
||||
|
||||
Rows int
|
||||
|
||||
quitting bool
|
||||
unchanged bool
|
||||
|
||||
maxColumns int
|
||||
headerIdx map[string]int
|
||||
|
||||
ctx *Context
|
||||
|
||||
columns []table.Column
|
||||
}
|
||||
|
||||
type HelpLine []string
|
||||
type HelpColumn []HelpLine
|
||||
|
||||
const (
|
||||
// Add a fixed margin to account for description & instructions
|
||||
fixedVerticalMargin = 0
|
||||
// header+footer
|
||||
ExtraRows = 5
|
||||
|
||||
ExtraRows = 8
|
||||
|
||||
HELP = "/:filter esc:clear-filter q:commit c-c:abort space:select a:select-all | "
|
||||
HelpFooter = "?:help | "
|
||||
)
|
||||
|
||||
var (
|
||||
// we use our own custom border style
|
||||
customBorder = table.Border{
|
||||
Top: "─",
|
||||
Left: "│",
|
||||
@@ -74,16 +111,103 @@ var (
|
||||
|
||||
InnerDivider: "│",
|
||||
}
|
||||
|
||||
// Cells in selected columns will be highlighted
|
||||
StyleSelected = lipgloss.NewStyle().
|
||||
Background(lipgloss.Color("#696969")).
|
||||
Foreground(lipgloss.Color("#ffffff")).
|
||||
Align(lipgloss.Left)
|
||||
|
||||
StyleHeader = lipgloss.NewStyle().
|
||||
Foreground(lipgloss.Color("#ff4500")).
|
||||
Align(lipgloss.Left).Bold(true)
|
||||
|
||||
// help buffer styles
|
||||
StyleKey = lipgloss.NewStyle().Bold(true)
|
||||
StyleHelp = lipgloss.NewStyle().Foreground(lipgloss.Color("#ff4500"))
|
||||
|
||||
// the default style
|
||||
NoStyle = lipgloss.NewStyle().Align(lipgloss.Left)
|
||||
|
||||
HelpData = []HelpColumn{
|
||||
{
|
||||
HelpLine{"up", "navigate up"},
|
||||
HelpLine{"down", "navigate down"},
|
||||
HelpLine{"tab", "navigate columns"},
|
||||
},
|
||||
{
|
||||
HelpLine{"s", "sort alpha-numerically"},
|
||||
HelpLine{"n", "sort numerically"},
|
||||
HelpLine{"t", "sort by time"},
|
||||
HelpLine{"d", "sort by duration"},
|
||||
},
|
||||
{
|
||||
HelpLine{"spc", "[de]select a row"},
|
||||
HelpLine{"a", "[de]select all visible rows"},
|
||||
HelpLine{"f", "enter fuzzy filter"},
|
||||
HelpLine{"esc", "finish filter input"},
|
||||
},
|
||||
{
|
||||
HelpLine{"?", "show help buffer"},
|
||||
HelpLine{"q", "commit and quit"},
|
||||
HelpLine{"c-c", "discard and quit"},
|
||||
},
|
||||
}
|
||||
|
||||
// rendered from Help above
|
||||
Help = ""
|
||||
|
||||
// number of lines taken by help below, adjust accordingly!
|
||||
HelpRows = 0
|
||||
)
|
||||
|
||||
func NewModel(data *Tabdata) FilterTable {
|
||||
// generate a lipgloss styled help buffer consisting of various
|
||||
// columns
|
||||
func generateHelp() {
|
||||
help := strings.Builder{}
|
||||
helpcols := []string{}
|
||||
maxrows := 0
|
||||
|
||||
for _, col := range HelpData {
|
||||
help.Reset()
|
||||
|
||||
// determine max key width to avoid excess spaces between keys and help
|
||||
keylen := 0
|
||||
for _, line := range col {
|
||||
if len(line[0]) > keylen {
|
||||
keylen = len(line[0])
|
||||
}
|
||||
}
|
||||
|
||||
keylenstr := fmt.Sprintf("%d", keylen)
|
||||
|
||||
for _, line := range col {
|
||||
// 0: key, 1: help text
|
||||
help.WriteString(StyleKey.Render(fmt.Sprintf("%-"+keylenstr+"s", line[0])))
|
||||
help.WriteString(" " + StyleHelp.Render(line[1]) + " \n")
|
||||
}
|
||||
|
||||
helpcols = append(helpcols, help.String())
|
||||
|
||||
if len(col) > maxrows {
|
||||
maxrows = len(col)
|
||||
}
|
||||
}
|
||||
|
||||
HelpRows = maxrows + 1
|
||||
Help = "\n" + lipgloss.JoinHorizontal(lipgloss.Top, helpcols...)
|
||||
}
|
||||
|
||||
// initializes the table model
|
||||
func NewModel(data *Tabdata, ctx *Context) FilterTable {
|
||||
columns := make([]table.Column, len(data.headers))
|
||||
rows := make([]table.Row, len(data.entries))
|
||||
lengths := make([]int, len(data.headers))
|
||||
hidx := make(map[string]int, len(data.headers))
|
||||
|
||||
// give columns at least the header width
|
||||
for idx, header := range data.headers {
|
||||
lengths[idx] = len(header)
|
||||
hidx[strings.ToLower(header)] = idx
|
||||
}
|
||||
|
||||
// determine max width per column
|
||||
@@ -95,45 +219,53 @@ func NewModel(data *Tabdata) FilterTable {
|
||||
}
|
||||
}
|
||||
|
||||
// setup column data
|
||||
for idx, header := range data.headers {
|
||||
columns[idx] = table.NewColumn(strings.ToLower(header), header, lengths[idx]+2).
|
||||
WithFiltered(true)
|
||||
}
|
||||
|
||||
// setup table data
|
||||
for idx, entry := range data.entries {
|
||||
rowdata := make(table.RowData, len(entry))
|
||||
|
||||
for i, cell := range entry {
|
||||
rowdata[strings.ToLower(data.headers[i])] = cell + " "
|
||||
// determine flexFactor with base 10, used by flexColumns
|
||||
for i, len := range lengths {
|
||||
if len <= 10 {
|
||||
lengths[i] = 1
|
||||
} else {
|
||||
lengths[i] = len / 10
|
||||
}
|
||||
|
||||
rows[idx] = table.NewRow(rowdata)
|
||||
}
|
||||
|
||||
keys := table.DefaultKeyMap()
|
||||
keys.RowDown.SetKeys("j", "down", "s")
|
||||
keys.RowUp.SetKeys("k", "up", "w")
|
||||
|
||||
// our final interactive table filled with our prepared data
|
||||
return FilterTable{
|
||||
Table: table.New(columns).
|
||||
WithRows(rows).
|
||||
WithKeyMap(keys).
|
||||
Filtered(true).
|
||||
Focused(true).
|
||||
SelectableRows(true).
|
||||
WithSelectedText(" ", "✓").
|
||||
WithFooterVisibility(true).
|
||||
WithHeaderVisibility(true).
|
||||
Border(customBorder),
|
||||
horizontalMargin: 10,
|
||||
Rows: len(data.entries),
|
||||
// setup column data with flexColumns
|
||||
for idx, header := range data.headers {
|
||||
columns[idx] = table.NewFlexColumn(
|
||||
strings.ToLower(header),
|
||||
StyleHeader.Render(header),
|
||||
lengths[idx]).WithFiltered(true).WithStyle(NoStyle)
|
||||
}
|
||||
|
||||
// separate variable so we can share the row filling code
|
||||
filtertbl := FilterTable{
|
||||
maxColumns: len(data.headers),
|
||||
Rows: len(data.entries),
|
||||
headerIdx: hidx,
|
||||
ctx: ctx,
|
||||
columns: columns,
|
||||
}
|
||||
|
||||
filtertbl.Table = table.New(columns)
|
||||
filtertbl.fillRows()
|
||||
|
||||
// finally construct help buffer
|
||||
generateHelp()
|
||||
|
||||
return filtertbl
|
||||
}
|
||||
|
||||
func (m FilterTable) ToggleSelected() {
|
||||
// Applied to every cell on every change (TAB,up,down key, resize
|
||||
// event etc)
|
||||
func CellController(input table.StyledCellFuncInput, m FilterTable) lipgloss.Style {
|
||||
if m.headerIdx[input.Column.Key()] == m.ctx.selectedColumn {
|
||||
return StyleSelected
|
||||
}
|
||||
|
||||
return NoStyle
|
||||
}
|
||||
|
||||
// Selects or deselects ALL rows
|
||||
func (m *FilterTable) ToggleAllSelected() {
|
||||
rows := m.Table.GetVisibleRows()
|
||||
selected := m.Table.SelectedRows()
|
||||
|
||||
@@ -150,10 +282,56 @@ func (m FilterTable) ToggleSelected() {
|
||||
m.Table.WithRows(rows)
|
||||
}
|
||||
|
||||
// ? pressed, display help message
|
||||
func (m FilterTable) ToggleHelp() {
|
||||
m.ctx.showHelp = !m.ctx.showHelp
|
||||
}
|
||||
|
||||
func (m FilterTable) Init() tea.Cmd {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Forward call to context sort
|
||||
func (m *FilterTable) Sort(mode string) {
|
||||
m.ctx.Sort(mode)
|
||||
m.fillRows()
|
||||
}
|
||||
|
||||
// Fills the table rows with our data. Called once on startup and
|
||||
// repeatedly if the user changes the sort order in some way
|
||||
func (m *FilterTable) fillRows() {
|
||||
// required to be able to feed the model to the controller
|
||||
controllerWrapper := func(input table.StyledCellFuncInput) lipgloss.Style {
|
||||
return CellController(input, *m)
|
||||
}
|
||||
|
||||
// fill the rows with style
|
||||
rows := make([]table.Row, len(m.ctx.data.entries))
|
||||
for idx, entry := range m.ctx.data.entries {
|
||||
rowdata := make(table.RowData, len(entry))
|
||||
|
||||
for i, cell := range entry {
|
||||
rowdata[strings.ToLower(m.ctx.data.headers[i])] =
|
||||
table.NewStyledCellWithStyleFunc(cell+" ", controllerWrapper)
|
||||
}
|
||||
|
||||
rows[idx] = table.NewRow(rowdata)
|
||||
}
|
||||
|
||||
m.Table = m.Table.
|
||||
WithRows(rows).
|
||||
Filtered(true).
|
||||
WithFuzzyFilter().
|
||||
Focused(true).
|
||||
SelectableRows(true).
|
||||
WithSelectedText(" ", "✓").
|
||||
WithFooterVisibility(true).
|
||||
WithHeaderVisibility(true).
|
||||
HighlightStyle(StyleSelected).
|
||||
Border(customBorder)
|
||||
}
|
||||
|
||||
// Part of the bubbletea event loop, called every tick
|
||||
func (m FilterTable) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
var (
|
||||
cmd tea.Cmd
|
||||
@@ -163,6 +341,8 @@ func (m FilterTable) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
m.Table, cmd = m.Table.Update(msg)
|
||||
cmds = append(cmds, cmd)
|
||||
|
||||
// If the user is about to enter filter text, do NOT respond to
|
||||
// key bindings, as they might be part of the filter!
|
||||
if !m.Table.GetIsFilterInputFocused() {
|
||||
switch msg := msg.(type) {
|
||||
case tea.KeyMsg:
|
||||
@@ -178,23 +358,48 @@ func (m FilterTable) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
cmds = append(cmds, tea.Quit)
|
||||
|
||||
case "a":
|
||||
m.ToggleSelected()
|
||||
}
|
||||
case tea.WindowSizeMsg:
|
||||
m.totalWidth = msg.Width
|
||||
m.totalHeight = msg.Height
|
||||
m.ToggleAllSelected()
|
||||
|
||||
m.recalculateTable()
|
||||
case "tab":
|
||||
m.SelectNextColumn()
|
||||
|
||||
case "?":
|
||||
m.ToggleHelp()
|
||||
m.recalculateTable()
|
||||
|
||||
case "s":
|
||||
m.Sort("alphanumeric")
|
||||
|
||||
case "n":
|
||||
m.Sort("numeric")
|
||||
|
||||
case "d":
|
||||
m.Sort("duration")
|
||||
|
||||
case "t":
|
||||
m.Sort("time")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Happens when the terminal window has been resized
|
||||
switch msg := msg.(type) {
|
||||
case tea.WindowSizeMsg:
|
||||
m.ctx.totalWidth = msg.Width
|
||||
m.ctx.totalHeight = msg.Height
|
||||
|
||||
m.recalculateTable()
|
||||
}
|
||||
|
||||
m.updateFooter()
|
||||
|
||||
return m, tea.Batch(cmds...)
|
||||
}
|
||||
|
||||
// Add some info to the footer
|
||||
func (m *FilterTable) updateFooter() {
|
||||
selected := m.Table.SelectedRows()
|
||||
footer := fmt.Sprintf("selected: %d", len(selected))
|
||||
footer := fmt.Sprintf("selected: %d ", len(selected))
|
||||
|
||||
if m.Table.GetIsFilterInputFocused() {
|
||||
footer = fmt.Sprintf("/%s %s", m.Table.GetCurrentFilter(), footer)
|
||||
@@ -202,9 +407,10 @@ func (m *FilterTable) updateFooter() {
|
||||
footer = fmt.Sprintf("Filter: %s %s", m.Table.GetCurrentFilter(), footer)
|
||||
}
|
||||
|
||||
m.Table = m.Table.WithStaticFooter(HELP + footer)
|
||||
m.Table = m.Table.WithStaticFooter(HelpFooter + footer)
|
||||
}
|
||||
|
||||
// Called on resize event (or if help has been toggled)
|
||||
func (m *FilterTable) recalculateTable() {
|
||||
m.Table = m.Table.
|
||||
WithTargetWidth(m.calculateWidth()).
|
||||
@@ -212,37 +418,76 @@ func (m *FilterTable) recalculateTable() {
|
||||
WithPageSize(m.calculateHeight() - ExtraRows)
|
||||
}
|
||||
|
||||
func (m FilterTable) calculateWidth() int {
|
||||
return m.totalWidth - m.horizontalMargin
|
||||
func (m *FilterTable) calculateWidth() int {
|
||||
return m.ctx.totalWidth - m.ctx.horizontalMargin
|
||||
}
|
||||
|
||||
func (m FilterTable) calculateHeight() int {
|
||||
if m.Rows+ExtraRows < m.totalHeight {
|
||||
// FIXME: avoid full screen somehow
|
||||
return m.Rows + ExtraRows
|
||||
// Take help height into account, if enabled
|
||||
func (m *FilterTable) calculateHeight() int {
|
||||
height := m.Rows + ExtraRows
|
||||
|
||||
if height >= m.ctx.totalHeight {
|
||||
height = m.ctx.totalHeight - m.ctx.verticalMargin
|
||||
} else {
|
||||
height = m.ctx.totalHeight
|
||||
}
|
||||
|
||||
return m.totalHeight - m.verticalMargin - fixedVerticalMargin
|
||||
if m.ctx.showHelp {
|
||||
height = height - HelpRows
|
||||
}
|
||||
|
||||
return height
|
||||
}
|
||||
|
||||
// Part of the bubbletable event view, called every tick
|
||||
func (m FilterTable) View() string {
|
||||
body := strings.Builder{}
|
||||
|
||||
if !m.quitting {
|
||||
body.WriteString(m.Table.View())
|
||||
|
||||
if m.ctx.showHelp {
|
||||
body.WriteString(Help)
|
||||
}
|
||||
}
|
||||
|
||||
return body.String()
|
||||
}
|
||||
|
||||
// User hit the TAB key
|
||||
func (m *FilterTable) SelectNextColumn() {
|
||||
if m.ctx.selectedColumn == m.maxColumns-1 {
|
||||
m.ctx.selectedColumn = 0
|
||||
} else {
|
||||
m.ctx.selectedColumn++
|
||||
}
|
||||
}
|
||||
|
||||
// entry point from outside tablizer into table editor
|
||||
func tableEditor(conf *cfg.Config, data *Tabdata) (*Tabdata, error) {
|
||||
// we render to STDERR to avoid dead lock when the user redirects STDOUT
|
||||
// see https://github.com/charmbracelet/bubbletea/issues/860
|
||||
lipgloss.SetDefaultRenderer(lipgloss.NewRenderer(os.Stderr))
|
||||
//
|
||||
// TODO: doesn't work with libgloss v2 anymore!
|
||||
|
||||
out := os.Stderr
|
||||
|
||||
if isatty.IsTerminal(os.Stdout.Fd()) {
|
||||
out = os.Stdout
|
||||
}
|
||||
|
||||
lipgloss.SetDefaultRenderer(lipgloss.NewRenderer(out))
|
||||
|
||||
ctx := &Context{data: data}
|
||||
|
||||
// Output to STDERR because there's a known bubbletea/lipgloss
|
||||
// issue: if a program with a tui is expected to write something
|
||||
// to STDOUT when the tui is finished, then the styles do not
|
||||
// work. So we write to STDERR (which works) and tablizer can
|
||||
// still be used inside pipes.
|
||||
program := tea.NewProgram(
|
||||
NewModel(data),
|
||||
tea.WithOutput(os.Stderr),
|
||||
NewModel(data, ctx),
|
||||
tea.WithOutput(out),
|
||||
tea.WithAltScreen())
|
||||
|
||||
m, err := program.Run()
|
||||
@@ -255,13 +500,21 @@ func tableEditor(conf *cfg.Config, data *Tabdata) (*Tabdata, error) {
|
||||
return data, err
|
||||
}
|
||||
|
||||
table := m.(FilterTable).Table
|
||||
data.entries = make([][]string, len(table.SelectedRows()))
|
||||
// Data has been modified. Extract it, put it back into our own
|
||||
// structure and give control back to cmdline tablizer.
|
||||
filteredtable := m.(FilterTable)
|
||||
|
||||
data.entries = make([][]string, len(filteredtable.Table.SelectedRows()))
|
||||
for pos, row := range m.(FilterTable).Table.SelectedRows() {
|
||||
entry := make([]string, len(data.headers))
|
||||
for idx, field := range data.headers {
|
||||
entry[idx] = row.Data[strings.ToLower(field)].(string)
|
||||
cell := row.Data[strings.ToLower(field)]
|
||||
switch value := cell.(type) {
|
||||
case string:
|
||||
entry[idx] = value
|
||||
case table.StyledCell:
|
||||
entry[idx] = value.Data.(string)
|
||||
}
|
||||
}
|
||||
|
||||
data.entries[pos] = entry
|
||||
|
||||
17
tablizer.1
17
tablizer.1
@@ -133,7 +133,7 @@
|
||||
.\" ========================================================================
|
||||
.\"
|
||||
.IX Title "TABLIZER 1"
|
||||
.TH TABLIZER 1 "2025-08-28" "1" "User Commands"
|
||||
.TH TABLIZER 1 "2025-09-11" "1" "User Commands"
|
||||
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
|
||||
.\" way too many mistakes in technical documents.
|
||||
.if n .ad l
|
||||
@@ -144,7 +144,7 @@ tablizer \- Manipulate tabular output of other programs
|
||||
.IX Header "SYNOPSIS"
|
||||
.Vb 2
|
||||
\& Usage:
|
||||
\& tablizer [regex,...] [file, ...] [flags]
|
||||
\& tablizer [regex,...] [\-r file] [flags]
|
||||
\&
|
||||
\& Operational Flags:
|
||||
\& \-c, \-\-columns string Only show the speficied columns (separated by ,)
|
||||
@@ -179,12 +179,13 @@ tablizer \- Manipulate tabular output of other programs
|
||||
\& \-t, \-\-sort\-time sort according to time string
|
||||
\&
|
||||
\& Other Flags:
|
||||
\& \-\-completion <shell> Generate the autocompletion script for <shell>
|
||||
\& \-f, \-\-config <file> Configuration file (default: ~/.config/tablizer/config)
|
||||
\& \-d, \-\-debug Enable debugging
|
||||
\& \-h, \-\-help help for tablizer
|
||||
\& \-m, \-\-man Display manual page
|
||||
\& \-V, \-\-version Print program version
|
||||
\& \-r \-\-read\-file <file> Use <file> as input instead of STDIN
|
||||
\& \-\-completion <shell> Generate the autocompletion script for <shell>
|
||||
\& \-f, \-\-config <file> Configuration file (default: ~/.config/tablizer/config)
|
||||
\& \-d, \-\-debug Enable debugging
|
||||
\& \-h, \-\-help help for tablizer
|
||||
\& \-m, \-\-man Display manual page
|
||||
\& \-V, \-\-version Print program version
|
||||
.Ve
|
||||
.SH "DESCRIPTION"
|
||||
.IX Header "DESCRIPTION"
|
||||
|
||||
15
tablizer.pod
15
tablizer.pod
@@ -5,7 +5,7 @@ tablizer - Manipulate tabular output of other programs
|
||||
=head1 SYNOPSIS
|
||||
|
||||
Usage:
|
||||
tablizer [regex,...] [file, ...] [flags]
|
||||
tablizer [regex,...] [-r file] [flags]
|
||||
|
||||
Operational Flags:
|
||||
-c, --columns string Only show the speficied columns (separated by ,)
|
||||
@@ -40,12 +40,13 @@ tablizer - Manipulate tabular output of other programs
|
||||
-t, --sort-time sort according to time string
|
||||
|
||||
Other Flags:
|
||||
--completion <shell> Generate the autocompletion script for <shell>
|
||||
-f, --config <file> Configuration file (default: ~/.config/tablizer/config)
|
||||
-d, --debug Enable debugging
|
||||
-h, --help help for tablizer
|
||||
-m, --man Display manual page
|
||||
-V, --version Print program version
|
||||
-r --read-file <file> Use <file> as input instead of STDIN
|
||||
--completion <shell> Generate the autocompletion script for <shell>
|
||||
-f, --config <file> Configuration file (default: ~/.config/tablizer/config)
|
||||
-d, --debug Enable debugging
|
||||
-h, --help help for tablizer
|
||||
-m, --man Display manual page
|
||||
-V, --version Print program version
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
15
vhsdemo/Makefile
Normal file
15
vhsdemo/Makefile
Normal file
@@ -0,0 +1,15 @@
|
||||
.PHONY: demo check clean-demo
|
||||
|
||||
VHS = vhs
|
||||
|
||||
clean-demo:
|
||||
|
||||
%.gif: %.tape
|
||||
@echo "vhs $<"
|
||||
env PATH=..:$(PATH) vhs $<
|
||||
|
||||
check:
|
||||
ls -l ../tablizer
|
||||
|
||||
demo: check clean-demo demo.gif
|
||||
|
||||
BIN
vhsdemo/demo.gif
Normal file
BIN
vhsdemo/demo.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.1 MiB |
157
vhsdemo/demo.tape
Normal file
157
vhsdemo/demo.tape
Normal file
@@ -0,0 +1,157 @@
|
||||
# -*-sh-*-
|
||||
|
||||
Output demo.gif
|
||||
Set FontSize 20
|
||||
Set Width 1200
|
||||
Set Height 1000
|
||||
Set Theme { "name": "Whimsy", "black": "#535178", "red": "#ef6487", "green": "#5eca89", "yellow": "#fdd877", "blue": "#65aef7", "magenta": "#aa7ff0", "cyan": "#43c1be", "white": "#ffffff", "brightBlack": "#535178", "brightRed": "#ef6487", "brightGreen": "#5eca89", "brightYellow": "#fdd877", "brightBlue": "#65aef7", "brightMagenta": "#aa7ff0", "brightCyan": "#43c1be", "brightWhite": "#ffffff", "background": "#29283b", "foreground": "#b3b0d6", "selection": "#3d3c58", "cursor": "#b3b0d6" }
|
||||
Set WindowBar Colorful
|
||||
Set BorderRadius 10
|
||||
Set Shell zsh
|
||||
Set FontFamily "IBM Plex Mono"
|
||||
Set CursorBlink false
|
||||
Set PlaybackSpeed 1
|
||||
Set TypingSpeed .05
|
||||
|
||||
# initialize
|
||||
Hide
|
||||
Type `PROMPT=''`
|
||||
Enter
|
||||
Type "setopt interactivecomments"
|
||||
Enter
|
||||
Type "autoload -U colors && colors"
|
||||
Enter
|
||||
Type `PS1="%{$fg[magenta]%}demo> %{$reset_color%}"`
|
||||
Enter
|
||||
Type "clear"
|
||||
Enter
|
||||
Show
|
||||
|
||||
Type "# Our input data"
|
||||
Enter
|
||||
Sleep 1s
|
||||
Type "cat input | head -10"
|
||||
Enter
|
||||
Sleep 2s
|
||||
|
||||
Enter
|
||||
Type "# Filter over all rows"
|
||||
Enter
|
||||
Sleep 1s
|
||||
Type "tablizer Central < input"
|
||||
Enter
|
||||
Sleep 2s
|
||||
|
||||
Enter
|
||||
Type "# Filter over all rows case insensitive"
|
||||
Enter
|
||||
Sleep 1s
|
||||
Type "tablizer '/penc/i' < input"
|
||||
Enter
|
||||
Sleep 2s
|
||||
|
||||
Enter
|
||||
Type "# Filter over specific column"
|
||||
Enter
|
||||
Sleep 1s
|
||||
Type "tablizer -Fcost=4.99 < input"
|
||||
Enter
|
||||
Sleep 2s
|
||||
|
||||
Enter
|
||||
Type "# Filter by regex on specific column"
|
||||
Enter
|
||||
Sleep 1s
|
||||
Type "tablizer -Funits=Pen. < input"
|
||||
Enter
|
||||
Sleep 2s
|
||||
|
||||
Enter
|
||||
Type "# Output as markdown"
|
||||
Enter
|
||||
Sleep 1s
|
||||
Type "tablizer -Funits=Pen. -M < input"
|
||||
Enter
|
||||
Sleep 2s
|
||||
|
||||
Enter
|
||||
Type "# Output as CSV"
|
||||
Enter
|
||||
Sleep 1s
|
||||
Type "tablizer -Funits=Pen. -C < input"
|
||||
Enter
|
||||
Sleep 2s
|
||||
|
||||
Enter
|
||||
Type "# Output as shell evaluable"
|
||||
Enter
|
||||
Sleep 1s
|
||||
Type "tablizer -Funits=Pen. -S < input"
|
||||
Enter
|
||||
Sleep 2s
|
||||
Type "bat eval.sh"
|
||||
Enter
|
||||
Sleep 2s
|
||||
Type "tablizer -Funits=Pen. -S < input | ./eval.sh"
|
||||
Enter
|
||||
Sleep 2s
|
||||
|
||||
Enter
|
||||
Type "# Reduce columns"
|
||||
Enter
|
||||
Sleep 1s
|
||||
Type "tablizer -Funits=Pen. -c region,customer,units,count < input"
|
||||
Enter
|
||||
Sleep 2s
|
||||
|
||||
Enter
|
||||
Type "# Sort by COUNT column numerically "
|
||||
Enter
|
||||
Sleep 1s
|
||||
Type "tablizer -Funits=Pen. -c region,customer,units,count -kcount -i < input"
|
||||
Enter
|
||||
Sleep 2s
|
||||
|
||||
Enter
|
||||
Type "# Do further filtering interactively"
|
||||
Enter
|
||||
Sleep 1s
|
||||
Type "tablizer -Funits=Pen. -c region,customer,units,count -I -O < input"
|
||||
Enter
|
||||
Sleep 2s
|
||||
Type "?"
|
||||
Sleep 2s
|
||||
Type "/"
|
||||
Sleep 2s
|
||||
Type "J"
|
||||
Sleep 1s
|
||||
Type "o"
|
||||
Sleep 1s
|
||||
Type "n"
|
||||
Sleep 1s
|
||||
Type "e"
|
||||
Sleep 1s
|
||||
Type "s"
|
||||
Sleep 1s
|
||||
Enter
|
||||
Sleep 2s
|
||||
Tab
|
||||
Sleep 1s
|
||||
Tab
|
||||
Sleep 1s
|
||||
Tab
|
||||
Sleep 1s
|
||||
Tab
|
||||
Type "n"
|
||||
Sleep 2s
|
||||
Space
|
||||
Sleep 1s
|
||||
Down
|
||||
Sleep 1s
|
||||
Down
|
||||
Sleep 1s
|
||||
Space
|
||||
Sleep 2s
|
||||
Type "q"
|
||||
|
||||
Sleep 10s
|
||||
5
vhsdemo/eval.sh
Executable file
5
vhsdemo/eval.sh
Executable file
@@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
while read LINE; do
|
||||
eval "$LINE"; echo "$Customer ordered $Count ${Units}s"
|
||||
done
|
||||
44
vhsdemo/input
Normal file
44
vhsdemo/input
Normal file
@@ -0,0 +1,44 @@
|
||||
Date Region Customer Units Count Cost Total
|
||||
2016-01-06 East Jones Pencil 95 1.99 189.05
|
||||
2016-01-23 Central Kivell Binder 50 19.99 999.50
|
||||
2016-02-09 Central Jardine Pencil 36 4.99 179.64
|
||||
2016-02-26 Central Gill Pen 27 19.99 539.73
|
||||
2016-03-15 West Sorvino Pencil 56 2.99 167.44
|
||||
2016-04-01 East Jones Binder 60 4.99 299.40
|
||||
2016-04-18 Central Andrews Pencil 75 1.99 149.25
|
||||
2016-05-05 Central Jardine Pencil 90 4.99 449.10
|
||||
2016-05-22 West Thompson Pencil 32 1.99 63.68
|
||||
2016-06-08 East Jones Binder 60 8.99 539.40
|
||||
2016-06-25 Central Morgan Pencil 90 4.99 449.10
|
||||
2016-07-12 East Howard Binder 29 1.99 57.71
|
||||
2016-07-29 East Parent Binder 81 19.99 1619.19
|
||||
2016-08-15 East Jones Pencil 35 4.99 174.65
|
||||
2016-09-01 Central Smith Desk 2 125.00 250.00
|
||||
2016-09-18 East Jones Pen Set 16 15.99 255.84
|
||||
2016-10-05 Central Morgan Binder 28 8.99 251.72
|
||||
2016-10-22 East Jones Pen 64 8.99 575.36
|
||||
2016-11-08 East Parent Pen 15 19.99 299.85
|
||||
2016-11-25 Central Kivell Pen Set 96 4.99 479.04
|
||||
2016-12-12 Central Smith Pencil 67 1.29 86.43
|
||||
2016-12-29 East Parent Pen Set 74 15.99 1183.26
|
||||
2017-01-15 Central Gill Binder 46 8.99 413.54
|
||||
2017-02-01 Central Smith Binder 87 15.00 1305.00
|
||||
2017-02-18 East Jones Binder 4 4.99 19.96
|
||||
2017-03-07 West Sorvino Binder 7 19.99 139.93
|
||||
2017-03-24 Central Jardine Pen Set 50 4.99 249.50
|
||||
2017-04-10 Central Andrews Pencil 66 1.99 131.34
|
||||
2017-04-27 East Howard Pen 96 4.99 479.04
|
||||
2017-05-14 Central Gill Pencil 53 1.29 68.37
|
||||
2017-05-31 Central Gill Binder 80 8.99 719.20
|
||||
2017-06-17 Central Kivell Desk 5 125.00 625.00
|
||||
2017-07-04 East Jones Pen Set 62 4.99 309.38
|
||||
2017-07-21 Central Morgan Pen Set 55 12.49 686.95
|
||||
2017-08-07 Central Kivell Pen Set 42 23.95 1005.90
|
||||
2017-08-24 West Sorvino Desk 3 275.00 825.00
|
||||
2017-09-10 Central Gill Pencil 7 1.29 9.03
|
||||
2017-09-27 West Sorvino Pen 76 1.99 151.24
|
||||
2017-10-14 West Thompson Binder 57 19.99 1139.43
|
||||
2017-10-31 Central Andrews Pencil 14 1.29 18.06
|
||||
2017-11-17 Central Jardine Binder 11 4.99 54.89
|
||||
2017-12-04 Central Jardine Binder 94 19.99 1879.06
|
||||
2017-12-21 Central Andrews Binder 28 4.99 139.72
|
||||
Reference in New Issue
Block a user