Linux-Vim/Vi命令使用技巧

在linux的世界观有这么一句话“万物皆文件”,意思是在Linux系统中所见到任何东西都是文件,都可以理解为文件,同样即可理解为你在Linux系统中看到的任务带有名称的东西,不管其是什么格式的,你都可以像对待纯文本文件一下打开它,当然打开后看到的内容肯定是会不同格式而不同的。打开文件当然需要能打开文件的命令来操作,Vim或者vi就是打开文件的命令。

Vim是从vi发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。Vim的第一个版本由布莱姆·米勒在1991年发布。最初的简称是VIMitation,随着功能的不断增加,正式名称改成了VIMproved。现在是在开放源代码方式下发行的自由软件

wiki上对Vim的基本介绍

1、主要基本模式

  • 命令(Normal)模式:默认模式,移动光标,剪切/粘贴文本—-查看文件内容
  • 插入(Insert)或编辑模式: 修改文本
  • 扩展命令(extended command )模式: 保存,退出等

2、在 Vim 中设置 Tab

为什么要设置vim的tab缩进,这个主要还是一些语言自身的格式要求(如python),还有就是为了视觉美观。缩进用 tab 制表符还是空格,这不是个问题,就像 python 用四个空格来缩进一样,这是要看个人喜好的。在 Vim 中可以很方便的根据不同的文件类型来设置使用 tab 制表符或者空格,还可以设置长度,非常灵活。

登录linux系统后,在光标闪动的地方输入: cd , 然后回车; 然后输入命令 vim ~/.vimrc

首先来看如何设定 tab 的宽度以及如何确定用 tab 制表符还是空格来表示一个缩进:

set tabstop=4
set softtabstop=4
set shiftwidth=4
set noexpandtab / expandtab

说明: 
其中 tabstop 表示一个 tab 显示出来是多少个空格的长度,默认 8。softtabstop 表示在编辑模式的时候按退格键的时候退回缩进的长度,当使用 expandtab 时特别有用。shiftwidth 表示每一级缩进的长度,一般设置成跟 softtabstop 一样。当设置成 expandtab 时,缩进用空格来表示,noexpandtab 则是用制表符表示一个缩进。

当然,除了基本的配置还有很多比较进阶配置,比如自动代码补全,换行缩进等

vim 小进阶配置
set nu
set tabstop=4
set ruler
set autoindent
set cindent
set smartindent
set laststatus=2
set softtabstop=4
set shiftwidth=4
syntax enable

set tags+=~/.vim/tags/cpp_src/tags ” 设置tags搜索路径

map <C-n> :NERDTree<CR>
map <C-t> :TlistToggle<CR>

” pathongen
execute pathogen#infect()
syntax on
filetype plugin indent on

” taglist
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
let Tlist_Use_Right_Window=1
let Tlist_Sort_Type=”name”
set completeopt=longest,menu

“youcompleteme
“回车即选择当前项
inoremap <expr> <CR> pumvisible() ? “\<C-y>” : “\<CR>”
” 跳转到定义处
let mapleader =”\<space>”
nnoremap <leader>jj :YcmCompleter GoToDefinitionElseDeclaration<CR>

let g:miniBufExplMapWindowNavVim = 1
let g:ycm_global_ycm_extra_conf=’~/.vim/bundle/youcompleteme/.ycm_extra_conf.py’
let g:ycm_error_symbol = ‘>>’
let g:ycm_warning_symbol = ‘>*’
“” 不显示开启vim时检查ycm_extra_conf文件的信息
let g:ycm_confirm_extra_conf=0
“开启基于tag的补全,可以在这之后添加需要的标签路径
let g:ycm_collect_identifiers_from_tags_files= 1
“”注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0
” 输入第 2 个字符开始补全
let g:ycm_min_num_of_chars_for_completion= 2
” 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_cache_omnifunc=1
“” 开启语义补全
let g:ycm_seed_identifiers_with_syntax= 1
“在注释输入中也能补全
let g:ycm_complete_in_comments = 1
“”在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
” 设置在下面几种格式的文件上屏蔽ycm
let g:ycm_filetype_blacklist = {‘tagbar’ : 1,’nerdtree’ : 1,}
“youcompleteme 默认tab s-tab 和 ultisnips 冲突
let g:ycm_key_list_select_completion = [ ‘<Down>’ ]
let g:ycm_key_list_previous_completion = [ ‘<Up>’ ]
“修改对C函数的补全快捷键,默认是CTRL + space,修改为ALT + ;
let g:ycm_key_invoke_completion = ‘<C-Space>’
vim 代码补全,换行缩进配置

