前言

最近有不少小伙伴询问我个人主页是如何搭建的,于是便写了这个文章教程,效果如下

[Echo's 个人主页 (liveout.cn)](https://liveout.cn/index/

 

项目地址

https://github.com/Tomotoes/HomePage

 

教程

1. 安装 node.js

首先,node.js 是啥子呢?这里简单解释下

Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。

科普地址:Node.js 教程 | 菜鸟教程 (runoob.com)

ubuntu 安装命令如下

sudo apt-get install -y nodejs

centos 安装命令如下

yum install -y nodejs

查看安装是否成功

node -v
//如果成功
v10.19.0

 

2. 安装 git

git 又是啥子呢?

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

科普地址:Git 教程 | 菜鸟教程 (runoob.com)

ubuntu 安装命令如下

sudo apt-get install git

centos 安装命令如下

yum -y install git-core

查看安装是否成功

git --version
//如果成功
git version 1.8.1.2

 

3. 部署项目

既然相关工具已经下载完成,下面就开始搭建吧!

首先通过 git 拉取项目仓库 (个人建议切换到opt目录)

//切换到opt目录
cd /opt

//拉取仓库
git clone https://github.com/Tomotoes/HomePage.git

拉取完成后进入项目目录

//进入项目目录 HomePage
cd HomePage

//npm 安装 Node.js 模块
npm install
npm run dev

进入目录后需要修改 相关配置,如 config.json

更多详细配置修改参考此文档:https://github.com/Tomotoes/HomePage/blob/master/README.zh_CN.md

修改完相关配置信息后执行以下命令

//生成项目文件到 dist 目录
npm run build

然后,你可以将dist目录部署到你喜欢的服务器托管商。

 

如果想通过菜单访问,可以讲dist文件放到博客根目录下面,菜单链接设置如下

https://域名/dist

这里的dist就是主页文件,你可以自己更改其名字,如index

通过 https://域名/index进行访问

 

结语

此教程可能存在相关错误,如有遇到,可进行留言。

 

--> 前言最近有不少小伙伴询问我个人主页是如何搭建的,于是便写了这个文章教程,效果如下[Echo's 个人主页 (liveout.cn)](https://liveout.cn/index/ 项目地址https://github.com/Tomotoes/HomePage 教程1. 安装 node.js首先,node.js 是啥子呢?这里简单解释下Node.js 是一个...

前言

基础算法模板 – Echo's blog (liveout.cn)


并查集

一共有 n个数,编号是 1∼n,最开始每个数各自在一个集合中。

现在要进行 m个操作,操作共有两种:

  1. M a b,将编号为 a和 b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
  2. Q a b,询问编号为 和 b 的两个数是否在同一个集合中;
#include<iostream>
using namespace std;
const int N=100010;
int p[N];//定义多个集合

int find(int x)
{
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) p[i]=i;
    while(m--)
    {
        char op[2];
        int a,b;
        scanf("%s%d%d",op,&a,&b);
        if(*op=='M') p[find(a)]=find(b);
        else
        if(find(a)==find(b))
        printf("Yes\n");
        else
        printf("No\n");
    }
    return 0;
}

 

单调栈

给定一个长度为 N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1−1

#include <iostream>
using namespace std;
const int N = 1e5+10;
int n;
int stk[N], tt;

int main()
{
    cin >> n;
    for (int i=0; i<n; i++)
    {
        int x;
        cin >> x;
        while (tt && stk[tt] >= x) tt--;
        
        if (tt) cout << stk[tt] << ' ';
        else cout << -1 << ' ';
        
        stk[++tt] = x;
    }
    return 0;
}

 

搜索

DFS(排列数字)

给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。

现在,请你按照字典序将所有的排列方法输出。

#include <iostream>
using namespace std;
const int N = 10;
int path[N];
int state[N];
int n;

void dfs(int u) 
{
	if (u>n)
	{
		for (int i=1; i<=n; i++)//数字填完了,输出
			cout << path[i] << " ";//输出方案
		cout << endl;	
	}	
	
	for (int i=1; i<=n; i++)//空位上可以选择的数字为:1 ~ n
	{
		if (!state[i]) //如果数字 i 没有被用过
		{
			path[u] = i;
			state[i] = 1;
			dfs(u+1);
			state[i] = 0;
		}
	}
}

int main()
{
	cin >> n;
	dfs(1);
	
	return 0;
}

 

BFS(迷宫)

给定一个 n×m的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。

最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角 (n,m) 处,至少需要移动多少次。

数据保证 (1,1) 处和 (n,m)处的数字为 0,且一定至少存在一条通路。

#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> PII;
const int N = 110;
int n, m;
int g[N][N]; //迷宫 
int d[N][N]; //每一个点到起点距离 

int bfs()
{
	queue<PII> q;
	memset(d, -1, sizeof d);
	d[0][0] = 0;
	q.push({0,0}); //起点 
	
	int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
	while (q.size())
	{
		auto t = q.front();
		q.pop();
		for (int i=0; i<4; i++)
		{
			int x = t.first+dx[i], y = t.second+dy[i];
			if (x>=0 && x<n && y>=0 && y<m && g[x][y] == 0 && d[x][y]==-1)
			{
				d[x][y] = d[t.first][t.second]+1;
				q.push({x,y}); //下一个点	
			}
		}
	}
	return d[n-1][m-1];
}
 
int main()
{
	cin >> n >> m;
	for (int i=0; i<n; i++)
		for (int j=0; j<m; j++)
			cin >> g[i][j];
	cout << bfs() << endl;
	
	return 0;
}

 

BFS (图中点的层次)

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环。

所有边的长度都是 1,点的编号为 1∼n.

请你求出 1 号点到 n 号点的最短距离,如果从 1 号点无法走到 n 号点,输出 −1。

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5+10;

int h[N], e[N], ne[N], idx;
int d[N]; //存储每个节点离起点的距离  d[1]=0
int n, m;


void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++;	
} 

