终端工具新手上路包

FINCTIVE 2021-03

本文遵循「懒人推荐」原则:花最少配置时间大幅度提升你的工作效率。想要更深入地学习各类工具的高级使用方法,请移步至具体程序的相应社区。

以下内容默认读者也在使用 Linux 系统,大部分程序在 macOS 下是大同小异的。

实用命令行程序

安装方式请查看相应文档,大部分都能在 Github 找到,也可以在系统的包管理器安装。

  • bpytop 系统资源监视器(这是我目前见过最漂亮的命令行工具!)

image-20210210221856811

  • ncdu 查看文件大小

image-20210210221725025

  • nload 网络监控工具

image-20210210222210916

  • ag 搜索工具

image-20210210224546888

  • fzf 模糊搜索工具,直接在命令行调用可以搜索文件名。可以和 rangervim 搭配使用。
  • ranger 具有 Vim 键位风格的终端文件管理器。下文仍有相关介绍。

image-20210210225023130

  • nnn 终端文件管理器,资源占用非常低。我在树莓派上使用 nnn.

  • proxychains-ng 以及 graftcp,连接命令行程序到代理服务器。

  • tldr 太长不看,懒人必备的文档查看工具。如果要看详细文档请使用man.

image-20210210230451003

命令行

基础

推荐阅读:命令行的艺术 ,比较长,你也可以通过视频来学习这些操作。

分享几个我常用的快捷键:

  • Tab 补全
  • 上下方向键 历史记录
  • Ctrl + A 光标移动到开头
  • Ctrl + E 光标移动到末尾
  • Ctrl + U 清除当前内容
  • Ctrl + F 光标往前移动
  • Ctrl + D 删除光标下的字符

fish

开箱即用不多说!

Fish shell 入门教程 - 阮一峰的网络日志

image-20210318181746263

亮点:

  • 新手友好
  • 功能强大且反应迅速
  • 出色的补全功能
  • 支持网页端配置

为了让 fish 在我打开终端的时候自动启动,我在 ~/.bashrc文件末尾加上了 exec fish

下拉终端

推荐使用 Guake. 我把快捷键 Win + Enter 绑定到了终端开关,非常顺手。

Vim

学习 Vim 的主要目的不是更快地输入代码,而是拥有一套工具能更贴合思维地操作。使用 Vim 时,很少会使用ctrl键和其他键配合,大部分时间只敲击一个键。

推荐阅读 [译] Vim 的蔓延 - 依云’s Blog

入门视频教程:Vim Tutorial - YouTube - Ben Awad

Vim 大量使用了Esc键。我把CapsLk键和Esc键的功能做了交换,否则无法获得流畅的体验。(我的配置方法 - Linux KDE )mac OS 可以通过系统设置修改。如果你使用的键盘有驱动配置程序,也许也可以通过设置交换按键。(我没有找到方便的 Windows 系统的修改方法,如果你恰好知道,欢迎分享。)

关于 Vim 的配置教程,推荐 Bilibili Up 主 TheCW

我不使用 Vim 开发程序,因为它的配置并不简单,需要大量时间学习,我更喜欢开箱即用。Jetbrains 系列 IDE 可以安装 ideavim 插件,目前支持的功能已经很多了,强烈推荐。ideavim 插件也可以把自定义的 Vim 快捷键绑定到 IDE 功能中,举个例子,我把代码格式化功能绑定到了 <leader>f

# ~/.ideavimrc
nnoremap <leader>f :action ReformatCode<CR>

具体配置方法:Executing IDE Actions

终端文件管理 Ranger

Ranger - Github

Ranger 是一款终端文件管理程序,拥有 Vim 风格的键位绑定(比如使用 hjkl 移动浏览)。在初学 Linux 命令行时,我认为 lscdmv这些命令的操作远远没有图形界面文件管理器方便。直到我开始使用 Ranger, 我才体会到终端操作的迅捷。

image-20210210225023130

关于 Ranger 的基本用法,请查看官方文档。

退出时切换工作目录

