linux/macOS下的vim界面配置以topo_sort

Apare_xzc 2021.2.3


先说一下,一般macOS 的/usr/share/vim/vimrc 这个路径下的vimrc 不可修改readonly, 用我尝试用sudo也不可以,可能处于安全性的考虑。
我们可以在 home目录下创建 .vimrc
比如: vim ~/.vimrc
然后进入insert模式,写入一些常用的配置,然后esc :x 保存退出


  1. 我是在我的腾讯云服务器的ubuntu系统上面进行配置的。
    首先我们可以查询一下ubuntu服务器信息:lsb_release -a

    我们可以看到系统的版本号是18.04.4,用户名为Ununtu(默认的)
    同时我们可以发现,服务器的终端是黑底白字,十分单调~

我们可以试一试vim的界面长什么样子:

vim topo_sort.cpp

打开之后的vim界面是这个样子的(还是黑底白字):

相信大家可以看出来,这是一个简单的对DAG拓扑排序的cpp程序,而且编码风格比较规范,不过这不是重点,我们要改造一下vim的界面才好。


vim的全局配置一般在/etc/vim/vimrc这个路径
我们可以在ubuntu终端输入命令

cd /etc/vim

然后

vim vimrc

没错,这个/etc/vim/vimrc是配置vim的文件,我们可以用vim打开它,然后对其进行编辑(^_^)


我们发现,最后一行现实这个文件是readonly只读的。可能是我们当前是普通用户没有权限。(刚进来是命令模式)我们在vim中输入

:q!

强行先推出。
然后在终端输入su,然后输入密码即可切换到root身份

su

输入su之后会要求输入root用户的密码(还没设置过的可以先输入sudo passwd设置一下密码),密码不回显。

我们可以发现,终端的命令提示符最后一个字母为#,而不是$,说明我们已经进入了root。
然后我们可以重新编辑vimrc这个配置文件:

cd /etc/vim
vim vimrc


我们可以发现,现在就不是只读了。我们可以按下键盘上的i(或者a或者o)进入输入模式(insert mode)对配置文件进行编辑。
我们可以简单看一下原来被注释了的配置。后面有英文的解释,告诉我们某个命令是干什么用的。比如这一行:

"set showmatch          " Show matching brackets.

就是告诉我们用set showmath 可以显示匹配的括号。当光标在某个括号上的时候,匹配的另一个括号会高亮显示。
我们只需要删除这一行第一个“注释就可以了。
我向virmc配置文件中加入了如下的配置:

set showcmd " 命令模式下,在底部显示,当前键入的指
set mouse=a " 支持使用鼠标
set encoding=utf-8
set t_Co=256 " 开启256色
set autoindent " 按下回车键后,下一行的缩进会自动跟上一行的缩进保持一致
set tabstop=4 " Tab键的空格数
set expandtab " Tab自动转化为空格
set softtabstop=4 " Tab转化为多少个空格
set number " 显示行号
" set cursorline " 光标所在当前行高亮
set showmatch " 光标在括号上时,自动高亮对应匹配的括号
set hlsearch " 搜索时高亮显示匹配结果

加入配置后,按下esc 回到命令模式,输入:wq退出。

然后再次用vim 打开一个文件,我们期待会变成好看的样子:

还是黑白的,不过至少显示了行号,而且tab键会自动变成4个空格。这个腾讯云服务器我也不知道咋搞的。。。
来看看我另一个虚拟机同样方法配置后的vim界面:

这个其实是在MacOS的终端,用relay登陆ubuntu虚拟机后,配置的vim的效果。
反正显示行号,和tab转4空格,showmatch的功能是可以正常显示了。至于语法高亮嘛…还得再研究。


另外,我的腾讯云服务器中ls和命令提示符都是白色,需要配置一下。
首先,我们可以在 $HOME下查看.bash_profile, 这个是一个用户的配置文件,每次登陆时候自动加载。默认的shell解释器是bash

cd ~
vim .bash_profile
cat .bash_profile
if [ -f "$HOME/.bashrc" ];then. "$HOME/.bashrc"#echo "已经成功加载~/.bashrc文件"
fi

感觉 . “$HOME/.bashrc” 的.也可以换成source命令, $HOME也可以写成~.
然后我们编辑 $HOME/.bashrc
可以参照这篇https://www.cnblogs.com/Q–T/p/5394993.html

alias ls='ls --color'
alias ll='ls -l --color'
PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\[\e[0m\]]\\$ "

alias 用于定义命令别名
PS1是一个环境变量,设置命令提示符的格式。

推荐这个网站:http://bashrcgenerator.com/

PS1="\n\[$(tput sgr0)\]\[\033[38;5;11m\]\\$\[$(tput sgr0)\] \[$(tput sgr0)\]\[\033[38;5;51m\]\u\[$(tput sgr0)\] \[$(tput sgr0)\]\[\033[38;5;253m\]@\[$(tput sgr0)\] \[$(tput sgr0)\]\[\033[38;5;2m\]\H\[$(tput sgr0)\] \[$(tput sgr0)\]\[\033[38;5;226m\]\w\[$(tput sgr0)\] \[$(tput sgr0)\]\[\033[38;5;250m\][\t]\[$(tput sgr0)\]\n\[$(tput sgr0)\]\[\033[38;5;196m\]\\$\[$(tput sgr0)\] \[$(tput sgr0)\]"

上面是我用这个网站设计的仿照oh-my-zsh ys主题的PS1
效果如下


vim基本配置大概就是这个流程了。
下面简单贴一下上面截图的代码好了

#include <cstdio>
#include <vector>
#include <queue>class Graph {public:Graph(int n) {this->_node_count = n;this->_adjanency_list.resize(n+1);this->_indegree.resize(n+1);}void add_edge(int u,int v,int d) {_adjanency_list[u].push_back(Node(v,d));_indegree[v] += 1;}std::vector<int> get_distance(int source_node) {std::vector<int> min_distance(_node_count+1,-1);std::queue<int> Q;min_distance[source_node] = 0;for (int u = 1; u <= _node_count; ++u) {if (_indegree[u] == 0) {Q.push(u);}}while (!Q.empty()) {int tp_node = Q.front();Q.pop();int cur_node_dis = min_distance[tp_node];for (int i = 0; i < (int)_adjanency_list[tp_node].size(); ++i) {int v_node = _adjanency_list[tp_node][i].v_node;int edge_weight = _adjanency_list[tp_node][i].edge_weight;if (--_indegree[v_node] == 0) {Q.push(v_node);}if (cur_node_dis != -1) {if (min_distance[v_node] == -1 || (cur_node_dis + edge_weight < min_distance[v_node])) {min_distance[v_node] = cur_node_dis + edge_weight;}}}}return min_distance;}
private:struct Node {int v_node;int edge_weight;Node(int v,int d) : v_node(v), edge_weight(d) {}Node() : v_node(0), edge_weight(0) {}};int _node_count;std::vector<std::vector<Node> > _adjanency_list; std::vector<int> _indegree;
};int main(void) {freopen("graph.in","r",stdin);freopen("graph.out","w",stdout);int n,m,k,u,v,d;scanf("%d%d",&n,&m);Graph graph(n);for (int i = 0; i < m; ++i) {scanf("%d%d%d",&u,&v,&d);graph.add_edge(u,v,d);}int source_node = 0;scanf("%d",&source_node);std::vector<int> dis = graph.get_distance(source_node);for (int i = 1; i <= n; ++i) {printf("%d%c",dis[i],(i == n) ? '\n' : ' ');}fclose(stdin);fclose(stdout);return 0;
}

应该不难看出这段代码的功能是拓扑排序求DAG单源最短路。
没啥。

我们直接g++ graph.cpp可以生成一个a.out的可执行文件。
然后直接./a.out可以运行。
运行后会生成graph.out



graph.in:

5 6
5 1 5
1 2 100
1 3 1
1 4 3
3 4 1
4 2 9
5

graph.out:

5 16 6 7 0

可以验证样例的输出结果是正确的。


写到这里,感觉博客是说vim配置还是说代码?就当时是日记好了。
那么我再记录一个,python 写的拓扑排序好了(^_^),最近也开始写python了
题目链接排水系统 <–
这个题,其实是2020年CSP提高组的一道题,其实就是拓扑排序+分数求和。分数的话,我们可以用Python的Fraction。