int bfs()
{
	memset(d, -1, sizeof d);
	queue<int> q;
	d[1] = 0; //存储每个节点离起点的距离
	q.push(1);
	while (q.size())
	{
		int t = q.front();
		q.pop();
		
		for (int i=h[t]; i != -1; i=ne[i])
		{
			int j=e[i];
			if (d[j] == -1)
			{
				d[j] = d[t] + 1; //d[j]存储j节点离起点的距离,并标记为访问过
				q.push(j);
			}
		}
	}
	return d[n];
}

int main()
{
	cin >> n >> m;
	memset(h, -1, sizeof h);
	
	for (int i=0; i<m; i++)
	{
		int a, b;
		cin >> a >> b;
		add(a, b);
	}
	cout << bfs();
	return 0;
}

 

Dijkstra(优化版)

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n号点,则输出 −1。

#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> PII;
const int N = 1e6+10;

// 稀疏图用邻接表来存
int h[N], w[N], e[N], ne[N], idx;
int dist[N]; //1 号点到 n 号点的最短距离
bool st[N]; // 如果为true说明这个点的最短路径已经确定

int n, m;

void add(int x, int y, int c)
{
    // 有重边也不要紧,假设1->2有权重为2和3的边,再遍历到点1的时候2号点的距离会更新两次放入堆中
    // 这样堆中会有很多冗余的点,但是在弹出的时候还是会弹出最小值2+x(x为之前确定的最短路径),
    // 并标记st为true,所以下一次弹出3+x会continue不会向下执行。
	w[idx] = c;
	e[idx] = y; ne[idx] = h[x]; h[x] = idx ++;
}

int dijkstra()
{
	memset(dist, 0x3f, sizeof dist);
	dist[1] = 0;
    
    //首先小根堆是根据距离来排的,所以有一个变量要是距离,
    // 其次在从堆中拿出来的时候要知道知道这个点是哪个点,不然怎么更新邻接点呢?所以第二个变量要存点
	priority_queue<PII, vector<PII>, greater<PII>> heap;
	heap.push({0, 1}); //距离+点  // 这个顺序不能倒,pair排序时是先根据first,再根据second,
	
	while (heap.size())
	{
		PII k = heap.top(); // 取不在集合S中距离最短的点
		heap.pop();
		int distance = k.first, ver = k.second;
		if (st[ver]) continue;
		st[ver] = true;
		
		for (int i=h[ver]; i != -1; i=ne[i])
		{
			int j = e[i]; // i只是个下标,e中在存的是i这个下标对应的点。
			if (dist[j] > dist[ver] + w[i])
			{
				dist[j] = dist[ver] + w[i];
				heap.push({dist[j], j});
			}
		}
	}
	if (dist[n] == 0x3f3f3f3f) return -1;
	else return dist[n];
}



int main()
{
	memset(h, -1, sizeof h);
	cin >> n >> m;
	
	while (m --)
	{
		int x, y, c;
		cin >> x >> y >> c;
		add(x, y, c);
	}
	cout << dijkstra() << endl;
	
	return 0;
}

 

Floyd求最短路

给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。

再给定k个询问,每个询问包含两个整数x和y,表示查询从点x到点y的最短距离,如果路径不存在,则输出“impossible”。

数据保证图中不存在负权回路

#include <iostream>
using namespace std;

const int N = 210, M = 2e+10, INF = 1e9;

int n, m, k, x, y, z;
int d[N][N];

void floyd() {
    for(int k = 1; k <= n; k++)
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}

int main() {
    cin >> n >> m >> k;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            if(i == j) d[i][j] = 0;
            else d[i][j] = INF;
    while(m--) {
        cin >> x >> y >> z;
        d[x][y] = min(d[x][y], z);
        //注意保存最小的边
    }
    floyd();
    while(k--) {
        cin >> x >> y;
        if(d[x][y] > INF/2) puts("impossible");
        //由于有负权边存在所以约大过INF/2也很合理
        else cout << d[x][y] << endl;
    }
    return 0;
}

 

DP

01背包

有 N件物品和一个容量是 V的背包。每件物品只能使用一次

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

#include <iostream>
#include <algorithm>

using namespace std;

const int MAX = 1005;
int v[MAX];
int w[MAX];
int f[MAX];

int main()
{
    int n,m;
    cin >> n >> m;
    for (int i=1; i<=n; i++)
        cin >> v[i] >> w[i];
    
    for (int i=1; i<=n; i++)
        for (int j=m; j>=v[i]; j--)
        {
           f[j] = max(f[j],f[j-v[i]]+w[i]);
        }
    
    cout << f[m] << endl;
    return 0;
}

 

完全背包

有 N种物品和一个容量是 V 的背包,每种物品都有无限件可用

第 i 种物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1010;

int n, m;
int v[N], w[N];
int f[N];

int main()
{
    cin >> n >> m;
    for (int i=1; i<=n; i++) cin >> v[i] >> w[i];
    
    for (int i=1; i<=n; i++)
        for (int j=v[i]; j<=m; j++)
            f[j] = max(f[j], f[j-v[i]]+w[i]);
            
    cout << f[m] << endl;
    
    return 0;
}

 

多重背包问题

有 N 种物品和一个容量是 V 的背包。

第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;

int n, m;
int v[N], w[N], s[N];
int f[N][N];

int main()
{
    cin >> n >> m;
    
    for (int i=1; i<=n; i++) cin >> v[i] >> w[i] >> s[i];
    
    for (int i=1; i<=n; i++)
        for (int j=0; j<=m; j++)
            for (int k=0; k<=s[i] && k*v[i] <= j; k++)
                f[i][j] = max(f[i][j], f[i-1][j-v[i]*k] + w[i]*k);
                
    cout << f[n][m] << endl;
    return 0;
}

 

线性DP(最长上升子序列)

给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
int a[N];
int q[N];

int main()
{
    scanf("%d", &n);
    for (int i=0; i<n; i++) scanf("%d", &a[i]);
    
    int len = 0;
    for (int i=0; i<n; i++)
    {
        int l=0, r = len;
        while (l < r)
        {   //二分
            int mid  = l + r + 1 >> 1;
            if (q[mid] < a[i]) l = mid;
            else r = mid - 1;
        }
        len = max(len, r+1);
        q[r+1] = a[i];
    }
    printf("%d\n", len);
    
    return 0;
}

 

线性DP(最长公共子序列)

给定两个长度分别为 N 和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。

