Onwaier's Blog

大步后退亦或停止不前,不如匍匐前进

0%

简介

conda是一款可以运行在windows,macOS和Liunx多系统的开源包管理系统和环境管理系统。Conda能快速安装、运行和更新包及其依赖。Conda能容易在你的电脑上创建、保存、加载和切换运行环境。如果你需要一个满足另一不同版本的Python。你不需要切换到一个不同的环境,因为conda也是一个环境管理器,使用一小段命令,你就可以设置一个完全独立的环境来运行不同版本的Python,然后在一般环境中运行你常用的Python版本。

常用命令

创建conda环境

conda env list或者conda info --envs可以查看当前已经存在的环境列表。 默认情况下只有一个base。

1
2
conda create -n 环境名 python=python版本号 包名=包版本号
# -n用来设置环境名

conda create -n py36 python3.6创建一个名为py36的新环境。

激活(启动)环境

1
2
conda activate 环境名
# 如conda activate py36

退出环境

1
conda deactivate

删除环境

1
2
conda remove -n 环境名 --all
# 如conda remove -n py36 --all

重名命环境

1
2
3
4
# 分2步:先复制环境,再删除
# 这里把刚才创建的pyt36重命名为python36
conda create -n python36 --clone py36
conda remove -n py36 --all

更新环境

1
2
3
4
# 更新所有包
conda update
# 更新指定包
conda update package_name

共享环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 将你的环境导出给别人使用
# 1. 进行激活环境
conda activate 环境名
# 2. 导出环境
conda env export > environment.yml
# 将上面文件copy给别人(默认在安装 anaconda的文件夹中)
# 上面命令会安装在conda默认的环境路径
# 如果要指定其它安装路径,使用-p选项
# conda env create -f environment.yml -p /home/user/anaconda3/envs/env_name
# 3. 创建环境
conda env create -f environment.yml
```python
```python
# 也可以导出到txt文件中
# 用pip的方法如下:
pip freeze > requirements.txt
pip install -r requirements.txt
# 用conda的方法
conda list -e > requirements.txt
conda install --yes --file requirements.txt

安装包

1
2
3
4
5
6
7
# 未指定环境安装在当前激活的环境下
conda install -n 环境名 package_name
# 如conda install -n py36 keras
conda install package_name
# 使用某pip进行安装包
python.exe -m pip install package_name

删除包

1
2
# 删除指定环境中package
conda remove -n 环境名 package_name

显示包列表

1
conda list

搜索包

1
conda search package_name

题目描述

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]

题解

最先萌发的肯定是暴力求解的方法,试探每一种可能性。三重循环,时间复杂度比较高,是[latex] O(n^3) [/latex]。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>>res;
vector<int>tmp;
int len = nums.size();
if(len > 0)
sort(nums.begin(),nums.end());
for(int i = 0; i < len - 2; ++i){
if(i > 0 && nums[i] == nums[i - 1]){
continue;
}
else{
for(int j = i + 1; j < len - 1; ++j){
if(j > i + 1 && nums[j] == nums[j - 1]){
continue;
}
else{
for(int k = j + 1; k < len; ++k){
if(k > j + 1 && nums[k] == nums[k - 1]){
continue;
}
else{
if(nums[i] + nums[j] + nums[k] == 0){
tmp.clear();
tmp.push_back(nums[i]);
tmp.push_back(nums[j]);
tmp.push_back(nums[k]);
res.push_back(tmp);
}
}
}
}
}
}
}
return res;
}
};

执行结果

超出时间限制!!

优化

