Vim小技巧

这篇文章主要总结了我在使用 Vim 过程中遇到的一些问题及解决方案,都是一些比较零碎的内容,如果要看 Vim 系统的内容可以参考之前的几篇文章。

查看 Vim 使用的配置

在 vim 中输入

:script 来查看 Vim 加载使用的配置

查看 Vim 的版本

:version 来查看 Vim 的版本

在有一次使用 Vim 的时候总是无法将 Vim 选中的内容和系统粘贴板用到一起 "+y"+p 根本无法使用,后来经过网上一查, 通过 :version 一查才知道原来本地安装的 Vim 版本根本没有把 clipboard 支持编译进去。所有有的时候遇到问题第一时间检查一下版本还是比较重要的。

查看 Vim 中所有的快捷键映射

使用 :map 来查看当前 Vim 配置中所有的快捷键映射。

列选

  1. 进入 Visual Block Mode Ctrl + V
  2. 选中编辑的列
  3. Shift + i 进入编辑模式 Insert Mode
  4. 输入编辑
  5. esc 两次

批量缩进代码

如果使用VS,或者IDE的同学应该都知道,如果要批量缩进代码,在这些IDE中都能够选择+tab键实现,而Vim中则不太一样,之前困扰我很久,现在终于有了解决方案。在之前的文章中已经提到了Vim的模式,现在我们要用到其中的一种—-选择模式。

批量缩进代码的方式如下:

  • 按下 v , 进入选择模式
  • j/k 移动光标选择需要缩进行
  • 按一次> 缩进一次,按 < 回缩

如果是需要选中的行数比较多可以使用 数字num+j 方法移动num行,对于有括号 { } 的方法,例如

function functionName(){
// a lot of code
}