输入格式

第一行包含两个整数 N 和 M。

第二行包含一个长度为 N 的字符串,表示字符串 A。

第三行包含一个长度为 M 的字符串,表示字符串 B。

字符串均由小写字母构成。

输出格式

输出一个整数,表示最大长度。

数据范围

1≤N,M≤1000

输入样例

4 5
acbd
abedc

输出样例

3

代码

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1010;
int n, m;
char a[N], b[N];
int f[N][N];

int main()
{
    scanf("%d%d", &n, &m);
    scanf("%s%s", a+1, b+1);
    
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
        {
            f[i][j] = max(f[i-1][j], f[i][j-1]);
            if (a[i] == b[j]) f[i][j] = max(f[i][j], f[i-1][j-1]+1);
        }
    printf("%d\n",f[n][m]);
    
    return 0;   
}

 

区间DP(石子合并)

设有 N 堆石子排成一排,其编号为 1,2,3,…,N。

每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。

每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。

例如有 4 堆石子分别为 1 3 5 2, 我们可以先合并 1、2 堆,代价为 4,得到 4 5 2, 又合并 1、2 堆,代价为 9,得到 9 2 ,再合并得到 11,总代价为 4+9+11=24;

如果第二步是先合并 2、3 堆,则代价为 7,得到 4 7,最后一次合并代价为 11,总代价为 4+7+11=22。

问题是:找出一种合理的方法,使总的代价最小,输出最小代价。

模板

for (int len = 1; len <= n; len++) {         // 区间长度
    for (int i = 1; i + len - 1 <= n; i++) { // 枚举起点
        int j = i + len - 1;                 // 区间终点
        if (len == 1) {
            dp[i][j] = 初始值
            continue;
        }

        for (int k = i; k < j; k++) {        // 枚举分割点,构造状态转移方程
            dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + w[i][j]);
        }
    }
}

 

#include <iostream>
#include <cstring>

using namespace std;

const int N = 307;

int a[N], s[N];
int f[N][N];

int main() {
    int n;
    cin >> n;

    for (int i = 1; i <= n; i ++) {
        cin >> a[i];
        s[i] += s[i - 1] + a[i];
    }

    memset(f, 0x3f, sizeof f);
    // 区间 DP 枚举套路:长度+左端点 
    for (int len = 1; len <= n; len ++) { // len表示[i, j]的元素个数
        for (int i = 1; i + len - 1 <= n; i ++) {
            int j = i + len - 1; // 自动得到右端点
            if (len == 1) {
                f[i][j] = 0;  // 边界初始化
                continue;
            }

            for (int k = i; k <= j - 1; k ++) { // 必须满足k + 1 <= j
                f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j] + s[j] - s[i - 1]);
            }
        }
    }

    cout << f[1][n] << endl;


    return 0;
}

 

线性DP(数字矩阵和)

小蓝有一个 3 行 6 列的数字矩阵,矩阵中的每个数都是 0 到 9 之间的数字。现在小蓝想从这个矩阵的第一行第一列画一条折线到第 3 行 6 列,线只能沿水平向右走或竖直向下走,只能在有数字的地方拐弯。小蓝想知道,这样一条线经过的数字的和最大是多少。

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 35, M = 65;

int n = 30, m = 60;
char g[N][M];
int f[N][M];

int main()
{
for(int i = 1; i <= n; i ++) scanf("%s", g[i] + 1);

// cout << "?" << endl;

for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
{
f[i][j] = max(f[i - 1][j], f[i][j - 1]) + g[i][j] - '0';
}
cout << f[n][m] << endl;

return 0;
}

 

记忆化搜索(滑雪)

小蓝准备在一个空旷的场地里面滑行,这个场地的高度不一,小蓝用一个 n 行 m 列的矩阵来表示场地,矩阵中的数值表示场地的高度。
如果小蓝在某个位置,而他上、下、左、右中有一个位置的高度(严格)低于当前的高度,小蓝就可以滑过去,滑动距离为 1 。
如果小蓝在某个位置,而他上、下、左、右中所有位置的高度都大于等于当前的高度,小蓝的滑行就结束了。
小蓝不能滑出矩阵所表示的场地。
小蓝可以任意选择一个位置开始滑行,请问小蓝最多能滑行多远距离。

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

const int N = 110;
int n, m;
int g[N][N], f[N][N];
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; //dx上下 dy左右  

int dp(int x, int y) //dfs
{
	int &v = f[x][y];
	if (v != -1) return v;
	v = 1;
	for (int i=0; i<4; i++)
	{
		int a = x + dx[i], b = y + dy[i];
		if (a >= 1 && a <= n && b >= 1 && b <= m && g[x][y] > g[a][b])
			v = max(v, dp(a, b)+1); //dp(a, b)+1 表示从(a,b)到下一个点,中间加一
	}
	return v;
}

int main()
{
	cin >> n >> m;
	for (int i=1; i<=n; i++)
		for (int j=1; j<=m; j++)
			cin >> g[i][j];
			
	memset(f, -1, sizeof f);
	
	int res = 0;
	for (int i=1; i<=n; i++)
		for (int j=1; j<=m; j++)
			res = max(res, dp(i, j));
	cout << res;
}

 

数论

分解质因数

给定 n 个正整数 ai,判定每个数是否是质数。

#include <iostream>
#include <algorithm>

using namespace std;

bool is_prime(int x)
{
    if (x < 2) return false;
    for (int i=2; i<=x/i; i++)
    {
        if (x%i ==  0) return false;
    }
    return true;
}

int main()
{
    int n;
    cin >> n;
    while (n --)
    {
        int x;
        cin >> x;
        if (is_prime(x)) puts("Yes");
        else puts("No");
    }
    return 0;
}

 

判断闰年

#include<iostream>
using namespace std;

int main()
{
	int year;
	cin>>year;	//键盘中输入一个年份,保存到变量year中

	if((year%4 == 0 && year%100 != 0)|| year%400 == 0)//指定是否为闰年的判断条件
		cout<< year << "是闰年" << endl;	//条件成立则该年份是闰年
	else
		cout << year << "不是闰年" << endl;	//否则该年份不是闰年
	return 0;
}

 

