vim 常用操作及配置

vim常用操作汇总 光标移动 上下左右 k/j/h/l 行首 0 或者 ^ 行尾 $ 单词和字符串间移动 指令 动作 w/W 正向移动到下一个单词开头,大写的忽略特殊字符、符号等 b/B 和w相对应的反向移动,移动到上一个单词开头 e/E 正向移动到下一个单词结尾 ge 反向移动 {num+} f/F+空格 正向/反向移动到本行空格的地方,num相当于移动几次 跳转 指令 动作 ctrl+f 向下翻页 ctrl+b 向上翻页 ctrl+d/u 向下/向上翻半页 gg 文件行首 G 最后一行 行号+gg/G 都是跳到指定行号的行 g+ctrl+g/G 查看光标位置,输出包含行、列、词、字节位置 缩进操作符 指令 动作 » 和 « 或者 :> 和 :< 当前行右缩进和左缩进,后者命令行模式 :line_num1,line_num1+x> 或者 :line_num>x 命令行模式,批量缩进,缩进x行 复制粘贴 复制剪贴内容存于寄存器, :reg可以查看寄存器内容 指令 动作 yy / 8yy 复制/8行 dd / 8dd 剪贴/8行 p/P 粘贴到光标前/后 u 撤销 ctrl+r 重做 yw 复制当前光标单词 y8w / y8W 复制含当前光标的正向8个单词,大写W的含义和W移动含义相同(忽略一些符号) x/4x/X 剪贴单个字符/4个字符,大写就是反向 d{w/h/j/k/l} 可以各种组合 d$/D 删除光标到行尾 d^ 删除光标到行首 插入、查找、替换 插入 指令 动作 I/A i/a 行首、行尾插入,向前向后插入 o/O 下一行、上一行插入 num + (i/I/A/a/o/O) 多次插入,即重复插入多个字符或者多行 转换 指令 动作 ~ 单个字符大小写转换 g~w 单词大小写反转 g~$ 或 g~~ 整行大小写反转 gU或gu + 回车 整行转大写或小写 gU/uw 单词转大写或小写,转换光标到词尾的部分 ’.’:点操作符表示重复上一次操作 ...

June 20, 2019 · 4 min · 704 words · erpan

Linux虚拟内存与物理内存

概念 在linux中,内存分为物理内存和虚拟内存,即ps命令中的RSS和VSZ。虚拟内存存在的原因是为了解决在物理内存上直接划分内存存在的一些问题,比如: 频繁申请和回收内存导致的空间碎片化 可以随意访问用于其他用途的内存区域,不安全 难以执行多任务 进程能看见的是虚拟地址空间,且地址段时连续的,而系统上搭载的内存的实际的地址是物理地址。通过命令 readelf和cat /proc/<pid>/maps输出的就是进程的虚拟地址。 虚拟内存以页为单位进行划分的,在x86_64的架构中页大小默认是4KB,getconf PAGESIZE可以查看页大小。通过内核管理的页表可以完成从虚拟地址到物理地址的转换,每个进程拥有独立的虚拟地址空间,进程的虚拟内存是连续的,但是在物理内存中不一定是连续,且进程只能访问自己的虚拟内存段,没法访问到其他进程的虚拟内存空间和物理内存。 利用虚拟内存机制的重要功能: 文件映射 请求分页 写时复制 swap 多级页表 标准大页 请求分页 如果内核直接从物理内存中获取需要的区域,然后设置页表并关联虚拟地址空间与物理地址空间,这样会导致内存的浪费,有一部分内存获取后可能进程到运行结束都不会使用,如: 用于大规模程序中的、程序运行时未使用的功能代码段和数据段 由glibc保留的内存池中未被用户利用的部分 所以利用请求分页来解决这个问题。对于虚拟地址空间内的各个页面,只有在进程初次访问页面时才会为这个页面分配物理内存。 过程: ① 进程访问入口点 ② CPU 参照页表,筛选出入口点所属的页面中哪些虚拟地址未关联物理地址 ③ 在CPU中引发缺页中断 ④ 内核中的缺页中断机构为页面分配物理内存并更新页表 ⑤ 回到用户模式继续运行进程 测试 现用以下测试代码观察虚拟内存和物理内存的分配关系 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #include <unistd.h> #include <time.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <err.h> #define BUFFER_SIZE (100*1024*1024) #define NCYCLE 10 #define PAGE_SIZE 4096 int main(void) { char *p; time_t t; char *s; t = time(NULL); s = ctime(&t); printf("%.*s: before allocation, please press Enter key\n", (int)(strlen(s) - 1), s); getchar(); p = malloc(BUFFER_SIZE); //申请100MB的内存 if (p == NULL) err(EXIT_FAILURE, "malloc() failed"); t = time(NULL); s = ctime(&t); printf("%.*s: allocated %dMB, please press Enter key\n", (int)(strlen(s) - 1), s, BUFFER_SIZE / (1024 * 1024)); getchar(); int i; // 以页为单位访问内存,每10M且隔1秒就输出一次信息 for (i = 0; i < BUFFER_SIZE; i += PAGE_SIZE) { p[i] = 0; if (i != 0 && i % (BUFFER_SIZE/NCYCLE) == 0) { t = time(NULL); s = ctime(&t); printf("%.*s: touched %dMB\n", (int) (strlen(s) - 1), s, i / (1024*1024)); sleep(1); } } t = time(NULL); s = ctime(&t); printf("%.*s: touched %dMB, please press Enter key\n", (int) (strlen(s) - 1), s, BUFFER_SIZE / (1024 * 1024)); getchar(); exit(EXIT_SUCCESS); } 示例说明: ...

