1
0
mirror of https://shylinux.com/x/ContextOS synced 2025-04-26 09:14:06 +08:00
ContextOS/usr/wiki/zsh_tmux_vim.md
2018-09-23 11:18:15 +08:00

1191 lines
39 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 《终端工具链》简介
终端工具链,就是对编程开发过程中所用到的各种命令行的工具进行高效的组合,不断的提升编程速度与开发效率。
- 在主流的系统中Ubuntu的命令行最为强大有丰富的命令行工具可以很容易组合出自己的终端工具链
- 其次是MacOSX命令行也很丰富再搭配上苹果电脑的硬件与系统可以组合出很流畅的终端工具链
- 最后是Windows命令行功能弱的可以忽略但可以安装一个shell工具[git-scm](https://git-scm.com/downloads)使用一些基本的命令如果需要更丰富的命令行工具可以本地安装虚拟机或是远程连接云主机使用Ubuntu。
命令行终端,与图形界面不同,是以一种文本化的方式与系统进行交互。
可以很直接、很高效执行各种系统操作,同时各种重复性的操作,都可以很方便的写成程序脚本,和系统命令一样直接调用,不断的提升操作效率。
在终端里,有大量丰富的命令可以使用,不可能全部掌握,一些基本的命令会使用即可。
但在开发流程想提升编程速度与开发效率就需要深入理解与熟练掌握这几个工具zsh、tmux、docker、git、vim。
- **zsh** 和系统默认自带的bash一样也是一种shell不断的解析用户或脚本的输入执行各种命令。但提供了更丰富的特性如各种补全命令补全、文件补全、历史补全可以极大的提升操作效率。
- **tmux** 是一款高效的终端分屏器可以在终端把一块屏幕分成多个小窗口每个窗口都启动一个独立shell这样就可以充分的利用屏幕同时执行多个命令。
- **docker** 是一种容器软件,像虚拟机一样为应用软件提供一个完整独立的运行环境,但以一种更加轻量简捷的方式实现,极大的简化的软件的部署与分发。
- **git** 是代码的版本控制软件,用来管理代码的每次变化,分支与版本,本地与远程代码仓库,可以实现多人协作开发。
- **vim** 是一款极其强大的编辑器,通过模式化快捷键提升编辑速度,通过灵活的脚本与插件扩展丰富的功能。
使用zsh+tmux+vim的工具链根据自己的使用习惯进行个性化配置就可以极大的提升编程速度与开发效率。
## 基础入门
每个系统上打开终端的方式都不一样,根据自己的系统进行操作。
- 在Ubuntu中按Ctrl+Alt+T可以直接打开终端。
- 在Mac中打开Finder然后打开应用->实用工具->终端。
- 在Windows里先下载一个应用[git-scm](https://git-scm.com/downloads)按步骤安装即可然后打开应用Git bash。
打开终端后,你就打开了一个全新的世界,通过命令行,你就可以自由自在的控制你自己的电脑,并可以直接与世界上成千上万的计算机进行各种交互。
先来体验一下几个基本的命令吧。
输入"date",并按回车,即可查看当前日期与时间。
```
$ date
Wed Sep 12 09:32:53 CST 2018
```
输入"pwd",并按回车,即可查看当前所在目录。
```
$ pwd
/Users/shaoying
```
在Mac上输入"open"可以打开各种应用,如访问网页。
```
$ open http://www.baidu.com
```
在Mac上将文字转换成语音播放。
```
say hello
```
查看电脑开机时长。
```
$ uptime
19:31 up 26 days, 21:21, 3 users, load averages: 2.00 1.96 1.98
```
查看主机名。
```
$ hostname
shy-MacBook-Pro.local
```
下载文件使用wget命令参数输入下载链接地址即可下载文件到当前目录。
```
$ wget http://www.baidu.com
```
如果Mac上没有brew可以安装一下[Mac包管理器](https://github.com/Homebrew/brew)。更多信息参考[HomeBrew官网](https://brew.sh/)
```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
### zsh使用
Mac上自带zsh不用安装但Ubuntu上需要自己安装一下。
```
$ sudo apt-get install zsh
```
原生的zsh不是很好用可以安装一个[zsh插件管理器](https://github.com/robbyrussell/oh-my-zsh)。
更多信息可以查看[ohmyzsh官网](https://ohmyz.sh/)。
```
$ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
```
如果在Ubuntu上没有安装curl可以安装一下。
在终端常用的搜索命令有find与grep。
ag就是取代grep对指定目录下的所有文件的内容进行全文搜索。
度h
```
$ sudo apt-get install curl
```
```
$ brew install the_silver_searcher
```
```
$ sudo apt-get install silversearcher-ag
```
### tmux使用
在开发与测试的过程中经常会同时处理多个事情就用到多个终端窗口可以使用SecureCRT、PuTTY、Terimal、iTerm、Konsole等软件去管理这些终端。
不过窗口一多,在一堆标签中来回切换窗口,简直是恶梦一样,经常会翻来翻去,搞半天才能找到自己想用的终端窗口。
而且尤其是连接远程服务器,网络一但断开,所有的窗口就要重新连接,而且终端里的操作历史基本上就废了,很多工作就要重新操作一遍了。
tmux就是一款极其强大的终端管理软件。
它不仅可以把一个窗口分隔成任意多个小窗口每个窗口都是一个独立的终端像IDE一样把几个相关的终端窗口放在一个界面中。
而且即使网络中断也不会丢失任何数据,重新连接后可以继续工作,不会感觉出现场环境有任何变化。
仅凭这两点tmux就可以极大的提高工作的效率和工作连续性。
Ubuntu上安装tmux
```
$ sudo apt-get install tmux
```
Mac上安装tmux
```
$ brew install tmux
```
Windows上安装tmux还是算了太折腾了放弃吧。
启动或连接tmux。
```
$ tmux
```
每次在终端运行tmux命令时tmux命令本身作为一个客户端会去连接后台服务如果服务进程不存在就会创建一个后台服务进程。
所以tmux是以CS的服务模式管理终端的即使网络中断了客户端退出了所有的运行终端都完整的保存在服务进程中。
服务启动后和普通终端一样就可以在tmux的窗口中执行各种命令行了。
tmux有三种交互方式快捷键命令行配置文件。
#### tmux快捷键体验
tmux默认的控制键是Ctrl+b然后再输入命令字符。就可以对tmux进行各种控制。
示例如下按下Ctrl+b然后再按引号键就可以将当前终端窗口分隔成上下两个终端。
```
Ctrl+b "
```
示例如下按下Ctrl+b然后再按百分号键就可以将当前终端窗口分隔成左右两个终端。
```
Ctrl+b %
```
示例如下按下Ctrl+b然后再按字母o就可以在两个终端窗口间来回切换。
```
Ctrl+b o
```
示例如下按下Ctrl+b然后再按字母c就可以创建一个新窗口。
```
Ctrl+b c
```
示例如下按下Ctrl+b然后再按字母n就可以切换到后一个窗口。
```
Ctrl+b n
```
示例如下按下Ctrl+b然后再按字母p就可以切换到前一个窗口。
```
Ctrl+b p
```
示例如下按下Ctrl+b然后再按字母d就会断开当前连接回到原始的终端窗口但tmux会话中的所有终端都还在运行。
```
Ctrl+b d
```
断开连接后在终端中再次执行tmux命令tmux会重新连接会话之前的窗口都会原样打开。
```
$ tmux
```
示例如下按下Ctrl+b然后再按问号?就可以查看所有快捷键。可以按方向键上下翻页按字母q可以退出查看。
```
Ctrl+b ?
```
#### tmux命令行体验
tmux的控制方式除了方便的快捷键还有丰富的命令行。
如下命令,查看有多少个窗口。
```
$ tmux list-windows
```
如下命令创建一个新窗口。再调用list-windows就可以看到新的窗口。
```
$ tmux new-window
```
如下命令,查看有多少个会话。
```
$ tmux list-sessions
```
如下命令,连接最近的会话。
```
$ tmux attach-session
```
除了在外部终端命令行中执行tmux命令还可以在tmux中执行命令按Ctrl+b然后按冒号就进入底行模式然后就可以输入各种命令最后按回车执行。
```
Ctrl+b : split-window <Enter>
```
显示时间,按任意键退出。
```
Ctrl+b : clock-mode <Enter>
```
显示状态条
```
Ctrl+b : set status on <Enter>
```
隐藏状态条
```
Ctrl+b : set status on <Enter>
```
#### tmux功能详解
每次运行tmux都会启动一个客户端client每个客户端client会连接到服务端server下的某一个会话session。
当然多个客户端client可以连接同一个会话session所以client与session是多对一的关系。
每一个会话session下面可以管理多个窗口window每个窗口window可以被分隔成多个窗格pane每个窗格pane就是一个独立的终端teriminal。
所以从server->session->window->pane就形成一个树状的结构每个叶子节点就是pane即一个终端。
命令如下,查看客户端列表。
```
$ tmux list-clients
/dev/ttys000: context [158x42 xterm-256color] (utf8)
```
其中"/dev/ttys000"就是客户端设备, "context"是会话名,"158x42"是窗口宽高utf8是字符集。
命令的详细定义可以查man手册"man tmux",可以查看每条命令的详细定义。
```
list-clients (lsc) [-F format] [-t target-session]
```
其中"list-clients"是命令lsc是命令简写
"-F format",可以指定输出内容格式,
"-t target-session",可以查看指定会话下有多少客户端连接,默认查看所有会话下的客户端。
查看所有会话session
```
list-sessions (ls) [-F format]
```
查看某会话或所有会话下的所有窗口window
```
list-windows (lsw) [-a] [-F format] [-t target-session]
```
查看某窗口或所有窗口下的所有空格pane
```
list-panes (lsp) [-as] [-F format] [-t target-window]
```
除了终端管理tmux还提供了缓存管理方便在终端间复制文字。tmux会保存每次复制的内容。
```
list-buffers (lsb) [-F format]
```
查看所有命令行
```
list-commands (lscm) [-F format]
```
查看所有快捷键
```
list-keys (lsk) [-t mode-table] [-T key-table]
```
#### tmux会话管理
新建会话
```
new-session (new) [-AdDEP] [-c start-directory] [-F format] [-n window-name] [-s session-name] [-t target-session] [-x width] [-y height] [command]
```
- "-s session-name" 指定会话名
- "-n window-name" 指定初始窗口的名字
- "-c start-directory" 设定起始目录
- "-d" 会话创建成功后,不自动连接
- "-x width" 指定窗口宽度
- "-y width" 指定窗口调试
- "-A" 如果会话存在就自动连接
- "-D" 自动连接会话时,断开会话与其它客户端连接
- "-t target-session" 创建共享会话新会话session-name与已存在的target-session共享所有窗口
- "-P format" 指定命令输出的格式
- "command" 窗口创建成功后执行的shell命令
会话是否存在
```
has-session (has) [-t target-session]
```
重命名会话
```
rename-session (rename) [-t target-session] new-name
```
连接会话
```
attach-session (attach) [-dEr] [-c working-directory] [-t target-session]
```
锁定会话
```
lock-session (locks) [-t target-session]
```
删除会话
```
kill-session (killp) [-a] [-t target-pane]
```
#### tmux窗口管理
创建窗口
```
new-window (neww) [-adkP] [-c start-directory] [-F format] [-n window-name] [-t target-window] [command]
```
- -n 指定新窗口的名字
- -t 指定新窗口的位置
- -a 新创建的窗口在-t指定窗口后面的位置
- -k -t指定的位置如果存在窗口则删除此窗口并插入新的窗口
- -c 指定新窗口的当前目录
- -d 新窗口创建后,不切换为当前窗口
- -P 命令执行成功后,返回字符串
- -F 返回字符串的格式
- command 窗口启动后执行的命令
分割窗口,将一个窗口分成上下或左右两个窗口
```
split-window (splitw) [-bdfhvP] [-c start-directory] [-F format] [-p percentage|-l size] [-t target-pane] [command]
```
- -t 被分割的窗口
- -h 分割成左右两个窗口
- -v 分割成上下两个窗口
- -b 指定新窗口的位置在左边或是上边
- -f 新窗口高度占满整个窗口
- -p 指定窗口宽度或高度百分比
- -l 指定窗口的宽度或高度
- -P 命令执行成功后返回字符串
- -F 返回字符串的格式
- -d 新窗口不切换为当前窗口
- -c 新窗口的当前目录
- command 执行的命令
重命令窗口
```
rename-window (renamew) [-t target-window] new-name
```
查找窗口
```
find-window (findw) [-CNT] [-F format] [-t target-window] match-string
```
- -N 从窗口名字中匹配
- -C 从窗口内容中匹配
- -T 从窗口标题中匹配
- match-string 匹配字符串
切换最近使用的窗口
```
last-window (last) [-t target-session]
```
切换下一个的窗口
```
next-window (next) [-a] [-t target-session]
```
切换上一个的窗口
```
previous-window (prev) [-a] [-t target-session]
```
交换两个窗口的位置
```
swap-window (swapw) [-d] [-s src-window] [-t dst-window]
```
移动窗口到指定位置
```
move-window (movew) [-dkr] [-s src-window] [-t dst-window]
```
镜像出一个窗口
```
link-window (linkw) [-dk] [-s src-window] [-t dst-window]
```
删除镜像
```
unlink-window (unlinkw) [-k] [-t target-window]
```
删除窗口
```
kill-window (killw) [-a] [-t target-window]
```
激活窗口
```
respawn-window (respawnw) [-k] [-t target-window] [command]
```
循环移动窗口位置
```
rotate-window (rotatew) [-DU] [-t target-window]
```
窗口切换到下一种布局
```
next-layout (nextl) [-t target-window]
```
窗口切换到上一种布局
```
previous-layout (prevl) [-t target-window]
```
显示所有窗口的序号
```
display-panes (displayp) [-t target-client]
```
切换到上一次选中的面板
```
last-pane (lastp) [-de] [-t target-window]
```
交换两个面板的位置
```
swap-pane (swapp) [-dDU] [-s src-pane] [-t dst-pane]
```
合并面板,把"-t dst-pane"的面板分割成两个, 把-s指定的面板移到新分割的位置中-t与-s位于相同的窗口中
```
move-pane (movep) [-bdhv] [-p percentage|-l size] [-s src-pane] [-t dst-pane]
```
合并面板,把"-t dst-pane"的面板分割成两个, 把-s指定的面板移到新分割的位置中-t与-s位于不同的窗口中
```
join-pane (joinp) [-bdhv] [-p percentage|-l size] [-s src-pane] [-t dst-pane]
```
把某个面板,移动到一个新的窗口
```
break-pane (breakp) [-dP] [-F format] [-s src-pane] [-t dst-window]
```
调整大小
```
resize-pane (resizep) [-DLMRUZ] [-x width] [-y height] [-t target-pane] [adjustment]
```
- -Z 占满全屏或恢复原大小
- -U 扩大上边缘位置
- -D 扩大下边缘位置
- -L 扩大左边缘位置
- -R 扩大右边缘位置
```
pipe-pane (pipep) [-o] [-t target-pane] [command]
```
捕获面板内容
```
capture-pane (capturep) [-aCeJpPq] [-b buffer-name] [-E end-line] [-S start-line][-t target-pane]
```
- -e 保留转义格式
- -p 输出内容到标准输出
- -b 输出内容到缓存
- -S start-line 起始行
- -E end-line 结束行
- -t 目标面板
重新激活面板
```
respawn-pane (respawnp) [-k] [-t target-pane] [command]
```
删除一个面板
```
kill-pane (killp) [-a] [-t target-pane]
```
切换当前窗口
```
select-window (selectw) [-lnpT] [-t target-window]
```
切换当前面板
```
select-pane (selectp) [-DdegLlMmRU] [-P style] [-t target-pane]
```
- -d 禁止面板输入
- -e 使能面板输入
- -m 标记面板被标记的面板作为join-pane swap-pane swap-window命令-s的默认参数
- -M 取消标记
- -g 显示终端属性
- -P style 设置终端属性
- -t 目标面板
- -D -U -L -R 目标面板为-t指定面板的相邻面板
选择窗口布局
```
select-layout (selectl) [-nop] [-t target-window] [layout-name]
```
交互式选择客户端
```
choose-client (capturep) [-aCeJpPq] [-b buffer-name] [-E end-line] [-S start-line][-t target-pane]
```
交互式选择会话
```
choose-session (capturep) [-aCeJpPq] [-b buffer-name] [-E end-line] [-S start-line][-t target-pane]
```
交互式选择窗口
```
choose-window (capturep) [-aCeJpPq] [-b buffer-name] [-E end-line] [-S start-line][-t target-pane]
```
交互式选择会话或窗口
```
choose-tree (capturep) [-aCeJpPq] [-b buffer-name] [-E end-line] [-S start-line][-t target-pane]
```
交互式选择缓存
```
choose-buffer (capturep) [-aCeJpPq] [-b buffer-name] [-E end-line] [-S start-line][-t target-pane]
```
#### tmux缓存管理
进入复制模式
```
copy-mode [-t target-pane]
```
复制模式,用户就可以浏览此窗口的输出历史,并可以复制内容到缓存
清空面板输出的历史记录
```
clear-history (clearhist) [-t target-pane]
```
粘贴缓存内容到指定面板
```
paste-buffer (pasteb) [-dpr] [-s separator] [-b buffer-name] [-t target-pane]
```
设置缓存内容
```
set-buffer (setb) [-a] [-b buffer-name] [-n new-buffer-name] data
```
- -a 保存缓存内容,并追加到后面
- -b 指定缓存的名字
- -n 缓存的新名字
- data 新加内容
显示某条缓存的内容
```
show-buffer (showb) [-b buffer-name]
```
将某条缓存内容保存到文件
```
save-buffer (saveb) [-a] [-b buffer-name] path
```
将文件内容加载到某条缓存
```
load-buffer (loadb) [-b buffer-name] path
```
删除某条缓存
```
delete-buffer (deleteb) [-b buffer-name]
```
#### tmux快捷键与命令行
发送前缀键到面板
```
send-prefix [-t target-pane]
```
发送字符到面板
```
send-keys (send) [-lRM] [-t target-pane] key ...
```
快捷键映射到命令行
```
bind-key (bind) [-cnr] [-t mode-table] [-R repeat-count] [-T key-table] key command [arguments]
```
取消映射
```
unbind-key (unbind) [-acn] [-t mode-table] [-T key-table] key
```
```
clock-mode (clearhist) [-t target-pane]
```
输出信息
```
display-message (display) [-p] [-c target-client] [-F format] [-t target-pane] [message]
```
- -p 作为命令的输出,否则输出到状态行
- -c target-client 指定客户端
- -t target-pane 指定面板
- message 输出的消息
查看输出历史
```
show-messages (showmsgs) [-JT] [-t target-client]
```
执行命令前,让用户选择一下是否执行
```
confirm-before (confirm) [-p prompt] [-t target-client] command
```
执行命令前,让用户输出一些参数
```
command-prompt [-p prompts] [-I inputs] [-t target-client] [template]
```
- -p 提示信息
- -I 参数默认值
- -t 指定客户端
- template 命令模板
```
执行Shell命令
```
run-shell (run) [-b] [-t target-pane] shell-command
```
执行完Shell命令根据执行结果选择执行tmux的命令
```
if-shell (if) [-bF] [-t target-pane] shell-command command [command]
```
显示环境变量
```
show-environment (showenv) [-gs] [-t target-session] [name]
```
设置环境变量
```
set-environment (setenv) [-gru] [-t target-session] name [value]
```
显示配置
```
show-options (show) [-gqsvw] [-t target-session|target-window] [option]
```
- -s 服务级配置
- -w 窗口级配置
- -g 显示全局配置
- -v 只显示配置值
- -t 目标会话或窗口
- option 配置项
修改配置
```
set-option (set) [-agosquw] [-t target-window] option [value]
```
加载脚本,
可以将tmux命令写文件中并随时加载执行tmux服务在启动时会默认加载~/.tmux.conf所以可以将一些默认的配置写此文件中
```
source-file (source) [-q] path
```
同步机制,
tmux提供了一种同步机制shell命令可以等待tmux条件tmux可触发条件
```
wait-for (wait) [-L|-S|-U] channel
```
其它命令
```
set-hook (setenv) [-gru] [-t target-session] name [value]
show-hooks (showenv) [-gs] [-t target-session] [name]
```
#### tmux客户端与服务端
刷新客户端
```
refresh-client (refresh) [-S] [-C size] [-t target-client]
```
挂起客户端
```
suspend-client (suspendc) [-t target-client]
```
切换客户端与会话的关系
```
switch-client (switchc) [-Elnpr] [-c target-client] [-t target-session] [-T key-table]
```
断开客户端与会话的连接
```
detach-client (detach) [-P] [-a] [-s target-session] [-t target-client]
```
锁定客户端
```
lock-client (lockc) [-t target-client]
```
查看服务信息
```
server-info (info)
```
启动服务进程
```
start-server (start)
```
结束服务进程
```
kill-server
```
锁定所有客户端
```
lock-server (lock)
```
#### tmux服务配置
常规配置
```
buffer-limit 20
default-terminal "screen"
escape-time 500
exit-unattached off
focus-events off
history-file ""
message-limit 100
quiet off
set-clipboard on
terminal-overrides "xterm*:XT:Ms=\E]52;%p1%s;%p2%s\007:Cs=\E]12;%p1%s\007:Cr=\E]112\007:Ss=\E[%p1%d q:Se=\E[2 q,screen*:XT"
```
#### tmux会话配置
使用set命令可以修改tmux一些配置让tmux更加个性化
启用鼠标
```
mouse on
```
设置命令前缀
```
prefix C-s
prefix2 None
```
设置状态栏
```
status on
status-keys vi
status-interval 15
status-justify left
status-position bottom
status-style fg=black,bg=green
status-left "[#S] "
status-left-length 10
status-left-style default
status-right " "#{=21:pane_title}" %H:%M %d-%b-%y"
status-right-length 40
status-right-style default
message-style fg=black,bg=yellow
message-command-style fg=yellow,bg=black
visual-activity off
visual-bell off
visual-silence off
bell-action any
bell-on-alert off
set-titles off
set-titles-string "#S:#I:#W - "#T" #{session_alerts}"
```
窗口显示的配置
```
display-panes-active-colour red
display-panes-colour blue
display-panes-time 5000
display-time 5000
```
启动或结束的窗口时的配置
```
detach-on-destroy on
destroy-unattached off
set-remain-on-exit off
default-command ""
default-shell "/bin/zsh"
lock-after-time 0
lock-command "lock -np"
update-environment "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY"
```
常规配置
```
base-index 1
renumber-windows on
history-limit 50000
word-separators " -_@"
key-table "root"
repeat-time 500
assume-paste-time 1
```
#### tmux窗口配置
使用set -w命令或是set-window-option命令可以设置窗口的一些配置
窗口布局设置
```
force-height 0
force-width 0
main-pane-height 24
main-pane-width 80
other-pane-height 0
other-pane-width 0
```
窗口样式
```
pane-border-style default
pane-border-status off
pane-active-border-style fg=green
pane-border-format "#{?pane_active,#[reverse],}#{pane_index}#[default] "#{pane_title}""
window-style default
window-active-style default
clock-mode-style 24
clock-mode-colour blue
```
状态栏样式
```
window-status-separator " "
window-status-style default
window-status-bell-style reverse
window-status-last-style default
window-status-current-style default
window-status-activity-style reverse
window-status-format "#I:#W#{?window_flags,#{window_flags}, }"
window-status-current-format "#I:#W#{?window_flags,#{window_flags}, }"
```
常规配置
```
mode-keys vi
mode-style fg=black,bg=yellow
allow-rename off
automatic-rename on
automatic-rename-format "#{?pane_in_mode,[tmux],#{pane_current_command}}#{?pane_dead,[dead],}"
pane-base-index 1
```
其它配置
```
aggressive-resize off
alternate-screen on
monitor-activity off
monitor-silence 0
synchronize-panes off
wrap-search on
xterm-keys off
remain-on-exit off
```
### docker使用
- [Windows版docker下载](https://store.docker.com/editions/community/docker-ce-desktop-windows)
- [Mac版docker下载](https://store.docker.com/editions/community/docker-ce-desktop-mac)
#### docker镜像管理
- 查看镜像 docker image ls
- 下载镜像 docker image pull
刚安装docker后查看镜像列表如下为空。
```
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
```
像github管理代码仓库一样docker hub上也存放了很多镜像用户可以自由的下载与上传各种镜像。
如下示例下载一个busybox镜像。busybox是将Unix下的常用命令经过挑选裁剪集成一个程序中搭配Linux内核就可以做出一个小型的操作系统在嵌入式领域应用广泛。
体积很小不到1M下载很快所以这里用做示例。更多信息参考[busybox官网](https://busybox.net/)
```
$ docker image pull busybox
```
下载完成后再查看镜像列表就会看到busybox镜像相关的信息。
```
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest e1ddd7948a1c 6 weeks ago 1.16MB
```
#### docker容器管理
- 查看容器 docker ps
- 启动容器 docker run
- 停止容器 docker exec
- 停止容器 docker stop
如下示例,查看容器列表,因为还没启动任何容器,所以这里为空。
```
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
```
如下示例用busybox:latest镜像启动一个容器并调用sh命令。
```
$ docker run --name demo -dt busybox:latest sh
29ff6b8343c4a2c57eab297e74e62422ab9bbd481d69f5ebf108f4aa23ae835c
```
其中,-d 指用守护的方式启动,与交互式 -i 不同,守护式启动,容器可以一直运行,不会因为终端容器关闭而停止。
--name参数指定容器的名字为demodocker中标识容器有两种方式一是通过ID查找容器二是通过NAMES查找容器为了方便记忆与查找建议启动容器时加上名字参数。
如下示例,再次查看容器列表,看到容器已经启动。
```
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
29ff6b8343c4 busybox:latest "sh" 4 minutes ago Up 4 minutes demo
```
连接容器demo调用命令解析器sh。这样就连接上了容器的命令行可以执行各种命令。
```
$ docker exec -it demo sh
#
```
容器的停止退出连接后容器依然在后台运行可以反复被连接。如果想停止容器的运行就用stop命令。
```
$ docker stop demo
```
#### 挂载文件
之前启动的容器都是与本机之间没有什么交互,是一个完全独立的运行环境。
如果需要容器与本机交互一些文件,就可以在启动容器时指定文件参数。
```
$ docker run --name demo1 -v/Users/shaoying:/home/shaoying -dt busybox:latest sh
```
#### 端口映射
### git入门
Mac上自带git不需要安装。
Windows上安装了的git-scm也集成了git也不需要单独安装。
但Ubuntu需要自己安装一下。
```
$ sudo apt-get install git
```
### vim入门
Mac上自带vim不需要安装。
Windows上安装了的git-scm也集成了vim也不需要单独安装。
但Ubuntu默认只安装了vivim需要自己安装一下。
```
$ sudo apt-get install vim
```
vim是最高效的编辑器没有之一。熟练掌握它的使用会极大的提升文本或代码的编辑速度。
当然与常见的其它编辑器不同vim有独特的操作模式刚开始使用会有些奇怪。
不过一但你理解了它的运行逻辑,适应了它的操作习惯,你这辈子都不会再想用其它的编辑器。
输入命令vim如果带有参数则会打开此文件如果没有参数则直接打开一个空文件。
```
$ vim hi.txt
```
按字母"i",进入编辑模式,然后就可以输入任意文本。
```
Hello Vim World!
Vim is best and fast.
You can use vim to input text or code into complute in a free style.
```
输入完内容后,按左上角的"Esc"键,就可以退出编辑模式,回到命令模式。
在命令模式下可以对文件内容进行各种查看、搜索、修改等操作。vim很多高效的操作都是在命令模式下执行的。
最后,需要保存文件并退出时,按冒号键":",进入底行模式,再输入"wq"并按回车。
```
:wq
```
#### vim的常用模式
与其它编辑器不同vim是一种模式化编辑器即处在不同模式下每个按键都会不同的功能。
之所以vim是最高效的编辑器这就是其中的原因之一。
常见的模式有:命令模式、编辑模式、底行模式。
启动vim后默认的模式是命令模式其它模式都是以命令模式为基准中心进行相互切换。
即由命令模式切到到编辑模式,由编辑模式切换到命令模式;由命令模式切换到底行模式,由底行模式切换到命令模式。
- 命令模式: 通过各种快捷键,对文件内容进行各种快速的查看、搜索、修改等操作。
- 编辑模式: 和其它编辑器一样,各种字母数字按键会当成文件的内容直接输入。
- 底行模式: 通过输入各种命令行调用vim各种函数或脚本对文件内容进行复杂的处理。
不同模式下按键的功能是不一样的,所以要知道当前的模式,并能自由切换。如果不知道自己所在的模式,就按\<Esc\>总会回到命令模式的。
- 命令模式->底行模式: 输入冒号键":",从命令模式切换到底行模式。
- 命令模式<-底行模式: 输入回车键\<Enter\>执行命令或输入退出键\<Esc\>不执行命令然后从底行模式返回到命令模式
- 命令模式->编辑模式: 输入"i"、"I"、"a"、"A"、"o"、"O"、"s"、"S",其中任何一个键都可以进行编辑模式。
- "i": 在光标左边的位置开始插入内容
- "a": 在光标右边的位置开始插入内容
- "o": 在光标下面新加一空白并开始插入内容
- "O": 在光标上面新加一空白并开始插入内容
- "A": 在光标当前行尾的位置开始插入内容
- "I": 在光标当前行首的位置开始插入内容
- "s": 删除光标下的字符,并在光标当前的位置开始插入内容
- "S": 删除光标当前行的所有字符,并在光标当前行开始插入内容
- 命令模式<-编辑模式: 输入退出键\<Esc\>从编辑模式返回到命令模式
#### vim的帮助文档
vim有很灵活的快捷键大量的配置与命令和丰富的插件所以除了要多练习还需要多看文档vim自带的帮助文档就很丰富很完整
英文不好也没关系vim帮助文档中的英语单词都比较简单很容易阅读与理解
当然也有很多复杂的单词不过那也无所谓就算每篇文档只看懂一半也能学到很多有用的技巧
因为英文的文档是最接近作者的思维功能讲解的也更加全面所以直接查看英文文档是一个优秀程序的必备修养
所以要克服自己的心理刚开始看懂多少是多少慢慢养成直接看英文文档的习惯文档看的多了自然看懂的就会越来越多
阅读英文文档不仅可以提高英文水平而且对你写文档和写代码的水平也会有很大的帮助
打开vim在命令模式下输入":help"并按回车就可以进入文档中心查看各种文档
```
:help
```
***学VIM第一要掌握的四个快捷键就是hjkl***。
把双手自然的放在键盘上右手离的最近的四个键就是hjkl所以这么黄金的位置当然分配给了使用最频繁的光标移动了
- "h"键在最左边所以按"h"当然就是把光标左移
- "l"键在最右边所以按"l"当然就是把光标右移
- "j"键在食指下面是按键最快的所以按"j"当然就是把光标向下移
- 最后是"k"当然就是把光标向上移
在帮助文档中可以练习一下光标移动的这四个键多体验一下你就会感觉到vim的强大
在vim鼠标就是最影响编辑速度的瓶颈练习过一段时间的快捷键后再碰鼠标你就会很明显的感觉到鼠标严重拖慢你的操作速度
再练习过一段时间后别说鼠标了就是那四个方向键和"Esc"键你会懒得去用因为那太慢太慢了
最终使用vim的效果就是你的手腕不会有任何移动只有手指在26个字母和10个数字键上噼里啪啦的在敲击
在vim有tags标签就像网页中的超链接一样可以点击访问另外一个文档
使用的方式就是把光标移动到有特殊标记的单词上按下两个组合键快捷"Ctrl+]"就可以跳到另外一篇文档中
看完那篇文档后按下组合键"Ctrl+T"就可以返回原来的文档
另外浏览文件常用的快捷键还有
- Ctrl+F 向下翻页
- Ctrl+B 向上翻页
- Ctrl+D 向下翻半页
- Ctrl+U 向上翻半页
- gg 跳到文件第一行
- G 跳到文件最后一行
#### vim的文本修改
除了前面的光标移动与翻页功能命令模式下还有很多操作命令
- cc 删除当前行并进入编辑模式
- dd 删除当前行
- yy 复制当前行
- p 在光标之后粘贴复制的内容
- x 删除光标所在的字符
- r 替换光标所在的字符输入字符r后接着输入新字符
- u 取消操作
- Ctrl+R 恢复取消的操作
#### vim的单词搜索
除了hjkl移动光标外还有更快捷移动光标的方式就是搜索
- 行内搜索: "f""t"当用h或l进行左右移动时经常需要按多好次键才能移动到目标位置所以输入f加上目标位置所在的字符就可以直接跳过去t与f相同也是跳转只是t是跳到目标字符的左边一个位置
- 匹配搜索: "\*""#"按一下"\*"vim就会用光标所在的单词向下搜索直接跳到当前单词出现的下一位置#与\*相反是向上搜索
- 全文搜索: "?""/"如果相搜索任意单词在命令模式下输入"/"然后输入想要搜索的单词最后输入回车即可向下搜索并移动光标到单词所在位置。?/相反是向上搜索
#### vim的命令组合
#### vim的常用配置
除了前面那一堆高效的快捷键外vim另一强大的原因就是灵活的配置
你完全可以根据自己的习惯修改各种各样的配置让编辑器更加得心应手
vim的配置命令是set在命令模式中输入":set "再加上需要修改的配置
***显示行号***输入":set number"即可在窗口左边显示文件的所有行号就可以很清楚的知道当前的位置
```
:set number
```
***显示相对行号***很多时候目标位置距当前位置相隔很多行还要去目测或一行行去数相对位置
设置显示相对行号后就可以直接看到窗口中所有行相对于当前行的相对行号
```
:set relativenumber
```
***显示光标纬线***有时屏幕屏幕太大往往对不准同一列的字符或同一行的内容就可以显示经纬经
```
:set cursorline
```
***显示光标经线***
```
:set cursorcolumn
```
状态行也可以显示很多用有的信息
***显示光标位置***
```
:set ruler
```
***显示当前命令***
```
:set showcmd
```
***显示当前模式***
```
:set showmode
```
#### vim的启动脚本
vim有大量的配置与命令不可能每次启动vim都要手动去输入一遍
vim具有脚本解析的功能并且会在启动的时候会加载启动脚本文件
所以就可以把一些常用的命令放到启动脚本中每次打开文件时vim会自动的首先执行这些命令
vim默认的启动脚本文件是在家目录下的.vimrc如下打开启动脚本文件并把之前的那些命令写到脚本中
因为vim会把脚本文件中的每一行当成一条命令来解析并执行所以行首不需要再专门输入":"。
```
$ vim ~/.vimrc
set number
set relativenumber
set cursorline
set cursorcolumn
set ruler
set showcmd
set showmode
set cc=80
set nowrap
set scrolloff=3
```
#### vim的扩展插件
除的vim自带的配置与命令还有大量丰富的插件可以扩展很多功能
但大量的插件手动维护太复杂可以下载一个[vim插件管理器](https://github.com/junegunn/vim-plug)
执行如下命令下载plug-vim
```
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```
下载完成后还需要在启动脚本文件中加入一些命令启用此插件管理器
打开~/.vimrc并添加以下第2行及以后的内容
```
$ vi ~/.vimrc
call plug#begin()
Plug 'vim-scripts/tComment'
call plug#end()
```
以后如果需要添加新的插件就可以在"call plug#begin()""call plug#end()"之间插入Plug命令
如安装插件tComment就插入"Plug 'vim-scripts/tComment'"。
重新加载启动脚本
```
:source ~/.vimrc
```
执行":PlugInstall"命令plug-vim就会从github上下载tComment插件
```
:PlugInstall
```
重新加载启动脚本
```
:source ~/.vimrc
```
输入":help tComment"即可查看此插件的帮助文档
```
:help tComment
```
***tComment插件***可以对代码进行快速注释或取消注释在编写代码尤其是调试代码时经常会遇到需要暂时注释掉一段代码但稍后又取消掉注释
tComment通过简单的命令就可以很快的实现此功能不再需要手动的去插入一堆注释的符号
- "gcc" 注释或取消注释当前行的代码
## 进阶指南
### zsh技巧
在Mac上将zsh设置为默认的shell
```
$ chsh -s /bin/zsh
```
在Ubuntu上将zsh设置为默认的shell
```
$ chsh -s /usr/bin/zsh
```
### tmux技巧
### docker技巧
### git技巧
### vim技巧
#### YouCompleteMe安装
vim只是编辑器如果需要语法检查与补全功能可以安装插件[YouCompleteMe](https://github.com/Valloric/YouCompleteMe)
打开.vimrc配置文件添加插件
```
$ vim ~/.vimrc
Plugin 'vim-syntastic/syntastic'
Plugin 'Valloric/YouCompleteMe'
```
保存配置文件重新打开vim并执行安装命令
```
$ vim
:PlugInstall
```
由于网络原因可能下载不了可以手动下载插件
```
$ git clone https://github.com/Valloric/YouCompleteMe ~/.vim/bundle/YouCompleteMe
$ cd ~/.vim/bundle/YouCompleteMe
$ git submodule update --init --recursive
```
不论是用vundle安装或手动下载都需要进入插件目录进行编译安装
```
$ cd ~/.vim/bundle/YouCompleteMe
$ ./install.py --clang-completer
```
Ubuntu上如果没有cmake还需要安装一下
```
$ sudo apt-get install cmake
```
## 源码解析
### zsh源码解析
[zsh源码](https://github.com/zsh-users/zsh)
### tmux源码解析
[tmux源码](https://github.com/tmux/tmux)
### docker源码解析
[docker源码](https://github.com/docker/docker-ce)
### git源码解析
[git源码](https://github.com/git/git)
### vim源码解析
#### vim源码安装
vim默认不支持python的语法补全如果需要用到python可以下载[vim源码](https://github.com/vim/vim)编译安装
```
$ sudo apt-get install python
$ sudo apt-get install python-pip
$ sudo apt-get install python-dev
$ sudo apt-get install libncurses5-dev
$ sudo apt-get install build-essential
$ git clone https://github.com/vim/vim.git && cd vim
$ ./configure --with-features=huge\
--enable-pythoninterp\
--with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/\
--enable-multibyte\
--prefix=/usr/local/vim8/
$ make -j8
$ sudo mkdir /usr/local/vim8
$ sudo make install
```
```
$ sudo apt-get install build-essential
```