进制转换(转换成10进制)

int convert(string s)
{
    //base为进制
	int sum = 0;
	for(int i = 0; i < s.size(); i ++)
  		sum = sum * base + s[i] - '0';
	return sum;
}

 

进制转换(10进制转换成 base 进制)

#include<bits/stdc++.h>
using namespace std;
int a,b;
char d[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//0~16对应的编码

void jz(int k,int base)//将k转化为n进制数
{
    int r;
    r = k % base;//对n求余
    k = k / base;//除n
    if(k != 0)//k==0为边界条件
        jz(k, base);//递归
    cout << d[r];//输出对应编码
    return;
}
int main()
{
    cin>>a>>b;
    jz(a, b);
    return 0;
}

 

求最大公约数

#include <iostream>
#include <algorithm>
using namespace std;
int gcd(int a, int b)
{
    return b ? gcd(b, a%b) : a;
}
int main() 
{
    int a, b;
    cin >> a >> b;
    cout<< gcd(a, b);
} 

 

求公约数及个数

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

vector<int> get_divistors(int x) //求约数
{
    vector<int> res;
    for (int i=1; i<=x/i; i++)
        if (x % i == 0)
        {
            res.push_back(i);
            if (i != x/i) res.push_back(x/i);
        }
    sort(res.begin(), res.end());
    return res;
}

int main()
{
    int n;
    cin >> n;
    while (n --)
    {
        int x;
        cin >> x;
        auto res = get_divistors(x);
        for (auto x : res) cout << x << " "; //遍历存取约数的数组
        cout << endl;
        cout << res.size(); //约数个数
    }

    return 0;
}

 

--> 前言基础算法模板 – Echo's blog (liveout.cn)并查集一共有 n个数,编号是 1∼n,最开始每个数各自在一个集合中。现在要进行 m个操作,操作共有两种:M a b,将编号为 a和 b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;Q a b,询问编号为 和 b 的两个数是否在同一个集合中;#include<iostream>u...

前言

一个似书评但又不是书评的文章

上个月突然想起来了一本初中时候读过的书——《穿过你的时光我的年华》。于是便立马淘宝下单,并且花了短短一天就读完了。

但是由于学业太忙(我太懒了),今天才起笔写了一下书评(姑且算个人感受吧)。因为是初中时候读过的,所以会带着个人的主观因素了。

 

穿过你的时光我的年华

穿过你的时光 我的年华 (豆瓣) (douban.com)

 

简介

内容

齐明是个为了爱敢于放弃一切的男孩,他和昆仑,刘强整天在欢笑中体味着成长的疼痛与快乐。晶晶是个完美的女孩,两人渐渐摩擦出爱的火花。像所有破碎的爱情一样,晶晶在高考结束以后离开人世,此时同桌唐晓才告诉齐明自己一直喜欢他。经历了大喜大悲的齐明在高考结束后带着他的杯水爱情观走向了新生活。

 

作者

李智超,1984年4月出生于内蒙古,现就读于中国防卫科技学院。

全国第八,九届新概念作文大赛获奖者,黑皮帮网站创始人。

最喜欢的乐队:Nirvana。

最喜欢的电影:楚门的世界。

最喜欢的小说:霍乱时期的爱情。

主要作品:

长篇小说《穿过你的时光我的年华》、短篇小说《失眠岂是遥遥无期》、《刘子》、《非正常时期的爱情》、《如此而忆》、《乱弹》等。

 

长评

应该算学生时代的回忆吧

emm,怎么说呢,内容确实挺狗血的,但是初中时的我读起来却津津有味,甚至还读了好几遍。如果细究原因的话,可能因为这本书平淡如水,就像我们实际的高中生活。(虽然当时在初中)。还有就是懵懂时期对爱情的憧憬,hh。

书里有一句话当时觉得挺有趣的,如下

杯水爱情三定律

  1. 学生时代的爱情就像一杯水,不好喝,但很解渴。
  2. 爱情是一杯坏水,我把它给了你,我就属于你了。
  3. 如果没有水了,那么爱情也就结束了。

 

初中时候应该是我当前人生中最幸福的时候了,没有太大的学业压力,有着不是很多的零花钱却很多的时间,每过两个星期就会买一本小说,带到学校看。因为是寄宿制,星期天下午就得回到学校。于是那天下午都是在宿舍看着小说。整个初中时代是我看小说最多的时候。江南的《龙族》、三毛的一些书和这本书应该算印象最深的了。(还有张嘉佳,hh,都是些青春文艺小说)

 

这本书的故事时间是在03年作用,判断的原因是里面有着对非典的记录,像极了高中时候的新冠。

里面的故事都是关于齐明(男主)和晶晶(女主)的高中故事,女主因病出去就医,高中最后一年重新回到教室,陪伴男主度过高考,自己却因病去世,高考都没能参加。

整本书都洋溢着03年代的氛围,并且里面会时不时出现当时比较火的老歌歌词,比如许巍的专辑《时光.漫步》。

至于女主最后死去是我没想到的,这对当时的我是多么重的打击。不过也有可能和作者在出版前一个月和女友分手有关,哈哈,报应。

 

有一个短评是这样的:

就是一个怀念自己青春的流水账小说,但是也确实是会引起读者对高中生活的怀念啦~但是故事背景是03年 可能也得是那个时代的人才会有共鸣吧

 

确实是一个流水账小说,受众是懵懂的学生,但是也不能说一无是处吧。

一万个读者有一万个哈姆雷特,总会有人喜欢看这本书的,很明显,我应该算其中之一。并且02年的我,看着03年的故事,还是会有一些感同身受,以至于大学了还会再买一本看看(之前的已经送给了初中的好朋友)。

里面的一些事情,学生的懵懂,苦恼,友情以及单纯的爱情总会让人带入到自己。(可能没有爱情,hh)


节选

夏日的浮躁带着喧嚣穿过整个城市,人们流淌着汗水讥笑着这城市的浮华,一年又一年,像盛开的罂粟花。此时走在长长的大街上,除了燥热,还是燥热。只有几只狗在街角吐着舌头,试图驱赶着夏日的颓唐。花店的鲜花却在主人的精心照料下显得异常妩媚。

今年我高三了,像大多数青年一样,在被义务教育折磨了十多年后第一次看到了生命的曙光。自我懂事以来父母就一直要求我做个好孩子。 到底什么是好孩子?我不知道,至少现在我认为光学习好是远远不够的。小时候我的梦想是戴上红领巾,成为一名少先队员, 以后报效祖国为人民服务,可后来随着我身体一天天发育, 我越来越感觉到迷茫和无助。

这一切都是怎么了?

我不明白。

北方的小城夏天还算凉爽,空气里没有大批大批的水分子在躁动。我总是每天下午放学后山上我的两个哥们儿,昆仑和强子,去学校后面的小树林没有目的地教步,然后起去吃饭,然后一起去小卖部买雪糕,然后一起去看看新到的磁带,然后一起去上跑自习,然后起回宿舍,天就这祥地在无数个 “然后”中过去了。

我叫齐明,高三,昆仑和强子是我的两个哥们儿。

昆仑个儿很高,他因为在一次篮球比赛中双手摸到篮筐,在学校篮球界比院风云。也许是我们学校的人平均海拔过低,能摸到篮筐的真没几个,更别说双手了,这种情况是不能给中国篮球添砖加瓦的。有时,我幻想以后的某一天我也能以这种高度俯视这个世界,可惜我的名字注定让我高不过一米八零,毕竟,昆仑不是白叫的。或许当时我妈生下我后给我取名叫珠穆朗玛,可能今天那个在NBA打篮球的小巨人没准就是我了。

强子是他的外号,他的名字叫刘强,学习很好,班里足球队的队长。这厮号称热爱足球,但是我知道,热爱归热爱,技术就是另外一回事了。

我的学校在市郊,一个很有名的省重点中学。学校周围环境很好,对面有一片农田,平时总可以看见几个农民伯伯在地里汗滴禾下土。学校旁边是-一个农业研究所,门口的牌子写着“绵羊工人受精站”,这让我校师生每次到那里都感慨不已, 纷纷猜测这里究竟在研究什么。可后来才知道那里不过是个绵羊人工受精站,只是不知道被哪个冒失鬼写错了。

至于农研所更改牌子时,我已毕业三年,这是后话。

我们学校奇特得很,为了搞绿化,竟然要求市领导把校外的很大一片树林划给我们,更令人费解的是,市里居然同意了。这片树林给我们带来的不仅仅是一片很简单的绿地而已,更是为那些热血男女们提供了一个非常适合交流的场所,如果下了晚自习时去,没准还能踩到一两对。

我们高三了,家长们却心急火燎的,就好像他们要高考似的。我们都似乎很快乐很轻松,就好像我们不高考似的。闲了,就和昆仑去书店转转,两个男人抱着本小说能看一个晚自习。强子这小子在这方面显然要比我和昆仑差得很多,通常是一晚白习只能看一页,于是我和昆仑先看完后再拿给强子看,一个月后问强子看完了吗? 他通常会若有所思地说,嗯,这本书的主角快出现了。我和昆仑双双晕倒。

 

结尾

如果你问我这本书值不值得一看,我只能说句套话——因人而异。

如果你想回忆下学生时代的生活,不妨花一杯奶茶钱买来看一看。

从前的一切一切,譬如昨日已经死了;

以后的一切一切,譬如今天,刚刚出生!

其实,想写的不只这些,等到以后有时间再写吧。

比如有关江南的《龙族》,还有周日即将去看的新海诚的新电影——《铃芽之旅 すずめの戸締まり》

--> 前言一个似书评但又不是书评的文章上个月突然想起来了一本初中时候读过的书——《穿过你的时光我的年华》。于是便立马淘宝下单,并且花了短短一天就读完了。但是由于学业太忙(我太懒了),今天才起笔写了一下书评(姑且算个人感受吧)。因为是初中时候读过的,所以会带着个人的主观因素了。 穿过你的时光 我的年华 (豆瓣) (douban.com) 简介内容齐明是个为了爱敢于放弃一切的男孩,...

前言

 

通常查看目录的完整路径需要 pwd 命令,但是我想要直接在终端左侧显示,即如下样子

[root@VM-12-5-centos /opt/C/test]$

 

具体操作

编辑 profile 文件

vim /etc/profile

 

最后一行插入 export PS1='[\u@\h $PWD]$'

//光标最后一行
shift + g 

//编辑模式
i

//输入此命令
export PS1='[\u@\h $PWD]$'

 

刷新环境变量

source /etc/profile

 

补充

显示绝对路径

export PS1='[\u@\h $PWD]$'

只列出最后一个目录

export PS1='[\u@\h \W]$'

显示完整工作目录,当前用户目录会以$代替

export PS1='[\u@\h \w]$' 

 

--> 前言 通常查看目录的完整路径需要 pwd 命令,但是我想要直接在终端左侧显示,即如下样子[root@VM-12-5-centos /opt/C/test]$ 具体操作编辑 profile 文件vim /etc/profile 最后一行插入 export PS1='[\u@\h $PWD]$'//光标最后一行shift + g //编辑模式i//输入此命令expo...

效果预览

废话不多说,先上效果,然后再介绍下Vim基本操作以及快捷键

Vim

介绍

Vim是一种文本编辑器,是Linux和Unix系统中最常用的编辑器之一。它是Vi编辑器的改进版,包含了Vi编辑器的所有功能,并增加了很多新的功能和命令。Vim的特点是可以使用键盘快捷键完成各种操作,非常适合程序员和系统管理员使用。它支持语法高亮、多标签窗口、代码折叠、自动缩进等功能,还可以通过插件扩展功能。Vim也被广泛应用于编写各种文本文件,如程序代码、配置文件、Markdown文档等。

PS:只要与linux打交道,应该是避免不了接触这个了,也有一些竞赛选手喜欢用这个。并且有丰富的插件功能,用来实现各种功能。如果你能熟练使用Vim,那么就会发现其好处,当然了,萝卜青菜各有所爱,如果不喜欢,也不用强求自己使用,

常用指令

  • i: 在当前光标处插入文本。
  • a: 在当前光标后插入文本。
  • o: 在当前行下插入新行。
  • dd: 删除当前行。
  • x: 删除当前光标下的字符。
  • :w: 保存文件。
  • :q: 关闭当前窗口。
  • :wq: 保存并关闭当前窗口。
  • :q!: 强制关闭当前窗口,丢弃所有修改。
  • :set nu: 显示行号。
  • :set nonu: 取消显示行号。
  • /: 查找关键字。
  • :%s/old/new/g: 在全文中将 "old" 替换为 "new"。

这里只是列举了一些基本的指令,Vim 的指令非常多,可以根据需要进一步学习和使用。

Vim工作模式

Vim键盘图

 

配置文件

set sw=4
set ts=4
set et
set smarttab
set smartindent
set lbr
set fo+=mB
set sm
set selection=inclusive
set wildmenu
set mousemodel=popup

set pastetoggle=<F11>

au FileType php setlocal dict+=~/.vim/dict/php_funclist.dict
au FileType css setlocal dict+=~/.vim/dict/css.dict
au FileType c setlocal dict+=~/.vim/dict/c.dict
au FileType cpp setlocal dict+=~/.vim/dict/cpp.dict
au FileType scale setlocal dict+=~/.vim/dict/scale.dict
au FileType javascript setlocal dict+=~/.vim/dict/javascript.dict
au FileType html setlocal dict+=~/.vim/dict/javascript.dict
au FileType html setlocal dict+=~/.vim/dict/css.dict

"
"syntastic相关
"execute pathogen#infect()
let g:syntastic_python_checkers=['pylint']
let g:syntastic_php_checkers=['php', 'phpcs', 'phpmd']
"golang
"Processing... % (ctrl+c to stop)
let g:fencview_autodetect=0
set rtp+=$GOROOT/misc/vim
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 显示相关  
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
syntax on
set cul "高亮光标所在行
set cuc
set shortmess=atI   " 启动的时候不显示那个援助乌干达儿童的提示  
set go=             " 不要图形按钮  
"color desert     " 设置背景主题  
color ron     " 设置背景主题  
"color torte     " 设置背景主题  
"set guifont=Courier_New:h10:cANSI   " 设置字体  
"autocmd InsertLeave * se nocul  " 用浅色高亮当前行  
autocmd InsertEnter * se cul    " 用浅色高亮当前行  
set ruler           " 显示标尺  
set showcmd         " 输入的命令显示出来,看的清楚些  
"set whichwrap+=<,>,h,l   " 允许backspace和光标键跨越行边界(不建议)  
set scrolloff=3     " 光标移动到buffer的顶部和底部时保持3行距离  
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}   "状态行显示的内容  
set laststatus=2    " 启动显示状态行(1),总是显示状态行(2)  
"set foldenable      " 允许折叠  
""set foldmethod=manual   " 手动折叠  
set nocompatible  "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限  
" 显示中文帮助
if version >= 603
        set helplang=cn
        set encoding=utf-8
