个人学习

产品经理,超级奶爸

0%

上一篇大致介绍了Hexo站点的布局,每个主题的布局结构是不一样的,但是都是类似的,所以明白了Hexo生成站点的原理就能看懂所有主题的布局,这里还是以主题light-ch为例来讲解如何添加一个新的布局resume.ejs

1、在layout文件夹中添加布局文件

想要一个新的布局,要么通过对layout的判断在article.ejs局部模块中修改,要不就是新建一个resume.ejs布局文件,指向另外一个局部模块。这里我选择了后面一种方法,避免混乱。

首先在layout文件下创建resume.ejs文件,里面代码如下:

1
<%- partial('_partial/resume') %>

它指向的是一个局部模块,里面就是想要显示的样式了。把它替换到layout.ejs文件中<%- body %>的位置上就是你的resume页面了。

假如这里替换到<%- body %>的样式也不是我想要的,那么就可以修改layout.ejs文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%- partial('_partial/head') %>
<body>
<header id="header" class="inner"><%- partial('_partial/header') %></header>
<% if(page.layout == 'resume') {%>
<%- body %>
<% }else{ %>
<div id="content" class="inner">
<div id="main-col" class="alignleft"><div id="wrapper"><%- body %></div></div>
<aside id="sidebar" class="alignright"><%- partial('_partial/sidebar') %></aside>
<div class="clearfix"></div>
</div>
<% } %>
<footer id="footer" class="inner"><%- partial('_partial/footer') %></footer>
<%- partial('_partial/after_footer') %>
</body>
</html>

我只想要保留header以及footer的部分,其他的部分我想单独设计,那么如上加个判断条件就行了。当布局为resume的时候,完全按照我的_partial/resume模版样式。那么接下来就是考验设计网页的功底了。

2、resume布局的局部模块

_partial目录下创建resume.ejs局部模块,这里的内容就是想显示的页面布局了,可以发挥自己的设计能力,设计一个漂亮的页面,我的示例代码如下:

1
2
3
4
5
6
7
8
9
10
<div class="resume">
<div class="resume-left">
<img src="/image/avatar/psb.jpg" alt="photo">
<span>Email:</span>
<a href="#">1911986273@qq.com</a>
</div>
<div class="resume-entry">
<%- page.content %>
</div>
</div>

页面结构有了,下面就要添加样式文件了,你可以在source/css/_partial/目录中添加resume.styl,然后在source/css/style.styl中引入(在最后一行加入@import '_partial/resume')就行了。

3、在页面中添加page

通过命令hexo new page resume创建一页,Hexo会自动在根目录下的source文件夹下创建resume文件夹,文件夹下有index.md文件,编辑index.md写上你的简历主要内容。

index.md的前置声明一定要加上layout: resume,不然你的布局就形同虚设了。(如果不设置,默认会是page布局)

 source/
    ├── _drafts/
    ├── _posts/
    ├── resume/
        ├──index.md

然后打开主题light-ch目录下的_config.yml配置文件,在menu下添加一行代码。

menu:
    首页: /
    个人简历: /resume

至此,大功告成,浏览一下个人简历页面。Demo

刚看完Hexo Docs中模版那一部分的时候,很多地方不明白,这里就来谈谈Hexo的站点是怎么生成的?布局指的是什么?了解了这些,就可以对你的站点布局『为所欲为』了。

Every templates apply to layout template by default.
每个模板都默认使用layout布局。

阅读全文 »

背景

CentOS上搭建meiupic图床(一个PHP写的开源相册),之前也搭建过PHP的LNMP环境,但是那是很长时间的事了,并且当时使用的是Ubuntu Server版本服务器。本以为很快就搭建OK,却还是折腾了一晚上,真是惭愧…

一、CentOS配置网络

本是一件多简单的事,不就是在配置文件/etc/sysconfig/network-scripts/ifcfg-eth0里写入下面这几行配置嘛。

DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes

ipaddr=192.168.1.123
netmask=255.255.255.0
gateway=192.168.1.1

可是还真是奇了怪了,一重启,IP就自动变了,随机分配了。明明配置的是静态IP啊。耗了我老长时间找原因了,最后照着书上一个一个校对,最后发现把ipaddrnetmaskgateway都改成大写的就行了。。(PS. 记得在Ubuntu上没有区分啊,难道我记错了~郁闷)

二、Nginx

1、安装

教程很多,贴一条备用,没准哪天又忘了怎么编译安装了。以前在Ubuntu上都是直接sudo apt-get install nginx,可是在CentOS里貌似默认没有,学会编译安装nginx还有必要的。而且编译安装的版本使用起来有一些差异。