借鉴之前两数之和的思路,用空间来换时间,用哈希表存储前两个数的信息。通过一个数来找另两个数满足三数之和为00。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>>res;
vector<int>temp;
map<int,vector<int>>myMap;
sort(nums.begin(), nums.end());//排序一下 是为了去重,但并没有达到想要的效果
int num;
int len = nums.size();
for(int i = 0; i < len - 1; ++i){
if(i > 0 && nums[i - 1] == nums[i]){
continue;
}
for(int j = i + 1; j < len; ++j){
if(j > i + 1 && nums[j - 1] == nums[j]){
continue;
}
if(myMap.find(nums[j]) != myMap.end()){//存在于map中,则视为符合题意的解
temp.clear();
temp.push_back(nums[j]);
temp.push_back(myMap[nums[j]][0]);
temp.push_back(myMap[nums[j]][1]);
res.push_back(temp);
}
else{//不存在,就在map中记录下信息
temp.clear();
num = 0 - nums[i] - nums[j];
temp.push_back(nums[i]);
temp.push_back(nums[j]);
myMap[num] = temp;
}
}
}
return res;
}
};
//该解未能有效去重,不能AC,只是提出一种思路。

再优化

为了便于去重,首先仍是排序,复杂度为[latex] nlog_{2}n [/latex]。然后用双指针的方法,初始化指向数据的首尾,中间数b,保持不动。判断a+b+c。若a+b+c > 0则需减小,尾指针向左移动;若a+b+c < 0则需增大,头指针向右移动。将有某个指针指向b时,则结束。调整b,继续上次操作。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>>res;
sort(nums.begin(), nums.end());
int len = nums.size(), beg, end, cnt;
for(int i = 1; i < len - 1; ++i){
while(beg < i && end > i){//位于i两侧
if(nums[beg] +nums[i] + nums[end] > 0){//偏大,减小
--end;
}
else if(nums[beg] + nums[i] + nums[end] < 0){//偏小,增大
++beg;
}
else{//刚好,同时移动
int a[3] = {nums[beg], nums[i], nums[end]};
vector<int>tmp(a, a + 3);
res.push_back(tmp);
while(beg < i && nums[beg + 1] == nums[beg]) ++beg;//去重
while(end > i && nums[end - 1] == nums[end]) --end;//去重
++beg;
--end;
}
}
}
return res;
}
}
//未AC,去重太麻烦了,针对[0, 0, 0, 0]有问题。

再再优化

换个思路,考虑排序后,固定a,两指针分别指向b和c,判断方式仍然相同,当然可以有更多优化,比如a>0时,a+b+c一定大于0,可以直接跳过。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>>res;
sort(nums.begin(), nums.end());
int len = nums.size(), beg, end, sum;
for(int i = 0; i < len - 1; ++i){
if(nums[i] > 0){
break;
}
if(i > 0 && nums[i] == nums[i - 1]){//去重
continue;
}
beg = i + 1, end = len -1;
while(beg < end){
int sum = nums[i] + nums[beg] + nums[end];
if(sum > 0){
--end;
}
else if(sum < 0){
++beg;
}
else{
res.push_back({nums[i], nums[beg], nums[end]});
while(beg < end && nums[beg] == nums[beg + 1]){//去重
++beg;
}
while(beg < end && nums[end] == nums[end - 1]){//去重
--end;
}
++beg;
--end;
}
}
}
return res;
}
};
//AC

问题描述

  1. 手机可以连接湖南大学的wifi(hnu),电脑有线通过拨号也能连接,唯独电脑不能连接无线且输入用户名(账户)和密码,点击登录时,会出现Server is not responding的错误?

解决方法

电脑连接hnu wifi,然后更改适配器设置,在WLAN(hnu)上单击右键,打开属性。 双击Internet协议版本4会弹出属性设置框,然后设置为自动获取ip地址,自动获取DNS服务器地址。 此时打开校园网登录界面(以前我是需要手动输入ip地址才能进到登录界面,自动获取dns后,打开网页,登录界面会弹出,这是修改有效的一个明显变化),输入用户名和密码,就可以成功使用湖南大学的校园网。 这个方法不一定会适合你,写出来只是希望分享我遇到的问题及解决方案,之前在网上找了好久都没有与之相关的博客,希望它能在一定程度上解决你的问题。

问题描述

  1. 湖南大学校园网VPN使用过程中突然断开,然后出现“许可用尽”的错误提示

解决方法