endif
" 自动缩进
set autoindent
set cindent
" Tab键的宽度
set tabstop=4
" 统一缩进为4
set softtabstop=4
set shiftwidth=4
" 使用空格代替制表符
set expandtab
" 在行和段开始处使用制表符
set smarttab
" 显示行号
set number
" 历史记录数
set history=1000
"搜索逐字符高亮
set hlsearch
set incsearch
"语言设置
set langmenu=zh_CN.UTF-8
set helplang=cn
" 总是显示状态行
set cmdheight=2
" 侦测文件类型
filetype on
" 载入文件类型插件
filetype plugin on
" 为特定文件类型载入相关缩进文件
filetype indent on
" 保存全局变量
set viminfo+=!
" 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-
" 字符间插入的像素行数目

"markdown配置
au BufRead,BufNewFile *.{md,mdown,mkd,mkdn,markdown,mdwn}   set filetype=mkd
au BufRead,BufNewFile *.{go}   set filetype=go
au BufRead,BufNewFile *.{js}   set filetype=javascript
"rkdown to HTML  
nmap md :!~/.vim/markdown.pl % > %.html <CR><CR>
nmap fi :!firefox %.html & <CR><CR>
nmap \ \cc
vmap \ \cc

"将tab替换为空格
nmap tt :%s/\t/    /g<CR>