August 12, 2018 · 2 min · 370 words · erpan

限制svn上传文件大小

为了方便管理和避免一些问题,svn上传文件需要限制文件大小 svn有几种钩子,资料一搜一大把,限制上传文件大小需要用到 pre-commit 在仓库hooks目录下有示例配置文件,新建一个名为 pre-commit 的脚本,内容如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/bin/bash REPOS="$1" TXN="$2" SVNLOOK=/usr/bin/svnlook MAX_SIZE=512000 files=$($SVNLOOK changed -t $TXN $REPOS | awk '{print $2}') # check check if [[ $files =~ "project_nuli" ]];then for f in $files do # check file size filesize=$($SVNLOOK cat -t $TXN $REPOS $f | wc -c) if [ $filesize -gt $MAX_SIZE ] ; then echo "File $f is too large (must <= $MAX_SIZE)" >> /dev/stderr exit 1 fi done fi exit 0 客户端提交大于500K文件会返回 File $f is too large (must <= $MAX_SIZE) ...

December 13, 2017 · 1 min · 178 words · erpan

Linux系统平均负载和上下文切换

平均负载 top/uptime显示的平均负载到底是啥意思?它的值多少是比较合理的? Linux系统中,不知道的命令、库和系统调用等都可以执行下man命令来查看。 man uptime说明: ​ System load averages is the average number of processes that are either in a runnable or uninterruptable state. A process in a runnable state is either using the CPU or waiting to use the CPU. A process in uninterruptable state is waiting for some I/O access, eg waiting for disk. The averages are taken over the three time intervals. Load averages are not normalized for the number of CPUs in a system, so a load average of 1 means a single CPU system is loaded all the time while on a 4 CPU system it means it was idle 75% of the time. ...

November 12, 2017 · 1 min · 184 words · erpan

dns 概述

dns协议 介绍 Domain Network System(DNS),可以理解为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符(协议限制),域名总长度则不能超过253个字符。开始时,域名的字符仅限于ASCII字符的一个子集。2008年,ICANN通过一项决议,允许使用其它语言作为互联网顶级域名的字符。使用基于Punycode码的IDNA系统,可以将Unicode字符串映射为有效的DNS字符集。因此,诸如“XXX.中国”、“XXX.美国”的域名可以在地址栏直接输入并访问,而不需要安装插件。但是,由于英语的广泛使用,使用其他语言字符作为域名会产生多种问题,例如难以输入,难以在国际推广等。 早期的域名必须以英文句号.结尾。例如,当用户访问www.wikipedia.org的HTTP服务时必须在地址栏中输入:http://www.wikipedia.org.,这样DNS才能够进行域名解析。现在的DNS服务器会自动补上结尾的点号。 域名层级结构 主机名.次级域名.顶级域名.根域名 b.940504.top. 即:host.sld.tld.root DNS层级结构 所有 DNS 服务器都属于以下四个类别之一: 本地域名服务器(DNS resolver/Local DNS,一般是递归解析器,用来响应客户端的递归请求,大多数 Internet 用户使用他们 ISP 提供的递归解析器) 权威域名服务器(authoritative nameserver,在特定区域内具有唯一性,保存了该区域内的域名与IP地址之间的对应关系) 顶级(TLD)域名服务器(top-level domains,管理顶级域名服务器下注册的二级域名,比如940504.com中,.com是顶级域名,向此域名服务器查询可返回940504.com的权威域名服务器地址) 根域名服务器(本地域名服务器查询不到时,会向根查询返回顶级域名服务器地址) DNS Master Files (Zone Files) 常用记录类型 主机记录(A记录):将域名映射到对应主机的IP地址。 别名记录(CNAME记录): 返回另一个域名,即当前查询的域名是另一个域名的跳转。最常用到 CNAME 的场景包括做 CDN、企业邮箱、全局流量管理等。 IPv6主机记录(AAAA记录): 与A记录对应,用于将特定的主机名映射到一个主机的IPv6地址。 服务位置记录(SRV记录): 用于定义提供特定服务的地址和端口,下面有示例。 MX邮件记录(Mail eXchange):返回接收电子邮件的服务器地址,dig 940504.top mx。 域名服务器记录(NS记录):把子域名交给其他 DNS 服务商解析。该记录只能设置为域名,不能设置为IP地址。 PTR:逆向查询记录(Pointer Record):用于从IP地址查询域名。 TXT:一个域可以具有许多 TXT 记录,通常用于发件人策略框架(SPF)代码,这些代码可帮助电子邮件服务器判断邮件是否来自受信任的来源,有有助于域所有权验证。dig _dnsauth.b.940504.top txt。 起始授权记录SOA:此记录可以存储有关域的重要信息,如管理员的电子邮件地址、上次更新域的时间,以及服务器在刷新之间应等待的时间。 url记录:有显性和隐性。隐性url记录使用的是iframe框架技术,不是重定向,访问后地址栏url不变;显性url记录支持url转发301、302重定向,地址栏会跟着重定向。 ns记录 NS 代表“域名服务器”,域名服务器记录指示哪个 DNS 服务器对该域名具有权威性(即,哪个服务器包含实际 DNS 记录)。一般来说,NS 记录表明了可从哪里找到域名的 IP 地址。为了服务的安全可靠,一个域名通常会有多个 NS 记录,这些记录可指示该域的主要和备用域名服务器。 ...

October 15, 2017 · 2 min · 404 words · erpan