则可以使用 % 进行括号匹配, 按下 v 进入选择模式,将光标移动到 { ,按下 % ,Vim自动找到匹配的括号并选择该函数,利用 > 即可缩进该函数。

那么,其实单行缩进就是两个大于号 >> , 回缩就是两个小于号 <<

不重启使vimrc文件生效

在学习阶段,我经常改动vimrc文件,而每一次改动就要重启一下Vim,甚是烦恼。偶然间看到Google Group中有人讨论一些无关紧要的问题,其中看到写了不重启使vimrc文件生效的代码,尝试一下确实可行,做一下记录:

在命令模式下运行
:so #MYVIMRC
去帮助查看so,其实so是source的缩写

当然你也可以在vimrc文件中加入

"编辑vimrc之后,重新加载
autocmd! bufwritepost _vimrc source $VIM/_vimr

这样每一次保存vimrc文件就自动加载vimrc文件,使之生效。而如果在vimrc文件中存在函数,可能会遇到vim警告“函数 已存在,请加!强制替换”,同样讨厌,虽然作为新手的我还不知道为什么出现这些警告,但总之解决方法就是把vimrc中的函数全部定义成 function! 这种形式。但其实那些警告不影响效果,不定义成 function! 也行,但是很烦人。

均匀插入空行

均匀的在行与行之间插入空行,原先的空行保留。

Vim 的 :g 命令就是为类似的任务设计的,给每一行运行单独的命令。使用如下命令完成目标:

:g/.\n\n\@!/norm o

正则匹配 /.\n\n\@!/ ,拆分成不同部分来解释:

  • . 匹配行中所有字符。(这个例子中用来排除空行)
  • \n 匹配行末尾
  • \n\@! 如果有连续两个换行则匹配失败

用命令 :h E59 查看 \@! 更多信息。我们使用 :g 命令正则匹配到符合规则的行之后,我们告诉Vim执行 norm o ,也就是 Normal Mode 下的 o 命令,也就是在当前行下插入空行。

总结来说,这行命令匹配所有下一行不是空行的行,然后在他们下面增加一行空行。通过这个例子,你也许想要查看一下vim的wiki Power of G 来学习一下 :g 命令,已经它的姐妹命令 :v

This note is taken from superuser

从 vim 中复制到粘贴板

使用 shift+v 选中几行内容之后,如果只使用y 无法复制到系统的粘贴板中,此时在选中的情况下输入 "+y , 即可将所选内容复制到粘贴板。注意需要输入的是:引号+加号+ 小写y。

而这样做需要输入三次,可以使用 map 绑定到喜欢的快捷键上,比如:

vmap <C-c> "+y

这一行配置的含义就是在可视模式下,Ctrl+c,就是将所选择内容复制到粘贴板。 但是需要注意的是如果运行 :echo has('clipboard') 返回的结果是0,那么这个方法就没用,因为该版本的 vim 在编译的时候没有将 +clipboard 加入。

同理,如果想要从系统粘贴板中粘贴内容到 vim 中,使用 "+y or "*y, 引号+加号+y,来从系统粘贴板中将内容粘贴到 vim 中。

NERDTree Tip

Vim 中极好用的文件管理插件,用了也有一些时间了,但是有些内容并没有仔细地看,今天突然有些需求就看了一下。常用的 NERDTree 命令有:

  • o 打开或关闭文件或目录
  • i 在水平分割的新窗口打开文件
  • s 在垂直分割的窗口中打开文件
  • t 在新标签页中打开文件
  • j/k 移动
  • J/K 到第一个或者最后一个节点
  • ? 帮助菜单

创建目录与文件

打开 NERDTree,在 NERDTree 中使用m 然后选择a,来创建文件或者文件夹,要创建文件夹只需要在输入的名字后面加上/

删除文件与目录

同理,在 NERDTree 中按下 m 会由很多选项可选,使用 d 就可以删除结点,也就是删除文件或者文件夹。

显示隐藏文件

在 NERDTree 中使用Shift+i 来显示隐藏文件。

vim 删除偶数行

使用命令:

:g/^/+d

:g 命令在所有匹配正则的行上执行

:g/LinesMatchThisRegex/ExecuteThisCommand

举例:

:g/hello/d

以上命令会删除所有包含 “hello” 的行

而与此同时 :%s 仅仅提供正则的搜索和替换,命令最后的 g 表示全局,整个文件中

:%s/hello/world/g

因此该命令会替换文中所有的 hello 为 world.

:%s 中的 s 表示替换 (substitute) , 而 % 表示整个 buffer. 因此 :%s 表示从整个文件 buffer 中替换, :%s 还可以指定行范围:

:10,15s/hello/world/g

搜索并替换10至15行中的 hello 为 world.

快速移动

在 vim 中移动 hjkl, 左下上右移动光标已经不用多说, wb,向后向前移动一个 word。

gg 移动到第一行, G 移动到最后一行,这是最基本的,也可以使用 nG 来移动到第 n 行。

翻页技能,使用 Ctrl D 向下移动半页, Ctrl U 向上移动半页

Ctrl B 向上翻页, Ctrl F 向下翻页

* 号用来向下查找整个单词

# 号用来将光标移动到上一个在光标下的字符,比如光标正在单词 String 上,使用 # 来向上查找上一个 String。

% 百分号用来在匹配的括号之间跳转。

fx 光标跳转到下一个 x 位置,可以用来快速跳转到下一个预期的字符 x

Fx 向前跳跃到字符 x 位置

tx til 下一个 x,光标在 x 前面

Tx 上一个 x

让vim支持系统粘贴板

sudo apt install vim-gnome

配置 leader

配置的 leader 要在 map 之前

let mapleader = “,”

let g:mapleader = “,”

参考配置


2015-05-08 vim , tips

Vim 学习笔记2: 组合命令

Vim 学习笔记进阶版,初级版可以参考这篇文章

这篇文章主要分为替换操作,多窗口操作,Vim 的 Tab 操作,以及Visual mode 命令模式等等。

组合命令 combine command

Vim 所有的操作都是原子化的,将操作组合起来能够实现非常快捷的Input

.    (dot) will repeat the last command 点命令重复上一个命令
n<commmand>    will repeat the command n times 将命令重复 n 次

for example:

2dd    will delete 2 lines
3p 	   will paste the text 3 times
40idesu [ESC] will write "desu " 40 times
5w     向后移动5个单词
6j     向下移动6行

Vim 还支持另一种组合

di"   光标在引号内, (d)elete (i)nside "  删除在引号之间的内容
yi(   光标在括号内, (y)ank (i)nside ()  复制在()中的内容
vi]   光标在中括号内, 选中[] 内的内容
dtx   向后删除字符直到遇到第一个 `x` 字符, (d)elete (t)ill x
ytx   先后复制内容直到遇到第一个 `x` 字符

文件中快速跳转

NG    go to line N, N is a number, like 23G means go to line 23
:x    跳转到第 x 行 x为行号
gg    shortcut for 1G - 跳转到第一行
G     跳转到最后一行

标记和宏 macro

ma    将当前位置标记为a,26个字母都可以作为标记,`mb`, `mc` 等
'a    跳转到 a 标记位置
qa    将所有的键盘操作录制下来,直到再次在命令模式按下 <kbd>q</kbd>, 并存储在 <kbd>a</kbd> 中
@a    执行刚刚记录在 <kbd>a</kbd> 中的键盘操作
@@    执行上一次 macro 操作

宏命令是 Vim 中最神奇的操作之一,需要慢慢体会,关于宏命令可以参考这篇

批量替换

在全文中用一个单词替换另外一个单词

:%s/想要被替换的字串/新字串/g g模式全局替换
  • ”%” 范围前缀表示在所有行中执行替换,%为当前文件, 相当于:1,$s/,如果不加 % 则表示在当前行中
  • “g” 标记表示替换行中所有匹配点。

替换的语法为::[addr]s/源字符/目的字符/[option]

[addr] 表示检索范围, 省略表示当前行。

  • :n1,n2s/word1/word2/g 从 n1 行到 n2 行,替换 word1 为 word2 全局替换
  • :%s/ = :1,$s/
  • :.,$/word1/word2/g 从当前行到尾行

s: 表示替换操作

[option]表示操作类型

  • g 全局替换
  • c 确认,如果加上 c 选项,每次都需要确认 confirm
  • p 逐行显示结果

省略 option 时只对每一行的第一个匹配串进行替换

删除所有空行

:g/^$/d

删除所有空白行和空行

:g/^[ ][ ]*$/d

在每行开始插入两个空白

:%s/^/  /

在接下来5行末尾加入"

:.,5/$/"/

多窗口操作

新建与关闭窗口

在 Normal 模式下使用以下命令新建窗口

:split 			水平分割窗口,内容一样
:10split 		水平分割窗口,新窗口高度10行
:split filename 窗口中打开新文件
:new 			功能和split一样
:sp 			split 缩写
Ctrl-w s,v 		分割窗口的快捷方式,s水平分割,v垂直分割
:vsplit 		垂直分割窗口,简写 :vs
Ctrl-w c 		关闭当前窗口

窗口间移动

Ctrl-w h,j,k,l    Ctrl按下,按下w 松开,Ctrl松开,按hjkl 对应左下上右

移动窗口

Ctrl-w H,J,K,L    大写HJKL,移动窗口

窗口最大化

Ctrl-w o    让当前文件占据整个窗口

调整窗口大小

Ctrl-w < > 调整窗口宽度,<缩小当前窗口宽度,向左扩展一列,>增加当前窗口宽度,向右扩展一列。当然 Ctrl-w 之后可以使用 n+< 调整多列宽度 Ctrl-w - + 调整窗口高度

在使用 Nerd tree 插件后,可以使用 Nerd tree 内置的快捷键,在 Nerd tree 中

  • i split 一个新窗口打开选中的文件,并跳转到该窗口
  • s vsplit 一个新窗口打开选中文件,并跳到该窗口

Tabs

在 Vim 中 Tab 和 Windows 是不一样的概念,如果平时使用 Chrome 或者 Firefox,就很好理解 Tab,在 Vim 中每一个 Tab 能够包含多个窗口。

Create New tab

有很多方法可以创建新 Tab , 这里是最简单方式:

:tabnew 	create a empty new tab
:tabedit {file} 	edit specified file in new tab

Manage tabs

Some ways to close tabs:

:tabclose 	close current tab
:tabclose {i} 	close i-th tab
:tabonly 	close all other tabs

Some ways to move tabs:

:tabm 0 	move current tab to first
:tabm 		move current tab to last
:tabm {i} 	move current tab to position i+1
:tabs 		list all tabs including their opening windows

Ways to move between tabs:

:tabn 		go to next tab
:tabp 		go to previous tab
:tabfirst 	go to first tab
:tablast 	go to last tab

While in normal mode, you can type:

gt 			go to next tab
gT 			go to previous tab
{i}gt 		go to tab in position i

修改文本

Insert模式下

<BS>  退格键,删除光标前
<Del> Delete键,删除光标后
<C-W> 删除一个单词
<C-U> 删除光标前的字符,保留光标之后的文本,保留行首的缩进,只删除第一个非空字符至光标位置之间的文本。

可视Visual mode

v 按字符选择,在Normal mode下按下v进入Visual mode
V 按行选择
Ctrl+Q 块选择,Windows下,其他平台下Ctrl+V

选择字符之后操作

d 剪切选择内容到剪贴板
y 拷贝选择内容到剪贴板
c 剪贴选择内容到剪贴板并进入Insert mode

命令模式

:! command 暂时离开 vi 到命令模式下执行 command

把命令的结果读入 Vim

在命令模式下,可以不离开 Vim 进行操作,但如果想要把命令的结果粘贴到 Vim 中,就需要使用 read 命令

:read !ls -al

Vim 会在当前光标处插入命令执行的结果。

增减数字

将光标停在数字上,Vim 中 Ctrl + X 会将数字减1, 而 Ctrl + A</kdb> 能将数字加1 ,默认为8进制。

Other

:verbose set tabstop?    in Vim, it will tell you where the tapstop option value is coming from
:help + command  查看Vim命令的帮助,比如想要查看 c 命令的帮助直接使用 `:h c` 就能查到。
g <C-g>  单词统计

差不多看到这里就能够直接看文档了:http://vimcdoc.sourceforge.net/ 通过文档学习更多符合自己使用习惯的命令或者操作。

还有一些参考资料

reference


2015-05-07 vim , command , linux , editor

Vim 学习笔记

Vim 入门及简单使用,包括简单介绍 Vim 模式,移动,和编辑命令。

模式切换 Change between modes

如果你不知道Vim 的各种模式,可以参考Vim 模式

Insert -> Normal : ESC/Ctrl-[
Insert -> Command : (Insert -> Normal) -> :

Normal -> Command : :
Normal -> Insert : iIsScCoO
Command -> Normal : Enter

插入模式

i 进入 insert mode,在光标为之前进入插入模式
I 行首非空字符前插入 , I 等同于 `^i`
s 删除光标下字符,并进入insert mode, 等同于 `cl`
S 删除光标所在一行,并进入insert mode行首 , 等同于 `^C`
a 光标之后进入insert mode
A 光标移动到行尾并进入insert mode , 等同于 `$a`
o 在光标下一行插入一行,并进入insert mode , 等同于 `A<CR>`
O 在光标上一行插入新行,并进入insert mode , O 等同于 `ko`
C 删除光标后到行尾内容,并进入insert mode , C 其实等同于 `c$` 
cc 删除行,并进入插入模式

replace mode

按如下两个按键进入替换模式:

r replace the letter under cursor
R replace under cursor till you press Esc

move

简单的移动

    k
    ^
h <   > l
    v
    j

advanced Move

在Vim中,Word有两种含义,开始我也没搞明白,过了很久才渐渐明白。广义的 WORD 可以是任何两个空格之间的内容,比如 this is a word ,就是四个大写的 WORD 。侠义的 word ,英文单词、标点符号和非字母字符都被当成一个字。如$、%、^、&、*、(、)、-、+、{、}、[、]、~、|、\、<、>、/等,均被当成是一个字。

举例说明,比如 sub-directory 就是两个 word 但是是一个 WORD 。关于 word 的参考可以见word ,一般情况下记住大写的 WORD 是空格分割的词就行。

Vim中使用大写命令一般将字作为广义,小写命令就是作为侠义对待。命令都是成对出现,w 和 W,b 和 B,e 和 E:

w 词向后移动
W WORD is splited by space
b 词向前移动
B WORD向前移动
e 移下一个单词词末
ge 前一个单词词末
E 如果光标起始位置处于字内(即非字尾处),则该命令将把光标移到本字字尾;如果光标起始位置处于字尾,则该命令将把光标移动到下一个字的字尾。
0 光标移动到行首
^ 光标移动到行首非空白字符
$ 光标移动到行尾非空白字符
g_ 光标移动到行尾,包括空白字符

以下命令可以用来翻页

Ctrl+f  下一页
Ctrl+b  上一页
Ctrl+d  下半页
Ctrl+u  上半页
H       Move to first letter on top of screen
M 		Move to first letter on middle of screen
L 		Move to first letter on bottom of screen

行内移动 move inline

fx  向前查找本行中的字符x, 比如想要移动到下一个双引号时,可以使用 `f"` 来实现行内快速移动
F   向左查找

复制粘贴 Copy/Paste

p   光标之后粘贴 (p)aste
P   paste before the cursor
yy  复制当前行
y   Yank 复制. Example: yw (yank word) 光标停留到词第一个字母上 yw 复制单词
y0  copy the data from cursor to begining of the line
y$  copy the data from cursor to end of the line

删除 delete

x   删除光标下单个字符,将其放到粘贴板,剪切
X   向前删除一个字符,相当于 Backspace
dd  删除光标所在一行,并把该行复制
dw  删除光标所在词 (d)elete (w)ord
d0  删除光标到该行最前
d^  删除光标到行首非空白字符
d$  删除光标到该行最后
J   删除光标所在行的换行符

剪切x ,删除dd ,dw用的情况还挺多的。

在插入模式下删除

在 Vim 插入模式下可以使用下面的命令来删除字符、单词或者行

<C-h>    向前删除一个字符
<C-w> 	 先前删除一个单词
<C-u>    删除至行首
<C-k>    删除至行尾

这 bash 的快捷键一致

撤销/重做 redo

u   撤销上一次编辑 undo
<C-r> Ctrl-R redo

搜索与替换 search replace

/pattern  - 正向搜索,从光标处开始向文件末搜索
?pattern  - 反向搜索,从光标处开始向文件首搜索
n  - 下一个,往下执行搜索命令
N  - 上一个
*  - Word under cursor - forward (bounded)
g* - Word under cursor - forward (unbounded) 不包含单词边界 `\<\>`
#  - Word under cursor - backward (bounded)
g# - Word under cursor - backward (unbounded)
:s/p1/p2/g -将当前行中所有p1均用p2替代
:n1, n2s/p1/p2/g -将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g -将文件中所有p1均用p2替换

Load/Save/Quit/Change File

:e <path/to/file> open file
:w save
:saveas <path/to/file> save to <path/to/file>
:x, ZZ or :wq save and quit (:x only save if necessary)
:q! quit without saving. :qa! to quit even if there are modified hidden buffers
:q! 放弃修改之后可用 :e! 恢复修改 :e! 为放弃为保存的修改

Other

gg     移动光标到文件开头
G      移动光标到文件末尾
Ctrl-]
Ctrl-O 跳转到上一个位置
Ctrl-T 标签退栈

参考


2015-05-06 vim , linux , command

Vim插件Vundle

简单介绍

Code Rush推荐,之后又陆陆续续看到很多在使用这款插件,所以在入门插件的时候就第一个安装了此插件,VIM如果不依靠插件来增强功能可谓鸡肋。而VIM提供的插件又很多,新手可能无从下手。幸好让我接触到了这个Vundle插件,Vundle用来安装,管理其他插件,这样以后安装插件卸载插件的问题就迎刃而解了。用Vundle管理插件有以下好处:

  • 自动下载安装插件
  • 自动更新插件
  • 只需要保存一份配置文件即可在新环境下安装所有插件
  • 自动清理没用的插件

安装

下载地址

https://github.com/gmarik/Vundle.vim

Mac和Linux安装

  1. 安装git客户端 Mac和Linux一般默认已经安装

  2. 下载并安装Vundle

     git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
    
  3. vimrc配置

    把以下的配置放到vimrc最前面

     set nocompatible              " be iMproved, required
     filetype off                  " required
    
     " set the runtime path to include Vundle and initialize
     set rtp+=~/.vim/bundle/Vundle.vim
     call vundle#begin()
     " alternatively, pass a path where Vundle should install plugins
     "call vundle#begin('~/some/path/here')
    
     " let Vundle manage Vundle, required
     Plugin 'gmarik/Vundle.vim'
    
     " The following are examples of different formats supported.
     " Keep Plugin commands between vundle#begin/end.
     " plugin on GitHub repo
     Plugin 'tpope/vim-fugitive'
     " plugin from http://vim-scripts.org/vim/scripts.html
     Plugin 'L9'
     " Git plugin not hosted on GitHub
     Plugin 'git://git.wincent.com/command-t.git'
     " git repos on your local machine (i.e. when working on your own plugin)
     Plugin 'file:///home/gmarik/path/to/plugin'
     " The sparkup vim script is in a subdirectory of this repo called vim.
     " Pass the path to set the runtimepath properly.
     Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
     " Avoid a name conflict with L9
     Plugin 'user/L9', {'name': 'newL9'}
    
     " All of your Plugins must be added before the following line
     call vundle#end()            " required
     filetype plugin indent on    " required
     " To ignore plugin indent changes, instead use:
     "filetype plugin on
     "
     " Brief help
     " :PluginList       - lists configured plugins
     " :PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
     " :PluginSearch foo - searches for foo; append `!` to refresh local cache
     " :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal
     "
     " see :h vundle for more details or wiki for FAQ
     " Put your non-Plugin stuff after this line
    
  4. 安装插件

    启动vim,并运行:PluginInstall

Windows下安装

查看官方教程,官方的教程有点问题,完全按照所写配置并不能成功。

vim74     #主程序目录 对应变量 $VIMRUNTIME
vimfiles  #配置文件目录 对应变量 $VIM	
  1. 同样需要Git,并且需要Curl

  2. 下载安装msysgit,add Path to your environment.安装过程中选择Run git from Windows command prompt option安装完成之后在终端运行git --version,如果出现类似以下情况即可:

     C:\> git --version
     git version 1.7.4.msysgit.0
    
  3. 设置Curl

    以下内容保存成curl.cmd,并存到msysgit安装目录中C:\Program Files\Git\cmd\curl.cmd,在终端运行curl --version出现以下类似内容即可:

     C:\> curl --version
     curl 7.21.1 (i686-pc-mingw32) libcurl/7.21.1 OpenSSL/0.9.8k zlib/1.2.3
     Protocols: dict file ftp ftps http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
     Features: Largefile NTLM SSL SSPI libz
    
  4. 因为Windows下和mac,linux环境不同,vim的配置地址也不同,所以git clone到的目录如下:

     git clone https://github.com/gmarik/Vundle.vim.git vimfiles/bundle/Vundle.vim
    
  5. _vimrc

    需要将Mac和Linux中相应位置代码修改成如下代码:

     " 配置同Mac,只需要按照下面修改rtp的路径即可
     set rtp+=$VIM/vimfiles/bundle/Vundle.vim/
     let path='$VIM/vimfiles/bundle'
     call vundle#rc(path)
    

使用

使用方法很简单,只需3步使新插件生效即可

  1. 将目标插件配置进vimrc或vundle_vimrc
  2. 执行:PluginInstall
  3. 重启

常用命令

:PluginList       - 枚举已安装的插件列表
:PluginInstall    - 安装插件或者后面加上'!'更新
:PluginUpdate     - 更新插件 同 :PluginInstall!
:PluginSearch foo - 查找插件。例如查找名称为foo的插件。或者后面加'!'更新本地缓存
:PluginClean      - 清理无用插件或者后面加'!'自动清理

更多使用方法查看帮助 :h vundle

参考:


2015-05-04 vim , vim-plugin , vundle

Vim模式

Vim 是一种多模式的编辑器,不同于一般的编辑器,进入便是编辑模式,可以在编辑模式下对文本进行各种编辑,Vim 进入之后是在普通模式(Normal mode) 下。

基本模式

普通模式 Normal mode

在普通模式中,用户可以执行一般的编辑器命令,比如移动光标,删除文本等等。这也是Vim启动后的默认模式。这正好和许多新用户期待的操作方式相反 (大多数编辑器默认模式为插入模式)。

Vim 强大的编辑能力中很大部分是来自于其普通模式命令。普通模式命令往往需要一个操作符结尾。例如普通模式命令”dd”删除当前行,但是第一 个”d”的后面可以跟另外的移动命令来代替第二个”d”,比如用移动到下一行的”j”键就可以删除当前行和下一行。另外还可以指定命令重复次 数,”2dd”(重复”dd”两次),和”dj”的效果是一样的。用户学习了各种各样的文本间移动/跳转的命令和其他的普通模式的编辑命令,并且能够灵活 组合使用的话,能够比那些没有模式的编辑器更加高效的进行文本编辑。

在普通模式中,有很多方法可以进入插入模式。比较普通的方式是按”a”(append/追加, 光标移动到行尾并进入插入模式)键或者直接使用”i”(insert/插入)键进入。

插入模式 Insert mode

在普通模式下按下 “i” 键进入, 在这个模式中,大多数按键都会向文本缓冲中插入文本。这是大多数文本编辑器的默认模式,也是大多数新用户希望文本编辑器编辑过程中保持的模式。但是 Vim 的设计哲学告诉我们,只有在真正输入文本的时候进入该模式,否则立即按下 ESC 退出到普通模式。

在插入模式中,可以按ESC键回到普通模式。

可视模式 Visual mode

在普通模式下按下 “v” 键进入,使用“V”可按行选择, 这个模式与普通模式比较相似。但是移动命令会扩大高亮的文本区域。高亮区域可以是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到 这块高亮的区域上。Vim的”文本对象”也能和移动命令一样用在这个模式中。

  • v命令进入的字符可视化模式(Characterwise visual mode)。文本选择是以字符为单位的。
  • V命令进入的行可视化模式(Linewise visual mode)。文本选择是以行为单位的。
  • Ctrl-V进入的块可视化模式(Blockwise visual mode)。可以选择一个矩形内的文本。(注意:在Windows中,Ctrl-V可能已经被影射为粘贴操作,可以使用Ctrl-Q进入块可视化模式。)

在 Vim 中使用如下命令查看更多官方帮助

:h 04.4

选择模式 Select mode

这个模式和无模式编辑器的行为比较相似(Windows标准文本控件的方式)。选择模式与可视模式相似,这个模式中,可以用鼠标或者光标键高亮选择文本,不过输入任何字符的,Vim会用这个字符替换选择的高亮文本块,并且自动进入插入模式。选择模式更多在 MS-Windows 中用到,其他系统如需启动选择模式,首先需要激活:

:set selectmode+=mouse

在 Vim 中使用如下命令查看更多官方帮助

:h 09.4

命令行模式

在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(”:”键),搜索(”/”和”?”键)或者过滤命令(”!”键)。在命令执行之 后,Vim返回到命令行模式之前的模式,通常是普通模式。

常用的命令模式有替换和搜索,比如使用 :%/a/b/g 将文本中所有的 a 替换成 b。

或者使用 /abc 来搜索文本中的 abc 字符串

Ex模式

这和命令行模式比较相似,在使用”:visual”命令离开Ex模式前,可以一次执行多条命令。我至今没用过,也不知道怎么弄,如果需要 Google 关键词: Vim Ex模式。

普通模式下按 Q 进入 Ex 模式,多行 Command Line 模式

派生模式

操作符等待模式

这个派生模式指普通模式中,执行一个操作命令后Vim等待一个”动作”来完成这个命令。Vim也支持在操作符等待模式中使用”文本对象”作为动作, 包括”aw”一个单词(a word)、”as”一个句子(a sentence)、”ap”一个段落(a paragraph)等等。

比如,在普通模式下”d2as”删除当前和下一个句子。在可视模式下”apU”把当前段落所有字母大写。

插入普通模式

这个模式是在插入模式下按下ctrl-o键的时候进入。这个时候暂时进入普通模式,执行完一个命令之后,Vim返回插入模式

插入可视模式

这个模式是在插入模式下按下ctrl-o键并且开始一个可视选择的时候开始。在可视区域选择取消的时候,Vim返回插入模式。

插入选择模式

通常这个模式由插入模式下鼠标拖拽或者shift方向键来进入。当选择区域取消的时候,Vim返回插入模式。

替换模式

这是一个特殊的插入模式,在这个模式中可以做和插入模式一样的操作,但是每个输入的字符都会覆盖文本缓冲中已经存在的字符。在普通模式下按”R”键进入。

vim key command


2015-05-01 vim , linux

Vim字符编码及中文菜单乱码

vim经常遇到文件乱码的情况,很多的文章都只是解决了作者遇到的乱码问题,不同的使用者由于环境不一样,参考之后,反而更加混淆和复杂。

其实vim乱码是与系统环境非常相关的,一味执着于修改vim的配置而不知道分析系统的实际环境,往往导致混淆,本文从原理分析vim编码的设计和乱码原因,帮助所有的用户解决vim的乱码。

vim为何会出现乱码:

  1. 首先是输入,vim 以错误的格式解析文件,比如原本是utf-8,但以ansi解析,那必然是乱码了。
  2. 然后是处理,vim 以错误的格式处理文件,比如原本是utf-8,但内部以 ansi 保存处理,导致乱码。
  3. 然后是输出,vim 输出显示的编码与系统不一致,也会乱码。
  4. 最后是写入,vim 回写文件与打开的不一致,造成编辑后文件乱码。

在 Linux 下需要考虑:

  1. Linux 默认支持的语系,/etc/sysconfig/i18n
  2. 终端 bash 的语系,与 $LANG 变量有关
  3. 再就是上面提到的文件编码有关

VIM编码相关选项

Vim 有四个跟字符编码方式有关的选项,encodingfileencodingfileencodingstermencoding (这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names),它们的意义如下:

encoding

encoding(enc) : Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、寄存器中字符串、菜单文本、消息文本等。用户手册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在 .vimrc 中改变它的值才有意义。Vim 读取文件之后,但并不以读取文件的编码来处理,而是会转换成内部编码的格式。这个编码默认是系统 locale 决定,一般与操作系统相关,linux下utf-8居多,中文windows下则是gbk。可以使用 :set enc 来查看当前 enc 设置

fileencoding

fileencoding(fenc) : 用于配置打开文件和保存文件的编码,fenc 是当前缓冲区文件自身的编码。从磁盘读取文件, Vim 会对文件编码检查,如果文件的编码与 Vim 内部编码(enc) 不同, Vim 会对文本做转码。当 Vim 向磁盘写文件时, enc 与 fenc 不一样, Vim 会转码成 fenc 编码保存文件。

该设置只能有一个值,只适合少数文件都是同种编码的环境

fileencodings

fileencodings(fencs): 这是一个字符编码的列表,Vim 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将 Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。从名字上看就知道是fileencoding的增强版,可以配置多种不同的编码,常见的配置为,配置好之后,列表中的文本编码只要合法,都能被 Vim 正确的读取。

termencoding

termencoding(tenc): Vim 所工作的终端 (或者 Windows 的 Console 窗口) 的字符编码方式,或者说是 Vim 用于屏幕显示时的编码。这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效,而对 Console 模式的 Vim 而言就是 Windows 控制台的代码页,并且通常我们不需要改变它。Vim 输出的编码,输出指输出到操作系统或命令终端等,默认与操作系统的语言编码一致,如果使用linux命令终端,建议终端和linux系统配置相同的编码,然后配置相同的termencoding,否则顾全了vim就顾不上shell,不过如果shell不存在中文名文件,则配置终端和termencoding一致即可,对于windows,能自动的识别gbk和utf-8,不用特殊配置。

fileformats

fileformats,用于区分操作系统,主要是回车\r\n的区别,fileformats选项,用于处理文件格式问题。以下命令,告诉 Vim 将UNIX文件格式做为第一选择,而将MS-DOS的文件格式做为第二选择:(换行方式 在早期的打印机时代,开始新的一行要占用两个字符的时间。如果到了一行的结尾处,你要快速回到新的一行的开头,需要打印针头在纸面上飞快地掠过,常常会在纸面上留下污点。解决这个问题的办法就是,用两个字符:一个字符来移到第一列,另一个字符来新增一行。计算机产生以后,存储较为昂贵,在如何解决回车换行这个老问题上,人们产生了不同的意见。UNIX人认为在到达一行的结尾时新增一行 (LF),而Mac人则认同 (CR)的解决办法,MS则坚持古老的 (CRLF)的方法。这就意味着如果你将一个文件从一个系统转移到另一个系统,就面临着回车换行的问题。而 Vim 编辑器则会自动的认出这种文件格式方面的区别,并做出相应处理。)

set fileformats=unix,dos

VIM 多字符编码方式工作流程

再记录一下,Vim 的多字符编码方式支持是如何工作的:

  1. Vim 启动,根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单文本、消息文的字符编码方式。
  2. 读取需要编辑的文件,根据 fileencodings 中列出的字符编码方式逐一探测该文件编码方式。并设置 fileencoding 为探测到看起来是正确的字符编码方式,如果没有找到合适的编码,就用latin-1(ASCII)编码打开。
  3. 对比 fileencoding 和 encoding 的值,若不同则调用 iconv 将文件内容转换为 encoding 所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的 buffer 里,此时我们就可以开始编辑这个文件了。
  4. 编辑完成后保存文件时,再次对比 fileencoding 和 encoding 的值。若不同,再次调用 iconv 将即将保存的 buffer 中的文本转换为 fileencoding 所描述的字符编码方式,并保存到指定的文件中。

由于 Unicode 能够包含几乎所有的语言的字符,而且 Unicode 的 UTF-8 编码方式又是非常具有性价比的编码方式 (空间消耗比 UCS-2 小),因此建议 encoding 的值设置为 utf-8。这么做的另一个理由是 encoding 设置为 utf-8 时,Vim 自动探测文件的编码方式会更准确 (或许这个理由才是主要的 ;) 。我们在中文 Windows 里编辑的文件,为了兼顾与其他软件的兼容性,文件编码还是设置为 GB2312/GBK 比较合适,因此 fileencoding 建议设置为 chinese (chinese 是个别名,在 Unix 里表示 gb2312,在 Windows 里表示 cp936,也就是 GBK 的代码页)。

vimrc中设置

在分析了乱码原因,了解了vim编码的参数之后,就可以根据实际情况来配置了

  1. 分析文件编码,配置 Vim 文件文件解析编码fileencodings,让 Vim 能解析出来
  2. 分析系统编码,配置 Vim 内码encoding,如果linux系统语言为ansi,则必须配置内码,否则 Vim 无法处理中文,中文windows下 Vim 内码为gbk,但还是建议统一配置为utf-8
  3. 根据输出配置显示编码,linux系统如果使用了putty或者SecureCRT,需要注意配置termencoding和终端软件一致,windows系统比较少有终端软件,系统能自动解析gdb和utf-8,建议统一配置为utf-8

参考的 Vim 编码配置如下,linux 和 windows 配置相同,linux系统语言编码和ssh终端编码配置为utf-8,windows则不需要配置,即可正常的打开utf-8,gdk等编码的文件

" Vim 内部编码
set encoding=utf-8
"按照utf-8 without bom,utf-8,顺序识别打开文件
set fileencodings=ucs-bom,utf-8,gbk,gb2312,cp936,big5,gb18030,shift-jis,euc-jp,euc-kr,latin1

set fileencoding=utf-8

"防止菜单乱码
if(has("win32") || has("win64") || has("win95") || has("win16"))
	source $VIMRUNTIME/delmenu.vim
	source $VIMRUNTIME/menu.vim
	language messages zh_CN.utf-8
endif
"默认以双字节处理那些特殊字符
if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)'
	set ambiwidth=double
