Linux
noi linux默认密码:123456
(noilinux)可以直接把文件拖到最上面(类似快捷方式?),删除方法:alt + 右键。
(娱乐用)可以尝试 alt + 右键上面的条。
终端里面使用的一些语句
linux环境下:
//创建一个新的cpp文件:
vim filename.cpp
//插入(即写代码)
i(快捷键)
//复制粘贴
Ctrl + Shift + C/V
//保存退出
w:保存;q:退出;!强制
因此操作为:先esc,然后输入":wq!" 或者 "wq"
//编译
g++ filename.cpp -o filename
注意:-o filename 指的是将操作内容输出到filename指定文件中,不可分割。
如果想要加一些编译选项,应该在它前面加:
g++ filename.cpp -O2 -Wall -Wl,--stack=112345678 -fsanitize=address -Wshadow -std=c++11
(Wshadow意思为在变量重名的时候Warning)
//运行
./filename.exe
未定义行为的检测
(据说)-fsanitize=undefined
//神仙们的编译(可能有额外错误提示)
-fsanitize=address
-ftrapv
vim相关
Vim主要分为两种模式:普通模式和插入模式。一开始默认为普通模式,此时随便敲打键盘将会出一些奇奇怪怪的东西;按 \(i\) 或 \(a\) 键进入插入模式,按 \(esc\) 退出。
.vimrc
我们需要进行一些配置。主要有三个:缩进改为两空格,自动缩进,括号回车自动缩进。
方法:在主文件夹建立一个 .vimrc
文件。可以直接在终端敲 vim .vimrc
set tabstop=2 //手敲 tab 两缩进
set shiftwidth=2 //自动缩进两缩进
set autoindent //自动缩进
set cindent //c风格自动缩进
set ruler //右下角显示行数列数
set nu //左边显示行号
nnoremap <F9> : call CompileRunGcc()<CR> //(普通模式下)一键编译运行
func! CompileRunGcc() //运行函数
exec "w" //以下相当于在 vim 的普通模式下的“命令行”的输入
exec '!g++ % -o %<' // % 表示当前文件名,%<表示去除当前文件名后面的后缀名以后的名字
exec '!time ./%<'//似乎单引号双引号都行,并且单引号可以少打一些 '\'
endfunc
nnoremap <F12> : call Clr()<CR> //(普通模式下)清空命令行
func! Clr()
exec "!clear"
endfunc
所有这些配置均可在普通模式下的“命令行”中直接输入,只会生效一次。
为了方便复制粘贴,可以用 set nonu
来取消左侧行号
一些快捷键
普通模式下按 G (大写)跳至行末,然后按 v 进入可视模式,然后按 gg 跳至开头,就可以实现“全选”操作了。
vim中复制粘贴时缩进混乱的解决方法
首先把光标搞到最左上角,然后按Ctrl V
,G
(大写),=
,就好了。
生活中 linux 的一些操作
//转移路径到桌面:
cd Desktop
//查询大小
size filename
//下载火狐浏览器
sudo apt-get install firefox
//更新火狐浏览器
sudo apt install --only -upgrade firefox
2020.8.28 Update
vimtutor
vim 的基础可以直接看vimtutor(这个是中文的)。直接在终端里打开即可。
第一讲小结
1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键。
h (左移) j (下行) k (上行) l (右移)
2. 欲进入 Vim 编辑器(从命令行提示符),请输入:vim 文件名 <回车>
3. 欲退出 Vim 编辑器,请输入 <ESC> :q! <回车> 放弃所有改动。
或者输入 <ESC> :wq <回车> 保存改动。
4. 在正常模式下删除光标所在位置的字符,请按: x
5. 欲插入或添加文本,请输入:
i 输入欲插入文本 <ESC> 在光标前插入文本
A 输入欲添加文本 <ESC> 在一行后添加文本
特别提示:按下 <ESC> 键会带您回到正常模式或者撤消一个不想输入或部分完整
的命令。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲小结
1. 欲从当前光标删除至下一个单词,请输入:dw
2. 欲从当前光标删除至当前行末尾,请输入:d$
3. 欲删除整行,请输入:dd
4. 欲重复一个动作,请在它前面加上一个数字:2w
5. 在正常模式下修改命令的格式是:
operator [number] motion
其中:
operator - 操作符,代表要做的事情,比如 d 代表删除
[number] - 可以附加的数字,代表动作重复的次数
motion - 动作,代表在所操作的文本上的移动,例如 w 代表单词(word),
$ 代表行末等等。
6. 欲移动光标到行首,请按数字0键:0
7. 欲撤消以前的操作,请输入:u (小写的u)
欲撤消在一行中所做的改动,请输入:U (大写的U)
欲撤消以前的撤消命令,恢复以前的操作结果,请输入:CTRL-R
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲小结
1. 要重新置入已经删除的文本内容,请按小写字母 p 键。该操作可以将已删除
的文本内容置于光标之后。如果最后一次删除的是一个整行,那么该行将置
于当前光标所在行的下一行。
2. 要替换光标所在位置的字符,请输入小写的 r 和要替换掉原位置字符的新字
符即可。
3. 更改类命令允许您改变从当前光标所在位置直到动作指示的位置中间的文本。
比如输入 ce 可以替换当前光标到单词的末尾的内容;输入 c[美元符号] 可以替换当
前光标到行末的内容。
4. 更改类命令的格式是:
c [number] motion
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲小结
1. CTRL-G 用于显示当前光标所在位置和文件状态信息。
G 用于将光标跳转至文件最后一行。
先敲入一个行号然后输入大写 G 则是将光标移动至该行号代表的行。
gg 用于将光标跳转至文件第一行。
2. 输入 / 然后紧随一个字符串是在当前所编辑的文档中正向查找该字符串。
输入 ? 然后紧随一个字符串则是在当前所编辑的文档中反向查找该字符串。
完成一次查找之后按 n 键是重复上一次的命令,可在同一方向上查
找下一个匹配字符串所在;或者按大写 N 向相反方向查找下一匹配字符串所在。
CTRL-O 带您跳转回较旧的位置,CTRL-I 则带您到较新的位置。
3. 如果光标当前位置是括号(、)、[、]、{、},按 % 会将光标移动到配对的括号上。
4. 在一行内替换头一个字符串 old 为新的字符串 new,请输入 :s/old/new
在一行内替换所有的字符串 old 为新的字符串 new,请输入 :s/old/new/g
在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g
在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g
进行全文替换时询问用户确认每个替换需添加 c 标志 :%s/old/new/gc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲小结
1. :!command 用于执行一个外部命令 command。
请看一些实际例子:
(MS-DOS) (Unix)
:!dir :!ls - 用于显示当前目录的内容。
:!del FILENAME :!rm FILENAME - 用于删除名为 FILENAME 的文件。
2. :w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文
件中。
3. v motion :w FILENAME 可将当前编辑文件中可视模式下选中的内容保存到文件
FILENAME 中。
4. :r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置
后面。
5. :r !dir 可以读取 dir 命令的输出并将其放置到当前文件的光标位置后面。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲小结
1. 输入小写的 o 可以在光标下方打开新的一行并进入插入模式。
输入大写的 O 可以在光标上方打开新的一行。
2. 输入小写的 a 可以在光标所在位置之后插入文本。
输入大写的 A 可以在光标所在行的行末之后插入文本。
3. e 命令可以使光标移动到单词末尾。
4. 操作符 y 复制文本,p 粘贴先前复制的文本。
5. 输入大写的 R 将进入替换模式,直至按 <ESC> 键回到正常模式。
6. 输入 :set xxx 可以设置 xxx 选项。一些有用的选项如下:
'ic' 'ignorecase' 查找时忽略字母大小写
'is' 'incsearch' 查找短语时显示部分匹配
'hls' 'hlsearch' 高亮显示所有的匹配短语
选项名可以用完整版本,也可以用缩略版本。
7. 在选项前加上 no 可以关闭选项: :set noic
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第七讲小结
1. 输入 :help 或者按 <F1> 键或 <Help> 键可以打开帮助窗口。
2. 输入 :help cmd 可以找到关于 cmd 命令的帮助。
3. 输入 CTRL-W CTRL-W 可以使您在窗口之间跳转。
4. 输入 :q 以关闭帮助窗口
5. 您可以创建一个 vimrc 启动脚本文件用来保存您偏好的设置。
6. 当输入 : 命令时,按 CTRL-D 可以查看可能的补全结果。
按 <TAB> 可以使用一个补全。
补充
-
Linux 可以敲中文的,按
shift
键即可。但是好像只有键盘左边的那个shift
管用。 -
vim 写程序其实可以不用非得退出后再编译运行,可以直接在普通模式下输入
:!g++ %
(注意要加“!”,因为这个是 vim 外面的命令),然后就自动编译到a.out
文件里面了(我也不会改,实在不行就:!g++ filename.cpp -o filename
);并且在vim里还可以运行,输:!./filename
即可。它会自动跳转到终端,并且运行完以后随便按个键就又回来了。 -
在 vim 里面的复制粘贴直接用 y 和 p 就好,用法见上面的 vimtutor;如果想要复制粘贴到 vim 外面,目前我知道的可行的方法就只有“拖拽”法,即手动用鼠标拖拽出想要复制的区域,Ctrl + shift + c。可能需要先Ctrl--,需要有一定的眼力。
-
关于 vim 的分屏:如果直接用
:sp a.cpp
的话,会分成上下两个屏幕,与平时习惯不符。使用:vs a.cpp
可以方便地分成左右两个屏幕。
2020.9.1 Update(Yousiki讲课)
终端命令:
-
不
-o filename
自动生成到 a.out -
make b
: 自动执行g++ b.cpp -o b
-
cp a.cpp b.cpp
: 赋值 a.cpp 到 b.cpp -
cat a.cpp
: 查看 a.cpp 的内容 -
rm a.cpp
: 删除 a.cpp -
mv a.cpp b.cpp
: 移动(重命名) a.cpp 到 b.cpp -
mv a.cpp noi/
: 将 a.cpp 移动到 noi 目录下 -
cp a.cpp noi/
: 将 a.cpp 赋值一份放到 noi 目录下 -
注意:不要 g++ a.cpp -o a.cpp,这样代码就没了
-
nl a.cpp
: 显示 a.cpp 的代码并且显示行号 -
diff a b
: 将 a 和 b 进行比较 -
./c >output
: 将c的输出重定向到 output 文件 -
./c <input
: 将c的输入从定向到 input 文件
对拍
mkdir checker
: 创建文件夹 checker
cd checker/
vim a.cpp
vim b.cpp
vim maker.cpp
vim checker.cpp
make a
make b
make maker
make checker
: 此时开始对拍
编辑器
(大部分不支持编译)
getit
可以显示行号,调 tab 长度,调字体等
vim
可以开较大的文件,不会死机。
一些常用操作:
:set ts=4
4空格缩进
:set nu
显示行号
d 20 d
从当前光标开始数20行都删除
emacs
linux最强大的编译器,可以用鼠标。
打开:emacs a.cpp
Ctrl x + Ctrl s
保存
Ctrl x + Ctrl c
退出
guide
和 windows 的 dev-cpp 一样,但是不是很好使
gdb 调试
g++ a.cpp -o a -g
gdb a
b 6
: 在第6行加断点
r
: 执行
p a
: 输出变量 \(a\)
p a+b
: 输出 \(a + b\) 的值
q
: 退出
杂
make
写 Makefile : vim Makefile
a : a.cpp
g++ a.cpp -o a -Wall -std=c++11
( \(a\) 依赖于 a.cpp
)
以后就可以 make a
了。(如果没有 Makefile 默认 g++ a.cpp -o a
)
time
time ./a
: 会显示 real ...s user ...s sys ...s
,其中 real 是运行时间
注意不要用标准输入,否则输入的时间也会算进去
一个终端窗口中搞多个命令行
Ctrl shift T
: 新建命令行
Ctrl Pageup/Pagedown
: 在多个命令行中切换
ubuntu 20.04.1
sudo apt update
sudo apt upgrade -y
mirror.tuna.tsinghua.edu.cn
ubuntu 清华镜像 会快很多
复制粘贴到 vim 外
vim 内用 y 复制的东西不能弄到外面,只能用鼠标手动拖拽后 Ctrl + C 然后弄到外面。
由于 vim 在拖拽时无法移动屏幕,只能 Ctrl--------- 到最小后再拖拽,比较麻烦。
一个可行的办法是,在 vim 内敲 !cat %
然后就可以移动屏幕了。或者在 vim 外敲 cat filename.cpp
也是一个效果。
2020.11.9 Update
gedit
由于 vim 的复制粘贴功能过于令人无语,平时使用时可以用 gedit 来进行此类操作。gedit 有些像 Windows 里面的记事本。
-
gedit
:打开 gedit -
gedit filename.cpp
:打开filename.cpp
,但是这时这个终端就没法用了 -
gedit filename.cpp&
:打开filename.cpp
,但是此时这个终端还能继续用。
调整系统栈
-
ulimit -a
获得一些信息,其中stack size
即为当前系统栈大小。可以在里面看到单位为KB -
ulimit -s 102400
:开 100MB 的系统栈 -
help ulimit
获取更多(英文)帮助
杂
-
diff tree.out tree.ans
这样可能会由于行末空格以及文末回车导致不同。可以diff tree.out tree.ans -w
来忽略行末空格和文末回车。 -
-fsanitize=address
可以检查是否内存泄漏(数组越界)。加上-fsanitize=undefined
可以显示RE的行号,但是NOI linux不能用。不过可以在它给的信息中找到#0 0x80488e2 (/home/noilinux/jzp/test+0x80488e2)
这样的信息,然后addr2line 0x80488e2 -e ./test
就能获得行号。可以addr2line --help
获取更多帮助。 -
-ftrapv
可以检查是否爆 int 或爆 long long。但是开启此编译选项可能会影响性能。 -
打开大文件要用
vim
,用gedit
打开会卡掉。 -
当某个文件(如
gedit
)卡掉需要强制关掉时,需要去终端里敲pkill gedit
或者pkill gedit -9
强制关闭。 -
编译选项最好加上
-g
,加上后方便调试(如addr2line
就可以看到行号了) -
vimdiff a.out b.out
是个很好用的命令,可以在 vim 中同时打开两个文件并且显示哪些行不同。
time
测试程序运行时间和内存:\time -f "%U %M" ./test
。其中 \time
需要安装 time,安装方法:[root@roclinux ~]# yum install time
,但是 NOI Linux 应该有。其中 -f 是 -format 的意思,-format FORMAT
可以让它只输出我们想要的东西,并且是以我们想要的格式。 %U
是 user time
运行时间,%M
是运行所用空间,单位 KB。注意这里的空间是使用到的部分,比如说开个 10000000 的数组但不适用是不会算进去的。
至于那个 user time,指的是 CPU 时间,即不包括 IO 的等待时间。NOI 系列比赛都是看的 user time。
目前使用的 .vimrc
注意 time
那行要用单引号,否则需要敲更多的 \
set autoindent
set cindent
set mouse=a
set shiftwidth=2
set tabstop=2
set nu
set ruler
nmap<F9> : call Jzp() <CR>
func! Jzp()
exec "w"
exec "!clear"
exec "!g++ % -o %< -fsanitize=address -ftrapv -Wall -g"
exec '!\time -f "time : \%U memo : \%M" ./%<'
endfunc
nmap<F12> : call Zzz() <CR>
func! Zzz()
exec "w"
exec "!clear"
exec '!g++ % -o %< -O2'
exec '!\time -f "time : \%U memo : \%M" ./%<'
endfunc
(以下为20230213版本)
set tabstop=2
set shiftwidth=2
set autoindent
autocmd FileType cpp set cindent
set ruler
set nu
set mouse=a
autocmd FileType cpp nmap<F8> : !g++ % -o %<
autocmd FileType cpp nmap<F9> : call Compile_cpp() <CR>
func! Compile_cpp()
exec "w"
exec "!clear"
exec "!g++ % -o %< -fsanitize=address -ftrapv -Wall -g"
endfunc
autocmd FileType cpp nmap<F12> : call Execute_cpp() <CR>
func! Execute_cpp()
exec '!\time ./%<'
endfunc
autocmd FileType sh nmap<F9> : call Execute_sh() <CR>
func! Execute_sh()
exec "w"
exec "!clear"
exec "!./%"
endfunc
nmap<F9> : !python3 %