- 编程
OI考场Emacs使用指南
- 2023-4-6 13:36:02 @
CSP考试由于是Linux评测系统,故使用windows参赛的选手避免不了出现系统之间的锅。
windows用户真得劲!
怎么办?还好官方给出NOI_Linux系统参赛。然而这篇Blog,会以Ubuntu系统进行演示(不用担心,Ubuntu和Linux除了界面不一样,实质和命令都是相同的)
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",并输入样例,按回车,就可以得到输出了。当你的代码有文件时,请确保有输入文件,输出也会在输出文件中。
是不是很激动?
GNU Emacs 25(GUI)编译器配置优化
在windows中用Dev-C++用顺手了,用这个四不像的编译器真TM想骂人。
那么我们不妨来修改修改配置,让编译器更加清爽。
怎么修改配置呢
首先,点击文件,进入主文件夹(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的感受如下
- F9一键编译,可以避免在终端g++时编译错误又返回而浪费时间。
- F10一键运行,不用到终端去了
- 编译器透明,(需要超级豪华顶级配置),要看题面、数据时不用总是切屏
- 页面及其清爽
@Karry5307 大神给出了一些别的界面优化
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