"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""新文件标题
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新建.c,.h,.sh,.java文件,自动插入文件头 
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.rb,*.java,*.py exec ":call SetTitle()" 
""定义函数SetTitle,自动插入文件头 
func SetTitle() 
        "如果文件类型为.sh文件 
        if &filetype == 'sh' 
                call setline(1,"\#!/bin/bash") 
                call append(line("."), "") 
    elseif &filetype == 'python'
        call setline(1,"#!/usr/bin/env python")
        call append(line("."),"# coding=utf-8")
            call append(line(".")+1, "") 

    elseif &filetype == 'ruby'
        call setline(1,"#!/usr/bin/env ruby")
        call append(line("."),"# encoding: utf-8")
            call append(line(".")+1, "")

"    elseif &filetype == 'mkd'
"        call setline(1,"<head><meta charset=\"UTF-8\"></head>")
        else 
                call setline(1, "/*************************************************************************") 
                call append(line("."), "        > File Name: ".expand("%")) 
                call append(line(".")+1, "        > Author: echo") 
                call append(line(".")+2, "        > Mail: big_fw@foxmail.com") 
                call append(line(".")+3, "        > Created Time: ".strftime("%c")) 
                call append(line(".")+4, " ************************************************************************/") 
                call append(line(".")+5, "")
        endif
        if expand("%:e") == 'cpp'
                call append(line(".")+6, "#include <iostream>")
        call append(line(".")+7, "using std::cin;")
        call append(line(".")+8, "using std::cout;")
        call append(line(".")+9, "using std::endl;")
                call append(line(".")+10, "using namespace std;")
                call append(line(".")+11, "")
        endif
        if &filetype == 'c'
                call append(line(".")+6, "#include <stdio.h>")
                call append(line(".")+7, "")
        endif
        if expand("%:e") == 'h'
                call append(line(".")+6, "#ifndef _".toupper(expand("%:r"))."_H")
                call append(line(".")+7, "#define _".toupper(expand("%:r"))."_H")
                call append(line(".")+8, "#endif")
        endif
        if &filetype == 'java'
                call append(line(".")+6,"public class ".expand("%:r"))
                call append(line(".")+7,"")
        endif
        "新建文件后,自动定位到文件末尾