在退出 Ranger 时,工作目录并没有改变。使用以下别名启动 Ranger 可以实现这个功能,将下列内容加入到你使用的 shell 的启动配置中。(比如 .bashrc

# 退出 ranger 的时候,cd 到相应的目录
alias ra='ranger --choosedir=$HOME/.rangerdir; LASTDIR=`cat $HOME/.rangerdir`; cd "$LASTDIR"'

如果你使用 fish:

alias ra='ranger --choosedir="$HOME/.rangerdir"; cd (cat $HOME/.rangerdir)'

fzf 集成

fzf 是一款方便的模糊搜索程序。

安装好 fzf 之后,创建 ~/.config/ranger/commands.py, 粘贴以下内容。

from ranger.api.commands import Command

class fzf(Command):
    """
    :fzf

    Find a file using fzf.

    With a prefix argument select only directories.

    See: https://github.com/junegunn/fzf
    """
    def execute(self):
        import subprocess
        import os.path
        if self.quantifier:
            # match only directories
            command="find -L . \( -path '*/\.*' -o -fstype 'dev' -o -fstype 'proc' \) -prune \
            -o -type d -print 2> /dev/null | sed 1d | cut -b3- | fzf +m"
        else:
            # match files and directories
            command="find -L . \( -path '*/\.*' -o -fstype 'dev' -o -fstype 'proc' \) -prune \
            -o -print 2> /dev/null | sed 1d | cut -b3- | fzf +m"
        fzf = self.fm.execute_command(command, universal_newlines=True, stdout=subprocess.PIPE)
        stdout, stderr = fzf.communicate()
        if fzf.returncode == 0:
            fzf_file = os.path.abspath(stdout.rstrip('\n'))
            if os.path.isdir(fzf_file):
                self.fm.cd(fzf_file)
            else:
                self.fm.select_file(fzf_file)

使用方法:打开 Ranger, 输入 :fzf,回车!这时候你可以输入关键词,通过 Ctrl + J / K 上下移动选择文件。

image-20210318161033303

终端复用器 Tmux

终端复用器 Tmux 常被用于将远程服务器的会话和窗口解绑,让程序保持运行。这篇文章可以帮助你入门 Tmux 的使用:Tmux 使用教程 - 阮一峰的网络日志

Tmux 也能作为分屏工具使用,通过修改、绑定快捷键,终端的使用体验会得到大幅提升。

(下图为一个终端窗口的3个 Tmux pane)

image-20210318162311881

我的配置文件 ~/.tmux.conf

# reference: 
# https://gist.github.com/spicycode/1229612
# https://unix.stackexchange.com/questions/348913/copy-selection-to-a-clipboard-in-tmux


# keys

# 按下 Ctrl+b 然后按 r
# Reload tmux config
bind r source-file ~/.tmux.conf

# Set new panes to open in current directory
# 左右分屏,按下 Ctrl+b 然后按 |
bind-key | split-window -h -c "#{pane_current_path}"
# 上下分屏,按下 Ctrl+b 然后按 -
bind-key - split-window -v -c "#{pane_current_path}"

# bind-key J resize-pane -D 5
# bind-key K resize-pane -U 5
# bind-key H resize-pane -L 5
# bind-key L resize-pane -R 5

# Use Alt-vim keys without prefix key to switch panes
# 按住 Alt, 使用 hjkl 移动
bind -n M-h select-pane -L
bind -n M-j select-pane -D 
bind -n M-k select-pane -U
bind -n M-l select-pane -R
# Alt+C 创建新页面(窗口)
bind -n M-c new-window -c "#{pane_current_path}"
# Alt+P 切换页面(窗口)
bind -n M-p previous-window
# Alt+P 切换页面(窗口)
# 按下 Ctrl+b 然后按 x, 删除pane (窗格)

# copy selected
# 将选中内容加入剪贴板
set-option -g mouse on
set-option -s set-clipboard off
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -se c -i"

# right color
set -g terminal-overrides ",xterm-256color:Tc"
set -g default-terminal screen-256color

# theme(copied from nord tmux theme plugin)
# Colors
set -g status-bg default
# set -g status-bg colour235
set -g status-fg white
# Panes
set -g pane-border-style bg=black
set -g pane-border-style fg=black
set -g pane-active-border-style bg=black
set -g pane-active-border-style fg=brightblack
set -g display-panes-colour black
set -g display-panes-active-colour brightblack

# 0 is too far from ` ;)
set -g base-index 1

# Automatically set window title
set-window-option -g automatic-rename on
set-option -g set-titles on

# No delay for escape key press
set -sg escape-time 0

set -g status-keys vi
set -g history-limit 10000

setw -g mode-keys vi
setw -g monitor-activity on

结语

本文介绍的内容并不深入,如果你有兴趣,可以沿着这些兔子洞折腾一下。

最后,推荐一些我自己也没有看完的学习资料: