linux/macOS下的vim界面配置以及topo_sort Apare_xzc
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 保存退出
- 我是在我的腾讯云服务器的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相关推荐
- Linux 环境下安装 GitLab 与配置
什么是 GitLab? GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务. GitLab的功能特点 提供了管理,计划,创建,验证,打 ...
- qt程序在Linux下字体乱了,解决linux/Ubuntu下Qt creater 界面程序在编译运行后无法显示中文或中文乱码问题!...
本文解决的主要是界面程序编译运行后无法显示中文的问题,如果在creater 中无法输入中文,下载个IBus或者搜狗之类的中文输入法即可解决! 首先说乱码问题,这个很好解决: 如果是在linux下打开W ...
- Linux操作系统下双网卡路由表配置
Linux操作系统下双网卡路由表配置 作者:佚名 字体:[增加 减小] 来源:互联网 时间:09-08 17:08:11 我要评论 如果eth0为192.168.10.123/255.255.255. ...
- Linux系统下ifconfig和route配置网络详解
Linux系统下ifconfig和route配置网络详解 ifconfig和route合用于配置网络(ip命令综合二者功能,此处不讲),通常在前者设置好ip地址等信息后,采用route命令配置路由.( ...
- Linux环境下安装tomcat并配置开机自启
Linux环境下安装tomcat并配置开机自启 1. 将tomcat压缩包复制到Linux中,(这里复制到usr/local/tomcat目录下). 2. 使用tar zxvf apache-tomc ...
- 在Linux系统下XAMPP安装与配置(可离线安装)
在Linux系统下XAMPP安装与配置(可离线安装) XAMPP网址:https://www.apachefriends.org/zh_cn/index.html 首先找到自己需要安装的版本下载地址( ...
- linux开发板 wifi配置,iTOP-4412开发板Linux系统下使用wifi模块配置
精英版在 linux 下使用 wifi,需要进行下面的配置: 首先用户在拿到光盘资料以后查看下光盘里面的"linux"->"root_xxxxxxxx.tar.gz ...
- 在桌面Linux环境下开发图形界面程序的方案对比
在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的 ...
- WIN10系统下 USG6000V1-ENSP WEB界面配置
WIN10系统下 USG6000V1-ENSP WEB界面配置 USG6000V1-ENSPweb界面配置 首先添加Microsoft KM-TEST 环回适配器. 打开设备管理器->点击网络适 ...
最新文章
- 抽象工厂模式_常用设计模式--抽象工厂模式
- Oracle_Rac_BackgroudProcess
- clr 面试_Java中高级面试题及答案
- ./和bash的区别
- android 获取键盘回车键事件,设置软键盘回车键显示内容,点击空白处隐藏软键盘
- 史上最全 yum 入门使用教程和常见错误解决办法
- Python学习笔记之字典(三)
- 中国互联网大佬隐退简史
- VS2003创建动态库的一点笔记
- [笔试面试题] 9-数据结构与算法篇
- 佳明、杜斯曼集团等巨头遭勒索攻击;Emotet利用新技术实施攻击
- 常见信号的模拟仿真(matlab)(spike signal)
- 传智播客 import导入模块 学习笔记
- Web浏览器发送POST请求
- 助力公益数字化 火山引擎向公益机构捐赠多款技术产品
- CITA环境搭建与运行
- html onload div,将备用页面内容加载到div onload中
- iOS App 签名的原理(转)
- LT8911EXB MIPI DSI CSI转EDP
- Debug:‘boost::this_thread‘ has not been declared; undefined reference to ‘boost::this_thread...‘
热门文章
- JS如何定义一个类分别用Es5和Es6来实现
- linux新增、修改用户和组的方法
- 联想笔记本wifi打不开怎么办
- wxFormBuilder添加wxToolBar报错cpp(963) in wxToolBar::Realize(): invalid tool button bitmap解决方案
- onResume无限循环
- 程序员高铁上撸代码被拍,头发这么多,肯定不是程序员
- 《深度工作》一书摘抄
- 前端线上问题如何调试
- Linux 指令 关防火墙 挂载
- pygame中画圆方法pygame.draw.circle()使用