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相关

oi wiki : Vim

Vim主要分为两种模式:普通模式和插入模式。一开始默认为普通模式,此时随便敲打键盘将会出一些奇奇怪怪的东西;ia 键进入插入模式,按 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 VG(大写),=,就好了。

生活中 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> 可以使用一个补全。

补充

2020.9.1 Update(Yousiki讲课)

终端命令:

对拍

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 里面的记事本。

调整系统栈

time

测试程序运行时间和内存:\time -f "%U %M" ./test。其中 \time 需要安装 time,安装方法:[root@roclinux ~]# yum install time,但是 NOI Linux 应该有。其中 -f 是 -format 的意思,-format FORMAT 可以让它只输出我们想要的东西,并且是以我们想要的格式。 %Uuser 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 %