操作系统:对下控制硬件运行,对上为应用程序提供支持
linux 基于unix发展而来
linux内核: 系统的心脏,提供操作系统的最基本的功能,它负责管理系统的进程调动、内存管理、 设备驱动、文件和网络系统,决定着系统的性能和稳定性。(linux内核是用C语言编写的开源程序)
linux发行版: linux内核 + 一套软件+使用手册
常见的发行版:centos redhat ubuntu Fedora
windows和linux文件系统区别:
windows:每个驱动器都有自己的根目录结构,这样形成了多个树并列的情形
linux:
ubuntu 没有盘符这个概念,只有一个根目录/,所有文件都在它下面
/bin 、/usr/bin:可执行二进制文件的目录
/boot:放置 linux 系统启动时⽤到的⼀些⽂件,如 linux 的内核⽂件: /boot/vmlinuz ,系统引 导管理器: /boot/grub
/dev:存放linux系统下的设备⽂件,访问该⽬录下某个⽂件,相当于访问某个设备,常⽤的是挂 载光驱 mount /dev/cdrom /mnt
/etc:系统配置⽂件存放的⽬录,不建议在此⽬录下存放可执⾏⽂件
/lib、/usr/lib、/usr/local/lib:系统使⽤的函数库的⽬录,程序在执⾏过程中,需要调⽤⼀些额外的 参数时需要函数库的协助
/sbin、/usr/sbin、/usr/local/sbin:放置系统管理员使⽤的可执⾏命令
/usr:应⽤程序存放⽬录
/root:系统管理员root的家⽬录
mkdir 创建目录 递归创建目录-p
touch 创建文件
gedit 编辑文件
-i 以进行交互式方式执行
-f 强制删除,忽略不存在的文件,无序提示
-r 递归地删除目录下的内容,删除文件夹(目录)时必须加此参数
-n 查看文件内容,并且对每行进行编号(含空行)
-b 查看文件内容,并且对每行进行编号(不含空行)
-s 查看文件内容,多个空白行只显示一行
连接文件: 如 cat text.txt tet.txt 使用cat方式将两个文件合并查看
!历史指令编号 - 执⾏历史指令
最近想让师兄把他服务器上的数据集拷到我服务器 用了这两个命令
scp :secure copy(默认端口为22)
上传 scp 本地路径 服务器用户名@服务器地址:远程路径
ex: scp local_file username@ip:remote_folder
如果复制目录下的所有文件:scp -r local_file username@ip:remote_folder
当端口非22时:
scp -P 333333 -r local_file username@ip:remote_folder
下载 scp 服务器用户名@服务器地址:远程路径 本地路径
rsync:remote sync
参数:-a ,–archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
-v, --verbose 详细模式输出
ex: rsync -av local_file username@ip:remote_folder
区别:scp是相当于复制,粘贴,如果有的话是覆盖,比较耗时间,而rsync有重复的文件,会直接跳过; rsync远程拷贝可以附带软链接/硬链接, 而scp不支持链接的拷贝;(然后师兄说如果是压缩包用scp,不让用rsync)
ssh:ssh [-p port] username@remote(域名/IP地址,也可以配置别名)
使用 exit 退出当前用户的登录
域名/IP地址
端口号(SSh 服务器 22;Web服务器 80;HTTPS 443;FTP 服务器 21)
(WinSCP MobaXterm)当然也可以使用图形软件进行ssh登录服务器,进行文件传输,WinSCP,使用SFTP协议(ssh 文件传输协议)
(1) python
python --version / python -V
(2)torch
import torch
print(torch.__version __)
(3) cuda
cat /usr/local/cuda/version.txt
(4) cudnn
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
#查看版本
python
import cv2
print(cv2.__version__)
或者:python -c "import cv2;print(cv2.__version__)"
#安装指定版本cv2
pip install opencv_python == 3.4.2.17(指定版本)
pip install opencv-contrib-python==3.4.2.17
为啥会有 opencv-contrib-python 呢? opencv contrib是opencv的扩展版本,像SIFT等算法都放在Contrib库中了
参考Python opencv contrib版本安装指北
(1)which python
(2)python -c “import sys;print(sys.executable)”
(3)python -c “import os;print(os.sys.executable)”
更新conda: conda update -n base conda
创建一个环境: conda creat --name pytracking python==3.7
激活某个程序的环境: conda activate pytracking(你代码的名字)
停止一个激活的环境: conda deactivate
更换源:
(1)直接vim ~/.condarc 手动添加镜像路径
(2)conda config --add channels https://mirrors.tuna.tsinghua.edu/cn/anaconda/pkgs/free
conda config --set show_channel_urls yes
如果要移除的话:conda config --remove channels ‘http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/’
参考
du -sh * (disk usage 查看当前目录下各个文件及目录占用空间的大小)
du -sh filename (查看指定文件的大小)
du -h 查看目录下所有文件的大小
cp命令主要用于复制文件或目录 cp 源文件 目标文件
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
-i:覆盖文件前提示
cp 源文件 目标文件
今天用到了,复制多个文件到另一个目录下
cp ltr/result_module2/checkpoints/ltr/bbreg/atom_default/{ATOMnet_ep0050.pth.tar,ATOMnet_ep0049.pth.tar,ATOMnet_ep0048.pth.tar,ATOMnet_ep0047.pth.tar} pytracking/networks/
看到多个文件用{ }包起来
下载数据集需要,可以网络不稳定,老是断,这个命令拯救了我
它的名字是“World Wide Web”和“Get”的结合,同时也隐含了软件的主要功能。目前它支持通过HTTP、HTTPS,以及FTP这三个最常见的TCP/IP协议协议下载。
1.使用wget -c
断点续传,重新启动下载中断的文件
需要继续中断的下载时可以使用-c参数
例如我下载coco2017的命令为:wget -c http://images.cocodataset.org/zips/train2017.zip 其他coco数据集val、test链接
2.使用wget -b
后台下载
对于下载非常大的文件的时候,我们可以使用参数-b进行后台下载
Terminal Multiplexer 的缩写,是linux终端的复用神器,当服务器断网的时候,当有多个窗口,tmux神器就会发挥它的神力,它包括会话(session)、窗口(window)、窗格(pane)三部分。会话实质是伪终端的集合,每个窗口表示一个伪终端,多个窗格展现在一个屏幕上,这一屏幕就叫窗口。
会话管理命令如下:
新建会话:tmux new
新建指定会话: tmux new -s wenmei
查看会话列表: tmux ls
连接上一个会话: tmux a
连接指定会话:tmux a -t wenmei
重命名会话: tmux rename -t wenmei ss
关闭指定的会话: tmux kill-session -t wenmei
关闭指定会话:tmux kill-sever
关闭上次打开的会话:tmux kill-session
窗口管理命令如下:
新建窗口:ctrl b +c
进入下一个窗口(窗口翻页):ctrl b +p 如果不行 可以直接加数字 如:ctrl b +1
关闭窗口:ctrl b +&
窗格管理命令:
水平方向创建窗格:ctrl b +%
垂直方向创建窗格:ctrl b +‘’
关闭当前窗格:ctrl b +x
参考资料
这里面的表格很清楚
查看系统的磁盘
lsblk命令默认情况下将以树状列出所有块设备,如下:
首先查看磁盘状况: df -h
然后挂载:sudo mount /dev/sda1 /mnt/raid
1.find 查找文件
find /home/wenmei/ -name “* .txt” #以txt结尾的所有文件
find ./ -name test.sh
find /tmp -size 2M(等于2M的文件,如果是+2M 表示大于,-2M 表示小于)
2.grep [-选项] ‘搜索内容串’ 文件名
如 grep ‘teacher’ test.txt
-n 显示匹配行及行号
-v 显示不包含匹配文本的所有行(相当于求反)
-c 选项告诉 grep 抑制匹配行的打印,只显示匹配行的数量,匹配查询的行。
-i 忽略大小写
如 grep -in hello 123.txt
grep -n ss test.txt
常用的两种模式查找:(正则化表达)
^a 行首,搜寻以a开头的行
de$ 行尾,搜寻以de结尾的行
. (点) 如 grep -n ‘t.t’ test.txt 查找满足两边都是t中间是任意值
不同操作系统中,常用的打包压缩方式是不同的
Windows 常用 rar
Mac 常用 zip
Linux 常用 tar.gz
1.打包+压缩
打包文件:(归档)
tar -cvf 打包文件.tar.gz 被打包的文件/路径
-c 生成档案文件,创建打包文件
-v 列出归档解档的详细过程,显示进度
-f 指定档案文件(放在最后,后面必须跟上要处理的文件名)
-x 解压
-z(通过gzip支持的压缩或解压缩)
如: tar -zcvf py.tar 01.py 02.py 03.py
解压+解包文件
tar -zxvf 打包文件.tar.gz
解压到指定路径的命令:tar -zxvf filename -C path(这个path必须存在)
2.解压+解包
这里tar 与 gzip 命令结合,可以使用实现文件的打包和压缩,这样文件也会很小
tar 只负责打包文件,但不压缩
用gzip压缩tar打包后的文件,其扩展名一般用xxx.tar.gz(也是linux中最常见的压缩文件格式)
3.压缩zip命令
zip -r myfile.zip 源文件
将文件压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件.
4.解压.zip文件命令:unzip命令
unzip -o -d /home/bunny myfile.zip 此压缩文件压缩到指定目录
5.压缩为 .gz 文件
gzip -r (递归) -f(强制) -v(显示指令执行过程)filename
注意 压缩为 .gz 文件 源文件会消失,所以想要保留源文件,使用命令:
gzip -c 源文件 >压缩文件
6 .解压.gz文件
gunzip fiiename.gz
当然是用 gzip -d 也可以解压(decompression )
7.tar 与 bzip2命令结合可以使用实现文件打包和压缩(用法和gzip一样)
tar 只负责打包文件,但不压缩
用bzip2压缩tar打包后的文件,器扩展名一般用xxx.tar.bz2
在tar命令中有一个选项 -j 可以调用bzip2,从而可以方便的实现压缩和解压缩的功能
压缩文件: tar -jcvf 打包文件.tar.bz2 被压缩的文件/路径。。
解压缩文件: tar -jxvf 打包文件.tar.bz2
源码安装一般包括一个步骤:配置(configure),编译(make),安装(make install)
首先下载好使用的压缩包(如yasm,ffmpeg),解压后,进入目录后,执行 ./configure (生成Makefile文件)这里我们可以增加参数,
如 –perfix 这样可以将要安装的应用安装到指定的目录中;还有一个是 **–enable-shared,表示编译后链接成共享对象,生成动态链接库,后缀名为.so,而–enable-static,**表示生成静态链接库,后缀名为.a
他们两之间的区别如下:
动态库:
优点
·生成的可执行程序体积小
·动态库在内存只加载一次,同时可为多个进程共享,由此会提高一定的效率
缺点
·依赖库文件,不方便移植
静态库:
优点
·因为将库中代码加载进程序中,因此运行时省去动态链接加载的过程,带来一定的性能提升
·程序运行可以不依赖于库文件,即便库文件被删除也可以照样运行
缺点
·生成的可执行程序体积较大
·使用静态链接库无法在内存中共享,会造成一定的浪费
接着运行 make 生成头文件include 和动态库文件lib 参考ffmpeg之头文件和库文件
最后make install (将编译出来的二进制文件,库,配置文件等等放到相应的目录下)
然后进入到安装的指定目录下,查看一下发现有bin,include,lib,share这4个目录,其中bin是ffmpeg主程序二进制目录,include是C/C++头文件目录,lib是编译好的库文件目录,share是文档目录
然后进入bin目录下,运行./ffmpeg -version,报错信息如下:
原因是lib目录未加载到链接到系统库中,系统ld目录列表在 /etc/ld.so.conf 中,打开文件会发现,里面引用了/etc/ld.so.conf.d/下面所有的.conf文件
解决方案:执行命令 vim /etc/ld.so.conf.d/ffmpeg.conf 然后添加一行内容: /usr/loacl/ffmpeg/lib (根据自己指定的目录更改)之后保存并退出,然后执行 ldconfig 使配置生效,现在再次执行 ./ffmpeg -version 显示就正常了
应该有很多人和我一样,不想编译FFMPEG之后还要动自己系统的环境,这时有一个简单的方法可以解决这个问题。就是在当前终端export一个环境变量。如下所示:
export LD_LIBRARY_PATH=newdir:$LD_LIBRARY_PATH
当然可以用make clean清除编译结果
LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库) 时除了默认路径之外的其他路径。(看清楚是库哈)
用法:
export LD_LIBRARY_PATH=newdir:$LD_LIBRARY_PATH,也就是如果从文件不在缺省目录’/lib’and’/usr/lib’。那么就需要指定环境变量LD_LIBRARY_PATH,newdir为你所生成的库文件。
LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库 时指定除了系统默认路径之外的其他路径;
LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库 时指定查找共享库的路径;
参考LD_LIBRARY_PATH详解
-a 显示指定目录下所有子目录与文件,包括隐藏文件
-1 以列表方式显示文件的详细信息(d 目录 - 文件 l 链接文件 【文件类型、权限【文件拥有者、同组用户、其他用户】、文件所属用户、文件所属组、文件大小、文件最后修改时间、文件或目录名】)
-h 配合 -l 以人性化的方式显示文件大小,最直接的变化是,⽂件或者⽬录⼤⼩以 K、M的形式显示,不在以字节为单位显示
ls输出颜色不止3种,有以下几种,
白色:表示普通文件
蓝色:表示目录
绿色:表示可执行文件
红色:表示压缩文件
浅蓝色:链接文件
红色闪烁:表示链接的文件有问题
黄色:表示设备文件
灰色:表示其他文件
/lib是内核级别的
/usr/lib是系统级别的
/usr/local/lib是用户级别的
打开服务器中的一个火狐浏览器
重定向:改变数据流和原来的默认“走向”
‘>’ 将本应该显示在终端的内容(结果)保存到指定文件中,如果文件不存在,则创建,若存在则覆盖其内容。
如:ls > test.txt echo Hello Python > test.txt
‘>>’ 将输出结果追加到目标文件中,如果文件不存在,就创建文件;如果文件存在,就把结果追加到原文件末尾。
注:如果你追加的文件是一个不存在的文件夹里面的文件,是不会创建的,会报错
/dev/null 表示空设备文件
0 表示/dev/stdin标准输入 键盘
1 表示dev/stdout标准输出 屏幕
2 表示dev/stderr标准错误 屏幕
2>&1 也就表示将错误重定向到标准输出上(& 放在命令到结尾,表示后台运行,防止终端一直被某个进程占用,这样终端可以执行别到任务)
在数据流的处理过程中将某段信息保存下来,使其既能输出到屏幕又能保存到某一个文件中。
–dataset $ dataset 2>&1 | tee logs/test_$dataset.log(将标准错误信息重定向到标准输出,然后通过管道输出到日志中)
ls |tee output.txt
& 表示该命令在后台执行
&&表示前一条命令执行成功时,才执行后一条命令(;无论前一句的结果如何均会执行后续的命令,|| 前一条命令执行不成功,才执行后一条命令)
jobs 查看当前有多少在后台运行
fg 把任务调至前台任务
bg 把任务调至后台任务
上一条命令的输出,作为下一条命令参数(输入)
如: ls -lha ~ | grep vi
ls -lha ~ | more
管道可以实现:将前面的标准输出作为后面命令的标准输入;
管道无法实现:将前面的标准输出作为后面命令的命令参数。
ls | grep siam | xargs -I {} cp resnet.model {}
#我用的这句话是ls到当前路径的一些文件,并筛选以siam开头的文件,将resnet.model拷贝到以siam开头的文件中,可见将标准输出作为cp的命令参数。
详解链接 以后用到再细查
Linux 内核
Linux 发行版本
单用户操作系统(磁盘)
多用户操作系统(/根目录,/ home,/bin、/usr/bin 可执行二进制文件的目录,/etc 系统配置文件存放的目录,/dev ,/mnt)
查看目录内容 ls
ls -a 显示指定目录下所有子目录与文件,包括隐藏文件(以.开头的文件为隐藏文件)
ls -l 以列表方式显示文件的详细信息
ls -h 配合-l以人性化的方式显示文件的大小
从左到右依次是:
权限,第一个字符如果是d表示目录(拥有者权限、组权限、其他用户权限)
硬链接数,通俗地讲,就是有多少种方式,可以访问到前目录/文件
拥有者
组
大小、时间、名称
一直在使用 通配符 但是不知道它就是通配符,它与ls搭配使用,显示自己想要的文件或者目录:
*代表任意个数个字符
?代表任意一个字符,至少1个
[]表示可以匹配字符组中的任意一个
[abc]匹配a、b、c中的任意一个
[a-f]匹配从a到f范围内的任意一个字符
切换目录 cd
Linux 所有的目录和文件名都是大小写敏感的
cd / cd ~ 切换到当前用户的主目录(/home/用户目录)
cd . 保持在当前目录不变
cd . .切换到上级目录
cd - 可以在最近两次工作目录之间来回切换
创建和删除操作
touch 创建文件或修改文件时间
如果文件不存在,可以创建一个空白文件
如果文件已经存在,可以修改文件的末次修改日期
mkdir
-p 可以递归创建目录
新建目录的名称不能与当前目录中已有的目录或文件同名
rm(可以配合通配符使用,使用时需小心)
-r 递归地删除目录下的内容,删除文件夹时必须加此参数
-f 强制删除,忽略不存在的文件,无序提示
拷贝 cp 和移动文件 mv
tree 命令可以以树状图列出文件目录结构 tree [目录名]
-d 只显示目录(不会显示文件)
(之前一直想显示SiamMask的目录,现在有机会了,可是下面的data数据太多了,完全刷屏)
cp 上面有
mv 源文件 目标文件(移动文件或者目录/ 文件或者目录重命名)
-i 覆盖文件前提示
查看文件内容 cat more grep
cat 查看文件内容 ,会一次显示所有的内容,适合查看内容较少的文本文件
more 可以分屏显示文件内容 ,每次只显示一页内容
cat -b 对非空输出行编号
cat -n 对输出的所有行进行编号
grep(类型与ctrl + F)上面有
其他 echo 重定向 管道
shutdown 命令可以安全关闭或者重新启动系统
shutdown 选项 时间
-r 重新启动
shutdown -r now
shutdown now
shutdown +10(10分钟后自动关机)
shutdown -c 取消之前指定的关机计划
ifconfig 查看/配置计算机当前的网卡配置信息
ping IP地址 一般用于检测当前计算机到目标计算机之间的网络是否通畅,数值越大,速度越慢
ping 127.0.0.1 检测本地网卡工作正常
可以修改用户/组 对文件/目录的权限
chmod +/- rwx 文件名/目录名
#递归修改文件权限
chmod -R 755 文件名/目录名
chmod在设置权限时,可以简单地使用三个数字分别对应 拥有者/组 和其他用户的权限。(r 4 w 2 x 1)
chmod u/g/o/a +/-/= rwx ⽂件
u 代表用户
g 代表组
o 代表其他
a 代表所有
which 命令可以查看执行命令所在位置,例如
which python which conda
在linux中,绝大多数可执行文件都是保存在/bin、/sbin、/usr/bin、/usr/sbin
/bin(binary)是二进制执行文件目录,主要用于具体应用
/sbin(system binary )是系统管理员专用的二进制代码存放目录,主要 用于系统管理
/usr/bin(user commands for applications) 后期安装的一些软件
/usr/sbin(super user commands for applications)超级用户的一些管理程序
所谓进程,通俗地说就是 当前正在执行的一个程序
ps aux (process status 查看进程的详细状况 PID cpu memory)
a 显示终端上的所有进程,包括其他用户的进程
u 显示进程的详细状态
x 显示没有控制终端的进程
top 动态显示运行中的进程并且排序 退出 q
htop 以人性化的界面显示
kill -9 进程代号 终止指定代号的进程,-9表示强行终止
提示:最好只终止由当前用户开启的进程,而不要终止root身份开启的进程,否则可能导致系统奔溃
这应该是我研一的时候就认识的命令,当时啥都不懂
ln -s 被链接的源文件 链接文件,例如
ln -s /mnt/sdb/wenmei/data/vot2017 vot2017
软链接类似于Windows下的快捷方式,源文件要使用绝对路径,不能使用相对路径,这样可以方便移动链接文件后,仍然能够正常使用,软链接不占用磁盘空间,源文件删除则软链接失效;而硬链接是文件的一个或多个文件名。
使用ls -l查看的时候会对应有一个箭头指向链接的目录地址
如果没有-s 选项建立的是一个硬链接文件(使用ls -l查看的时候没有一个箭头指向链接的目录地址),硬链接和软链接之间的不同是,删除源文件硬链接不受影响,而软链接会受到影响。
不过在日常工作中,几乎不会建立文件的硬链接。
软连接和硬链接的区别
1).软链接可以跨⽂件系统,硬链接不可以;
2).软链接可以对⼀个不存在的⽂件名(filename)进⾏链接(当然此时如果你vi这个软链接⽂件, linux会⾃动新建⼀个⽂件名为filename的⽂件),硬链接不可以(其⽂件必须存在,inode必须存在);
3).软链接可以对⽬录进⾏连接,硬链接不可以
sudo apt install xxx
apt(Advanced Package Tool)
wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。
该命令各选项含义如下:
c 统计字节数。
l 统计行数。
w 统计字数。
cat 文件名 | wc -l 或者 wc -l 文件名#前者只输出行号 后者会输出行号和文件名
sed主要是用来将数据进行选取、替换、删除、新增的命令
sed -i.bak 's/root/ROOT/g' 文件名
s 替换,替换每行中的第一个匹配的内容
g 全部替换,替换每行中的所有匹配内容
a 向匹配行下一行插入内容a\ nl /etc/passwd |sed '/root/ a \ROOT'
i 向匹配行上一行插入内容i\ nl /etc/passwd |sed '/root/ i \ROOT'
c 更改匹配行的内容 c\ nl /etc/passwd |sed '/root/ c \ROOT'
d 删除匹配的内容 c\ nl /etc/passwd |sed '/root/d'
相较于sed 常常作用于一整个行的处理,awk 则比较倾向于一行当中分成数个『字段』来处理。 因此,awk 相当的适合处理小型的数据数据处理
编辑文件指定行:
vim 文件名 + 定位到最后一行
vim 文件名 +12 定位到12行
vim 文件名 定位到第一行
如果不显示行数:
到vi或者vim编辑器的末行模式下,输入 set number 或者 set nu,按下回车就显示行号了
那怎么关闭行数呢?
只要再到vi或者vim编辑器的末行模式下输入 set nonumber 或者 set nonu,按下回车行号就没了
三种基本工作模式:
1.命令模式 vi的入口,定位,翻页、复制、粘贴、删除
2.末行模式 vi的出口,执行保存、退出等操作 :
3.编辑模式 i 编辑
命令 | 功能 | 手指 |
---|---|---|
h | 向左 | 食指 |
j | 向下 | 食指 |
k | 向上 | 中指 |
l | 向右 | 无名指 |
命令 | 英文 | 功能 |
---|---|---|
w | word | 向后移动一个单词 |
b | back | 向前移动一个单词 |
0 | 行首 | |
^ | 行首,第一个不是空白字符的位置 | |
$ | 行尾 |
命令 | 英文 | 功能 |
---|---|---|
gg | go | 文件顶部 |
G | go | 文件末尾 |
数字gg | go | 移动到 数字 对应行数 |
数字G | go | 移动到 数字 对应行数 |
:数字 | 移动到 数字 对应行数 |
命令 | 英文 | 功能 |
---|---|---|
Ctrl + b | back | 向上翻页 |
Ctrl + f | forward | 向下翻页 |
H | Head | 屏幕顶部 |
M | Middle | 屏幕中间 |
L | Low | 屏幕底部 |
vi
中使用 空行 来区分段落命令 | 功能 |
---|---|
{ | 上一段 |
} | 下一段 |
()
、[]
、{}
使用频率很高,而且 都是成对出现的命令 | 功能 |
---|---|
% | 括号匹配及切换 |
m
增加一个标记,这样可以 在需要时快速地跳转回来 或者 执行其他编辑操作a~z
或者 A~Z
之间的任意 一个 字母命令 | 英文 | 功能 |
---|---|---|
mx | mark | 添加标记 x,x 是 a~z 或者 A~Z 之间的任意一个字母 |
'x | 直接定位到标记 x 所在位置 |
复制
命令前,应该先学会 怎么样选中 要复制的代码vi
中要选择文本,需要先使用 Visual
命令切换到 可视模式vi
中提供了 三种 可视模式,可以方便程序员选择 选中文本的方式ESC
可以放弃选中,返回到 命令模式命令 | 模式 | 功能 |
---|---|---|
v | 可视模式 | 从光标位置开始按照正常模式选择文本 |
V | 可视行模式 | 选中光标经过的完整行 |
Ctrl + v | 可视块模式 | 垂直方向选中文本 |
ggVG
能够选中所有内容命令 | 英文 | 功能 |
---|---|---|
u | undo | 撤销上次命令 |
CTRL + r | redo | 恢复撤销的命令 |
命令 | 英文 | 功能 |
---|---|---|
x | cut | 删除光标所在字符,或者选中文字 |
d(移动命令) | delete | 删除移动命令对应的内容 |
dd | delete | 删除光标所在行,可以 ndd 复制多行 |
D | delete | 删除至行尾 |
提示:如果使用 可视模式 已经选中了一段文本,那么无论使用
d
还是x
,都可以删除选中文本
* dw # 从光标位置删除到单词末尾
* d0 # 从光标位置删除到一行的起始位置
* d} # 从光标位置删除到段落结尾
* ndd # 从光标位置向下连续删除 n 行
* d代码行G # 从光标所在行 删除到 指定代码行 之间的所有代码
* d'a # 从光标所在行 删除到 标记a 之间的所有代码
vi
中提供有一个 被复制文本的缓冲区
命令 | 英文 | 功能 |
---|---|---|
y(移动命令) | copy | 复制 |
yy | copy | 复制一行,可以 nyy 复制多行 |
p | paste | 粘贴 |
提示
d
、x
类似于图形界面的 剪切操作 —— CTRL + X
y
类似于图形界面的 复制操作 —— CTRL + C
p
类似于图形界面的 粘贴操作 —— CTRL + V
vi
中的 文本缓冲区同样只有一个,如果后续做过 复制、剪切 操作,之前缓冲区中的内容会被替换注意
vi
中的 文本缓冲区 和系统的 剪贴板 不是同一个CTRL + C
复制的内容,不能在 vi
中通过 P
命令粘贴命令 | 英文 | 功能 | 工作模式 |
---|---|---|---|
r | replace | 替换当前字符 | 命令模式 |
R | replace | 替换当前行光标后的字符 | 替换模式 |
R
命令可以进入 替换模式,替换完成后,按下 ESC
可以回到 命令模式命令 | 功能 |
---|---|
>> | 向右增加缩进 |
<< | 向左减少缩进 |
. | 重复上次命令 |
>
或者 <
在程序中,缩进 通常用来表示代码的归属关系
- 前面空格越少,代码的级别越高
- 前面空格越多,代码的级别越低
命令 | 功能 |
---|---|
/str | 查找 str |
Next
查找下一个出现的位置:
n
: 查找下一个N
: 查找上一个命令 | 功能 |
---|---|
* | 向后查找当前光标所在单词 |
# | 向前查找当前光标所在单词 |
vi
中查找和替换命令需要在 末行模式 下执行:%s///g
:%s/旧文本/新文本/g
:s/旧文本/新文本/g
g
改成 gc
在替换的时候,会有提示!推荐使用!:%s/旧文本/新文本/gc
y
- yes
替换n
- no
不替换a
- all
替换所有q
- quit
退出替换l
- last
最后一个,并把光标移动到行首^E
向下滚屏^Y
向上滚屏vi
中除了常用的 i
进入 编辑模式 外,还提供了以下命令同样可以进入编辑模式:命令 | 英文 | 功能 | 常用 |
---|---|---|---|
i | insert | 在当前字符前插入文本 | 常用 |
I | insert | 在行首插入文本 | 较常用 |
a | append | 在当前字符后添加文本 | |
A | append | 在行末添加文本 | 较常用 |
o | 在当前行后面插入一空行 | 常用 | |
O | 在当前行前面插入一空行 | 常用 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Tires1q-1595294183864)(media/14993340485745/004_%E6%8F%92%E5%85%A5%E5%91%BD%E4%BB%A4.png)]
N
个同样的字符在
Python
中有简单的方法,但是其他语言中通常需要自己输入
**********
连续 10 个星号要实现这个效果可以在 命令模式 下
10
,表示要重复 10 次i
进入 编辑模式*
也就是重复的文字ESC
返回到 命令模式,返回之后 vi
就会把第 2、3
两步的操作重复 10
次提示:正常开发时,在 进入编辑模式之前,不要按数字
在
Python
中,要给代码增加注释,可以在代码前增加一个#
要实现这个效果可以在 命令模式 下
^
来到行首CTRL + v
进入 可视块 模式j
向下连续选中要添加的代码行I
进入 编辑模式,并在 行首插入,注意:一定要使用 I#
也就是注释符号ESC
返回到 命令模式,返回之后 vi
会在之前选中的每一行代码 前 插入 #
vi
的高级命令 —— 可以 同时编辑和查看多个文件末行命令 主要是针对文件进行操作的:保存、退出、保存&退出、搜索&替换、另存、新建、浏览文件
命令 | 英文 | 功能 |
---|---|---|
:e . | edit | 会打开内置的文件浏览器,浏览要当前目录下的文件 |
:n 文件名 | new | 新建文件 |
:w 文件名 | write | 另存为,但是仍然编辑当前文件,并不会切换文件 |
提示:切换文件之前,必须保证当前这个文件已经被保存!
命令 | 英文 | 功能 |
---|---|---|
:w | write | 保存 |
:q | quit | 退出,如果没有保存,不允许退出 |
:q! | quit | 强行退出,不保存退出 |
:wq | write & quit | 保存并退出 |
:x | 保存并退出 | |
:%s///gc | 确认搜索并替换 |
在实际开发中,可以使用
w
命令 阶段性的备份代码
命令 | 英文 | 功能 |
---|---|---|
:sp [文件名] | split | 横向增加分屏 |
:vsp [文件名] | vertical split | 纵向增加分屏 |
分屏窗口都是基于
CTRL + W
这个快捷键的,w
对应的英文单词是window
命令 | 英文 | 功能 |
---|---|---|
w | window | 切换到下一个窗口 |
r | reverse | 互换窗口 |
c | close | 关闭当前窗口,但是不能关闭最后一个窗口 |
q | quit | 退出当前窗口,如果是最后一个窗口,则关闭 vi |
o | other | 关闭其他窗口 |
分屏窗口都是基于
CTRL + W
这个快捷键的,w
对应的英文单词是window
命令 | 英文 | 功能 |
---|---|---|
+ | 增加窗口高度 | |
- | 减少窗口高度 | |
> | 增加窗口宽度 | |
< | 减少窗口宽度 | |
= | 等分窗口大小 |
调整窗口宽高的命令可以和数字连用,例如:
5 CTRL + W +
连续 5 次增加高度
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VSXyQJV0-1595294183865)(media/14993340485745/vim.png)]
vimrc
是 vim
的配置文件,可以设置 vim 的配置,包括:热键、配色、语法高亮、插件 等Linux
中 vimrc
有两个位置,家目录下的配置文件优先级更高/etc/vim/vimrc
~/.vimrc