在系统最小化托盘中找到湖南大学VPN应用,然后单击右键,有三个选项,选择中间“还原”键,这时再重新登录校园网VPN,这在一定程度上能解决校园网VPN许可用尽的问题。

题目描述

给定 n 个非负整数 [latex]a_1,a_2,\\cdots, a_n[/latex],每个数代表坐标中的一个点 [latex](i, a_i)[/latex] 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 [latex](i, a_i)[/latex] 和[latex](i, 0)[/latex]。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 说明:你不能倾斜容器,且 n 的值至少为 2。 示例:

1
2
输入: [1,8,6,2,5,4,8,3,7]
输出: 49

题解

最容易想到的肯定是暴力求解的方法,将所有可能的组合都尝试,然后选取出面积最大的。但是时间复杂度是[latex]o(n^2)[/latex],运行时间会很长,从执行结果上看,仅击败了5%的用户。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
int maxArea(vector<int>& height) {
int res = 0, tmpArea = 0;
for(int i = 0; i <height.size(); ++i){
for(int j = i + 1; j < height.size(); ++j){
tmpArea = min(height[i], height[j]) * (j - i);
if(tmpArea > res){
res = tmpArea;
}
}
}
return res;
}
};

执行结果

优化

参考官方给出的题解,采用双指针的方法。初始时两指针i与j分别指向数据height的两侧,与x轴构成的容器的面积为: [latex] Area = min(height[i], height[j]) * (j - i)\\\\ [/latex] 然后指向height较小的指针向内侧移动(对i来说,就是增加;对j来说,就是减小),为什么要这做呢?如果较大的指针向内侧移动则[latex] j - i [/latex]的值一定会减小,而[latex] min(height[i], height[j]) [/latex]的值 是小于等于移动之前的min(height[i], height[j])。这样[latex] area [/latex]一定会减小。所以要将较小的指针向内侧移动。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
int maxArea(vector<int>& height) {
int i = 0, j = height.size() - 1;
int resArea = 0, tmpArea;
while(i < j){
tmpArea = min(height[i], height[j]) * (j - i);
if(tmpArea > resArea){
resArea = tmpArea;
}
if(height[i] > height[j]){
--j;
}
else{
++i;
}
}
return resArea;
}
};

执行结果

题目描述

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例1:

1
2
3
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0

示例2:

1
2
3
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5

题解

自己能够想到的是将两个有序数组进行归并排序,然后根据奇偶取中位数。但这样做的时间复杂度为o(m+n),是不符合题意。 最后参考官方题解,写出了时间复杂度为o(log(m+n))的程序。 首先回顾中位数定义是对于n个数据,求取中位数首先将其排序,若n为奇数,则中位数为第(n+1)/2个数;若n为偶数,则中位数是第n/2个数和第n/2 + 1个数之和的平均数。 现在我们换种思路,已知两个有序数组和nums1(元素个数为n)和nums2(元素个数为m)。对于nums1,将其从位置i处划分成两部分,我们有n+1种划分方式。i的取值为[0, n]。当i=0,左边有0个元素,右边有n个元素;当i=n,左边有n个元素,右边有0个元素;当i介于0到n之间,左边有i个元素,右边有n-i个元素。划分的左边区域的最大值记为lmax1,划分的右边区域的最小值记为rmin1。lmax1 = nums1[i - 1],rmin1 = nums1[i]。 同理对于nums2数组,我们在位置j处划分。有lmax2 = nums2[j - 1],rmin2 = nums2[j]。 现在若我们能保证i + j = (n + m + 1) / 2且lmax1 <= rmin2,lmax2 <= rmin1,则nums1与nums2的左边区域和nums1与nums2的右边区域元素个数相等,且左边 <= 右边。 这种情况下,很容易找到中位数,当n+m为偶数时,中位数为max(lmax1, lmax2)与min(rmin1,rmin2)的平均数;当n+m为奇数,中位数为max(lmax1, lmax2)。 位置i的调整采用二分的方式,当lmax1 > rmin2时,说明nums1左边元素偏大,需将i减小,此时j增大(j = (n + m + 1) / 2 - i),当lmax2 > rmin1时,说明num2左边元素偏大,需将j减小,此时i增大。