endif

set nobomb "不自动设置字节序标记

参考:


2015-05-01 vim , linux , encode , fileencoding

开始使用Vim

这是不是一篇 Vim 的教程,只是一个入门 Vim 的流程,如果你从未听说过 Vim,但是希望学习 Vim,那么可以继续往下看,如果想要了解 Vim 更多的功能可以参考博客中其他关于 Vim 的文章。

Brief Introduction

vim作为一款linux下必备的编辑器,如果学会了使用,非常强大,但是不得不说vim的入门实在是太困难了。当然如果只是简单的使用插入功能,i,进入插入模式,直接敲,敲完esc退出,再:wq保存退出,也就是最基本的入门了。当时如果想要尝试其他的功能,就不得不看文档,装插件,装配色方案,写vimrc配置等等了。

其实很多vimer都会对新手说一句看帮助文档,这句话对新手真的毫无用处,或许真的只有对vim有了一定了解才能在文档的帮助下学到vim更多的东西。文档一般都是大而全,有很多部分其实完全没有必要再新手阶段的时候就全部读完,而甚至有些命令,设置用了多年的vimer都不会去接触一下。所以如何入门?首先要了解作为一个编辑器最基本的功能,写入,删除,修改,保存,编码,而对于vim,还有几大模式,移动光标,替换操作等等。

