灰常牛逼的命令行
备忘录 [navi
]
命令行
是非常高效的工具,但一个很常见的现象是,很多命令行过一段时间就容易忘。举个栗子,如果我们常用git
命令行管理代码、利用conda
命令管理开发环境,如果过一段时间没用了,那么你还记得如何用 git 将本地代码同步到 GitHub,还记得如何用conda
命令删除一个本地环境吗?
当然,我们可以在网上搜索一下,也能快速找到答案,但总之还是挺不方便的。我们常见的做法是,将容易忘记的命令行写到笔记中去,忘了再查就是。但现在,有一个新的开源项目navi
,它提供了一个交互式的备忘录。
看看下面的动图,可以说,不用做笔记、不用查History
,我们再也不用担心忘记命令行了。
Last login: Mon Sep 23 14:11:30 on console
192:~ yebinghe$ brew install denisidoro/tools/navi
==> Tapping denisidoro/tools
Cloning into '/usr/local/Homebrew/Library/Taps/denisidoro/homebrew-tools'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
Tapped 1 formula (27 files, 23.9KB).
==> Installing navi from denisidoro/tools
==> Installing dependencies for denisidoro/tools/navi: fzf
==> Installing denisidoro/tools/navi dependency: fzf
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/bottles/fzf-0.18.0.
######################################################################## 100.0%
==> Pouring fzf-0.18.0.mojave.bottle.tar.gz
==> Caveats
To install useful keybindings and fuzzy completion:
/usr/local/opt/fzf/install
To use fzf in Vim, add the following line to your .vimrc:
set rtp+=/usr/local/opt/fzf
==> Summary
🍺 /usr/local/Cellar/fzf/0.18.0: 17 files, 3.6MB
==> Installing denisidoro/tools/navi
==> Downloading https://github.com/denisidoro/navi/archive/v0.8.1.tar.gz
==> Downloading from https://codeload.github.com/denisidoro/navi/tar.gz/v0.8.1
######################################################################## 100.0%
🍺 /usr/local/Cellar/navi/0.8.1: 33 files, 60.2KB, built in 5 seconds
==> Caveats
==> fzf
To install useful keybindings and fuzzy completion:
/usr/local/opt/fzf/install
To use fzf in Vim, add the following line to your .vimrc:
set rtp+=/usr/local/opt/fzf
执行navi git
192:~ yebinghe$ navi git
┌────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ git add <filename> │
└────────────────────────────────────────────────────────────────────────────────────────────────────┘
git rebase master -S -f [git]
# Sign all commits in a branch based on master [git]
git clean -dxf [git]
# Clear everything [git]
git log --all --decorate --oneline --graph [git]
# Displays formatted log of commits for a repo [git]
git log [git]
# Displays log of commits for a repo [git]
git merge <branch_name> [git]
# Merges changes on one branch into current branch [git]
git pull --ff-only [git]
# Pulls changes to a remote repo to the local repo [git]
git push <remote_name> <branch_name> -f [git]
# Overwrites remote branch with local branch changes [git]
git push <remote_name> <branch>:<branch_to_overwrite> [git]
# Pushes changes to a remote repository overwriting another branch [git]
git push -u <remote_name> <branch_name> [git]
# Pushes committed changes to remote repository [git]
git commit -m <message> [git]
# Saves the changes to a file in a commit [git]
git add . [git]
# Stages all changed files for commit [git]
git add <filename> [git]
> # Stages a changed file for commit [git]
git diff <filename> [git]
# Displays the changes made to a file [git]
git status [git]
# Displays the current status of a git repository [git]
git checkout <branch> [git]
# Change branch [git]
# Checkout to branch [git]
git remote add <remote_name> <remote_url> [git]
# Adds a remote for a git repository [git]
git init [git]
# Initializes a git repository [git]
git config --global user.email <email> [git]
# Set global git user email [git]
git config --global user.name <name> [git]
# Set global git user name [git]
systemctl list-unit-files --type=service --state=disabled [systemctl, service]
# List disabled services [systemctl, service]
systemctl list-unit-files --type=service --state=enabled [systemctl, service]
# List enabled services [systemctl, service]
systemctl list-units --type=service --state=running [systemctl, service]
# List running services [systemctl, service]
systemctl status <service> [systemctl, service] ]
# Service status [systemctl, service]
systemctl reload <service_active> [systemctl, service]
# Reload service [systemctl, service] ]
systemctl restart <service> [systemctl, service]
# Restart service [systemctl, service]
systemctl disable <service_enabled> [systemctl, service]
> < 119/119
如上所示,navi
允许我们查阅所有的备忘录并执行对应的命令,值得注意的是,备忘录是实时匹配的,如果我键入 git
,那么差不多就剩下 git
相关的命令行。
项目地址
神奇的命令行备忘录:navi
机器之心也尝试了该工具,从安装到使用,总体感觉非常便捷。我们可以使用已有的命令行备忘录,也能自己导入以前常用的备忘录。我们可以配置可以直接运行的命令行,只需要手动加上参数就行;也可以写上备忘录注释,再手动键入命令行。
该项目表示,navi
的目标主要是:
通过给定关键字或文字描述,更便捷地查找命令;
如果作为长命令的辅助部分,查找后的结果也可以直接复制粘贴到主命令;
我们的命令行使用习惯或备忘录可以与其它人共享;
此外,该工具也能实现命令行的自动补全,不过这属于高级用法。
总体而言,它就是有助于命令行的整体应用。如下图所示,我们将几个 conda
命令也加到了备忘录中,键入命令行的时候就会显示自己去试试。
navi
该怎么用
我们是在 macOS
系统上测试的,可以便捷地使用 Homebrew 安装:brew install denisidoro/tools/navi。
其它系统估计满足环境也是可以的,如下是没有 Homebrew 时的安装方法:
git clone http://github.com/denisidoro/navi /opt/navicd /opt/navi
sudo make install
安装完成后,可以直接在命令行内键入navi
,从而进入到交互式备忘录界面。对于初始的navi
,它一共包含 9 个内置的备忘录,我们可以修改它们。
yuii.jpg进入后的交互式界面如下图所示,我们删除了一些不太用得上的默认备忘录。
自定义个备忘录
navi
很重要的功能是能自定义备忘录,我们可以仿照自带的备忘录写一个新的。该项目表示,我们可以用命令行传递.cheat
文件,从而达到添加的目的:
navi --dir "/folder/with/cheats"
也可以直接把我们的备忘录文件夹添加到Bash
环境中。机器之心做了更简单的一个操作,直接查找该工具的安装目录,然后手动删增备忘录,我们的发现这也是可以的。如果读者也使用 Homebrew 安装,那么在 usr/local/Cellar/navi
路径下就能找到默认备忘录。
当然,我们是要把以前的笔记做成.cheat
纯文本的,它的用法也不难,只不过要实现补全或带参数的命令,还是需要一些特殊的语法。如下是一个标准的.cheat
文件:
-
cheat
语法主要有以下几点:
以「%」
开头的行包含了特定的 Tag
,也就是说上图「git」
会作为标签加到该文件所有命令行最后;
以「#」
开头的行描述了该命令行的用法;
以「$」
开头的行应该为给定参数生成建议值;
其它所有非空行应该都为可执行命令行。
如下所示为有效的.cheat
文件:
% git, code
# Change branch
git checkout <branch>
$ branch: git branch | awk '{print $NF}'
最后,我们真的比较推荐这个新工具,用它来查备忘命令行实在是太方便了,那就去GitHub
star
去吧。
网友评论