#from Queue import Queue
import threading
from queue import Queue
from queue import Empty
from fractions import Fractionclass Graph(object):def __init__(self,cnt_node):cnt_node = int(cnt_node)self.cnt_node = cnt_nodeself.edge = [ [] for i in range(cnt_node+1)]self.indegree = [0 for i in range(cnt_node+1)       ]self.flow = [Fraction(0,1) for i in range(cnt_node+1)]def add_edge(self,u,v):self.edge[u].append(v)self.indegree[v] += 1def topo_sort(self):Q = Queue()for i in range(1,self.cnt_node+1):if self.indegree[i] == 0:Q.put(i)self.flow[i] = Fraction(1,1)while not Q.empty():u = Q.get()sz = len(self.edge[u])add_flow = self.flow[u] * Fraction(1,sz) if sz != 0 else Fraction(0,1)for v in self.edge[u]:self.flow[v] += add_flow self.indegree[v] -= 1if self.indegree[v] == 0:Q.put(v)def main():with open('water.in','r') as fin:n,m = list(map(int,fin.readline().split(' ')))graph = Graph(n)outNode = []for i in range(1,n+1):arr = list(map(int,fin.readline().split(' ')))sz = arr[0]if sz == 0:outNode.append(i)for j in range(1,sz+1):v = arr[j]graph.add_edge(i,v)graph.topo_sort()with open('water.out','w') as fout:for u in outNode:line = str(graph.flow[u].numerator)+' '+str(graph.flow[u].denominator)fout.write(line+"\n")if __name__ == "__main__" :main()


这个题,我用python的提交TLE了,只过了60%的点。

那就再上一个C++的AC代码吧

#include <queue>
#include <cstdio>
#include <vector>
#include <cassert>
#include <cmath>
using namespace std;
typedef double LL;LL gcd(LL a, LL b) {return fabs(b) >= 1e-6 ? gcd(b, fmod(a, b)) : a;
}
LL lcm(LL a, LL b) {return a / gcd(a, b) * b;
}
void reduct(LL &a, LL &b) {LL g = gcd(a, b);a /= g;b /= g;
}
struct Number {LL up;LL down;Number() {up = 0;down = 1;}Number(LL _up, LL _down) {up = _up;down = _down;}void setNumber(int _up, int _down) {up = _up;down = _down;}friend Number operator + (const Number &opLeft, const Number &opRight) {LL Lcm = lcm(opLeft.down, opRight.down);LL up = opLeft.up * (Lcm / opLeft.down) + opRight.up * (Lcm / opRight.down);reduct(Lcm, up);return Number(up, Lcm);}
};int main(void) {freopen("water.in", "r", stdin);freopen("water.out", "w", stdout);int n, m, d, v;;scanf("%d%d", &n, &m);vector<vector<int>> edge(n + 1); //邻接表vector<int> indegree(n + 1); //记录入度vector<int> outNode;for (int i = 1; i <= n; ++i) {scanf("%d", &d);if (d == 0) {outNode.push_back(i);continue;}while (d--) {scanf("%d", &v);edge[i].push_back(v);++indegree[v];}}vector<Number> sum(n + 1);queue<int> Q;for (int i = 1; i <= n; ++i) {if (indegree[i] == 0) {Q.push(i);sum[i].setNumber(1, 1);}}while (!Q.empty()) {int tp = Q.front();Q.pop();LL outCnt = edge[tp].size();Number now = sum[tp];reduct(outCnt, now.up);now.down *= outCnt;reduct(now.up, now.down);for (int i = 0; i < (int)edge[tp].size(); ++i) {int to = edge[tp][i];sum[to] = sum[to] + now;if (--indegree[to] == 0) {Q.push(to);}}}for (int i = 0; i < (int)outNode.size(); ++i) {int id = outNode[i];printf("%.0lf %.0lf\n", sum[id].up, sum[id].down);}fclose(stdin);fclose(stdout);return 0;
}


题目不难,主要是练习一下最近学习的编码规范。


没了。bye-bye
2021.2.3 21:45