endfunc 
autocmd BufNewFile * normal G
command WQ wq 
command Wq wq 
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"键盘命令
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
:nmap <silent> <F9> <ESC>:Tlist<RETURN>
" shift tab pages
map <S-Left> :tabp<CR>
map <S-Right> :tabn<CR>
map! <C-Z> <Esc>zzi
map! <C-O> <C-Y>,
map <C-A> ggVG$"+y
map <Esc><Esc> :w<CR>
map <F12> gg=G
map <C-w> <C-w>w
imap <C-k> <C-y>,
imap <C-t> <C-q><TAB>
imap <C-j> <ESC>
" 选中状态下 Ctrl+c 复制
"map <C-v> "*pa
imap <C-v> <Esc>"*pa
imap <C-a> <Esc>^
imap <C-e> <Esc>$
vmap <C-c> "+y
"set mouse=v
"set clipboard=unnamed
"去注释  
nnoremap <F1> :g/^\s*#/d<CR>
"去空行  
nnoremap <F2> :g/^\s*$/d<CR>
"比较文件  
nnoremap <C-F2> :vert diffsplit 
"nnoremap <Leader>fu :CtrlPFunky<Cr>
"nnoremap <C-n> :CtrlPFunky<Cr>
"列出当前目录文件  
map <F3> :NERDTreeToggle<CR>
imap <F3> <ESC> :NERDTreeToggle<CR>
"打开树状文件目录  
map <C-F3> \be  
:autocmd BufRead,BufNewFile *.dot map <F5> :w<CR>:!dot -Tjpg -o %<.jpg % && eog %<.jpg  <CR><CR> && exec "redr!"
"C,C++ 按F5编译运行
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
        exec "w"
        if &filetype == 'c'
                exec "!g++ % -o %<"
                exec "!time ./%<"
        elseif &filetype == 'cpp'
                exec "!g++ % -std=c++11 -o %<"
                exec "!time ./%<"
        elseif &filetype == 'java' 
                exec "!javac %" 
                exec "!time java %<"
        elseif &filetype == 'sh'
                :!time bash %
        elseif &filetype == 'python'
                exec "!time python2.7 %"
    elseif &filetype == 'html'
        exec "!firefox % &"
    elseif &filetype == 'go'
"        exec "!go build %<"
        exec "!time go run %"
    elseif &filetype == 'mkd'
        exec "!~/.vim/markdown.pl % > %.html &"
        exec "!firefox %.html &"
        endif
endfunc
"C,C++的调试
map <F8> :call Rungdb()<CR>
func! Rungdb()
        exec "w"
        exec "!g++ % -std=c++11 -g -o %<"
        exec "!gdb ./%<"
endfunc


"代码格式优化化

map <F6> :call FormartSrc()<CR><CR>

"定义FormartSrc()
func FormartSrc()
    exec "w"
    if &filetype == 'c'
        exec "!astyle --style=ansi -a --suffix=none %"
    elseif &filetype == 'cpp' || &filetype == 'hpp'
        exec "r !astyle --style=ansi --one-line=keep-statements -a --suffix=none %> /dev/null 2>&1"
    elseif &filetype == 'perl'
        exec "!astyle --style=gnu --suffix=none %"
    elseif &filetype == 'py'||&filetype == 'python'
        exec "r !autopep8 -i --aggressive %"
    elseif &filetype == 'java'
        exec "!astyle --style=java --suffix=none %"
    elseif &filetype == 'jsp'
        exec "!astyle --style=gnu --suffix=none %"
    elseif &filetype == 'xml'
        exec "!astyle --style=gnu --suffix=none %"
    else
        exec "normal gg=G"
        return
    endif
    exec "e! %"
endfunc
"结束定义FormartSrc


""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""实用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if has("autocmd")
      autocmd BufReadPost *
          \ if line("'\"") > 0 && line("'\"") <= line("$") |
          \   exe "normal g`\"" |
          \ endif
endif
"当打开vim且没有文件时自动打开NERDTree
autocmd vimenter * if !argc() | NERDTree | endif
" 只剩 NERDTree时自动关闭
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif

" 设置当文件被改动时自动载入
set autoread
" quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>
"代码补全 
set completeopt=preview,menu 
"允许插件  
"filetype plugin on
"共享剪贴板  
"set clipboard+=unnamed 
"自动保存
set autowrite
"set ruler                   " 打开状态栏标尺
"set cursorline              " 突出显示当前行
set magic                   " 设置魔术
set guioptions-=T           " 隐藏工具栏
set guioptions-=m           " 隐藏菜单栏
""set foldcolumn=0
""set foldmethod=indent 
""set foldlevel=3 
" 不要使用vi的键盘模式,而是vim自己的
set nocompatible
" 去掉输入错误的提示声音
set noeb
" 在处理未保存或只读文件的时候,弹出确认
set confirm
"禁止生成临时文件
set nobackup
set noswapfile
"搜索忽略大小写
set ignorecase




set linespace=0
" 增强模式中的命令行自动完成操作
set wildmenu
" 使回格键(backspace)正常处理indent, eol, start等
set backspace=2
" 允许backspace和光标键跨越行边界
set whichwrap+=<,>,h,l
" 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
"set mouse=a
set selection=exclusive
set selectmode=mouse,key
" 通过使用: commands命令,告诉我们文件的哪一行被改变过
set report=0
" 在被分割的窗口间显示空白,便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\
" 高亮显示匹配的括号
set showmatch
" 匹配括号高亮的时间(单位是十分之一秒)
set matchtime=1
" 光标移动到buffer的顶部和底部时保持3行距离
set scrolloff=3
" 为C程序提供自动缩进
"自动补全
"":inoremap ( ()<ESC>i
"":inoremap ) <c-r>=ClosePair(')')<CR>
":inoremap { {<CR>}<ESC>O
":inoremap } <c-r>=ClosePair('}')<CR>
"":inoremap [ []<ESC>i
"":inoremap ] <c-r>=ClosePair(']')<CR>
"":inoremap " ""<ESC>i
"":inoremap ' ''<ESC>i
""function! ClosePair(char)
""        if getline('.')[col('.') - 1] == a:char
""                return "\<Right>"
""        else
""                return a:char
""        endif
""endfunction
filetype plugin indent on 
"打开文件类型检测, 加了这句才可以用智能补全
set completeopt=longest,menu
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" CTags的设定  
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let Tlist_Sort_Type = "name"    " 按照名称排序  
let Tlist_Use_Right_Window = 1  " 在右侧显示窗口  
let Tlist_Compart_Format = 1    " 压缩方式  
let Tlist_Exist_OnlyWindow = 1  " 如果只有一个buffer,kill窗口也kill掉buffer  
""let Tlist_File_Fold_Auto_Close = 0  " 不要关闭其他文件的tags  
""let Tlist_Enable_Fold_Column = 0    " 不要显示折叠树  
"let Tlist_Show_One_File=1            "不同时显示多个文件的tag,只显示当前文件的
"设置tags  
set tags=tags;  
"set autochdir 