vimtutor

在最短的时间内了解这个编辑器的基本功能,至少把他能够当成一个编辑器使,再不济能够直接使用键盘来浏览文件内容,对文件内容进行修改,删除,保存。当然在几十分钟内你可能要记住几十个命令,以及每个命令对应的操作。可能这对于很多新手来说需要锻炼一段时间才能记住,所以不要怕,用记事本,或者VIM记下来每个命令和对应的功能,之后不断的练习,很短的时间就能习惯这种操作。在习惯了之后就会发现再移动鼠标是多么的慢。当然你可能在VIM默认配置中有很多不太习惯的地方,把你那些不习惯记住,把那些你想要的功能一个一个记下来,在以后的学习中,我们来一一解决。

比如我在最初的时候觉得j/k在行之间移动,有些时候中文一行比较长,显示的时候跳跃了很多行,而是用j/k移动光标的时候在几行之间跳跃,让我很不习惯,当然这个在之后的学习中偶然看到了原来只要在VIMRC中配置<map> j gj就能够用j来直接到下一行,即使这一行事实上是VIM中的一行。还有很多很多的问题,都在短短几天的时间内一一得到了解决。所以开始的时候用极短的时间略读一遍vimtutor先熟悉。哦,对了,vimtutor在哪里,Windows下是在VIM安装目录下vimtutor.bat这个文件,双击运行,而Linux下直接终端运行vimtutor即可。当然这一切都在VIM的帮助文档中写着了,你可以尝试在VIM普通模式下运行:help vimtutorVIM会把文档全部显示出来。