linux/macOS下的vim界面配置以及topo_sort Apare_xzc相关推荐

  1. Linux 环境下安装 GitLab 与配置

    什么是 GitLab? GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务. GitLab的功能特点 提供了管理,计划,创建,验证,打 ...

  2. qt程序在Linux下字体乱了,解决linux/Ubuntu下Qt creater 界面程序在编译运行后无法显示中文或中文乱码问题!...

    本文解决的主要是界面程序编译运行后无法显示中文的问题,如果在creater 中无法输入中文,下载个IBus或者搜狗之类的中文输入法即可解决! 首先说乱码问题,这个很好解决: 如果是在linux下打开W ...

  3. Linux操作系统下双网卡路由表配置

    Linux操作系统下双网卡路由表配置 作者:佚名 字体:[增加 减小] 来源:互联网 时间:09-08 17:08:11 我要评论 如果eth0为192.168.10.123/255.255.255. ...

  4. Linux系统下ifconfig和route配置网络详解

    Linux系统下ifconfig和route配置网络详解 ifconfig和route合用于配置网络(ip命令综合二者功能,此处不讲),通常在前者设置好ip地址等信息后,采用route命令配置路由.( ...

  5. Linux环境下安装tomcat并配置开机自启

    Linux环境下安装tomcat并配置开机自启 1. 将tomcat压缩包复制到Linux中,(这里复制到usr/local/tomcat目录下). 2. 使用tar zxvf apache-tomc ...

  6. 在Linux系统下XAMPP安装与配置(可离线安装)

    在Linux系统下XAMPP安装与配置(可离线安装) XAMPP网址:https://www.apachefriends.org/zh_cn/index.html 首先找到自己需要安装的版本下载地址( ...

  7. linux开发板 wifi配置,iTOP-4412开发板Linux系统下使用wifi模块配置

    精英版在 linux 下使用 wifi,需要进行下面的配置: 首先用户在拿到光盘资料以后查看下光盘里面的"linux"->"root_xxxxxxxx.tar.gz ...

  8. 在桌面Linux环境下开发图形界面程序的方案对比

    在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的 ...

  9. WIN10系统下 USG6000V1-ENSP WEB界面配置

    WIN10系统下 USG6000V1-ENSP WEB界面配置 USG6000V1-ENSPweb界面配置 首先添加Microsoft KM-TEST 环回适配器. 打开设备管理器->点击网络适 ...

最新文章

  1. 抽象工厂模式_常用设计模式--抽象工厂模式
  2. Oracle_Rac_BackgroudProcess
  3. clr 面试_Java中高级面试题及答案
  4. ./和bash的区别
  5. android 获取键盘回车键事件,设置软键盘回车键显示内容,点击空白处隐藏软键盘
  6. 史上最全 yum 入门使用教程和常见错误解决办法
  7. Python学习笔记之字典(三)
  8. 中国互联网大佬隐退简史
  9. VS2003创建动态库的一点笔记
  10. [笔试面试题] 9-数据结构与算法篇
  11. 佳明、杜斯曼集团等巨头遭勒索攻击;Emotet利用新技术实施攻击
  12. 常见信号的模拟仿真(matlab)(spike signal)
  13. 传智播客 import导入模块 学习笔记
  14. Web浏览器发送POST请求
  15. 助力公益数字化 火山引擎向公益机构捐赠多款技术产品
  16. CITA环境搭建与运行
  17. html onload div,将备用页面内容加载到div onload中
  18. iOS App 签名的原理(转)
  19. LT8911EXB MIPI DSI CSI转EDP
  20. Debug:‘boost::this_thread‘ has not been declared; undefined reference to ‘boost::this_thread...‘

热门文章

  1. JS如何定义一个类分别用Es5和Es6来实现
  2. linux新增、修改用户和组的方法
  3. 联想笔记本wifi打不开怎么办
  4. wxFormBuilder添加wxToolBar报错cpp(963) in wxToolBar::Realize(): invalid tool button bitmap解决方案
  5. onResume无限循环
  6. 程序员高铁上撸代码被拍,头发这么多,肯定不是程序员
  7. 《深度工作》一书摘抄
  8. 前端线上问题如何调试
  9. Linux 指令 关防火墙 挂载
  10. pygame中画圆方法pygame.draw.circle()使用