0%

使用vimdiff查看文件之间的不同

与Unix diff命令一样,vimdiff用于显示文件之间的不同的地方。不像Unix的diff命令,vimdiff有更多的颜色和用户友好性

在下面的例子中,很容易可视化的看到两个文件中哪些地方文本被改变和添加。

1
$ vimdiff employee.txt new-employee.txt
vimdiff命令 描述
$ vimdiff file1 file2 使用垂直窗口分割显示文件的不同
$ vim -d file1 file1
$ vimdiff -o file1 file1 使用水平窗口分割显示文件的不同
$ vim -d -o file1 file1
$vim filel & :diffsplit file1 如果你已经打开一个文件,使用:diffsplit以水平方式加载的不同点
$vim file1 & :vert diffsplit file1 如果你已经打开一个文件使用:vert diffsplit以垂直方式加载的不同点
[c 移动到vimdiff中下一个改变处
]c 移动到vimdiff中前一个改变处

可以上墙的广播命令wall

.. _linux_wall_beginner:

.. note::
一呼百应。

Linux wall命令会将信息传给每一个 mesg 设定为 yes 的上线使用者(可以输入mesg,如果返回is yes就可以收到)。当使用终端登陆的时候,可以使用EOF (通常用 Ctrl+D)。所有人均可以使用该命令。

官方的定义为:

wall - send a message to everybody’s terminal

所以wall应该是write all user’s terminal的缩写。

命令格式

1
$ wall [-n] [ message ]

其中参数-n的含义为,修改显示的广播信息放松抬头,看示例即可明白。

这个命令的使用场景为如果需要升级维护系统,可以通过wall命令通知所有在线的用户。

如下:

1
2
3
4
5
6
7
8
9
10
11
$ wall
Dear all,
We want to make you aware that this weekend 12PM CST,
there will be scheduled down time for approximately 6 hours.
During this time we will add more capacity and software update
to our infrastructure and service.
Please save all your works and logout for safe.
See you next week.
Regards,
Admin
Ctrl+D #退出

所有登陆的终端都会收到这个消息:

1
2
3
4
5
6
7
8
9
10
11
Broadcast message from user@localhost (pts/4) (Mon Apr 18 22:02:22 2011):

Dear all,
We want to make you aware that this weekend 12PM CST,
there will be scheduled down time for approximately 6 hours.
During this time we will add more capacity and software update
to our infrastructure and service.
Please save all your works and logout for safe.
See you next week.
Regards,
Admin

需要注意的是,这个命令最大支持20行的信息,超过了就不会广播了。

如果使用-n参数的效果如下

1
2
3
4
5
6
$ wall -n 'hello'

# 其他终端用户收到的消息
Remote broadcast message (Mon Apr 18 22:05:22 2011):

hello

可以看到此时的通知抬头变成了 Remote broadcast message,去掉了是哪个用户发送的消息。

退出vim

  • : x :wq ZZ 保存文件并且退出
  • :q! :qa 退出但不保存文件

保存文件

使用*:w* 和 :u 都可以保存文件,其中w代表write,u代表update的含义。

如果只是输入上述命令,则直接保存文件,当然也可以使用*:w anotherFilename*来另存为另一个新的文件。

自动保存文件

当你试图切换缓冲区或者文件时,如果你没有保存改变时Vim通常会给出错误消息。

启用切换缓冲区/文件时自动写入文件,命令如下:

1
:set autowrite

使用单个命令写入所有文件(这可能在宏中非常有用)

1
:wall

保存文件时发生的问题

  1. 尝试保存文件已存在,可以输入*:w! file用来覆盖现有的文件,或者:w newfile*将编辑的结果写入新的文件;
  2. 得到文件系统已满的消息,可以输入*:!rm junkfile来删除一个不需要的打文件,空出一些空间(在冒号后加上感叹号,然后就可以执行shell命令),或者输入:!df看看其他文件系统有没有空间,如果有,先放入其他文件系统,用:w pathname*来写入你的文件。
  3. 系统进入开放模式并且显示文件系统已满的消息,可以输入*:!ls /tmp来查看有无可以移除的文件,以腾出一些空间。如果有的话,可以先创建一个临时的unix shell,以便移除,直接输入:sh可以打开一个新的暂时的shell*,移除后,可以输入exit返回到vi,或者使用CTRL+Z来将vi暂停,放到后端,使用fg即可以回到vi。
  4. 尝试写入文件,却得到磁盘限额已满的消息,可以实时*:pre(:preserve)*的缩写,强迫系统保存你的缓冲区。

使用当前行重绘屏幕

导航键 描述
z然后ENTER 将光标行移到屏幕顶端并滚动屏幕
z. 将光标行移到屏幕中心并滚动屏幕
z- 将光标行移到屏幕底端并滚动屏幕
200z然后ENTER 会把第200行移到屏幕顶端

VIM 重复命令

  • @@ : 重复上一个执行宏
  • n:以相同的方向重复上一个搜索命令;
  • N:以相反的方向重复上一个搜索命令;
  • . :重复上一个编辑命令;
  • @:重复上一个命令行

VIM快速选中并复制粘贴替换一个单词

  1. 比如准备用bbb替换aaa
  2. 光标移动到aaa的开头,按 v 按e 按y
  3. 光标移动到bbb的开头,按 v 按e 按p

VIM 撤销和重做

  • u:可以撤销上次的操作;
  • Nu:可以撤销前N次的操作;
  • U:撤销当前行的所有修改;
  • :red或者CTRL+R:可以撤销还原;

关于gvim

gVim是Vim的图形前端,它是跨平台的编辑器,基本上主流的操作系统上面都有它的版本。

##显示或隐藏gvim的菜单和工具栏

使用:set guioptions命令。

例如隐藏工具栏*:set guioptions-=T,再次显示工具栏为:set guioptions+=T*

UI元素命令 描述
:set guioptions+=TmrlRL 显示所有gvim的GUI元素
:set guioptions-=TmrlRL 隐藏所有gvim的GUI元素
:set guioptions-=T 隐藏gvim工具栏
:set guioptions-=m 隐藏gvim菜单栏
:set guioptions-=r 隐藏gvim右边的滚动栏
:set guioptions-=l 隐藏gvim左边的滚动栏
:set guioptions-=R Hide gVim Right side scroll bar that appears when window is split vertically
:set guioptions-=L Hide gVim Left side scroll bar that appears when window is split vertically

gVim中改变字体

你可能不喜欢gVim的缺省字体,你可以使用下面两种方法来修改它。

方法1:

该例子设置字体类型为Courier New,大小为10。对于这种方式,你应该已经知道字体的名称。

1
:set guifont=Courier\ New:h10

方法2:

下面的方法将打开一个字体选择UI,在对话框中你可以选择字体类型和大小。

1
:set guifont=*

Swap文件

使用-r选项来列出当前目录下的Swap文件,~/tmp、/var/tmp、/tmp。

下面的命令显示所有的swap文件。

1
$ vim -r

当一个swap文件存在时,如果你试图打开它的原始文件,你会得到覆盖swap文件的消息,原因是:

  • 一些人正在编辑文件;
  • 基于为什么会发生下面Vim提示中的一种,如下所示:
  • 打开只读文件(查看文件内容);
  • 任何地方进行编辑(编辑文件内容);
  • 恢复(使用交换文件来替代文件内容);
  • 退出或崩溃。