vimrc

在熟悉了最基本的命令之后,你可以开始看文档,尝试修改vimrc配置,当然如果你不想看英文文档,VIM还是有中文文档的。不想覆盖:help 的文档,直接下一个PDF的随时查看也挺好,在熟悉了一下命令之后,直接看英文的也就很快了。我的方法就是直接看别人的配置,去Github上面一搜,很多人把自己的配置都公开了,就去一条条试试那些命令,有什么作用,我自己能怎么修改,然后查文档,很快你自己熟悉的配置就有了。

Plugin

当然在熟悉VIMRC配置之后,在随便哪个文件中只要运行:edit $MYVIMRC就能够直接编辑vimrc文件,我在网上看别人的博客,于是我也就用了很多人推荐的Vundle来管理我的插件,从此之后再不用下载,解压,复制,只需要修改vimrc配置就能够安装插件,同样也只要保存一份配置文件就能够同步我的插件,这件事简直太棒了。当然最初安装Vundle这件事情是要你自己来的。直接去Vundle主页看吧。

colorscheme

或许在练习了VIM不久就会觉得VIM的颜色太单调,但是没关系,VIM有很多很多的配色方案,只要你能找到总能找到自己喜欢的,我直接用了别人推荐的molokai,你也可以试试,下载molokai.vim文件到colors目录下之后,在vimrc中写入colorscheme molokai,就能使用这款配色了。当然你也能自己定义字体和字号,还有很多你能自己定义的东西等待发掘的。

附送两张图

vi tutorial

vi key command


2015-05-01 vim , tutorial , linux , editor

cloudup尝鲜

应该是很久以前在听到一个韩国FM节目的时候遇到得这个网盘Cloudup,当时直接能在网页上播放音频视频,所以觉得还不错,可是当我想去注册时才发现这个网站需要邀请才能注册,没办法只能申请邀请,于是等了很久很久之后,今天早上打开邮箱,官方终于邀请我去注册了。

官方的邮件也极其简单:

Thanks a million for joining the Cloudup wait list. You and your pals can now signup without waiting a minute longer!

Create your account now to start sharing files, links, pictures, gifs, videos, and documents instantly and beautifully with anyone. Just drag, drop, & stream.

Let me know if you have any questions, and have a wonderful week!

虽然简单但也把问题说的清清楚楚,这个社会已经没人不知道网盘服务了,所以也就么有必要解释,简单的说“能够分享文件,链接,图片,gifs,视频和文档”这也就够了。再把上传过程“drag,drop&stream”,分享界面beautiful说明白,真的足够了。其实我最关心的stream,很少网盘能够支持音视频直接串流的。

注册了账号体验了一把,界面清爽,操作简单,分享的链接漂亮,预览快速,支持直链,给我用也足够了。哦对了,这个网盘用item的数量来表示空间,至多能上传1000份文件,每个文件至多200M。我想也足够了呢。

你可以尝试我分享的Music:https://cloudup.com/cuP0Yl1BeGj

还有文档:https://cloudup.com/cSvQXovNXBx

最后你如果也想试试,我的邀请:https://cloudup.com/s/einverne-865

161011 更新

今天心血来潮,用 Cloudup 做个 Podcast 倒是很好的选择,查了这么久的 Podcast Hosting,各种收费,VPS,可是这个现成的 Cloudup 不是刚刚好么,1000个文件,想想都无法做到那么多,然后稳定性,经过这么多时间的观察,似乎这个已经是可以认可的了,并且这个云盘服务没有大规模扩张,一直保持着清爽的界面,真不知道后面是如何赚钱的,希望不会倒闭吧。


2015-04-30 products , cloudup , 网盘

魅蓝Note折腾记

##魅蓝Note的一些设置和想法

  1. 账户–点击账户名–系统权限可以开启ROOT,默认是关闭的,开启后不再享受三包!
  2. 安全–权限与凭证–允许安装位置来源~-开启这个,否则一些软件将无法正常安装。默认是关闭的。
  3. 辅助功能–有很多实用功能
    • 手势唤醒里常用设置可以参考:双击=点亮屏幕,上滑=解锁,下滑=打开通知面板,V=手电
    • 长按主键可以设置关闭屏幕或语音助手
    • 实时网速,依个人需求开启
    • 智能隐藏Smartbar 推荐开启
  4. 关于手机–存储–清除手机数据=恢复出厂设置。建议:恢复出厂之前记得备份!手机账户-云存储-可以备份联系人及桌面布局
  5. 一些补充:
    • 如果手机出现黑屏,无法点亮的问题不要着急。长按电源键7S可重启。然后官网下载最新版固件升级即可。
    • 对于App的缺点,则不在我的考虑范围,不喜欢拨号盘,那我可以更换其他App,不喜欢短信app,我也可以换,这就是Android的优势。所以我替换了桌面TSF Launcher,浏览器Chrome,短信Messenger,地图Google Map,音乐Play Music & NetEase Music,记事本Keep,日历Google Calendar,搜索Google Search······我是不是有点强迫症了。
    • 看到貌似是和LBE合作了,有一个简单的安全中心,将就用吧,反正之前也是用LBE
    • 没有纯正Android的返回,HOME,最近应用的三个虚拟键,很不喜欢,略奇怪的操作

##魅蓝Note如何安装GApps

  1. Root 账户–点击账户名–系统权限可以开启ROOT,默认是关闭的,开启后不再享受三包!
  2. 两个地址下载FQ工具
  3. Google安装器
  4. 登录FQ,输入SS帐号,登录Google Play Store,更新各项服务

参考:


2015-03-13 Android , Root , Meizu

返乡

南都讯 春节期间,一个上海大学博士生的返乡笔记《一位博士生的返乡笔记:近年情更怯,春节回家看什么》在微信朋友圈及微博等社交媒体疯传,截至昨晚9点,该文在微信公众号“市政厅”上阅读量已超过4.6万多次。近似“疯狂”的转发量让作者王磊光感到不安和不理解,在他看来这只是一个媒体事件,自己不过是“不小心卷入了其中”。