题目代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size();
int n = nums2.size();
if(m > n){
return findMedianSortedArrays(nums2, nums1);
}
else{
int low = 0, high = m;
int lmax1, lmax2, rmin1, rmin2, i, j;
while(low <= high){
i = (low + high) / 2;
j = (m + n + 1) / 2 - i;
lmax1 = i == 0?INT_MIN:nums1[i - 1];
rmin1 = i == m?INT_MAX:nums1[i];
lmax2 = j == 0?INT_MIN:nums2[j - 1];
rmin2 = j == n?INT_MAX:nums2[j];
if(lmax1 > rmin2){
high = i - 1;
}
else if(lmax2 > rmin1){
low = i + 1;
}
else{
if((m + n) % 2 == 0){//偶数
return (max(lmax1, lmax2) + min(rmin1, rmin2)) / 2.0;
}
else{//奇数
return max(lmax1, lmax2);
}
}
}
return 0.0;
}
}
};

执行结果

题目描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例:

1
2
3
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

题解

最初的思路:双重循环,判断2个数之和是否为目标值,如果是则直接找到解,跳出循环;否则,继续循环。

题目代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int>res;
bool flag = false;//用于标记是否找到题解
for(int i = 0; i < nums.size(); ++i){ //双重循环,暴力判断。
if(!flag){
for(int j = i + 1; j < nums.size(); ++j){
if(nums[i] + nums[j] == target){
res.push_back(i);
res.push_back(j);
flag = true;
break;
}
}
}
else{
break;
}
}
return res;
}
};

执行结果

优化

有效判断数组中是否存在目标元素,并且能返回下标的快速方法是哈希表 将值及索引添加到哈希表中,建立索引。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int>res;
map<int, int>myMap;
for(int i = 0; i < nums.size(); ++i){
if(myMap.find(nums[i]) != myMap.end()){
res.push_back(myMap[nums[i]]);
res.push_back(i);
break;
}
myMap[target - nums[i]] = i;
}
return res;
}
};

执行结果

进一步优化

unordered_map对元素的查询速度要比map快,这里可以用unordered_map代替map。

优化代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int>res;
unordered_map<int, int>myMap;
for(int i = 0; i < nums.size(); ++i){
if(myMap.find(nums[i]) != myMap.end()){
res.push_back(myMap[nums[i]]);
res.push_back(i);
break;
}
myMap[target - nums[i]] = i;
}
return res;
}
};

优化代码执行结果

1、安装插件

插件有很多,这里推荐安装WP-UTF8-Excerpt。 主要特点: 1. 支持多字节语言(如中文),不会产生乱码。 2. 摘要可保留文章中的格式标签,如字体、颜色、链接、图片等(需保留的标签可在后台设置)。 3. 首页每篇文章显示300字,存档页面每篇文章显示150字(字数可设置)。

2、修改代码

index.php是嵌套一个 content.php 的文件用于专门显示文章的内容。打开content.php文件(外观 -> 主题编辑器 -> content.php)。

1
2
3
4
5
6
the_content(
sprintf(
__( 'Continue reading %s', 'twentyfifteen' ),
the_title( '<span class="screen-reader-text">', '</span>', false )
)
);

替换成

1
2
3
4
5
if(!is_single()) {
the_excerpt();
} else {
the_content(__('(more…)'));
}

然后就能在首页显示你为文章设置的摘要了。

为vs2015同时配置opencv2和opencv3的版本,opencv3以后的一些功能(sifi,surf算法等)移到contrib中,如需使用这些功能需要单独配置contrib,为避免麻烦,这里同时配置opencv2和opencv3两个版本,方便使用。后面我会写博客介绍opencv3的contrib的配置。

配置opencv2.4.9

官网下载opencv2.4.9

打开“opencv\\2.4.9\\opencv\\build\\x86”,我们发现目录下只有vc10,vc11,vc12,并没有vc14(对应的是vs2015)。这里是没有关系的,涉及到vc的都配置成vc12就可以了。