Nginx安装

注意点:

  • pcre不要选择最新版pcre2,选择pcre2会报错,有能力解决者可以自行选择;
  • 源码全部下载在/usr/local/src/目录下,便于管理。

2、使用

重新启动service nginx restart?No,No,No,别被自动安装的软件惯坏了,nginx应该这么用。

  • /usr/local/nginx/nginx 启动主程序,安装目录下运行nginx,我的版本是1.7,其他版本nginx执行文件也许不在nginx目录下
  • /usr/local/nginx/nginx -s reload 重新加载
  • /usr/local/nginx/nginx -s stop 停止

当然不想输入那么长的路径也行,创建一个快捷方式,如果还是想使用service命令也行,在/etc/init.d目录下创建快捷方式。命令如下:

cp -s /usr/local/nginx/nginx /etc/init.d/

三、MySQL设置root密码

安装MySQL的方法倒是跟之前没两样,偷懒的方法就这样yum install -y mysql*,OK,一股脑全装上了,装完设置root密码方法如下:

方法1: 用SET PASSWORD命令

mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');

方法2:用mysqladmin

1
2
3
mysqladmin -u root password "newpass",
如果root已经设置过密码,采用如下方法:
mysqladmin -u root password oldpass "newpass"

方法3: 用UPDATE直接编辑user表

mysql -u root
mysql> use mysql;
mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';
mysql> FLUSH PRIVILEGES;

在丢失root密码的时候,可以这样

mysqld_safe --skip-grant-tables&
mysql -u root mysql
mysql> UPDATE user SET password=PASSWORD("new password") WHERE user='root';
mysql> FLUSH PRIVILEGES;

瞅一眼密码啥样…

四、php+nginx配置

这次花费最长的时间就是这块了,之前基本没怎么接触过PHP开发,php的开发环境更是半知不解。其实这次搭建完也是半知不解。

想要nginx解析php文件,那么需要安装php-fpm,它是个啥?

FastCGI Process Manager:FastCGI进程管理器,fpm能根据访问的压力动态的唤起cgi进程和销毁以到达动态的调整cgi数量,这样可以有效的使用内存。

跟着yum install php*命令,全安装上了。

接下来就是配置nginx了,使其能够解析并转发meiupic开源相册,我将相册源代码解压到了/usr/www/目录下了,然后就是配置nginx了,打开nginx配置文件,vim /usr/local/nginx/nginx.conf,找到http下的server区域,改成如下:

...此处省略
http {
    ....
    server{
        listen    8080;
        server_name    192.168.1.123;
        location / {
            root    /usr/www;
            index    index.php;
        }
        location ~ \.php$ {
            root    /usr/www;
            fastcgi_pass    127.0.0.1:9000;
            fastcgi_index    index.php;
            fastcgi_param    SCRIPT_FILENAME    /scripts$fastcgi_script_name;
            include    fastcgi_params;        
        }
    }
}
...省略若干

listen端口,我将默认的80改成了8080,server_name改成本机的IP,root改成php开源项目的源代码目录,然后最重要的那段php的配置当然不是我写的,只是将默认对PHP的配置注释给去掉了,改一下root就完事了。

好了,迫不及待的想试一试了。依次检查各种服务是否正常,nginx、mysql、php-fpm….启动了的重启一下,没有启动的启动一下。

service mysqld restart  
service php-fpm restart  
/usr/local/nginx/nginx -s reload  

OK ~浏览器运行http://192.168.1.123:8080,第一次嘛,必然是没有反应的。出现问题并不可怕,主要是要知道怎么找原因。

  1. 首先想到的就是网络是否通,主机ping 192.168.1.123,OK!
  2. 然后测试页面是否从服务器返回了,很显然在主机上测试是没有返回页面,而不是返回404。那么测试一下在虚拟机中是否返回页面了,没有浏览器怎么玩?没事,curl 192.168.1.123:8080,抓取页面代码。返回了。

好了,原因找到了,网络是通的,而页面无法访问,可是本地可以访问,这么一讲,就知道是防火墙的问题了。

五、设置防火墙

防火墙的配置是Linux运维的重点内容,CentOS默认只开通了22端口的访问配置。这里我们需要开启端口8080,亦或是关闭了它(当然不建议这么做)。

教程很多,或是直接看man iptables,你会学到很多。关于防火墙的配置文件是/etc/sysconfig/iptables,学习就靠自己了。

关闭的方法:service iptables stop

OK,设置好防火墙后,又是一系列重启服务操作,然后浏览器访问,这次不报错了,可是File Not Find,what’s the fuck!