王磊光

##作者否认美化绿皮火车

这篇文章的作者是80后博士生王磊光,如今在上海大学文化研究系上学。他平时喜好文学,对乡土问题比较关心,本科毕业后曾在某中学担任语文老师,随后继续考研深造。在这篇笔记中,他描述了自己返乡的见闻:交通没有以前那么拥挤,但家乡人与人之间联系渐渐疏远,而农村里年轻人的婚姻受到了物质的压迫,知识的无力感也十分强烈。

没想到,就是这些在他眼里看似普通的乡村生活见闻,却触动了一大批读者,在春节返乡之际引发了人们对乡土的思考。许多网友都用“感同身受”四字评价,但也人指出返乡笔记有“美化”嫌疑,网友“Walter”评论道:“什么素质,绿皮火车脏乱差,打牌外放音乐严重影响他人,居然还好意思美化……”

对此,王磊光感到很奇怪:“为什么有人读出了美化,我身边的朋友都为我担心,觉得我将家乡不光彩的一面说出来了。至于我提到慢车及其生活状况,从来都没有赞美—我讲述记忆中的交通时,已经说到了慢车上的那种糟糕的情况。我这里提到慢车,目的在于说明它在当下存在的必要性;同时,指出慢车上的那种人与人的联系,是人间应该有的自然联系。”

##“知识的无力感”观点引发论争

此文也让中国农村的现状,在春节期间成为社交媒体上的热门话题,并收获诸多回应,有肯定的声音,也有争议之声。前日,一篇署名为“古鱼”的《又一篇博士生返乡笔记:从一而终的稳定生活更可怕》在澎湃新闻发布,以另一位来自乡村的文科博士生视角看乡村。古鱼对农村大学生“近年情更怯”的现象表示不认同,在他看来读大学的观念应该改一改:“无论乡村还是城市,读书不会无用,因为知识是有用的,读过大学的人相对而言会有更高的成长空间,以后贡献越大,拿钱也就越多,而不是一毕业就能兑现很多钱或一毕业就加入体制内获得某种‘人上人’的身份优越感。”

对于返乡笔记引发的争议,王磊光回应道,自己从未说过读书无用,只是强调知识的无力感。“本来读书出来是应该有所为的,但是回到家乡却不能做什么。”

##这篇笔记其实是应邀写的演讲稿

除夕之际,王磊光不断接到朋友、以前学生的电话,他才知道自己的返乡笔记在这个春节火了。这是他没有预料到的,他感到不安,也不能理解:“我很少去看别人的评论,因为在我看来,这只是一个媒体事件。”

事实上,这是王磊光应邀为2014年2月举办的“我们的城市论坛”所写的一篇演讲稿。他反问南都记者:“你有没有发现这篇文章就像一个提纲?很多内容和细节没有展开。”春节前,上大现代文学研究所副研究员罗小茗告诉他,媒体有意发表其返乡手记,王磊光答应发表。当时的题目仅是《近年情更怯》,最终见报标题为《一位博士生的返乡笔记:近年情更怯,春节回家看什么》。因此,他把返乡手记爆红的原因归于媒体的传播。

王磊光这篇笔记也获得了自己的导师—上海大学文化研究系教授、主任王晓明的称赞:“分析很真切,文化研究的视野开始有点形成了,好!”博导王晓明表示,读了返乡手记最后一部分“知识的无力感”,也同样感到心情沉重:“从现代早期到上世纪90年代,从农村出来到城市求学的人,总体上是能够以自身的生活和精神状态让其他没有这个机会的人信任‘求学是人生正道’的,有这个信任在,城市里的进步力量反哺乡村的可能就存在。但现在的情况,似乎越来越像80年代晚期90年代初的上海:出租车司机每月赚1400元,当得知我一个大学副教授每月才600元的时候,很同情地看着我:‘算了,下海吧!

##“突然出名”让他感觉很不真实

王磊光觉得,自己这篇文章没什么了不起,也不是他理想之作,这种“突然的出名”让他感觉很不真实。网友们不断在网上评论博士生返乡手记,王磊光在手记发布的第一天看了看评论之后,便很少关注。他知道,不管自己说什么,都会有各种评论出现。

更何况,真正生活在文中所述乡村的人们并不知晓博士生返乡手记的走红,王磊光也从来没有向生活其中的长辈们提及文章的事情。“他们都是很本分的人,如果看到我将身边的事情写了出来,一定会为我担心。

对于自己的文章引发的有关农村大学生出路问题的讨论,王磊光则表示,“我所说的,是80后大学生出路难的问题,这里有一个背景,即与上世纪八九十年代大学毕业生相比,当时他们大学毕业之后是能够改变自己甚至家庭的命运,而如今的80后大学生承载着家庭的希望,但绝大部分人的出路是艰难的。”如今,媒体陆续找到他,但王磊光希望人们不要关注他本人,而去关注现实的中国。

##附全文

###博士春节返乡手记:越看越对乡村的未来越迷茫

“有故乡的人回到故乡,没有故乡的人走向远方。”我很庆幸我有故乡,可以随时回去,尤其可以回家乡过年。因为我的根在那里,我的亲人在那里,我的生活经验和记忆在那里。

我的家乡在湖北的大别山区,L县。我导师王晓明教授在2004年写过一篇著名的文章《L县见闻》,写的就是这个地方。王老师以我家乡为对象,揭示了当时农村的破产状况,人的精神的颓败,以及乡村文明的没落。我家所在的那个村子,是一个东西两座大山夹住的狭长谷地。一个村子由十来个“塆子”组成,一个塆子有几十户人家,我家那里叫王家塆。

直到现在,我每到一个地方,凡是碰见两山相夹或两排高大的建筑物相夹,我的第一意识就是,这两座山或两排建筑物,一个在东,一个在西,所以我在外面经常迷路,尤其在城市里。上海7号线有两个靠得比较近的站:“长寿路”和“常熟路”。我好几次下错站,以致现在每到这两个站就紧张,怕弄错了。为什么呢?因为在我家乡的方言里,“长寿”和“常熟”是完全一样的读法。人要靠语言来思维,这个事情让我意识到:对有家乡的人来说,是用方言来思维的。

我有一个初中同学群,群里90%的同学只读到初中就出去打工。经过十七八年的积累,很多同学在城市里有房有车,有的还有了自己的事业。平时在群里,他们交流的最多的是工作问题,车子问题等,言谈中总少不了炫耀。

但有一次,有个同学忽然在群里说,他已经三年没回家过年了,另一个同学紧跟着说,他五年没回家了,接着很多人说起回家的情况。有一个说:不管怎么样,今年过年一定要回一次家!另一个说:如果能在家乡找一个两千块钱的工作,就回去算了。还有一个说:能找个一千块的工作,我这边什么都不要,也愿意回家。

我有一个从小学到初中的同学,已经十年没有回家。有一天他在qq里突然对我说,我的父母是很好的人,因为小学四年级的时候他去我家玩,我爸妈用腊肉下面给他吃。这都是陈芝麻烂谷子的小事,他还记得,其实我知道,这是因为他太想家了。

上海大学文化研究系有位老师主持来沪青年工人的社会调查,最近在访谈工人。有一个打工者说:我真希望邓小平没有搞改革开放,我也愿意日子苦些,因为这样我就可以每天跟父母和孩子在一起。

回家过年,其实是没有道理可讲的一件事。套用贾平凹的话来说:家乡对我们的影响,就像乌鸡的乌,那是乌到了骨头里面。

###回家的交通

十多年前我上本科的时候,从大西北到武汉,坐的是那种编码没有字母只有四个数字的绿皮火车,22小时,通常要晚点两三个小时。西北往武汉的路线,不是人流最多的,但春运那个挤啊,大大超出了今天90后的想象。好在那个时候,学生一般都可以提前集体订票,买得到座位。而站着回家的,几乎全都是农民工。每次上车的时候,无论有票的还是没票的,都一窝蜂往车上挤。

我对过年回家的第一印象就是:我背着一个包,提着一个包,与同学一起,从第一节车厢狂奔到第十几节车厢,然后被后面的人推着挤上了车。上车后一分钟,车就开动了。我记得火车广播里号召大家发扬风格,让站着的乘客挤一挤。大家真的很友好,四个人的坐位,挤了五六个。火车过道里人贴着人,想蹲下来都没有办法,连厕所里也挤着好几个人。

男乘客还可以想办法,可苦了女乘客。记得有一次我身边坐着一个在西安读书的大学生,他要小便,就脱下外套让我给他挡住身体,想把尿撒在矿泉瓶里,但他很紧张,用了十几分钟才勉强撒出来。我还记得有一次身旁坐着一个从西北打工回家的河南妇女,尽管有位子,但她实在太困,太想睡觉了,就把位子让给别人坐,自己钻到座位底下睡觉去了。