配置环境变量

编辑系统环境变量中的path变量,添加D:\\Program Files\\opencv2.4.9\\opencv\\build\\x86\\vc12\\bin(这个目录和你安装的opencv的位置有关,下面同理)

新建工程

添加源文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream> 
#include<opencv2/opencv.hpp>

using namespace cv;

int main()
{
Mat img = imread("1.jpg");
namedWindow("1");
imshow("1", img);
waitKey(6000);
}

然后视图中选择属性管理器->Debug win32 ->Microsoft.Cpp.Win32.user,单击右键,选择属性。

配置VC++目录的包含目录和库目录

包含目录为: D:Program Files\opencv2.4.9\opencv\build\include D:Program Files\opencv2.4.9\opencv\build\include\opencv D:Program Files\opencv2.4.9\opencv\build\include\opencv2 库目录为: D:Program Files\opencv2.4.9\opencv\build\x86\vc12\lib

添加附加依赖项

选择链接器,选择输入,然后点击附加依赖项。 添加2.4.9的lib

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
opencv_ml249d.lib
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_objdetect249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_nonfree249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_videostab249d.lib
opencv_objdetect249.lib
opencv_ts249.lib
opencv_video249.lib
opencv_nonfree249.lib
opencv_ocl249.lib
opencv_photo249.lib
opencv_stitching249.lib
opencv_superres249.lib
opencv_videostab249.lib
opencv_calib3d249.lib
opencv_contrib249.lib
opencv_core249.lib
opencv_features2d249.lib
opencv_flann249.lib
opencv_gpu249.lib
opencv_highgui249.lib
opencv_imgproc249.lib
opencv_legacy249.lib
opencv_ml249.lib

运行项目

然后管理器设为Debug,X86运行项目。 成功运行出来图片,则表示配置成功。 如果运行出现缺少*.dll的错误,将对应的dll全部复制到操作系统目录下可解决问题。 具体如下:将D:\\Program Files\\opencv2.4.9\\opencv\\build\\x86\\vc12\\bin的所有文件复制到C:WindowsSystems32和C:WindowsSysWow64。

配置opencv3.2.0

配置环境变量

1
D:Program Files\opencv3.2.0\opencv\build\x64\vc14\bin

配置包含目录和库目录

属性管理器->Dubug x64 ->Microsoft.Cpp.x64.user,单击右键属性。 包含目录为:

1
2
3
D:Program Files\opencv3.2.0\opencv\build\include
D:Program Files\opencv3.2.0\opencv\build\include\opencv
D:Program Files\opencv3.2.0\opencv\build\include\opencv2

库目录为:

1
D:Program Files\opencv3.2.0\opencv\build\x64\vc14\lib

配置附加依赖项

1
2
opencv_world320d.lib
opencv_world320.lib

运行项目

管理器设为Dubug x64运行项目 至此win10上vs2015配置opencv2.4.9和opencv3.2.0完成。

vim通过命令能够快速的对文本内容进行编辑,能快速的移动光标和定位,使用起来非常方便,那怎样为其它的编辑器或IDE设置或扩展vim呢?

sublime开启vim模式

在菜单栏中: Preferences(首选项) -> Setting - User(设置 - 用户) 即可打开配置文件进行编辑,将 ignored_packages 项的[]里面内容清空:”ignored_packages”: []。 此时按ESC键,便可进入vim的command mode。

vs开启vim模式

VIM是一款很高效的编辑工具,VS2012以后支持VIM的插件:VsVim。 官网下载地址VsVim下载地址。下载安装完成后,打开vs,按ESC键便可进入vim的command mode。

xcode开启vim模式

参考我在CSDN上写的博客

_软件版本要求_

该插件用于Xcode9.0及以上,Xcode以下版本,请参考 https://github.com/XVimProject/XVim 我的Mac系统是Max 10.13.6;Xcode是10.0