六、fastcgi_params

最后找到就是fastcgi_params配置的问题,中间寻找答案的艰辛就不多说了,这里记下,给自己提个醒,同时给新人指路。我也是从前人那里找到的答案。

nginx调用php-fpm出错解决方法和nginx配置详解

问题就在上面nginx配置文件中的的这两句:

1
2
fastcgi_param	SCRIPT_FILENAME	/scripts$fastcgi_script_name;
include fastcgi_params;

解决方法有两种(其实是一个意思):

  1. 把第一句改成如下:
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  2. 或者把第二句改成如下:
    include fastcgi.conf

为什么说一样,可以自行查看一下,nginx安装目录下,fastcgi_param以及fastcgi.conf这两个文件的内容差异。

vim -O /usr/local/nginx/fastcgi_params /usr/local/nginx/fastcgi.conf

解决完这个问题后,又是一堆服务的重启,然后浏览器打开http://192.168.1.123:8080,OK,运行安装程序了。

七、安装meiupic

目录权限问题,到/usr/www目录下,设置一下,各个文件目录的访问权限。如果嫌麻烦,直接chmod 777 /usr/www/*,到这里基本就完成了。

忘记root登录密码,怎么办?

  1. 开机出现GRUB引导程序时,按e编辑GRUB引导参数
  2. 选择以kernel开始的行按e进行编辑
  3. 在kernel行末尾加上single后回车,按b启动系统进入单用户模式
  4. 在单用户模式下输入命令passwd root,输入两次密码
  5. 修改成功,shutdown -r now重启系统
  6. 新密码登入,成功。
  • history命令显示所有命令记录,然后通过!命令编号调用该命令
  • 清屏命令大家都知道clear,还有一个快捷键更方便——ctrl+l
  • Vim普通模式下输入ZZ,可以实现保存并退出文档
  • echo "hello123" | passwd --stdin jack 通过管道为用户jack设置密码
  • uptime 监控CPU使用情况

一、ACL访问控制权限

两个命令:getfaclsetfacl

  • getfacl 查看文档的ACL权限
  • setfacl 设置文档ACL权限
    • -b 删除所有附加的ACL条目
    • -k 删除默认的ACL
    • -m 添加ACL权限
    • -x 删除指定的ACL条目
    • -R 递归处理所有的子文件与子目录

示例

  • getfacl 2.log 查看文档2.log的ACL权限
  • setfacl -m u:user01:rw 2.log 添加ACL条目,使用户user01对2.log文件可读可写
  • setfacl -m g:group01:r 2.log 使用户组group01对文件2.log有可写权限
  • setfacl -x u:user01 2.log 删除用户user01的ACL条目
  • setfacl -x g:group01 2.log 删除组的权限
  • setfacl -b 2.log 清除文件2.log所有ACL权限

二、磁盘分区

之前在一篇笔记里已经介绍了fdisk命令的用法,这里就不重复了,这里说一下另外两个命令partprobeparted

  • partprobe /dev/sdb 让内核立即读取新的分区表,无需重启电脑就可以识别新创建的分区
  • parted GPT分区方式,不同与传统的MBR分区(使用fdisk

三、开机启动

学习开机启动命令,先要了解Linux的6种运行级别。

  • 0 关机模式
  • 1 单用户模式
  • 2 无NFS(共享服务)网络的字符界面模式
  • 3 全功能字符界面模式
  • 4 暂时未定义使用
  • 5 图形模式
  • 6 重启模式

通过runlevel命令可以查看当前所处的运行级别。服务器版本的Linux一般都是3级别,通过init命令可以改变当前的运行级别,如init 0命令可以直接关机.

好了,可以进入正题了,如何设置开机启动呢?使用命令chkconfig,用法如下:

  • chkconfig --list 查询系统服务运行级别信息
  • chkconfig --level 指定操作的运行级别,不指定级别时默认为2,3,4,5级别
  • 实例:
    • chkconfig --list sshd 查看sshd命令的运行级别
    • chkconfig sshd on 设置sshd服务在2.3.4.5级别开机启动

四、内存和硬盘使用情况

1、内存使用

内存的使用情况查看命令,应该很熟悉了,那就是free,但是你真的知道显示出来的各个数据都代表的是什么意思吗?至少之前我是没怎么去了解。

每次看的时候,也就扫了一眼,总共498M,用了263M,还剩235M,就完事了。其他的数据就没怎么看了,这里简单介绍一下其他数是什么含义。

在Linux开机后就会预先提取一部分内存,并划为buffer与cache以供进程随时使用。第一行的used就是这部分内存数263,而后面的buffers代表的是buffer使用剩余的内存数65,cached就是cache剩余的内存数145。那么buffer和cache用了多少呢?第二行中used就是buffer和cache使用的内存数51,那么就有等式263=65+145+51,接下来446系统总剩余的内存数,为分配的有235,分配了但是没有用完的有65+145,那么446=65+145+235

细心的读者也许一眼就看出了,等式根本不等嘛!别着急,换成字节单位,你再算算!至于原因就很明了了

2、硬盘使用

这里就补充两点。

1、df -hTT的参数代表显示文件系统

2、df -ii代表的是磁盘inode使用量信息

这里可以看出根分区还剩下313077个inode节点,也就是说如果在更分区下创建313077个空文件,那么就算该磁盘还有容量也再也容不下新增文件了。

五、网络

1、网络参数设置

有两种方式设置网络参数,一是通过命令行设置;二是通过修改参数文件。

命令行设置不外乎ifconfigroute这两个命令,具体使用可以自行查询帮助文档,这里介绍一下修改参数文件来设置网络。

网络的参数文件在/etc/sysconfig/network-scripts/ifcfg-<iface>,其中iface为网卡接口名称。如果只有一块以太网网卡,则一般为ifcfg-eth0,文件有一下字段:

  • DEVICE 设备名称 eh0,eth1...
  • TYPE 设备类型 ethernet
  • BOOTPROTO 启动协议 none|dhcp|static
  • HWADDR 硬件地址 MAC地址
  • NM_CONTROLLED 网卡是否可以被NetworkManager控制 yes|no
  • ONBOOT 开机是否启动该网卡 yes|no
  • ONPARENT 真实接口启动后虚拟接口是否启动 yes|no
  • IPADDR IP地址
  • PREFIX 网络位掩码个数
  • NETMASK 子网掩码
  • GATEWAY 默认网关
  • DNS{1,2} DNS服务器

如我网卡eth1设置静态IP,配置如下图

2、网络故障排错

这块主要介绍5个命令,pingtraceroutenslookupdignetstat

ping 非常常用的命令,测试基本如下步骤

  1. ping 127.0.0.1 ping本地回环,测试本地网络协议是否正常
  2. ping 192.168.1.101 ping本地IP,测试本地网络接口是否正常
  3. ping 192.168.1.1 ping本地网关,测试网关是否正常工作
  4. ping 61.135.169.121 ping外部网络,测试服务商网络是否正常工作
  5. ping www.baidu.com ping网址,如果上述都正常,而这步ping不通,那么肯定是DNS的问题了

traceroute 跟踪数据包的路由过程

nslookup 检测本地设置的DNS服务器工作是否正常

nslookup www.baidu.com 检测本地DNS服务器是否能解析到百度,本地设置的DNS服务器是8.8.8.8,检测到百度对应的两个IP地址

dig 查看更多关于DNS记录的信息

dig www.baidu.com 能显示比nslookup更详细的信息

netstat 网络监控命令
该命令比较强大,可以自行查看帮助文档学习,netstat -nutlp 查看当前系统开启端口信息。

之前一直觉得vim插件好复杂的,太多了,也不知道装哪些好,怎么使用,在这里我简单整理了一下vim的一些常用的插件安装及基本使用,给自己做一个备份,同时给大家做一个参考。

1、SuperTab

SuperTab使键入Tab键时具有上下文提示及补全功能。如下图
SuperTab_1

这个插件的安装比较简单,按以下步骤:

  1. 下载插件,进官网下载,请点击这里
  2. 用Vim打开下载的supertab.vmb文件,比如我下载到了Home目录下Downloads文件夹里,于是使用命令vim ~/Downloads/supertab.vmb打开文件
  3. 打开后,直接敲命令:UseVimball ~/.vim,出现下图所示
    SuperTab_2
  4. 打开vim配置文件,vim ~/.vimrc,在最后加上一行内容

    let g:SuperTabDefaultCompletionType=”context”

  5. OK了,可以拿tab键去尝试了

2、Vundle

插件管理器,方便安装Vim众多插件。

插件管理器的安装方法官方README文档都有,建议直接看文档安装,点击标题进入。鉴于是英文的,这里还是简单的说明一下安装步骤:

  1. 下载Vundle

     mkdir -p ~/.vim/bundle
     cd ~/.vim/bundle
     git clone https://github.com/gmarik/Vundle.vim.git

    没有.vim目录的先创建目录,git下载克隆插件到.vim的bundle目录下
    Vundle_2

  2. 配置各种插件,根据说明文档,敲入下面代码到.vimrc配置文件中就OK了
    Vundle_3
    其实官方说明中,默认给装了很多插件,它是为了教你如何装各种来源的插件,故代码有些长,如下图。

    Vundle_4

这样Vundle这个插件管理器就安装完了。下面紧接着介绍如何用它来安装插件。

3、Syntastic

根据名字,也能大概猜出它是一个语法检测的插件,变量类型写错了、句末分号忘加了(针对需要加分号的语言)等等语法错误都能自动检测出来。如下图所示。
Syntastic_1

这个插件代码是托管在Github上的,点击上面标题进入github地址,按照它的安装说明是需要装一个叫pathogen的插件管理器。但是这里我不这么装,因为个人觉得Vundle更加方便,再说插件管理器之前已经装过了,先入为主嘛。有了插件管理器,下面安装就简单了。

  1. .vimrc文件中加入一句

    Plugin ‘scrooloose/syntastic’

    Syntastic_3

  2. 保存退出,进入vim,输入:PluginInstall,等待下载安装完成
    Syntastic_4

OK,安装插件就是这么简单,保存文件时就会出现错误语法提示,如图有3处错误,光标定位到哪行,下面就显示该行错误提示。
Syntastic_2

4、Auto Pairs

一款简单的括号匹配插件。一件让程序员们抓狂的事是:我是不是少加了最后一个括号?为了处理这个问题,Auto Pairs 这个插件会自动插入和格式化方括号和圆括号。

有了上面的插件管理器Vundle,安装这个插件那就太简单了。将下面这行代码加入.vimrc文件中。

Plugin ‘jiangmiao/auto-pairs’

如图所示
Auto-pairs_1
最后在vim界面上,运行:PluginInstall,等待,大功告成。使用的话,自己去实际中体验吧。也可以点击标题查看说明文档

5、NERD Commenter

如果你在找一个可以支持多种程序语言的注释代码的快捷键,你可以试试 NERD Commenter。即使你不是程序员,也非常非常推荐这款插件,因为它会让你在注释bash脚本或者其他任何东西的时候都会变得非常高效。

使用Vundle插件安装器,安装方法简单到我都不想介绍了,老规矩,在.vimrc中加入下面一句。

Plugin ‘scrooloose/nerdcommenter’

OK了,运行vim,:PluginInstall,真正的轻松拥有。

nerdcommenter_1
使用很简单,但是也得看看官方Usage,不过一般只用到几个就行了,比如

  • \cc 注释当前行
  • \cu 撤销注释行
  • \cs sexily注释,C语言注释效果如上,不过我没看出哪里性感了
  • \cA 行尾注释,切换成输入模式

别看这个插件功能比较简单,但是强大之处就是可以用相同的方法给不同的语言添加注释,比如,bash是#,java是\\等等,很方便,居家旅行必备品。

还有一个插件叫Nerdtree,从名字上可以看出它俩应该是兄弟,同一个开发者开发的。下面紧接着就介绍它。

6、Nerdtree

nerdtree_1
它是一个文件浏览器,管理项目的时候,需要在不同的文件夹中编辑不同的文件代码,那么有了这个插件,你就方便了,不用来回的切换目录了,这样的Vim看起来有点像IDE了。

安装就不多说了,再讲就显得啰嗦了。Github地址请点击标题。它的使用可能需要介绍下,有些插件装完就能用,但是有些还是需要记点快捷键的,至少这个就不会像SuperTab一样简单使用。

进入vim输入:NERDTree默认打开当前目录,当然可以打开指定目录,如:NERDTree /home/打开home目录,完事后敲?,直接显示帮助。下面列出常用的快捷键:

  1. jk分别下、上移动光标
  2. o或者回车打开文件或是文件夹,如果是文件的话,光标直接定位到文件中,想回到目录结构中,按住Ctrl,然后点两下w就回来了
  3. go打开文件,但是光标不动,仍然在目录结构中
  4. is分别是水平、垂直打开文件,就像vim命令的:vs:sp一样
  5. gigs水平、垂直打开文件,光标不动
  6. p快速定位到上层目录
  7. P快速定位到根目录
  8. KJ 快速定位到同层目录第一个、最后一个节点
  9. q 关闭

总结

在这里介绍了6个插件的安装及用法,可以发现一些共性

  1. 下载。大部分插件都是在Github上下载的
  2. 安装。通过插件管理器,安装插件的方式都是一样的
  3. 用法。或看Usage,或:h PluginName查看帮助文档都可以了解它的用法

知道以上三点,差不多就掌握了vim插件的安装与使用了,接下来就是练习了。还有一些插件,诸如Snipmate、Tag List、undotree、gdbmgr、Ctags等,可以自行搜索学习。

欢,迎

激动,盼望

祝贺你,到此校

新的开始,新的希望

美丽的校园,美好的生活

昨日夕阳虽美,明日初阳更甚

放飞梦想的天空,寄予希望的殿堂

拼搏于知识的海洋,翱翔在生活的天空

只要你努力奋斗,成功会对你微笑

聪明在于学习,天才在于积累

多彩的生活,精彩的人生

新的一生,新的未来

愿幸福,伴一生

充实,美满

此,敬

前提

在Linux系统上操作文件,避免不了要使用vim编辑器,传说中的编辑器之神。

我感到非常的惭愧,很长一段时间,我总是觉得使用vim的时候是那么的力不从心,甚至觉得哪有传说中的那么神奇?那是因为我从来没有完整学习过vim,甚至是没有完整看过一遍:help,总觉得一个编辑器有这个必要吗?

平常只是使用vim修改个配置文件什么的,知道h|j|k|l还有io等插入不就行了嘛,直到最近,编写了一些代码才发现,vim不应该这么难用,怎么可能想修改一个字符,要先x删掉,然后i插入,最后esc退出,我觉得肯定有更快捷的方法,不然怎么配上叫“编辑器之神”的称号。

在这里没有高端的使用方法,没有各种牛X插件的介绍,这是非常基础的常用使用技巧,我只是将这些常用的使用技巧做了一个简单地总结,如果其中有一条技巧帮助到了你,那么我就会觉得非常欣慰了。

1、移动

知道h|j|k|l是”左下上右”是远远不够的,还要知道下面这些字符,熟练使用他们会大大提升编辑效率。

  • w 当前光标位置__直到__下一个单词起始处,不包括第一字符

  • e 当前光标位置__直到__单词末尾,包括最后一个字符

  • $ 前光标位置__直到__行尾,包括当前光标位置

  • 0 当前光标位置直到__行首,不包括当前光标位置。__注:这是数字0

  • G 直接跳到文件最后一行

  • gg 直接跳到文件第一行

  • #G 跳到指定的行号数,#代表行号,比如12G直接跳到12行处

    显示行号请使用设置命令:set nu

一定要注意上面解释的用语

  • 直到:它是一个范围,从光标处到下一个光标处的一个范围
  • 包括不包括:可以这么说,移动的路径中是否包括某个位置,为什么这么咬文嚼字,不就是移到下一个单词处或是哪一行嘛,接着往下看,你就会知道原因。

2、删除

可能被了解最多的就是dd命令了吧,它是指删除一行,要删除多行的话,就要加上数字number dd,比如2dd删除两行(包括当前行),如果你想删除一段程序中的一个函数,不知道你会不会先去数一数或是计算一下这个函数有多少行?我就这样干过好长时间。其实它的本质就是d删除指令,下面看一下删除指令d的基本格式。

d number motion
  • number 代表数字
  • motion 代表移动

多说也解释不清楚,下面看实例,当然最好是准备一个文档跟着我一块练习。

  • d2w number为2,motionw,代表删除两个单词,这里自己练习一下,就会体会到上面说的_移动范围_以及_包括不包括_的意思。
  • d$ 没有numbermotion$,代表直接删到行尾,包括当前光标位置。
  • d5G 没有numbermotion5G,删除当前行到第5行之间的内容,包括第5行。
  • dG 没有numbermotionGG代表什么?代表跳到最后一行对不对,那么dG呢?对了,删掉当前行到最后一行内容,包括最后一行。
  • dgg 这个不用解释了吧,呵呵

上面只是举了几个特殊的例子,现在你可以大胆的去拿d命令和移动命令组合了,当你明白了其中的道理,你会发现,何必要用2dd去删除两行呢,使用dj不是更快嘛。你甚至可以通过ggdG来删除全文,所以千万不要去尝试去记住所有的命令,你要记住的只是几个字母而已,哈

3、更改

更改的命令是c,道理完全同删除命令d一样,格式用法都是一样的,不一样的是,c命令会从正常模块直接进入编辑模式。

  • cw 修改一个单词,这里同ce效果一样,结合上面的内容,自己体会一下为什么。
  • c$ 更改从当前光标到行末,还有c0c2w等等命令就不再介绍了,到这里相信你也理解了,而无需我再重复介绍了。

在这里你就会发现,xi命令貌似和cl命令一个意思,都是删掉一个字符,然后进入编辑模式进行替换。我觉得还是挺麻烦的,仅仅为了修改一个字符,就要进入编辑模式,改完了还得esc退出编辑模式,这么做vim都觉得委屈。

还是接着学习吧……

4、字符替换

替换命令,也许你都想到了是什么,删除是d,更改是c,替换当然是r啦,哈哈,对了,就是r,看到没有,大神们就是怕你记不住,根本不用你去记。

好了,穿越到上面的问题去,我现在就想修改一个字符,有没有更快的方法,别让我来回esc了,比如就想将vaid中的a改成o,那么你可以将光标停在字母a上,然后按下替换命令r,接着输入字母o就行了,整个过程完全不用切到编辑模式,而直接替换了字符。

r只是替换一个字符,如果你输入R就可以一直在替换模式,直到按下esc退出为止。

5、复制粘贴

复制命令是y,格式同dc一样,在其后加入移动命令就可以复制指定内容了。下面也只是简单两个例子。

  • y2w 复制两个单词

  • ggyG 复制全文,先用gg命令跳到首行,然后yG,从首行复制到最后一行,就复制全文了。

    d命令类似,yy代表复制当前行,2yy代表复制两行,既然复制完了,如何粘贴呢?

    使用命令p就行了,其实p命令的本质是将vim的寄存器中的内容粘贴出来,这样一讲,你就会明白,剪切该怎么做,剪切不就是删了再粘贴出来吗,使用d命令就可以了,其实vim会把删除的内容存到寄存器中,然后你通过p命令粘贴,就达到了剪切的目的。

    大写Pp的区别只是一个是粘到前面,一个粘到后面而已。

6、搜索匹配

搜索单词hello,在正常模式下输入:/hello就行了,n向下搜索,N向前搜索。

想忽略大小写进行搜索,输入设置命令:set ic就可以了。

7、匹配替换

匹配替换就是word里面的替换功能,如果全篇的void都写成了vaid,总不能一个一个修改吧,于是就有了匹配替换功能。

  • :s/old/new/g 将所在行的old替换成new
  • :%s/old/new/g 整个文件范围内进行替换
  • :%s/old/new/gc 找到每个匹配串,并对每个匹配串提示是否进行替换
  • :#,#s/old/new/g 在若干行范围类进行替换,#代表行号

8、撤销与重做

这里我只想提上一句,撤销命令是u,也就是undo;重做命令为ctrl-r,好了,知道这些够用了。

9、文件

还有一些关于文件操作的小技巧,就总结到下面了

  • :#,# w filename 选择性保存,如:13,14 w filename将文件中13行,14行另存到filename文件中
  • :r filename 插入外部文档,将filename文件内容插入到光标所在下方

10、插入命令

为什么把最基础的命令留到了最后,因为前面的内容实在太精彩了。

  • i&I 光标前插入 & 光标所在行行首插入
  • a&A 光标后插入 & 光标所在行行尾插入
  • o&O 下一行插入 & 上一行插入

结束语

好了,基本上,你现在可以熟练操作vim编辑器了,你会发现肯定比普通编辑器要厉害多了,但是要想达到IDE的效果,那你还得继续努力,学习vim更为强大的命令以及插件。

学会这些命令,你就可以熟练的使用 Git 工具了,什么?想精通,那是不可能的。
基本上,Git 就是以下面的命令顺序学习的。文中笔记是从廖雪峰老师的Git 教程中总结出来的,方面查阅命令。详细原理请看Git教程

1、基础

  • git config --global user.name "Your Name"设置你的仓库用户名(用于标识提交者)
  • git config --global user.email "email@example.com"设置你的仓库邮箱(用于标识提交者)
  • git init 初始化一个git仓库
  • git add --all 添加所有更改的文件
  • git add filename1 当然可以指定添加filename1
  • git commit -m "commit message" 添加更改的信息,必须要有,不然报错,不建议不加。
  • git status 查看git当前状态
  • git diff filename1 查看filename1到底修改了哪些内容
  • git log 查看最近的提交日志
  • git log --pretty=oneline 单行显示提交日志
  • git reset --hard commitID 利用git log得到的commitID返回版本
  • git reset --hard HEAD^回到上一个版本
  • git reflog 查看命令的历史,可以找到git log看不到的commitID,因为git log只显示当前的提交日志,如果你提交了一次,退回版本后又后悔了,就能查看上次提交的commitID
  • git checkout -- filename1 利用版本库中的版本替换工作区中的文件。功能有2:
    • 撤销文件修改,分两种情况:
      • 撤销工作区中的修改(没有使用git add命令添加到暂存区)
      • 撤销暂存区中的修改(添加到了暂存区又做了修改)
    • 找回删除的文件
      • 工作区中文件误删了,可以通过此命令从版本库中找回
  • git reset HEAD filename1 撤销add,回到工作区
  • git rm filename1 删除文件
  • git remote add origin https://github.com/pengloo53/learngit.git 将本地库关联到github远程库上
  • git push -u origin master 第一次推送的时候要加上-u参数,可以将本地库的master分支与远程库的master分支关联起来;下次提交就不需要加-u了。
  • git clone https://github.com/pengloo53/learngit.git 克隆远程库到本地

2、分支管理

  • git checkout -b dev创建dev分支并切换到dev。相当于git branch devgit checkout dev两条命令。
  • git branch查看当前分支
  • git merge dev合并指定分支到当前分支,如,你现在master分支,那么执行命令就将dev分支合并到了master分支上。
  • git branch -d dev删除dev分支
  • git log --graph --pretty=oneline --abbrev-commit查看分支合并图
  • git merge --no-ff -m "merge with no-ff" dev禁用「Fast forward」,也就是保留分支的相关信息。
  • git stash 将工作区现场储藏起来,等以后恢复后继续工作。通常用于处理更为着急的任务时,例如:bug。
  • git stash list 查看保存的工作现场
  • git stash apply恢复工作现场
  • git stash drop 删除stash内容
  • git stash pop 恢复的同时直接删除stash内容
  • git stash apply stash@{0} 恢复指定的工作现场,当你保存了不只一份工作现场时。
  • git branch -D feature-vulcan 强行删除分支。用于不需要合并,就地删除的情况。
  • git remote 查看远程库的信息,一般返回origin。
  • git remote -v 查看远程库的详细信息。
  • git push origin master 将本地master分支推送到远程master分支。
    • master分支为主分支,因此要时刻与远程同步;
    • dev分支为开发分支,团队成员都需要在上面工作,所以也需要与远程同步;
    • bug分支只用于在本地修复bug,没有必要推送到远程;
    • feature新功能分支是否推送到远程,取决于你是否和其他人合作在上面开发。
  • git clone https://github.com/pengloo53/learngit.git 将远程库克隆到本地,默认只能看到master分支。
  • git checkout -b dev origin/dev 创建远程dev分支到本地
  • git pull 将远程分支的最新内容抓取下来。
  • git branch --set-upstream dev origin/dev将本地dev分支与远程dev分支之间建立链接。
  • 删除远程分支:
    • git push origin :<BranchName>
    • git push origin --delete <BranchName>
    • git branch -r -d origin/<BranchName>

多人协作工作模式

  1. 首先,可以试图用git push origin branch-name推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并(如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name);
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

3、标签管理

  • git tag v1.0 给当前分支打上标签
  • git tag 查看所有的标签,按时间顺序列出。
  • git log --pretty=oneline --abbrev-commit缩略commitID并单行显示提交信息
  • git tag v0.9 commitID通过上一条命令查看commitID,然后打上标签。用于忘记打标签的情况,因为标签其实就是只想某个commitID的指针,默认情况下,标签打在最新的提交上。
  • git show v0.9 查看标签信息。
  • git tag -a v0.1 -m "version 0.1 released" commitID创建带有说明的标签,-a指定标签名,-m指定说明文字。
  • git tag -d v0.1 删除标签v0.1
  • git push origin v1.0 推送标签1.0到远程
  • git push origin --tags 推送所有的标签到远程
  • git push origin :refs/tags/v0.9 删除远程标签,但是前提是要先在本地删除对应标签。

4、自定义Git

  • git config --global color.ui true 让Git显示颜色
  • .gitignore在这个文件里编辑你要忽略的文件,并提交到Git中,就可以忽略特殊文件的检查。如将*.db写入.gitignore文件中,将忽略所有db文件。可以参考github收集的所有.gitignore
  • git config --global alias.st status将status的别名设置成st,那么git st=git status
  • git config --global alias.unstage 'reset HEAD' 那么git reset HEAD filename=git unstage filename
  • git config --global alias.last 'log -1'git last就显示最后一次提交了。

5、搭建Git服务器

  1. sudo apt-get install git 安装Git;
  2. sudo adduser git 添加Git用户;
  3. sudo git init --bare sample.git 初始化git仓库;
  4. sudo chown -R git:git sample.git修改仓库的所属用户为git;
  5. 将git用户的信息git:x:1001:1001:,,,:/home/git:/bin/bash改成git:x:1001:1001:,,,:/home/git:/bin/git-shell,为了禁用shell登录。
  6. git clone git@server:/director/sample.git 克隆Git服务器上的仓库

PS. 想方便管理公钥,用Gitosis;想控制权限,用Gitolite