""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"其他东东
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"默认打开Taglist 
let Tlist_Auto_Open=0 
"""""""""""""""""""""""""""""" 
" Tag list (ctags) 
"""""""""""""""""""""""""""""""" 
let Tlist_Ctags_Cmd = '/usr/local/bin/ctags' 
let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的 
let Tlist_File_Fold_Auto_Close = 1
let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim 
let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口
" minibufexpl插件的一般设置
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1
let g:miniBufExplModSelTarget = 1  
nmap tl :Tlist<cr>

"python补全
let g:pydiction_location = '~/.vim/after/complete-dict'
let g:pydiction_menu_height = 20
let Tlist_Ctags_Cmd='/usr/local/bin/ctags'
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1
let g:miniBufExplModSelTarget = 1


set iskeyword+=.
set termencoding=utf-8
set encoding=utf8
set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030

autocmd FileType python set omnifunc=pythoncomplete#Complete

"set nocompatible               " be iMproved
"filetype off                   " required!

set rtp+=~/.vim/bundle/vundle/
"call vundle#rc()

" let Vundle manage Vundle
" required! 
"Bundle 'gmarik/vundle'

" My Bundles here:
"
" original repos on github
" Bundle 'tpope/vim-fugitive'
" Bundle 'rstacruz/sparkup', {'rtp': 'vim/'}
" Bundle 'Yggdroot/indentLine'
let g:indentLine_char = '┊'
"ndle 'tpope/vim-rails.git'
" vim-scripts repos
" Bundle 'L9'
" Bundle 'FuzzyFinder'
" non github repos
" Bundle 'https://github.com/wincent/command-t.git'
" Bundle 'Auto-Pairs'
" Bundle 'python-imports.vim'
" Bundle 'CaptureClipboard'
" Bundle 'ctrlp-modified.vim'
" Bundle 'last_edit_marker.vim'
" Bundle 'synmark.vim'
"Bundle 'Python-mode-klen'
" Bundle 'SQLComplete.vim'
" Bundle 'Javascript-OmniCompletion-with-YUI-and-j'
"Bundle 'JavaScript-Indent'
"Bundle 'Better-Javascript-Indentation'
"Bundle 'jslint.vim'
"Bundle "pangloss/vim-javascript"
"Bundle 'Vim-Script-Updater'
"Bundle 'ctrlp.vim'
"Bundle 'tacahiroy/ctrlp-funky'
"Bundle 'jsbeautify'
"Bundle 'The-NERD-Commenter'
"django
"Bundle 'django_templates.vim'
"Bundle 'Django-Projects'

"Bundle 'FredKSchott/CoVim'
"Bundle 'djangojump'
" ...
let g:html_indent_inctags = "html,body,head,tbody"
let g:html_indent_script1 = "inc"
let g:html_indent_style1 = "inc"

filetype plugin indent on     " required!
"
"ctrlp设置
"
set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*.pyc,*.png,*.jpg,*.gif     " MacOSX/Linux
set wildignore+=*\\tmp\\*,*.swp,*.zip,*.exe,*.pyc,*.png,*.jpg,*.gif  " Windows

let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'
let g:ctrlp_custom_ignore = '\v\.(exe|so|dll)$'
let g:ctrlp_extensions = ['funky']

let NERDTreeIgnore=['\.pyc']

 

方法1

在登录初始目录新建文件 .vimrc 并且将以上命令复制进去

vim .vimrc

如果 出错/太混乱 可以直接删除

rm -rf .vimrc

 

方法2

1. 代码

以上配置可直接通过命令实现

Centos: wget -qO- https://raw.github.com/ma6174/vim/master/setup.sh | sh -x
Ubuntu: curl -s https://raw.github.com/ma6174/vim/master/setup.sh | sudo sh -x

 

2. 讲解

  1. wget -qO- https://raw.github.com/ma6174/vim/master/setup.sh
    

    它使用wget命令从URL "https://raw.github.com/ma6174/vim/master/setup.sh"下载shell脚本,并将其输出到标准输出流(stdout)。

  2. sh -x
    

    这个部分会将上一步下载的shell脚本作为输入,运行它并将运行过程中的输出打印到标准输出流(stdout)上。-x选项是用来在执行脚本时输出调试信息的。

     

    整个命令的意思是下载shell脚本并立即运行它,输出运行过程中的调试信息。该脚本用于安装和配置Vim编辑器。

    -q选项用于静默下载文件,-O选项用于将下载内容输出到标准输出流,|字符用于将第一部分的输出传递给第二部分作为输入。

     

参考链接

Centos 7系统下的vim配置_Memory逝言的博客-CSDN博客

--> 效果预览废话不多说,先上效果,然后再介绍下Vim基本操作以及快捷键Vim介绍Vim是一种文本编辑器,是Linux和Unix系统中最常用的编辑器之一。它是Vi编辑器的改进版,包含了Vi编辑器的所有功能,并增加了很多新的功能和命令。Vim的特点是可以使用键盘快捷键完成各种操作,非常适合程序员和系统管理员使用。它支持语法高亮、多标签窗口、代码折叠、自动缩进等功能,还可以通过插件扩展功能。Vim也被...