应该要肯定,我们国家这十年间的铁路建设取得了巨大成就,铁路线路的增加,尤其是动车和高铁的开通,极大缓解了交通压力。火车站、火车上,起码不会像过去那么拥挤了。

过年回家那种路途的遥远、时间的漫长、竞争的激烈、拥塞以及不安全感,让我对“男儿有志在四方”的观念产生了极大厌倦。所以,本科毕业时,我找工作坚决要回到湖北。后来我就在家乡隔壁的县城一中当老师。自2004年到2011年来上海读研之前,我再也没有遭受春节回家难的痛苦。尽管从隔壁县回家的汽车在过年时依然被塞得满满的,但毕竟只有两个多小时,实在挤不下,还可以花两百多块钱请出租。我在上海读研的这几年,其实也没有遭受回家难的痛苦,因为上海到武汉的高铁和动车很多,普通车也有几趟,买票很方便。

今天各位出行,如果坐火车,不是高铁就是动车吧?但是,不知道大家有没有想过:那种速度慢、见站停的普通列车是否还有存在的必要?

大家有没有想过:到底是谁在乘坐普通列车?

我想大家肯定一下子就能给出答案:除非没有其他更好的交通工具,学生不会坐,城市人不会坐,主要是那些底层的老百姓,比如农民、农民工在坐。

去年暑假和寒假回家,我特意选择坐慢车,16个多小时的硬座。就是要看看是哪些人在坐慢车,看看慢车上还是不是过去那个样子。的确,主要是农民、农民工在坐慢车。对农民工来说,选择坐慢车,比动车起码节约一半的钱,比高铁节约三分之二以上的钱。从深圳到武汉,高铁一等座要八百多,二等座五百多,但慢车硬座不到两百。尤其对于全家在外打工的人,从深圳到武汉,可能要节约一千多元,这对农民家庭来说不是小数目。

不过,慢车也没有过去那么挤了,因为农民工虽多,但很多都被动车和高铁分流了——既有主动的分流,也有被动的分流,因为价格便宜的慢车越来越少了。

大家可以注意到,今年12306网站通告的春运期间的加班车,三分之二以上的是非动车高铁。这个安排还是挺人性的,因为说到底,加班车就是为了农民工而加,低价位的车符合他们的需求。

而且,你会发现,普通火车与动车的氛围完全不同。

在动车上,相对比较安静,大家不是玩电子产品就是睡觉,相互间很少交流。但是,在普通火车上,熟悉的、不熟悉的,都在热烈地交流,还有打牌、吃东西的,做什么的都有,也有用劣质手机放歌曲的,大家都不担心打扰到别人,也没有人认为别人的做法对自己是一种干扰。慢车上的风格是粗犷的,是人间生活的那种氛围。

对比动车高铁与普通火车,很容易就能发现这里的阶层差别、生活方式的差别。而且你还能感觉到,底层人的心理,比我们想象的要乐观得多,健康得多。底层的状况虽然普遍很糟糕,但大家还是很听话地活着,这里面的一个重要原因,就是他们如果在外面活不下去,还有家园可以退守。

开私家车回家过年,在青年打工者中越来越普遍。我待会进一步讲这个事情,因为它的意义大大超出了交通工具本身。

骑摩托车回家的情况,大家可能在新闻里看到了。每年春节,总有摩托大军回家过年。我的一个表哥,每到过年时就让他的儿子坐汽车回家,而自己骑摩托车带老婆回家,路上要两天一夜。另一个表哥也是骑摩托带老婆回家,有一年在途中撞了人,不知是真撞还是被讹诈了,反正被人家扣了一天多,赔了一万多块才放人,半年的收入就这样没有了。

###人与人之间联系的失落

我觉得,当前农村的亲情关系,很大程度上是靠老一辈建立的关系维系着。在老一辈那里,这种关系处在一种相对稳定的时空里,但对年轻一代来说,大家的关系早已被现实割裂了。比如,我和我的众多表哥,小时候一起上山捉鸟,下河摸鱼,关系好得不得了,但这一二十年来,他们一直在外打工,我一直在外读书和工作,一年最多在过年时见一次,平均下来每年还没有一次,因为他们不是年年都回家。拜年的时候,大家也不再像过去那样,在亲戚家吃饭喝酒聊天,甚至留宿一晚,现在大家都骑着摩托车拜年,去亲戚家匆匆走一遭,放下东西,客套几句,就要离开了。平时的生活啊情感啊什么的,都没有来得及交流。大家拜年,不再是为了亲戚间互相走动,馈赠礼物,交流感情,而只是为了完成传统和长辈交代的一项任务

悲哀的是:如果老一辈都不在世了,新一辈的联系也就慢慢断了。

更让人悲哀的是:农村的日常生活充满着深刻的悲剧。自打工潮于九十年代兴起以来,很多农村人一直在外打工,二十多年来与父母团聚的时间,平均到每一年可能就十来天。很多农村老人倒毙在田间地头,病死在床上,儿女都不在身边。没有来得及为父母养老送终,成为许多人终身的悔恨。

每次回家,看到我身边的老人摇摇欲坠的样子,我就觉得心里难受得很。

如果一个人为了生存,连爱父母爱子女的机会都被剥夺了,你怎么可能指望他去爱别人,爱社会,爱自然?你怎么可能指望他能用超出金钱的标准来衡量别人的价值?所以我想说:现代生活是一种让人心肠变硬的生活。

###在农村,还有什么可以将农民动员起来?

自从2006年免收农业税之后,中国农村的基层组织主要起着上传下达的作用,不再与农民的根本利益发生关系,也不再能将农民组织起来,农民处于“个人自治”的状态。

(1)春节的力量。亲人团聚,过年拜年。过年的力量,亲情的力量,是当下动员中国人最有效的力量。这也是过年最让人感觉温暖的东西。当然,以前过年时的各种集体活动,都已消失殆尽了。

(2)祭祀。中国农村还是保持着过年、过十五给祖宗上坟“送亮”的习俗——家家户户都要去祖宗的墓地给祖先点蜡烛,烧纸钱,放鞭炮,与祖先交流。很多已经在城市安家的人,也会赶在大家三十这一天开车回老家给祖宗上坟。许多曾被废弃的祠堂,这些年也逐渐恢复起来了。

(3)葬礼。很多老人没有挨过冬天。过年前后,是老人逝世的高峰时段。丧葬在中国文化和中国人的生活中有着非常重要的地位,尤其对今天的社会来说,有着特别重要的意义。媒体上动不动就喜欢报道某某地方为举办葬礼大肆挥霍,让大家误以为这是普遍现象。其实恰恰相反。相比古代,今天的丧葬已是在最大程度上简化了。“贵生重死”的观念早已失衡了——大家越来越贵生,对于死,不再有敬重,不再让死者享受哀荣;对于天地,不再有敬畏。

但丧礼,在现实中依然起着不可替代的作用。去年快过年的时候,本家一个叔叔亡故——本家人和四面八方的亲戚来给他守丧,守丧的时候大家聚在一起交流,像过节一般,交流一年的生活情况、见闻和感想,称赞中央的政策,谴责干部的腐败……深夜里交谈的声音传得很远很远。守丧完毕,大家集体出力,将他抬到山上,让他入土为安。

社会学者经常用“原子化”来形容今天农村的现状,说白了就是,农村原有的那种共同体已经消失了,人与人之间不再像原来那样有着密切的关系和交往,不再像过去那样每到过年时相互串门,集体上街玩等等。为死者守丧和送葬,在农村反而成了村里人团聚和交流的一个契机。这也是我在家乡看到的唯一能够让大家团聚的方式。

###妻子?房子?车子

(1)妻子。这一点主要是针对农村的男青年来说的。在今天的社会,农村男青年在本地找媳妇越来越难。一来,这是由中国男多女少的现状决定的。而且,农村稍微长得好看点的女孩子,基本都嫁到城里去了,愿意嫁在农村的女孩子越来越少。二来,农村青年讨媳妇,要具备的物质条件很高,现在普遍的一个情况是:彩礼六到八万,房子两套:在老家一栋楼,在县城一套房。这个压力,并不比城市青年讨老婆的压力小。

过年的时候,打工的青年男女都回来了。只要哪一家有适龄女孩子,去她家的媒人可谓络绎不绝。这在乡村已成了一门生意,农村说亲,几乎到了“抢”的地步。如果初步说定一个,男方至少要给媒人五百块,最终结婚时,还要给上千的报酬,有的甚至要给到两三千。

传统的农村婚姻,从相亲到定亲到结婚,要三四年时间,男女双方有一个了解和熟悉的过程。现在却不同,年里看对的,过了年,马上定亲,然后女青年跟着男青年出去打工,等到半年过去,女方怀孕了,立刻奉子成婚。

