{"id":28734681,"url":"https://github.com/rodmoioliveira/.dotfiles","last_synced_at":"2026-02-25T07:47:06.636Z","repository":{"id":215677645,"uuid":"739526031","full_name":"rodmoioliveira/.dotfiles","owner":"rodmoioliveira","description":"Here's my dotfiles collection.","archived":false,"fork":false,"pushed_at":"2025-08-01T12:39:57.000Z","size":164,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-03T22:48:05.593Z","etag":null,"topics":["dotfiles","dotfiles-setup"],"latest_commit_sha":null,"homepage":"https://rodmoioliveira.github.io/.dotfiles/","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rodmoioliveira.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-05T19:26:28.000Z","updated_at":"2025-08-01T12:40:01.000Z","dependencies_parsed_at":"2024-01-27T04:28:41.713Z","dependency_job_id":"206c6e13-6da4-4a01-9965-d8dca5b12a6e","html_url":"https://github.com/rodmoioliveira/.dotfiles","commit_stats":null,"previous_names":["rodmoioliveira/.dotfiles"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/rodmoioliveira/.dotfiles","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodmoioliveira%2F.dotfiles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodmoioliveira%2F.dotfiles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodmoioliveira%2F.dotfiles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodmoioliveira%2F.dotfiles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rodmoioliveira","download_url":"https://codeload.github.com/rodmoioliveira/.dotfiles/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rodmoioliveira%2F.dotfiles/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269906366,"owners_count":24494329,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-11T02:00:10.019Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dotfiles","dotfiles-setup"],"created_at":"2025-06-15T23:32:33.663Z","updated_at":"2026-02-25T07:47:01.601Z","avatar_url":"https://github.com/rodmoioliveira.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# .dotfiles\n\n# index\n\n- [Setup](#setup)\n- [Utilities](#utilities)\n  - [Command: b2c](#command-b2c)\n  - [Command: bfs](#command-bfs)\n  - [Command: dfs](#command-dfs)\n  - [Command: di](#command-di)\n  - [Command: git-basic](#command-git-basic)\n  - [Command: git-bump](#command-git-bump)\n  - [Command: git-deploy](#command-git-deploy)\n  - [Command: git-loc](#command-git-loc)\n  - [Command: git-release](#command-git-release)\n  - [Command: git-sync](#command-git-sync)\n  - [Command: j2b](#command-j2b)\n  - [Command: log-elapsed-time](#command-log-elapsed-time)\n  - [Command: lpath](#command-lpath)\n  - [Command: md-index](#command-md-index)\n  - [Command: t2b](#command-t2b)\n  - [Command: y2b](#command-y2b)\n- [Make Recipes](#make-recipes)\n- [How to Release](#how-to-release)\n\n# Setup\n\n[back^](#index)\n\nSetting up a new machine is [quite easy](https://drewdevault.com/2019/12/30/dotfiles.html).\nAfter the installation, run the following commands:\n\n```\ncd ~\ngit init\ngit remote add origin git@github.com:rodmoioliveira/.dotfiles.git\ngit fetch\ngit checkout -f main\n```\n\n# Utilities\n\n[back^](#index)\n\n## Command: b2c\n\n[back^](#index)\n\n```\nDisplay tab separated output in columns.\n\nUsage:\n  cat file.tab | b2c\n\nOptions:\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  bfs --file example.json | b2c\n```\n\n## Command: bfs\n\n[back^](#index)\n\n```\nFlatten json file with breadth-first search.\n\nUsage:\n  bfs [OPTIONS] --file \u003cFILE\u003e\n\nOptions:\n  -f, --file \u003cFILE\u003e\n          Path to a json file\n\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  bfs --file example.json\n```\n\n## Command: dfs\n\n[back^](#index)\n\n```\nFlatten json file with depth-first search.\n\nUsage:\n  dfs [OPTIONS] --file \u003cFILE\u003e\n\nOptions:\n  -f, --file \u003cFILE\u003e\n          Path to a json file\n\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  dfs --file example.json\n```\n\n## Command: di\n\n[back^](#index)\n\n```\nDisplay the interval between two dates.\n\nUsage:\n  di \u003cDATETIME:OLDER\u003e \u003cDATETIME:NEWER\u003e [OPTIONS]\n\nOptions:\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  di 2024-05-10T17:18:52Z 2024-05-17T17:18:52Z\n  di 1715361532 1715966332\n  di 2024-05-10T17:18:52Z 1715966332\n  di 1715361532 2024-05-17T17:18:52Z\n\nInputs:\n  2024-05-10T17:18:52Z 2024-05-17T17:18:52Z\n  1715361532 1715966332\n  2024-05-10T17:18:52Z 1715966332\n  1715361532 2024-05-17T17:18:52Z\n\nOutputs:\n  0 years, 7 days, 0 hours, 0 minutes and 0 seconds\n  0 years, 7 days, 0 hours, 0 minutes and 0 seconds\n  0 years, 7 days, 0 hours, 0 minutes and 0 seconds\n  0 years, 7 days, 0 hours, 0 minutes and 0 seconds\n```\n\n## Command: git-basic\n\n[back^](#index)\n\n```\nShows if your git repository has some basic files.\n\nUsage:\n  git-basic [OPTIONS]\n\nOptions:\n      --path \u003cPATH\u003e\n          Use to run as if git-basic was started in \u003cPATH\u003e instead of the\n          current working directory\n          [default: $(pwd)]\n\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  # Basic usage:\n  git-basic\n\n  # With pretty output\n  git-basic | b2c\n\n  # More fancy usage with [mlr](https://miller.readthedocs.io/):\n  find \"${HOME}/dir\" -regex '.*git$' -type d |\n    sed -E 's@/\\.git$@@g' |\n    xargs -n1 git-basic --path |\n    grep '^KEY' -v |\n    cut -f1,3 |\n    awk -v step=14 -v start=1 'line\u003cstep{print start\"\\t\"$0; line+=1} line==step{line=0;start+=1}' |\n    sed '1i n\\tkey\\tvalue' |\n    mlr --no-color --t2p reshape -s key,value |\n    sed -E '1 s/(.*)/\\U\\1/g'\n```\n\n## Command: git-bump\n\n[back^](#index)\n\n```\nBump the current tag version to the next version according to the SemVer spec.\n\nUsage:\n  git-bump [OPTIONS] --level \u003cRELEASE_LEVEL\u003e\n\nOptions:\n  -l, --level \u003cRELEASE_LEVEL\u003e\n          The release level to bump tag [possible values: patch, minor, major]\n\n  -m, --message \u003cMESSAGE\u003e\n          Optional tag message\n\n  -d, --dry-run\n          Prints the next version without committing anything\n\n  -h, --help\n          Print help information (use '-h' for a summary)\n\nExamples:\n  git-bump -l patch -m \"version %T\"\n  git-bump -l minor -d\n  git-bump -l major\n```\n\n## Command: git-deploy\n\n[back^](#index)\n\n```\nGenerate the deploy info to publish in the Slack channel.\n\nUsage:\n  git-deploy [OPTIONS]\n\nOptions:\n      --commit \u003cHASH\u003e\n          Use a specific commit to generate the deploy info\n\n      --path \u003cPATH\u003e\n          Use to run as if git-deploy was started in \u003cPATH\u003e instead of the\n          current working directory\n          [default: $(pwd)]\n\n      --since \u003cSTRING\u003e\n          Days to subtract from TODAY. Ex: --since '-5 days'\n\n      --slack \u003cURL\u003e\n          Slack channel URL to publish deploy info\n\n      --ci\n          Run script inside CI environment\n\n      --quiet\n          Don't print debug info\n\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  # Use '--path' to run as if git was started in \u003cPATH\u003e instead\n  # of the current working directory.\n  git-deploy --path ./your/repo\n\n  # Use '--commit' to use a specific commit to generate the deploy info\n  git-deploy --path ./your/repo --commit 775351a41b7f4ec455f7880647a497da6bae802e\n```\n\n## Command: git-loc\n\n[back^](#index)\n\n```\nPrints the number of lines of code added and deleted per commit.\n\nUsage:\n  git-loc [OPTIONS]\n\nOptions:\n      --path \u003cPATH\u003e\n          Use to run as if git-loc was started in \u003cPATH\u003e instead of the\n          current working directory\n          [default: $(pwd)]\n\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  # Inside a git directory run:\n  git-loc\n\n  # Use '--path' to run as if git-loc was started in \u003cPATH\u003e instead\n  # of the current working directory.\n  git-loc --path ./your/repo\n\nOutput:\n  git-loc | column -t\n\n  commits           loc-added  loc-deleted\n  0c3f5e3..3a787b9  180        0\n  8d51b23..0c3f5e3  16         0\n  5633537..8d51b23  62         33\n  d8df183..5633537  16         0\n  3ce044e..d8df183  4          4\n  ef78d95..3ce044e  16         0\n  abef142..ef78d95  124        23\n```\n\n## Command: git-release\n\n[back^](#index)\n\n```\nGenerate the release info to publish in the Slack channel.\n\nUsage:\n  git-release [OPTIONS]\n\nOptions:\n      --tail \u003cN_TAIL\u003e\n          Last \u003cN_TAIL\u003e tags from git repository (must be greater than 1)\n          [default: 2]\n\n      --head \u003cN_HEAD\u003e\n          First \u003cN_HEAD\u003e tags from the last \u003cN_TAIL\u003e tags (must be greater than 1)\n          [default: \u003cN_TAIL\u003e]\n\n      --path \u003cPATH\u003e\n          Use to run as if git-release was started in \u003cPATH\u003e instead of the\n          current working directory\n          [default: $(pwd)]\n\n      --since \u003cSTRING\u003e\n          Days to subtract from TODAY. Ex: --since '-5 days'\n\n      --slack \u003cURL\u003e\n          Slack channel URL to publish release info\n\n      --ci\n          Run script inside CI environment\n\n      --quiet\n          Don't print debug info\n\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  # Generate the latest release info for several repositories:\n  find . -maxdepth 1 -type d |\n    xargs -n1 git-release --path\n\n  # Use '--path' to run as if git-release was started in \u003cPATH\u003e instead\n  # of the current working directory.\n  git-release --path ./your/repo\n\n  # Generate the latest release info only if it was made today:\n  git-release --path ./your/repo --since '-1 day'\n\n  # Generate the release diff from TAG:latest-1..TAG:latest\n  cd ./your/repo; git-release\n\n  # Generate the release diff from TAG:latest-1..TAG:latest\n  git-release --path ./your/repo\n\n  # Generate the release diff from TAG:latest-5..TAG:latest\n  git-release --path ./your/repo --tail 6\n\n  # Generate the release diff from TAG:latest-5..TAG:latest-4\n  git-release --path ./your/repo --tail 6 --head 2\n```\n\n## Command: git-sync\n\n[back^](#index)\n\n```\nPull the changes from the remote default branch into the local default branch.\n\nUsage:\n  git-sync [OPTIONS]\n\nOptions:\n      --path \u003cPATH\u003e\n          Use to run as if git-sync was started in \u003cPATH\u003e instead of the\n          current working directory\n          [default: $(pwd)]\n\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  git-sync --path ./your/repo\n\n  # Synchronize with the latest changes in several repositories:\n  find . -maxdepth 1 -type d |\n    xargs -P10 -n1 git-sync --path\n```\n\n## Command: j2b\n\n[back^](#index)\n\n```\nConvert json to tab separated output.\n\nUsage:\n  j2b [OPTIONS] --file \u003cFILE\u003e\n\nOptions:\n  -f, --file \u003cFILE\u003e\n          Path to a json file\n\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  j2b --file example.json\n```\n\n## Command: log-elapsed-time\n\n[back^](#index)\n\n```\nDisplay elapsed time between operations in log file.\n\nUsage:\n  log-elapsed-time [OPTIONS]\n\nOptions:\n      --field-time \u003cJSON_KEY\u003e\n          JSON field containing a date [default: .time]\n\n      --field-key \u003cJSON_KEY\u003e\n          JSON field containing the value to be displayed [default: .msg]\n\n      --filter-regex \u003cREGEX\u003e\n          A REGEX pattern to filter messages within the log file\n\n      --log-file \u003cPATH\u003e\n          A path to a JSONL log file\n\n  -h, --help\n          Print help information (see a summary with '-h')\n\nInput:\n\n  % cat fruits.log\n\n    {\"registered\":\"2014-06-04T09:25:49\",\"favoriteFruit\":\"apple\"}\n    {\"registered\":\"2015-01-11T09:02:55\",\"favoriteFruit\":\"strawberry\"}\n    {\"registered\":\"2015-08-27T03:56:43\",\"favoriteFruit\":\"strawberry\"}\n    {\"registered\":\"2016-07-18T09:19:48\",\"favoriteFruit\":\"strawberry\"}\n    {\"registered\":\"2018-04-03T10:24:26\",\"favoriteFruit\":\"strawberry\"}\n    {\"registered\":\"2018-04-16T09:00:37\",\"favoriteFruit\":\"apple\"}\n    {\"registered\":\"2018-06-30T10:07:27\",\"favoriteFruit\":\"apple\"}\n    {\"registered\":\"2021-04-30T01:48:47\",\"favoriteFruit\":\"strawberry\"}\n    {\"registered\":\"2021-08-05T02:50:39\",\"favoriteFruit\":\"banana\"}\n    {\"registered\":\"2023-12-25T07:39:39\",\"favoriteFruit\":\"strawberry\"}\n\nExamples:\n\n  % log-elapsed-time --field-time=.registered --field-key=.favoriteFruit --log-file fruits.log\n\n    FIELD_KEY(.favoriteFruit)  FIELD_TIME(.registered)\n    -----                      -----\n    apple                      0 years, 0 days, 0 hours, 0 minutes and 0 seconds\n    strawberry                 0 years, 220 days, 22 hours, 37 minutes and 6 seconds\n    strawberry                 0 years, 227 days, 19 hours, 53 minutes and 48 seconds\n    strawberry                 0 years, 326 days, 5 hours, 23 minutes and 5 seconds\n    strawberry                 1 years, 259 days, 1 hours, 4 minutes and 38 seconds\n    apple                      0 years, 12 days, 22 hours, 36 minutes and 11 seconds\n    apple                      0 years, 75 days, 1 hours, 6 minutes and 50 seconds\n    strawberry                 2 years, 304 days, 15 hours, 41 minutes and 20 seconds\n    banana                     0 years, 97 days, 1 hours, 1 minutes and 52 seconds\n    strawberry                 2 years, 142 days, 4 hours, 49 minutes and 0 seconds\n    -----                      -----\n    TOTAL                      9 years, 205 days, 22 hours, 13 minutes and 50 seconds\n\n  % log-elapsed-time --field-time=.registered --field-key=.registered --log-file fruits.log\n\n    FIELD_KEY(.registered)  FIELD_TIME(.registered)\n    -----                   -----\n    2014-06-04T09:25:49     0 years, 0 days, 0 hours, 0 minutes and 0 seconds\n    2015-01-11T09:02:55     0 years, 220 days, 22 hours, 37 minutes and 6 seconds\n    2015-08-27T03:56:43     0 years, 227 days, 19 hours, 53 minutes and 48 seconds\n    2016-07-18T09:19:48     0 years, 326 days, 5 hours, 23 minutes and 5 seconds\n    2018-04-03T10:24:26     1 years, 259 days, 1 hours, 4 minutes and 38 seconds\n    2018-04-16T09:00:37     0 years, 12 days, 22 hours, 36 minutes and 11 seconds\n    2018-06-30T10:07:27     0 years, 75 days, 1 hours, 6 minutes and 50 seconds\n    2021-04-30T01:48:47     2 years, 304 days, 15 hours, 41 minutes and 20 seconds\n    2021-08-05T02:50:39     0 years, 97 days, 1 hours, 1 minutes and 52 seconds\n    2023-12-25T07:39:39     2 years, 142 days, 4 hours, 49 minutes and 0 seconds\n    -----                   -----\n    TOTAL                   9 years, 205 days, 22 hours, 13 minutes and 50 seconds\n\n  % log-elapsed-time --filter-regex=apple --field-time=.registered --field-key=.favoriteFruit --log-file fruits.log\n\n    FIELD_KEY(.favoriteFruit)  FIELD_TIME(.registered)\n    -----                      -----\n    apple                      0 years, 0 days, 0 hours, 0 minutes and 0 seconds\n    apple                      3 years, 316 days, 23 hours, 34 minutes and 48 seconds\n    apple                      0 years, 75 days, 1 hours, 6 minutes and 50 seconds\n    -----                      -----\n    TOTAL                      4 years, 27 days, 0 hours, 41 minutes and 38 seconds\n```\n\n## Command: lpath\n\n[back^](#index)\n\n```\nReplaces the current path with its last part within the text.\n\nUsage:\n  lpath [OPTIONS] \u003cTEXT\u003e\n\nOptions:\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  pwd | lpath\n```\n\n## Command: md-index\n\n[back^](#index)\n\n```\nCreate an index based on a markdown file.\n\nRule:\n  The index will include headings that start with a capital letter.\n\nUsage:\n  md-index [OPTIONS] --file \u003cFILE\u003e\n\nOptions:\n  -f, --file   \u003cFILE\u003e\n          Markdown file to generate index from\n\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  md-index --file README.md\n```\n\n## Command: t2b\n\n[back^](#index)\n\n```\nConvert toml to tab separated output.\n\nUsage:\n  t2b [OPTIONS] --file \u003cFILE\u003e\n\nOptions:\n  -f, --file \u003cFILE\u003e\n          Path to a toml file\n\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  t2b --file example.toml\n```\n\n## Command: y2b\n\n[back^](#index)\n\n```\nConvert yaml to tab separated output.\n\nUsage:\n  y2b [OPTIONS] --file \u003cFILE\u003e\n\nOptions:\n  -f, --file \u003cFILE\u003e\n          Path to a yaml file\n\n  -h, --help\n          Print help information (see a summary with '-h')\n\nExamples:\n  y2b --file example.yaml\n```\n\n# Make Recipes\n\n[back^](#index)\n\n```\nbash-all               Run all bash tests\nbash-check             Check format bash code\nbash-deps              Install bash dependencies\nbash-fmt               Format bash code\nbash-lint              Check lint bash code\ndoc-changelog          Write CHANGELOG.md\ndoc-readme             Write README.md\ndprint-check           Dprint check\ndprint-fmt             Dprint format\nhelp                   Display this help screen\nmakefile-descriptions  Check if all Makefile rules have descriptions\ntypos                  Check typos\ntypos-fix              Fix typos\n```\n\n# How to Release\n\n[back^](#index)\n\nTo generate a new version, you need to follow these steps:\n\n1. Run the command `git tag -a \u003cyour.new.version\u003e -m \"version \u003cyour.new.version\u003e\"`.\n2. Run the command `make doc-changelog \u0026\u0026 make doc-readme`.\n3. Run the command `git add -A \u0026\u0026 git commit -m \"release: \u003cyour.new.version\u003e\"`.\n4. Run `git push` to `main`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodmoioliveira%2F.dotfiles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frodmoioliveira%2F.dotfiles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frodmoioliveira%2F.dotfiles/lists"}