_对Xcode签名证书_

  1. 关闭Xcode
  2. 打开钥匙串访问 点击菜单栏 钥匙串访问->证书助理->创建证书..
  3. 填写证书的信息:名称:XcodeSigner;身份类型:自签名根证书;证书类型:Code Signing,然后点击“创建”
  4. 打开命令行,输入如下代码:sudo codesign -f -s XcodeSigner /Applications/Xcode.app 此过程有点漫长,请耐心等待,不要关闭命令行程序

_安装插件_

  1. 下载插件的源码(使用git命令):git clone https://github.com/XVimProject/XVim2.git
  2. 确认xcode-select的指向是否正确,输入命令:xcode-select -p,会返回结果:/Applications/Xcode.app/Contents/Developer,若不是,则通过命令xcode-select -s进行设置,具体如下:xcode-select -s /Applications/Xcode.app/Contents/Developer
  3. 进行源码目录:git默认下载在家目录下的当前用户的XVim2,命令:cd ./XVim2,然后进行编译,命令:make
  4. 出现Build Succeeded表示已经编译成功。

_加载插件_

打开Xcode时,询问是否加载插件时,点击Load bundle即可。

_卸载插件_

进入源代码目录,然后用命令:make uninstall进行卸载。

_致谢_

参考博客及文章:

  1. http://blog.sina.com.cn/s/blog\_5d6f997d0102xrib.html
  2. https://www.jianshu.com/p/0345c2b0d04c
  3. https://github.com/XVimProject/XVim2

vim简介

vim是功能强大的文本编辑器,常用于Linux上,作用是用来建立、编辑、显示文件。

vim的三种工作模式

vim有三种工作模式:命令模式、插入模式、编辑模式。 vim三种模式转换

插入命令

插入命令常见的有a,A,i,I,o,O等

命令

作用

a

在光标所在字符后插入

A

在光标所在行尾插入

i

在光标所在字符前插入

I

在光标所有行行首插入

o

在光标下插入新行

O

在光标上插入新行

定位命令

命令

作用

:set nu

设置行号

:set nonu

取消行号

gg

到第一行

G

到最后一行

nG

到第n行

:n

到第n行

$

移至行尾

0

移到行首

移动光标命令

命令

作用

h

光标左移

l

光标右移

j

光标下移

k

光标上移

删除命令

命令

作用

x

删除光标所在处字符

nx

删除光标所在处后n个字符

dd

删除光标所在行,ndd删除n行

dG

删除光标所在行到文件末尾内容

D

删除光标所在处到行尾的内容

d0

删除光标前到行首的内容

:n1,n2d

删除指定范围的行

复制和剪切命令

命令

作用

yy

复制当前行

nyy

复制当前行以下n行

dd

剪切当前行

ndd

剪切当前行以下n行

p、P

粘贴在当前光标所在行下或行上

替换和取消命令

命令

作用

r

取消光标所在处的字符

R

从光标所在处开始替换字符,按ESC结束

u

取消上一步的操作

搜索和搜索替换命令

命令

作用

/string

搜索指定字符串,搜索时忽略大小写:set ic

n

搜索指定字符串的下一个出现位置

:%s/old/new/g

全文替换指定字符串

:n1,n2s/old/new/g

在指定范围内替换指定字符串

保存和退出命令

命令

作用

:w

保存修改(write)

:w new_filename

另存为指定文件

:wq

保存修改并退出

ZZ

快捷键,保存修改并退出

:q!

不保存修改并退出(quit)

:wq!

保存修改并退出

一些使用技巧

1、导入命令执行结果 :r !命令 2、定义快捷键 :map 快捷键 触发命令 如设置注释快捷键 :map ^P I# 按ctrl + p 应可以行首添加”#”进行注释 同样取消注释快捷键可以设为 :map ^B 0x 按ctrl + b 可以删除行首的”#” 3、连续行注释 :n1,n2s/^/#/g 在n1至n2行添加注释 :n1,n2s/^#/g 取消n1 n2行的注释 4、替换 :ab mail onwaier@163.com mail用onwaier@163.com来代替