OI考场Emacs使用指南[原创]

御·Dragon

2019-10-25 11:42:45

Personal

~~阿里云的锅~~莫名在[博客园](https://www.cnblogs.com/CJYBlog/p/ubuntu.html)上的精美文字在洛谷变得奇丑。[更好的阅读效果请点击这里](https://www.cnblogs.com/CJYBlog/p/ubuntu.html) ------------ CSP考试由于是Linux评测系统,故使用windows参赛的选手避免不了出现系统之间的锅。 ![](https://cdn.luogu.com.cn/upload/image_hosting/7ughns8o.png) __windows用户真得劲!__ 怎么办?还好官方给出NOI_Linux系统参赛。然而这篇Blog,会以Ubuntu系统进行演示(不用担心,Ubuntu和Linux除了界面不一样,实质和命令都是相同的) ![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/w%3D268%3Bg%3D0/sign=878137e6bf3533faf5b6942890e89a22/3c6d55fbb2fb4316f37bc4922ea4462308f7d3f6.jpg) __Ubuntu上场了__ > ## Ubuntu编译指南 进入Ubuntu系统,在你想存的地址中新建一个空白文档,名称是可以随需要写,但是 __名称一定要记得加.cpp后缀!__ 举个栗子: "A+B_Problem.cpp" 即刻,右键点击文件,打开方式——选择 __"GNU Emacs 25(GUI)"__ 。点进去后,直接开始写代码就好了。我们之所以要用GNU Emacs 25(GUI)打开,是因为下文的配置适用于GNU Emacs 25(GUI),且个人感觉GNU Emacs 25(GUI)更好用。 比如: ``` #include<bits/stdc++.h> using namespace std; int a,b; int main(){ scanf("%d %d",&a,&b); printf("%lld",(long long)(a + b)); puts(""); return 0; } ``` __一定记得,每次打完代码,都要按Ctrl+x+s保存文件(不然一旦关机了......系统通常在你关闭未保存的文件时会提示你保存,点击yes即可)__ > 为什么? Ans:我们之后会讲到,当你需要运行文件时,要在终端先编译源代码,然后运行类似于windows中的.exe文件的a.out。然而,当你不保存源文件,之后的编译操作都只会编译未修改前的代码,故不管怎么改,输出都不会改变。 · 首先,将代码保存(请先确保能编译),并确保是否需要开文件(freopen) · 然后,打开终端,输入文件所在路径,如当文件在桌面中的新建文件夹里面,则输入 "cd 桌面/新建文件夹" · 这时,输入"g++ 代码名称.cpp",如"g++ check.cpp",此乃编译文件。若终端提示错误时,请回到程序修改Bug,并将步骤从“首先”二字重新开始。 · 然后,你会发现文件夹中多了一个"a.out",这时,在终端输入"./a.out",并输入样例,按回车,就可以得到输出了。当你的代码有文件时,请确保有输入文件,输出也会在输出文件中。 ![](https://cdn.luogu.com.cn/upload/image_hosting/e6n854t3.png) 是不是很激动? > ## GNU Emacs 25(GUI)编译器配置优化 在windows中用Dev-C++用顺手了,用这个四不像的编译器真TM想骂人。 ![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1572580026&di=894d7050242bcf00e3bb2a46d0dfdc3c&imgtype=jpg&er=1&src=http%3A%2F%2Fn.sinaimg.cn%2Fsinacn%2Fw700h752%2F20180214%2F6f51-fyrpeie6650541.jpg) 那么我们不妨来修改修改配置,让编译器更加清爽。 > 怎么修改配置呢 首先,点击文件,进入主文件夹(Home),按Ctrl+h显示所有文件,然后新建空白文档,文档名".emacs",在里面输入下面的东西,复制粘贴即可。 __超级豪华顶级配置__ (当你在家食用Ubuntu的时候,肯定希望配置越NB越好。) ``` (global-set-key [f9] 'compile-file) (global-set-key [f10] 'gud-gdb) (global-set-key (kbd "C-s") 'save-buffer) (global-set-key (kbd "C-z") 'undo) (global-set-key (kbd "RET") 'newline-and-indent) (global-linum-mode t) (show-paren-mode t) (define-key key-translation-map (kbd "C-d") (kbd "M-p M-y")) (global-set-key (kbd "M-p M-y") 'kill-whole-line) (define-key key-translation-map (kbd "C-a") (kbd "C-x h")) (setq c-default-style "awk") ;;;上面是考场必备 (ido-mode t) (setq default-frame-alist '((vertical-scroll-bars) (top . 25) (left . 45) (width . 120) (height . 40) (background-color . "grey15") (foreground-color . "grey") (cursor-color . "gold1") (mouse-color . "gold1") (tool-bar-lines . 0) (menu-bar-lines . 1) (scroll-bar-lines . 0) (right-fringe) (left-fringe))) (global-hl-line-mode 1) (set-face-background 'highlight "gray5") (set-face-foreground 'region "cyan") (set-face-background 'region "blue") (set-face-foreground 'secondary-selection "skyblue") (set-face-background 'secondary-selection "darkblue") ;;;;;设置org模式 (setq org-startup-indented t) ;(setq org-log-done 'time) ;(s.etq org-log-done 'note) ; ;;;无关紧要 (set-cursor-color "wheat") (set-mouse-color "wheat") (global-font-lock-mode t);;高亮 ;;;;;设置编译信息 (defun compile-file () (interactive) (compile (format "g++ -o %s %s -g -lm -Wall" (file-name-sans-extension (buffer-name))(buffer-name)))) ;;(global-set-key (kbd "<f9>") 'compile-file) ;;;;;设置F9一键调试 ;;;;;改变emacs标题栏的标题 (setq frame-title-format "CJY-Dragon") ;;;;;允许emacs和外部其他程序的粘贴 (setq x-select-enable-clipboard t) ;; 显示列号 (setq column-number-mode t) ;;设置tab的宽度 (setq default-tab-width 4) (setq c-basic-offset 4) ;;;;;启用时间显示设置(可能时间需要调整) (display-time-mode 1) ;;;;;时间使用24小时制 (setq display-time-24hr-format t) ;;;;;时间显示包括日期和具体时间 (setq display-time-day-and-date t) ;;;;;时间的变化频率 (setq display-time-interval 10) ;;;;;是用滚轴鼠标 (mouse-wheel-mode t) ;;;;;备份设置 ;;;;;emacs还有一个自动保存功能,默认在~/.emacs.d/auto-save-list里,这个非常有用,我这里没有改动,具体可以参见Sams teach yourself emacs in 24hours(我简称为sams24) ;;;;;备份设置方法,直接拷贝 (setq backup-by-copying t) ;; 自动存盘 (setq auto-save-mode t) ;;去警告铃声 (setq visible-bell nil) (setq ring-bell-function 'ignore) ;;;;;指针取消闪动,不然眼睛会花了 (blink-cursor-mode -1) ;;;;;滚动页面时比较舒服,不要整页的滚动 (setq scroll-step 1 scroll-margin 3 scroll-conservatively 10000) ;;;;;设定删除保存记录为200,可以方便以后无限恢复 (setq kill-ring-max 200) ;;;;;修改透明度 (set-frame-parameter (selected-frame) 'alpha (list 85 50)) (add-to-list 'default-frame-alist (cons 'alpha (list 85 50))) (setq-default cursor-type 'bar) (show-paren-mode 1);;括号匹配 (fset 'yes-or-no-p 'y-or-n-p);;酱油的 (setq make-backup-files nil) (global-auto-revert-mode t);自动reload文件 (global-set-key (kbd "<f8>") 'gdb-many-windows) (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(blink-cursor-mode nil) '(column-number-mode t) '(cua-mode t nil (cua-base)) '(display-time-mode t) '(inhibit-startup-screen t) '(show-paren-mode t)) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(default ((t (:family "Ubuntu Mono" :foundry "unknown" :slant normal :weight normal :height 143 :width normal))))) (auto-insert-mode) ;;; Adds hook to find-files-hook (setq auto-insert-directory "~/.emacs.d/mytemplates/") ;;; Or use custom, *NOTE* Trailing slash important (setq auto-insert-query nil) ;;; If you don't want to be prompted before insertion (define-auto-insert "\." "moban.cpp") ``` __但是这个配置在考场上又不能复制粘贴,这么一大段,也被不下来吧__ 考场易记高级配置 ``` (set-background-color "gray15") (set-foreground-color "gray") (global-set-key [f9] 'compile) (global-set-key [f10] 'gud-gdb) (global-set-key (kbd "C-s") 'save-buffer) (global-set-key (kbd "C-a") 'mark-whole-buffer) (global-set-key (kbd "RET") 'newline-and-indent) (setq default-cursor-type 'bar) (setq default-tab-width 4) (setq c-default-style "awk") (set-frame-parameter (selected-frame) 'alpha (list 85 50)) ``` > 粘贴完之后呢 保存,关闭即可。这时候再用GNU Emacs 25(GUI)打开你任意一个程序 哇,爽爆了 > 修改配置的好处都有啥? ~~谁说对了就给他~~ 御·Dragon的感受如下 1. F9一键编译,可以避免在终端g++时编译错误又返回而浪费时间。 2. F10一键运行,不用到终端去了 3. 编译器透明,(需要超级豪华顶级配置),要看题面、数据时不用总是切屏 4. 页面及其清爽 > @Karry5307 大神给出了一些别的界面优化 ![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1572014343375&di=7f75f0f117374afb101ea10b0641f089&imgtype=0&src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20180823%2Ffd248ba557f24fb7acfc67933f5c253b.jpeg) > ## Ubuntu对拍帮手 > 对拍是什么? 这里我不细说。 就是两个源程序,一个对拍程序,随机一组数据比较两个源程序的输出一不一样 > Ubuntu的对拍怎么弄? 注意:对拍一定要开文件! 我们这里一共需要 4 个程序,分别是"data.cpp"、"my.cpp"、 "text.cpp"、"check.sh" __(重点)__ 在每次修改完后、对拍前,请先进入"my.cpp"、"text.cpp"与"data.cpp"进行编译,否则新的对拍只会测试修改前的代码,使得答案不改变! > "data.cpp"为数据生成程序,__随题目需要求改__ 我们还是拿A+B举例子,A+B的随机数据代码如下 ``` #include<bits/stdc++.h> using namespace std; const long long MOD=1e18; int main() { freopen("input.in","w",stdout);//input.in是对拍当前输入数据的文件 srand(time(NULL));//这个地方很重要,保证了你每次随机出来的数不一样 int a,b; a = rand()%100000000;//随机数 b = rand()%100000000;//随机数 printf("%d %d",a,b); return 0; } ``` > "my.cpp"为 __自己写的__ 程序(即正确性需要对拍验证的程序) ``` #include<bits/stdc++.h> using namespace std; int a,b; int main(){ freopen("input.in","r",stdin); freopen("my.out","w",stdout); scanf("%d %d",&a,&b); printf("%lld",(long long)(a + b - 1)); puts(""); return 0; } ``` > "text.cpp"为与你自己程序 __对拍的程序__ (如题解、暴力等) ``` #include<bits/stdc++.h> using namespace std; int a,b; int main(){ freopen("input.in","r",stdin); freopen("text.out","w",stdout); scanf("%d %d",&a,&b); printf("%lld",(long long)(a + b - 1)); puts(""); return 0; } ``` > "check.sh"为对拍程序 在check.sh中输入(推荐使用emacsGUI编译) ``` #!bin/bash while true; do ./data ./my ./text if diff my.out text.out; then echo AC else echo WA exit 0 fi done ``` 以上全部保存到文件里面即可。 然后在终端输入在终端输入 bash ./check.sh 即可运行进行对拍 __百度网盘对拍压缩包(A+B-Problem为例)链接: https://pan.baidu.com/s/12uajVLSgfZt7DbkUAVrgDg 提取码: dhe5__ ## 今天就到这吧,还有什么没有提及的,欢迎来de!