曾听过一个搞量化统计的学者对农民工的调查报告,得出的结论之一是:农村孩子结婚越来越迟。但我看到的情况恰恰相反:因为女孩子难找,男孩子一到二十岁,父母就张罗着给儿子物色对象,物色好对象之后,既怕女孩子变心,又考虑要到城市讨生活的现实情况,就催着孩子赶快结婚。可以想象:在现代社会这种动荡不安的生活中,这样的婚姻会出现多少问题!事实上,农村离婚的情况,也是与日俱增的。

(2)房子。刚才已经说了,现在农村人娶老婆要房子两套:一套在家里,一套在县城。其实县城的那套房,平时都空着,只是过年时回来住,但对年轻人来说,那就是城市生活的一种代表。过年时,有的也会把父母接到县城过年,但父母住不惯,在县城过了大年,初一就赶回来了。在老家的生活是“老米酒,蔸子火,除了神仙就是我”,而在县城除了那套房,什么都没有。

但是,为了添置这两套房,将来给儿子娶媳妇,很多家庭是举全家之力在外打工。

下面给大家看我在去年过年的时候写的一则笔记,涉及到房子和婚姻的问题,但还有其他的含义在其中。

2013年冬天的一则笔记

跟大哥、细哥到二郎庙水库捕鱼。(细哥承包的这座小水库只有三十亩的水面,在海拔八九百米的山上,水很纯净,可直接饮用,鱼放在里面长得非常慢,一年下来甚至还要瘦。每年腊月底或者年初,细哥就要从外面进鱼秧,虽说是鱼秧,其实有三斤多一条——这种鱼是在平原地带的池塘里用饲料喂养的,进价是两块多,但是鱼在纯净水里清洗了一年之后,肉味大大改善,可以卖到五块多一斤。)

一个拉砖的师傅把车停在坝上。我们问他,从山下往山上拉一趟要多少钱。他骂了一句话粗话,然后说:“两百块,划不来!”又说,就是这样的生意,也越来越少了。山里的楼房基本都做完了,没有做的也都在县城里买了房。大哥说:“在县城买房又么样,到时住在那里做什么呢?”司机说:“只要是人,总有个生存的法子。”又来了一个人,是细哥的同学,他的摩托车上带着老婆和还在读初中的儿子。得知他在这山里做了楼房,还在县城买了一套房。细哥问:“你要买那么多房做么事!”他叹了一口气:“我们这时代不叫人过的时代!没办法!”“做了一栋楼,买了一套房,还叫没办法!明年还去打工吗?”“不去打工,在家里做么事?”而这座水库上头的两个塆子的人家,基本上都在这里做了一栋楼,在县城买了一套房。

其间来了一人,开小车,戴墨镜,手腕上戴着很粗的黄金链子。老远就用粗嗓子喊正在水上下网的细哥,问有鱼没有。细哥正划着独木船,一只手划,一只手下网,笑着答:“你又不买,问着做么事!”同我们说话时,他的墨镜始终没有摘下来,神气得不得了。墨镜又对细哥喊:“别扑了麻雀(翻船)哈,我是秤砣,到水里就沉了,帮不了你。”说完就独自哈哈地笑。他同我们说起晚上要陪开挖机的斗地主。说是挖山种天麻,规模很大,已经买了十五万斤树。从言谈中得知,他平时在县城住。细哥的同学也说,他准备将家里几面山的树都卖了——分田到户后交了几十年的税,没有沾过任何光。后来听细哥讲,墨镜小学没读完,就在外面混,替人讨债,拿斧头砍人,就这样起家的。

一会儿又来了母女三人,带着一个三岁的小孩。她们是来买鱼的。跟墨镜是亲戚。墨镜却不认识那个年纪最小的女孩。“跟以前长得不一样了呀!”墨镜说,“在哪里打工?”她说在温州。“属什么?”“属鸡。(刚满20)”

墨镜说:“还没有说人家吧?我帮你介绍个。”女孩的母亲说:“她回来这几天,已经有好几个人来介绍。”“某某某正为儿子找媳妇急得哼,我把你说到他家。”(说,替人说亲的意思)女孩母亲连忙说:“那怕是不行,她想嫁到县城里。”墨镜说:“他家在县城有套房子。那男孩的娘脾气不好,但你们又不跟她过,你们到县里住,做点小生意。他家也有钱,你叫他们现在拿个四五十万,轻而易举就拿出来了。”墨镜走的时候,表示过两天,要带那男孩上门相亲。

(3)车子。近些年来,对在外打工五年以上的农村青年来说,对一种东西的渴求,可能比对房子和妻子更为强烈,那就是车子。车子不一定要多么好,五万,八万,二十万,各种档次的都有。老百姓不认识车子的牌子,不知道车子的价位,只知道这些车叫“小车”。不管什么小车,关键是要有!

在农村,房子是一个媒介,车子更是一个媒介——是你在外面混得好,有身份的代表,房子不能移动,车子却可以四处招摇,表示衣锦还乡。很多二代、三代农民工,当下最大的期待就是买一个车子。尤其对那些好些年没回家的人来说,他再次回家,必须要有辆车,否则他怎么证明自己?

春节的县城,到了水泄不通的地步,这些车子绝大部分都是从外面回来的,与此同步的情况是:物价飞涨。

###知识的无力感

这十多年来,外界对于农村的关注主要集中于农民工身上。众所周知,他们在城市打工的日子很苦,而家里的老人和孩子往往无人照料。其中酸甜苦辣自不待言。但从另一个角度来看,现在农村日子过得较为殷实的,也恰恰是这些有几个成员在外务工的家庭。(仅仅只有一个成员务工,通常不足以改变家庭的经济状况。)应该说,他们的辛劳和泪水还是得到了适当的回报。

倒是有两类家庭,他们处于最困难的境地,却往往被忽视。一类是孤寡老人。一类是举全家之力,把子女培养成大学生的家庭。

在第一类家庭中,这些老人的年纪一天比一天大,身体一天比一天衰败,没有任何经济来源,日子过得异常艰难。有人会问:国家不是有低保吗?是的,他们中的确有部分人吃上了低保。在我的家乡,低保的额度是每年八百。但是,绝大部分这样的老人,仍在低保的福利之外。因为他们处在农村的最底层,没有人替他们说话。低保名额通常被身强体壮者拿走。甚至,有些村干部为了堵住所谓“刁民”的嘴,不让他们到镇上或县里反映村里的问题,就把这些人变成低保户,有的甚至全家吃上低保。“有钱人吃低保”,早已成为农村公认的一桩怪事。过年的时候,大家也不再像传统社会那样,家家户户给这些孤寡老人送点东西。

这里所谓第二类家庭,主要是指有孩子在1980年代出生的家庭。这些孩子,从小学读到大学,一直都在经受教育收费的最高峰,没有哪一坎能够躲过。并且,二十多年来,农村税费多如牛毛,家里一年的收入,不够交税。大人内外应付,心力交瘁。最要命的是,作为满载家庭希望的大学生,毕业之后勉强找到一份饿不死的工作时,又面临结婚、买房等种种压力。可以说,几乎每一个农村的80后大学生,都是以牺牲整个家庭的幸福为代价来读大学的。但他们中的绝大部分,毕业后没有希望收回成本,倒是让年迈的父母继续陷入困顿。

最近一个博士师兄请吃饭,他说他现在最害怕的就是回家,感觉很难融入到村子的生活,所以他每年过年他都回去得很迟,来学校很早。为什么呢?因为当你一出现在村子里,村里人其他的不问,就问一个问题:“你现在能拿多高的工资?”所以,他过年回家,基本不出门。这个体验跟我是一样的。你要问我过年在家乡看什么,其实我没看什么,因为一大半时间是呆在家里看书,看电视,写东西。

作为农村大学生,当你回到家乡的时候,你童年那些伙伴都衣锦还乡了,而你连自己的问题都不能解决,你还能做什么呢?没有人信任你的知识!

说了上面这些,相信大家能够理解,对于我这样漂在外的农村大学生,回家过年既是一件非常急迫的事情,也是一件情怯的事情。

回家究竟看什么?其实真的没有刻意去观察,但是很多事情却不停地往你心里撞,也就有了很多感受。越看,对乡村的未来越迷茫。

转载自:chinadigitaltimes


2015-03-01 思考 , 感悟 , 转载

Google+

最近文章

  • vim presentation 大纲
  • Vim 寄存器 Vim 的寄存器可以看成 Vim 中额外用来存储信息的区域,虽然看不见,但是如果使用 x, s, y, p 等等命令的时候都无意识的使用到了 Vim 的寄存器(register).
  • vim normal 命令 替换::%s/^/#/g visual block:ggI# 注释第一行后用.重复执行每一行 我们可以在第三种方法之上用normal命令实现上述需求,步骤:
  • Vim 中的宏命令 Vim 的设计哲学中有这样一句话:”if you write a thing once, it is okay. However if you’re writing it twice or more times, then you should find a better way to do it”.
  • headless chrome puppeteer Headless 最早的时候在 PhantomJS 听说过这个概念,后来在 GitHub 各种项目中总有人不断提起这个概念,而最新看到的新闻便是 Chrome 开始支持 Headless,也正激起了我了解的欲望。