netconf note
Vim note
Vim Note
VIM IDE 打造
1. vimplus 下载安装
安装 vimplus:
1  | $ git clone https://github.com/chxuan/vimplus.git ~/.vimplus  | 
更新 vimplus:
1  | $ ./update.sh  | 
可通过 vimplus 的 ,h 命令查看 vimplus 帮助文档
Ubuntu vimplus .vimrc 文件中有一个插件有问题,需要注释掉,插件名字如下:
1  | Plug 'Shougo/echodoc.vim'  | 
2. 安装 ctags
重新安装 ctags,使用 Universal CTags (默认的软件源都是Exuberant Ctags,版本太旧了)
1  | $ sudo apt install autoconf  | 
安装完毕需要在 .vimrc 中添加:
1  | " 正确设置 vimrc,读取 tags(当前目录,否则向上级目录查找添加 tags)  | 
这时已经可以通过在项目根目录运行 ctags -R . 来生成 tags 文件,就可以用了。
3. 安装 gtags
请首先安装最新版本 gtags,目前版本是 6.6.2,Linux 下请自行编译最新版(Debian / Ubuntu 自带的都太老了),Mac 下检查下 brew 安装的版本至少不要低于 6.6.0 ,否则请自己编译。
安装 gtags (系统软件源一般版本比较低,建议自己编译安装)
gtags 原生支持 6 种语言(C,C++,Java,PHP4,Yacc,汇编), 通过安装 pygments 扩展支持 50+ 种语言(包括 go/rust/scala 等,基本覆盖所有主流语言)。
1  | $ pip install pygments  | 
保证 .vimrc 里要设置过两个环境变量才能正常工作:
1  | " vimrc 中设置环境变量启用 pygments  | 
第一个 GTAGSLABEL 告诉 gtags 默认 C/C++/Java 等六种原生支持的代码直接使用 gtags 本地分析器,而其他语言使用 pygments 模块。
第二个环境变量必须设置,否则会找不到 native-pygments 和 language map 的定义,Linux 下要到 /usr/local/share/gtags 里找,也可以把它拷贝成 ~/.globalrc ,Vim 配置的时候方便点。
实际使用 pygments 时,gtags 会启动 python 运行名为 pygments_parser.py 的脚本,通过管道和它通信,完成源代码分析,故需保证 gtags 能在 $PATH 里调用 python,且这个 python 安装了 pygments 模块。
正确安装后,可以通过命令行 gtags 命令和 global 进行测试,注意shell 下设置环境变量。
4. 安装三个插件
安装三个插件 : vim-gutentags 索引自动管理 + 索引数据库切换 + 索引预览
1  | " 静态语法检查插件  | 
5. 自动生成 Gtags
使用 vim-gutentags 插件。
1  | Plug 'ludovicchabant/vim-gutentags'  | 
.vimrc 里加入:
1  | " gutentags 搜索工程目录的标志,当前文件路径向上递归直到碰到这些文件/目录名  | 
6. 基于 gutentags 实现跳转
在为当前目录生成tags文件后,可以通过按键 Ctrl + ] 跳转到对应的定义位置,再使用命令 Ctrl + o 回退到原来的位置。关于跳转的具体应用,可以参考 Vim使用ctags实现函数跳转
另外,建议多使用 Ctrl + W + ] 用新窗口打开并查看光标下符号的定义,或者 Ctrl -W } 使用 preview 窗口预览光标下符号的定义。
预设快捷键如下
| 快捷键 | 说明 | 
|---|---|
<leader>cg | 
查看光标下符号的定义 | 
<leader>cs | 
查看光标下符号的引用 | 
<leader>cc | 
查看有哪些函数调用了该函数 | 
<leader>cf | 
查找光标下的文件 | 
<leader>ci | 
查找哪些文件 include 了本文件 | 
查找到索引后跳到弹出的 quikfix 窗口,停留在想查看索引行上,按 小P 直接打开预览窗口,大P 关闭预览。
7. 快速预览
我们从新项目仓库里查询了一个符号的引用,gtags 噼里啪啦的给了你二十多个结果,那么多结果顺着一个个打开,查看,关闭,再打开很蛋疼,可使用 vim-preview 插件高效的在 quickfix 中先快速预览所有结果,再有针对性的打开必要文件:
1  | Plug 'skywind3000/vim-preview'  | 
快捷键
以下是部分常用快捷键,可通过 vimplus 的 ,h 命令查看 vimplus帮助文档。
| 快捷键 | 说明 | 
|---|---|
<leader>n | 
打开/关闭代码资源管理器 | 
<leader>t | 
打开/关闭函数列表 | 
<leader>a | 
.h .cpp 文件切换 | 
<leader>u | 
转到函数声明 | 
<leader>U | 
转到函数实现 | 
<leader>u | 
转到变量声明 | 
<leader>o | 
打开include文件 | 
<leader>y | 
拷贝函数声明 | 
<leader>p | 
生成函数实现 | 
<leader>w | 
单词跳转 | 
<leader>f | 
搜索~目录下的文件 | 
<leader>F | 
搜索当前目录下的文本 | 
<leader>ff | 
语法错误自动修复(FixIt) | 
<c-p> | 
切换到上一个buffer | 
<c-n> | 
切换到下一个buffer | 
<leader>d | 
删除当前buffer | 
<leader>D | 
删除当前buffer外的所有buffer | 
<F5> | 
显示语法错误提示窗口 | 
<leader>l | 
按竖线对齐 | 
<leader>= | 
按等号对齐 | 
Ya | 
复制行文本到字母a | 
Da | 
剪切行文本到字母a | 
Ca | 
改写行文本到字母a | 
rr | 
替换文本 | 
<leader>r | 
全局替换,目前只支持单个文件 | 
rev | 
翻转当前光标下的单词或使用V模式选择的文本 | 
gcc | 
注释代码 | 
gcap | 
注释段落 | 
vif | 
选中函数内容 | 
dif | 
删除函数内容 | 
cif | 
改写函数内容 | 
vaf | 
选中函数内容(包括函数名 花括号) | 
daf | 
删除函数内容(包括函数名 花括号) | 
caf | 
改写函数内容(包括函数名 花括号) | 
fa | 
查找字母a,然后再按f键查找下一个 | 
<leader>h | 
打开vimplus帮助文档 | 
<leader>H | 
打开当前光标所在单词的vim帮助文档 | 
<leader><leader>t | 
生成try-catch代码块 | 
<leader><leader>y | 
复制当前选中到系统剪切板 | 
<leader><leader>i | 
安装插件 | 
<leader><leader>u | 
更新插件 | 
<leader><leader>c | 
删除插件 | 
缓存操作
| 快捷键 | 说明 | 
|---|---|
:e <filename> | 
新建buffer打开文件 | 
:bp | 
切换到上一个buffer | 
:bn | 
切换到下一个buffer | 
:bd | 
删除当前buffer | 
窗口操作
| 快捷键 | 说明 | 
|---|---|
:sp <filename> | 
横向切分窗口并打开文件 | 
:vsp <filename> | 
竖向切分窗口并打开文件 | 
<c-w>h | 
跳到左边的窗口 | 
<c-w>j | 
跳到下边的窗口 | 
<c-w>k | 
跳到上边的窗口 | 
<c-w>l | 
跳到右边的窗口 | 
<c-w>c | 
关闭当前窗口 | 
<c-w>o | 
关闭其他窗口 | 
:only | 
关闭其他窗口 | 
光标移动
| 快捷键 | 说明 | 
|---|---|
0 | 
光标移动到行首 | 
^ | 
跳到从行首开始第一个非空白字符 | 
$ | 
光标移动到行尾 | 
<c-o> | 
跳到上一个位置 | 
<c-i> | 
跳到下一个位置 | 
<c-b> | 
上一页 | 
<c-f> | 
下一页 | 
<c-u> | 
上移半屏 | 
<c-d> | 
下移半屏 | 
H | 
调到屏幕顶上 | 
M | 
调到屏幕中间 | 
L | 
调到屏幕下方 | 
:n | 
跳到第n行 | 
w | 
跳到下一个单词开头(标点或空格分隔的单词) | 
W | 
跳到下一个单词开头(空格分隔的单词) | 
e | 
跳到下一个单词尾部(标点或空格分隔的单词) | 
E | 
跳到下一个单词尾部(空格分隔的单词) | 
b | 
上一个单词头(标点或空格分隔的单词) | 
B | 
上一个单词头(空格分隔的单词) | 
ge | 
上一个单词尾 | 
% | 
在配对符间移动, 可用于()、{}、[] | 
gg | 
到文件首 | 
G | 
到文件尾 | 
fx | 
跳转到下一个为x的字符 | 
Fx | 
跳转到上一个为x的字符 | 
tx | 
跳转到下一个为x的字符前 | 
Tx | 
跳转到上一个为x的字符前 | 
; | 
跳到下一个搜索的结果 | 
[[ | 
跳转到函数开头 | 
]] | 
跳转到函数结尾 | 
文本编辑
| 快捷键 | 说明 | 
|---|---|
r | 
替换当前字符 | 
R | 
进入替换模式,直至 ESC 离开 | 
s | 
替换字符(删除光标处字符,并进入插入模式,前可接数量) | 
S | 
替换行(删除当前行,并进入插入模式,前可接数量) | 
cc | 
改写当前行(删除当前行并进入插入模式),同 S | 
cw | 
改写光标开始处的当前单词 | 
ciw | 
改写光标所处的单词 | 
caw | 
改写光标所处的单词,并且包括前后空格(如果有的话) | 
ct, | 
改写到逗号 | 
c0 | 
改写到行首 | 
c^ | 
改写到行首(第一个非零字符) | 
c$ | 
改写到行末 | 
C | 
改写到行末(同 c$) | 
ci" | 
改写双引号中的内容 | 
ci' | 
改写单引号中的内容 | 
ci) | 
改写小括号中的内容 | 
ci] | 
改写中括号中内容 | 
ci} | 
改写大括号中内容 | 
cit | 
改写 xml tag 中的内容 | 
cis | 
改写当前句子 | 
ciB | 
改写’{}’中的内容 | 
c2w | 
改写下两个单词 | 
ct( | 
改写到小括号前 | 
x | 
删除当前字符,前面可以接数字,3x代表删除三个字符 | 
X | 
向前删除字符 | 
dd | 
删除当前行 | 
d0 | 
删除到行首 | 
d^ | 
删除到行首(第一个非零字符) | 
d$ | 
删除到行末 | 
D | 
删除到行末(同 d$) | 
dw | 
删除当前单词 | 
dt, | 
删除到逗号 | 
diw | 
删除光标所处的单词 | 
daw | 
删除光标所处的单词,并包含前后空格(如果有的话) | 
di" | 
删除双引号中的内容 | 
di' | 
删除单引号中的内容 | 
di) | 
删除小括号中的内容 | 
di] | 
删除中括号中内容 | 
di} | 
删除大括号中内容 | 
diB | 
删除’{}’中的内容 | 
dit | 
删除 xml tag 中的内容 | 
dis | 
删除当前句子 | 
d2w | 
删除下两个单词 | 
dt( | 
删除到小括号前 | 
dgg | 
删除到文件头部 | 
dG | 
删除到文件尾部 | 
d} | 
删除下一段 | 
d{ | 
删除上一段 | 
u | 
撤销 | 
U | 
撤销整行操作 | 
CTRL-R | 
撤销上一次 u 命令 | 
J | 
连接若干行 | 
gJ | 
连接若干行,删除空白字符 | 
. | 
重复上一次操作 | 
~ | 
交换大小写 | 
g~iw | 
替换当前单词的大小写 | 
gUiw | 
将单词转成大写 | 
guiw | 
将当前单词转成小写 | 
guu | 
全行转为小写 | 
gUU | 
全行转为大写 | 
gg=G | 
缩进整个文件 | 
=a{ | 
缩进光标所在代码块 | 
=i{ | 
缩进光标所在代码块,不缩进”{“ | 
<< | 
减少缩进 | 
>> | 
增加缩进 | 
== | 
自动缩进 | 
CTRL-A | 
增加数字 | 
CTRL-X | 
减少数字 | 
p | 
粘贴到光标后 | 
P | 
粘贴到光标前 | 
v | 
开始标记 | 
y | 
复制标记内容 | 
V | 
开始按行标记 | 
CTRL-V | 
开始列标记 | 
y$ | 
复制当前位置到本行结束的内容 | 
yy | 
复制当前行 | 
Y | 
复制当前行,同 yy | 
yt, | 
复制到逗号 | 
yiw | 
复制当前单词 | 
"+y | 
复制当前选中到系统剪切板 | 
3yy | 
复制光标下三行内容 | 
v0 | 
选中当前位置到行首 | 
v$ | 
选中当前位置到行末 | 
vt, | 
选中到逗号 | 
viw | 
选中当前单词 | 
vi) | 
选中小括号内的东西 | 
vi] | 
选中中括号内的东西 | 
viB | 
选中’{}’中的内容 | 
vis | 
选中句子中的东西 | 
gv | 
重新选择上一次选中的文字 | 
:set paste | 
允许粘贴模式(避免粘贴时自动缩进影响格式) | 
:set nopaste | 
禁止粘贴模式 | 
"?yy | 
复制当前行到寄存器 ? ,问号代表 0-9 的寄存器名称 | 
"?p | 
将寄存器 ? 的内容粘贴到光标后 | 
"?P | 
将寄存器 ? 的内容粘贴到光标前 | 
:registers | 
显示所有寄存器内容 | 
:[range]y | 
复制范围,比如 :20,30y 是复制20到30行,:10y 是复制第十行 | 
:[range]d | 
删除范围,比如 :20,30d 是删除20到30行,:10d 是删除第十行 | 
ddp | 
交换两行内容:先删除当前行复制到寄存器,并粘贴 | 
文件操作
| 快捷键 | 说明 | 
|---|---|
:w <filename> | 
按名称保存文件 | 
ZZ | 
保存文件(如果有改动的话),并关闭窗口 | 
:e <filename> | 
打开文件并编辑 | 
:saveas <filename> | 
另存为文件 | 
:r <filename> | 
读取文件并将内容插入到光标后 | 
:r !dir | 
将dir命令的输出捕获并插入到光标后 | 
:wa | 
保存所有文件 | 
:cd <path> | 
切换Vim当前路径 | 
:new | 
打开一个新的窗口编辑新文件 | 
:enew | 
在当前窗口创建新文件 | 
:vnew | 
在左右切分的新窗口中编辑新文件 | 
:tabnew | 
在新的标签页中编辑新文件 | 
实用命令
| 快捷键 | 说明 | 
|---|---|
/pattern | 
从光标处向文件尾搜索 pattern | 
?pattern | 
从光标处向文件头搜索 pattern | 
n | 
向同一方向执行上一次搜索 | 
N | 
向相反方向执行上一次搜索 | 
* | 
向前搜索光标下的单词 | 
# | 
向后搜索光标下的单词 | 
:s/p1/p2/g | 
替换当前行的p1为p2 | 
:%s/p1/p2/g | 
替换当前文件中的p1为p2 | 
:%s/<p1>/p2/g | 
替换当前文件中的p1单词为p2 | 
:%s/p1/p2/gc | 
替换当前文件中的p1为p2,并且每处询问你是否替换 | 
:10,20s/p1/p2/g | 
将第10到20行中所有p1替换为p2 | 
:%s/1\\2\/3/123/g | 
将“1\2/3” 替换为 “123”(特殊字符使用反斜杠标注) | 
:%s/\r//g | 
删除 DOS 换行符 ^M | 
:g/^\s*$/d | 
删除空行 | 
:g/test/d | 
删除所有包含 test 的行 | 
:v/test/d | 
删除所有不包含 test 的行 | 
:%s/^/test/ | 
在行首加入特定字符(也可以用宏录制来添加) | 
:%s/$/test/ | 
在行尾加入特定字符(也可以用宏录制来添加) | 
:sort | 
排序 | 
:g/^\(.\+\)$\n\1/d | 
去除重复行(先排序) | 
:%s/^.\{10\}// | 
删除每行前10个字符 | 
:%s/.\{10\}$// | 
删除每行尾10个字符 | 
其他
| 快捷键 | 说明 | 
|---|---|
vim -u NONE -N | 
开启vim时不加载vimrc文件 | 
vimdiff file1 file2 | 
显示文件差异 | 
vim -R filename | 
以只读方式打开(阅读模式) | 
Reference
Git note
优秀的Blog链接
1. 前端
2. 后端
3. Git 使用
4. 不吹不黑!逛 GitHub 必看 10 个开源项目
4.1 build Your Own X
- GitHub Star:61,300
 - GitHub:https://github.com/danistefanovic/build-your-own-x
 
自己动手,丰衣足食。
该库收集了诸多优质资源,教你如何构建一些属于自己的东西,内容主要分为增强现实、区块链、机器人、编辑器、命令行工具、神经网络、操作系统等几大类别。
4.2 Free Programming Books
- GitHub Star:139,000
 - https://github.com/EbookFoundation/free-programming-books
 
从名字中可以看出,这个仓库主要是为开发者推荐一些免费编程书籍,但除此同时,上面也会推荐一些免费的编程课程、播客、网站等学习资源。
4.3 Oh My Zsh
- GitHub Star:106,000
 - https://github.com/ohmyzsh/ohmyzsh
 
我们都知道,Linux 默认终端配置的是 bash,但是,自从 Oh My Zsh 横空出世后,不少开发者都将 bash 换成 Oh My Zsh 了。
究其原因,主要是因为 Oh My Zsh 上面提供了非常强大的插件系统,不少插件用上之后,能够大幅提升生产力。
当然,最主要的原因,还是因为 Oh My Zsh 的界面太酷炫了,装上之后简直逼格满满。
如果用这款终端的水友比较多,我们会考虑后面在公众号出一期专题文章,专门讲讲上面都有哪些比较好用的插件。
4.4 Coding Interview University
- GitHub Star:104,000
 - https://github.com/jwasham/coding-interview-university
 
这个项目此前我们也在 GitHubDaily 公众号上分享过,该项目作者 John 为了希望获得进入 Google 工作的机会,投入了大量精力去学习。
学习过程中,他接触到了大量与编程相关的知识与教学资源,秉着前人栽树后人乘凉的精神,John 在 GitHub 上开源了这份学习指南。
最后,虽然 John 没去成 Google,去了 Amazon,但他开源的这份资源让无数开发者受益匪浅。
John 的个人成长与学习经历也颇为精彩,感兴趣的同学,可看我们之前的分享过的这篇文章:
GitHub 标星 8w!学完这份指南后,你就可以去 Google 面试了!
4.5 Gitignore
GitHub Star:97,100
相信大部分初用 Git 的工程师,都有着一个苦恼,每次都得针对不同项目、不同语言类型来重复写 .gitignore,以忽略一些无需纳入 Git 管理的文件。
这个项目诞生的意义,就是帮工程师解决这个问题的。每次你需要为项目创建 .gitignore 文件时,只需要打开这个项目,针对你当前所用编程语言或框架,去寻找对应 .gitignore 模板替换即可。
如果你觉得挨个模板查阅很费劲,这里再跟大家推荐一个网站:gitignore.io。
支持一键搜索你所需的 gitignore 模板。
4.6 System Design Primer
- GitHub Star:86,200
 - https://github.com/donnemartin/system-design-primer
 
学习如何设计可扩展的系统将会有助于你成为一个更好的工程师。
系统设计是一个很宽泛的话题。在互联网上,关于系统设计原则的资源也是多如牛毛。
这个仓库就是这些资源的组织收集,它可以帮助你学习如何构建可扩展的系统。
4.7 Public API
GitHub Star:73,100
这个项目收集了一些可用在 Web 或软件开发的开放 API 接口。
其中包含动画、音乐、书籍、新闻、游戏等多个不同领域的开放 API。
如果你觉得文档看起来不够直观,没关系,小 G 再给你推荐个网站,让你可以直接一键搜索查询开放的 API。
4.8 The Art of Command Line
GitHub Star:70,100
对于工程师来说,用好命令行能剩下我们不少开发时间,大大解放生产力。
如果你想学好命令行,除了看《鸟哥的私房菜》,还可以看看这个项目。
该项目主要总结一些命令行使用的技巧,内容覆盖面广包括基础、日常使用、文件及数据处理等等,且还给出了具体最常用的例子,无论你是新手还是具有经验的人都值得学习下。
目前该项目已提供多国翻译版本,即使你看英文比较吃力,也不用过于担心。
4.9 Developer Roadmap
- GitHub Star:98,600
 - https://github.com/kamranahmedse/developer-roadmap
 
GitHub 之前爆发过一波热潮:技术路线图。
4.10 JavaScript 算法和数据结构
GitHub Star:64,700
算法与数据结构一直是另工程师颇为头疼的问题。因此,不少工程师在 GitHub 上开放了不少诸如 x-algorithms 的算法与数据结构仓库,目的就是为了帮助大家更好的学习与攻克这些问题的。
下面推荐的这个仓库,从名称上你也可以看出,其实现代码主要还是以 JavaScript 为主。
5. 技术类速查表
你能很轻松的从上面找到具体某项技术的快捷命令与基础语法,用上之后,相信能大幅提升开发效率。
6. Other
执行文件出现lib库缺失问题解决
1. 下面介绍一个memcached执行失败的问提
启动memcached时报错:
1  | error while loading shared libraries: libevent-2.1.so.6  | 
下面给出解决办法:
1.用ldd命令查看 memcached 命令缺失什么库
1  | [root@Autumn ~]# ldd /usr/local/bin/memcached  | 
2.在安装libevent时,安装结果告诉我们libevent安装在/usr/local/lib/,可以用locate命令查看:
1  | locate libevent-2.1.so.6  | 
如果没有安装locate,请查看:yum安装locate命令。
3.查看 memcached 查找依赖库的路径:
1  | [root@Autumn ~]# LD_DEBUG=libs /usr/local/bin/memcached -v  | 
发现它查找了search path那一行后面的路径,我们将libevent-2.1.so.6链接到/lib64目录下:
4.链接libevent-2.1.so.6:
1  | $ sudo ln -s /usr/local/lib/libevent-2.1.so.6 /usr/lib64/libevent-2.1.so.6  |