VIM的使用

上次配置完YCM,发现vim绝对是宇宙最强编辑器,不接受反驳。 接下来就分享一些有意思的快捷键。{dd}{yy} 啥的就不介绍了。

快速删除/复制/选中

以下命令都是删除的命令,复制、选中都类似,只需要把 d 换成 y 或者 v ;别的变成语言中成对出现的符号都适用下面的命令需要把 " 换成 '{( 等。

  • 快速删除引号中的内容 di"
  • 带着引号删除 da"
  • 删除从这个单词到下一个单词 dw

分屏

  • 左右分屏::vsplit filename
  • 上下分屏::split filename

实时调整当前窗口的宽度

  • 右加宽,默认值为1 Ctrl-w >
  • 向右加宽宽度N Ctrl-w N >
  • 向左调整把 > 换成 < 即可。上下调整使用 +-

大小写转换

VIM 中单个字符大小写转换使用 ~,多个就稍微有点麻烦了。 可以使用下面操作快速切换:

  • gu + 限定符:切换为小写
  • gU + 限定符:切换为大写

下面就属于一些配合vim快捷键的技巧了,比如说全文转大写 gggUG,可以分为几个部分 gggUG,这样就可以理解为先回到开头,然后转为大写,直到最后。剩下就看灵活发挥了。

括号快速切换

在匹配的括号之间快速切换使用 %


一个快捷键见总结 https://github.com/skywind3000/awesome-cheatsheets/blob/master/editors/vim.txt

sudo的工作原理

此文不介绍sudoers文件的配置方法,只是简单介绍sudo工作流程。

工作流程

工作流程如下图,第一次用markdown写流程图,不太精细。

认证文件简介

认证文件可以理解为cookie,里面记录认证时间,在终端的PID,用户ID,终端的ttydev。
解析代码参考Github
认证文件以二进制保存,每个用户会有一个自己的cookie文件,放在/var/run/sudo/ts文件夹下,文件名为用户名。
文件保存结构如下:

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
struct timestamp_entry_v1 {
unsigned short version; /* version number */
unsigned short size; /* entry size */
unsigned short type; /* TS_GLOBAL, TS_TTY, TS_PPID */
unsigned short flags; /* TS_DISABLED, TS_ANYUID */
uid_t auth_uid; /* uid to authenticate as */
pid_t sid; /* session ID associated with tty/ppid */
struct timespec ts; /* time stamp (CLOCK_MONOTONIC) */
union {
dev_t ttydev; /* tty device number */
pid_t ppid; /* parent pid */
} u;
};

struct timestamp_entry {
unsigned short version; /* version number */
unsigned short size; /* entry size */
unsigned short type; /* TS_GLOBAL, TS_TTY, TS_PPID */
unsigned short flags; /* TS_DISABLED, TS_ANYUID */
uid_t auth_uid; /* uid to authenticate as */
pid_t sid; /* session ID associated with tty/ppid */
struct timespec start_time; /* session/ppid start time */
struct timespec ts; /* time stamp (CLOCK_MONOTONIC) */
union {
dev_t ttydev; /* tty device number */
pid_t ppid; /* parent pid */
} u;
};

有两种保存方式,通过version进行区分,当version值为1时使用上面的结构体;剩下的使用下面的结构体。
type字段表示这下方的union中使用哪个字段,type会使用以下几个值:

1
2
3
4
#define TS_GLOBAL               0x01    /* not restricted by tty or ppid */
#define TS_TTY 0x02 /* restricted by tty */
#define TS_PPID 0x03 /* restricted by ppid */
#define TS_LOCKEXCL 0x04 /* special lock record */

flags字段自行研究吧,没有太关注。
auth_uid这个是授权用户的UID。
sid这个表示所在终端的PID,但是这个有一个东西需要注意,如果这个账户是通过别的账户su过来的,那么他的值为最上层终端的PID,不太清楚原因。

C/C++ const修饰符

写一篇简单点的,最近老是使用const,但是还经常想不起来咋用,老得查,写一篇记录以下,方便下次找。

作用

const说白了就是希望某些值不被改变,对于一般的变量来说很简单const int i = 1即可,但是对于指针来说就没那么简单了。

指针

1
2
3
const int *i = 0;      // 值不能改,指向可以随便改
int *const j = 0; // 值可以随便改,指向不能改
const int *const k = 0;

前两个很容易分不清楚,首先第一个是指向常量的指针,说人话就是i指向的值不能通过*i改变,但是可以通过别的方法改变,并且i这个指针可以随便指向其他变量。 第二个是常量指针,即指针不能随便指别人,但是指向的值可以随便改。 第三给就是都不嫩改了。

Linux用户信息详解

Linux用户信息很丰富,存储在了多个文件中,其中包括/etc/passwd,/etc/shadow,/var/log/wtmp等文件中,因为在项目中用到了,所以有些了解。下面对这几个文件进行一个详细的介绍。

账户基本信息

文件各字段含有

/etc/passwd存储了账户的基本信息,默认任何用户都可以读取,也是早期存储账户密码的文件,后因任何用户都可读取,造成安全问题,故后期不再用于存储。
/etc/passwd文件采用:分割,共分为了7个字段,下面是文件中的一行。

1
root:x:0:0:root:/root:/usr/bin/bash
阅读全文 »

Linux命令-top

简介

top相当于是Linux下的任务管理器,能够实时显示系统中各个进程的资源占用状况,MAN手册中的解释如下图。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态。
Linux MAN手册对top命令的描述

阅读全文 »

上路

初识Arch

寒假闲的作死,非要在装了linux的机子上重装一遍windows,作死搞废GRUB引导,在张大师的博客引导下初识Arch,配置了一天脑子都快炸了,最后在临睡觉前搞好了。
前两天没地方呆,各处实验室用不了,闲的无聊,无奈之下,装了个virtualbox虚拟机,奋斗三天,装崩数次,最终装上,虽说用了不超过一小时,又雪崩了吧,好歹成功一回。
Arch并不太懂,官方介绍献上Arch Linux (简体中文),当然英文好的还是建议看英文的(像我的这种英文渣……),英文文档也献上了Arch Linux

阅读全文 »