3、常用快捷键

1、最基本命令
空格键 向右移动一格
x 删除后面的字符 X 删除前一个字符  删除3个字符就是3x  
dd:删除一行   D 删除到行尾 
caw:改写单词  c 相当于 d 变为编辑模式
J:删除换行符,使下一行并上来。     nJ:连接后面的n行
u:撤销上一次操作      U:撤销当前行的所有修改
ctrl+r:对撤消的撤消
i 在光标前插入
I 在行首插入 
a 在光标后插入
A 在行末插入
o:在当前行的下面另起一行,并变为插入模式
O:在当前行上面另起一行,变为插入模式
Ctrl+o:临时变成命令模式(一次而已)
:e!:放弃更改,然后相当于重新打开
:help:帮助,可用ZZ退出帮助窗口
基本命令
2、复制命令
vim中Nyy可以复制光标后的N行。有时我们不容易得出行数,这时可以用做标记的方法来制定复制范围: 
  1. 在开始行上输入ma作一个标记a 
  2. 移动到结束行,输入y’a会复制当前行到标记a之间的文本。d’a会删除。 
或者是v进入可视模式,再13G跳转到相应行,y即可。
:10,20y    回车即可,相应的删除也是如此     :10,20d     (此方法比上面两种方法更简单)
:10,20 m 30    把10行到20行的内容,剪切到30行之后
:10,20 co 30   把10行到20行的内容,复制到30行之后
将光标放在 { 处,然后输入v%就可以把大括号中内容选定
如果光标放在第一个s上,想删除到“(”为止,则输入dt(就可以了,t(的作用是跳到下一个”(“前。
ctrl +n 自动补全 ctrl + p 也一样
:ab hw hello world  用一个缩写字符串代替一个长的字符串,此处用 hw 代替 hello world
%: 移动到与制匹配的括号上去(),{},[],<>等
‘ 移动到上一次的修改行
fx 向右跳到本行字符x处(x可以是任何字符)
Fx 向左跳到本行字符x处(x可以是任何字符)
tx 和fx相同,区别是跳到字符x前
Tx 和Fx相同,区别是跳到字符x后
# 到与当前单词相同的上一个单词上, * 到与当前单词相同的下一个单词上
如果你要重复键入一个短语或一个句子, 也有一种快捷的方法。Vim有一种记录宏的机制。你键入”qa”开始把一段宏记录入寄存器变量`a’中。
按下来你可以象平常一样键入你要的操作, 只是这些操作都会被Vim记录进它命名为`a’的宏中, 再次再下”q”键, 就结束了宏`a’的录制。当你要重复执行你刚才记录的那些操作时只要使用”@a”命令。共有26个可用的寄存器供你记录宏。 使用宏你可以重复多个不同的操作。而不仅仅是插入文本了。如果你要进行某种重复的操作, 记着要用这一招呀。
:abbr hte the
:abbr hw Hello World
输入先面的单词时,自动用后面的替换。
复制命令
3、移动命令
b、3b、w、3w:向前\后移动几个单词,标点也算一个单词。相应的大写状态为不含标点,即只把空格和换行符作为单词间隔符。
$:移动到行尾  3$:移动到3行后的行尾
^:移动到行首,0也是
+:移到下一行的行首
-: 移到上一行的行首
f:搜索命令,小写时向后搜索(用来定位)如 fx:定位到下一个x上。   Fx:定位到上一个x上,重复时,可用;或,  不过 , 表示反方向
%:跳到相对应的括号上,编程时常用
33G:跳转到33行   此时按“可以返回到原来行
gg:文件头   G: 文件尾
30%:跳转到文件的30%处
“H”意为Home, “M”为Middle, “L”为Last.  当前屏幕的上中下位置,大小写皆可
Ctrl+G:显示当前位置
set number:设置显示行号,set nonumber:关闭显示
:set ruler 设置在窗口右下角显示行号,与上面的好处是,节省空间
ctrl+u\d  向上\下滚动半屏
ctrl+e\y  向上\下滚动一行
ctrl+b\f  向上\下滚动一屏  这个比较实用,记住。
zz:将当前行滚动于屏幕中间,方便查看上下文  zt置顶,zb置尾
/string  查找string,回车后,按n键可以跳到下一个,N上一个,另外按/键后,按上下键可以找到以前查找的记录,同样的 :也有记录
?/string 同上,默认向上查找
:set ignorecase 大小写无关
:set noignorecase 大小写敏感
* :查找下一个光标所在单词  #是查找上一个
:set hlsearch  高亮显示查找结果
:set nohlsearch  取消高亮
:nohlsearch  去掉当前显示的高完(一次性)
 “ 上次光标停靠的行
% 匹配到相应括号处
>>   向右移动本行一段距离     <<   向左移动本行一段距离    3<<    把下面3行(包括本行),向左移动一段距离     :20,30>>  把20行到30行向右移动一段距离
移动命令
4、小幅改动命令
:%s/str1/str2/g   替换每一行的 str1为 str2
:10,20s/str1/str2/g   替换从行10到行20之间的 str1为 str2
:10,$s/str1/str2/g   替换从行10到最后一行之间的 str1为 str2
:s/str1/str2/g   替换当前行的 str1为 str2
.  重复执行命令 
:10,$ w test2.cpp     取行10到最后一行内容,保存到test2.cpp
:r class/User.hpp    读取文件中的内容,插入到当前行的后面
dw:删除一个单词(光标后部分)  不如:daw实用    d4w:删除4个单词    d$:删除当前光标到行尾    d^:删除当前光标至行首       d换成c效果是一样的,只是操作完会变成insert模式   dnw: 删除N个单词   dnj: 向下删除n行      dnk: 向上删除n行 
X:删除左边的字符,相当于<-键,x删除当前字符  D:相当于d$  C:相当于c$  s:相当于c1  S:相当于cc
r:替换当前字符,但不会进入insert模式    3r:把后面3个字符替换掉    R:替换模式
.:重复上一次操作
v:进入Visual模式    V:进入可视行模式,比如 Vjjd 删除3行  Ctrl+v:可视块模式
P:粘贴至光标前    p:粘贴至光标后    3P:粘贴3次      “2p     粘贴最后第二次的删除的内容
yy:复制一行  yaw: 复制一个单词,光标在单词任意位置    ynw: 复制N个单词       ynj: 向下复制n行          ynk: 向上复制n行  
自动缩进:
:set cindent(所有的set都可以简写为se,虽然只节省了一个字符, 译者注) 需要注意的是cindent控制缩进量是通过shiftwidth选项的值, 而不是通过tabstop 的值, shiftwidth的默认值是8(也就是说, 一个缩进为8个空格, 译者注), 要改变默认的设置, 可以使用”:set shiftwidth=x”命令, 其中x是你希望一个缩进量代表的空格的数目.
 { = 到前一个空行上
} = 到下一个空行上
小幅改动命令
5、滚屏和移动
^f:向前(下)一整屏
^b:向后(上)一整屏
^d:向前(下)一半屏
^u:向后(上)一半屏
z,Enter:将光标所在行移动到屏幕顶部(同于zz)
z.:将光标所在行移动到屏幕中间
z-:将光标所在行移动到屏幕尾部
nz,Enter:将第n行移动到屏幕顶部,同样的,z. 与 z- 前也可以加数字。
 
在屏幕中移动:
H、M、L分别移动到屏幕的顶部、中间和尾部。
nH、nL 移动到距离屏幕顶部和顶部n行的位置。
滚屏和移动

Linux-查看系统配置常用命令

在工作中我们经常会用linux系统作为服务器来部署我们的项目或者执行我们的程序任务,但是一般项目或者任务在执行之前就所在的运行环境有一定的硬性要求,这个时候就需要我们知道自己手里的服务器具体的底层参数是什么?服务器是什么版本?多少个cpu?多少的内存等等各种关键指标,以供我们对自己的程序或者项目的发布部署做出前期的预研和环境判断。

1、通过命令查看系统参数

# 列表中是常用到的可以查看系统相关参数的命令
# uname -a # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue # 查看操作系统版本
# cat /proc/cpuinfo # 查看CPU信息
# hostname # 查看计算机名
# lspci -tv # 列出所有PCI设备
# lsusb -tv # 列出所有USB设备
# lsmod # 列出加载的内核模块
# env # 查看环境变量 资源
# free -m # 查看内存使用量和交换区使用量
# df -h # 查看各分区使用情况
# du -sh # 查看指定目录的大小
# grep MemTotal /proc/meminfo # 查看内存总量
# grep MemFree /proc/meminfo # 查看空闲内存量
# uptime # 查看系统运行时间、用户数、负载
# cat /proc/loadavg # 查看系统负载 磁盘和分区
# mount | column -t # 查看挂接的分区状态
# fdisk -l # 查看所有分区
# swapon -s # 查看所有交换分区
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE # 查看启动时IDE设备检测状况 网络
# ifconfig # 查看所有网络接口的属性
# iptables -L # 查看防火墙设置
# route -n # 查看路由表
# netstat -lntp # 查看所有监听端口
# netstat -antp # 查看所有已经建立的连接
# netstat -s # 查看网络统计信息 进程
# ps -ef # 查看所有进程
# top # 实时显示进程状态 用户
# w # 查看活动用户
# id # 查看指定用户信息
# last # 查看用户登录日志
# cut -d: -f1 /etc/passwd # 查看系统所有用户
# cut -d: -f1 /etc/group # 查看系统所有组
# crontab -l # 查看当前用户的计划任务 服务
# chkconfig –list # 列出所有系统服务
# chkconfig –list | grep on # 列出所有启动的系统服务 程序
# rpm -qa # 查看所有安装的软件包
各种基本系统参数查看命令

2、根据系统文件查看系统参数

proc/cpuinfo文件分析: 在Linux系统中,提供了proc文件系统显示系统的软硬件信息。如果想了解系统中CPU的提供商和相关配置信息,则可以通过/proc/cpuinfo文件得到。本文章针对该文件进行简单的总结。

基于不同指令集(ISA)的CPU产生的/proc/cpuinfo文件不一样
基于X86指令集CPU的/proc/cpuinfo文件包含如下内容:
processor  : 0
vendor_id  :GenuineIntel
cpu family  :6
model    :26
model name :Intel(R) Xeon(R) CPU           E5520  @ 2.27GHz
stepping    :5
cpu MHz    :1600.000
cache size  : 8192 KB
physical id  :0
siblings    :8
core id     : 0
cpu cores   :4
apicid         :0
fpu       :yes
fpu_exception :yes
cpuid level   : 11
wp      :yes
flags      : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx rdtscp lm constant_tsc ida nonstop_tsc pni monitor ds_cpl vmx est tm2 cx16 xtpr popcnt lahf_lm
bogomips   :4522.12
clflush size  :64
cache_alignment  : 64
address sizes    : 40 bits physical, 48 bits virtual
power management :
以上输出项的含义如下:
processor :系统中逻辑处理核的编号。对于单核处理器,则课认为是其CPU编号,对于多核处理器则可以是物理核、或者使用超线程技术虚拟的逻辑核
vendor_id :CPU制造商      
cpu family :CPU产品系列代号
model   :CPU属于其系列中的哪一代的代号
model name:CPU属于的名字及其编号、标称主频
stepping   :CPU属于制作更新版本
cpu MHz   :CPU的实际使用主频
cache size   :CPU二级缓存大小
physical id   :单个CPU的标号
siblings       :单个CPU逻辑物理核数
core id        :当前物理核在其所处CPU中的编号,这个编号不一定连续
cpu cores    :该逻辑核所处CPU的物理核数
apicid          :用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续
fpu             :是否具有浮点运算单元(Floating Point Unit)
fpu_exception  :是否支持浮点计算异常
cpuid level   :执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容
wp             :表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection)
flags          :当前CPU支持的功能
bogomips   :在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second)
clflush size  :每次刷新缓存的大小单位
cache_alignment :缓存地址对齐单位
address sizes     :可访问地址空间位数
power management :对能源管理的支持,有以下几个可选支持功能:
  ts:  temperature sensor
  fid:   frequency id control
  vid:  voltage id control
  ttp:  thermal trip
  tm:
  stc:
  100mhzsteps:
  hwpstate:
  
CPU信息中flags各项含义:
fpu: Onboard (x87) Floating Point Unit
vme: Virtual Mode Extension
de: Debugging Extensions
pse: Page Size Extensions
tsc: Time Stamp Counter: support for RDTSC and WRTSC instructions
msr: Model-Specific Registers
pae: Physical Address Extensions: ability to access 64GB of memory; only 4GB can be accessed at a time though
mce: Machine Check Architecture
cx8: CMPXCHG8 instruction
apic: Onboard Advanced Programmable Interrupt Controller
sep: Sysenter/Sysexit Instructions; SYSENTER is used for jumps to kernel memory during system calls, and SYSEXIT is used for jumps: back to the user code
mtrr: Memory Type Range Registers
pge: Page Global Enable
mca: Machine Check Architecture
cmov: CMOV instruction
pat: Page Attribute Table
pse36: 36-bit Page Size Extensions: allows to map 4 MB pages into the first 64GB RAM, used with PSE.
pn: Processor Serial-Number; only available on Pentium 3
clflush: CLFLUSH instruction
dtes: Debug Trace Store
acpi: ACPI via MSR
mmx: MultiMedia Extension
fxsr: FXSAVE and FXSTOR instructions
sse: Streaming SIMD Extensions. Single instruction multiple data. Lets you do a bunch of the same operation on different pieces of input: in a single clock tick.
sse2: Streaming SIMD Extensions-2. More of the same.
selfsnoop: CPU self snoop
acc: Automatic Clock Control
IA64: IA-64 processor Itanium.
ht: HyperThreading. Introduces an imaginary second processor that doesn’t do much but lets you run threads in the same process a  bit quicker.
nx: No Execute bit. Prevents arbitrary code running via buffer overflows.
pni: Prescott New Instructions aka. SSE3
vmx: Intel Vanderpool hardware virtualization technology
svm: AMD “Pacifica” hardware virtualization technology
lm: “Long Mode,” which means the chip supports the AMD64 instruction set
tm: “Thermal Monitor” Thermal throttling with IDLE instructions. Usually hardware controlled in response to CPU temperature.
tm2: “Thermal Monitor 2″ Decrease speed by reducing multipler and vcore.
est: “Enhanced SpeedStep”
根据以上内容,我们则可以很方便的知道当前系统关于CPU、CPU的核数、CPU是否启用超线程等信息。
查询系统具有多少个逻辑核:cat /proc/cpuinfo | grep “processor” | wc -l
查询系统CPU的物理核数:cat /proc/cpuinfo | grep “cpu cores” | uniq
查询系统CPU是否启用超线程:cat /proc/cpuinfo | grep -e “cpu cores”  -e “siblings” | sort | uniq
  输出举例:
    cpu cores    : 6
    siblings     : 6
  如果cpu cores数量和siblings数量一致,则没有启用超线程,否则超线程被启用。
查询系统CPU的个数:cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l
查询系统CPU是否支持某项功能,则根以上类似,输出结果进行sort, uniq和grep就可以得到结果。
proc/cpuinfo文件分析

3、小试牛刀

总核数 = 物理CPU个数 X 每颗物理CPU的核数
总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l

# 查看CPU信息(型号)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
# 查看内 存信息
cat /proc/meminfo