$ cat ~/.vimrc,centos7是在/etc/vimrc文件中配置。
nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<CR><CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR>
set textwidth=200
set shiftwidth=4 "缩进的空格数为4
set noexpandtab
set cindent "C/C++语言的自动缩进方式
set tabstop=4 "设置(软)制表符宽度为4
set softtabstop=4
set expandtab
set autoindent "自动缩进:即每行的缩进值与上一行相等;noautoindent取消设置
set ai
set nu "行号
centos7中用双引号做注释
以下未验证:
syntax enable syntax on colorscheme desert filetype plugin indent on set completeopt=longest,menu set cst set cscopequickfix=s-,c-,d-,i-,t-,e-,f- " cs add /home/yangxl/readcode/cscope-kernel/cscope.out " cs add /home/yangxl/readcode/cscope-app/cscope.out let Tlist_Enable_Fold_Column = let Tlist_WinWidth = let Tlist_Show_One_File = let g:miniBufExplMapCTabSwitchBufs = let g:miniBufExplMapWindowNavVim = let g:miniBufExplMapWindowNavArrows = let g:winManagerWindowLayout='FileExplorer|TagList' let g:SuperTabRetainCompletionType= nmap wm :WMToggle<cr> "nmap <F2> :cs find d <C-R><C-W><CR> "nmap <F3> :cs find c <C-R><C-W><CR> "nmap <F4> :cs find t <C-R><C-W><CR> "nmap <F5> :cs find e <C-R><C-W><CR> "nmap <F6> :cs find f <C-R><C-W><CR> "nmap <F7> :cs find i <C-R><C-W><CR> nmap <F5> :TlistToggle <CR> nmap <F2> :cs find c <C-R>=expand("<cword>")<CR><CR> nmap <F3> :cs find s <C-R>=expand("<cword>")<CR><CR> nmap <F4> :cs find g <C-R>=expand("<cword>")<CR><CR> nmap <F6> :cs find f nmap <C-n> :cn<CR> nmap <C-p> :cp<CR> "nmap :cs find t <C-R>=expand("<cword>")<CR><CR> "nmap :cs find e <C-R>=expand("<cword>")<CR><CR> "nmap :cs find f <C-R>=expand("<cfile>")<CR><CR> "nmap :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR> "nmap :cs find d <C-R>=expand("<cword>")<CR><CR> " Using 'CTRL-spacebar' then a search type makes the vim window " split horizontally, with search result displayed in " the new window. "nmap <C-Space>s :scs find s <C-R>=expand("<cword>")<CR><CR> "nmap <C-Space>g :scs find g <C-R>=expand("<cword>")<CR><CR> "nmap <C-Space>c :scs find c <C-R>=expand("<cword>")<CR><CR> "nmap <C-Space>t :scs find t <C-R>=expand("<cword>")<CR><CR> "nmap <C-Space>e :scs find e <C-R>=expand("<cword>")<CR><CR> "nmap <C-Space>f :scs find f <C-R>=expand("<cfile>")<CR><CR> "nmap <C-Space>i :scs find i ^<C-R>=expand("<cfile>")<CR>$<CR> "nmap <F2> :scs find d <C-R>=expand("<cword>")<CR><CR> " Hitting CTRL-space *twice* before the search type does a vertical " split instead of a horizontal one "nmap <C-Space><C-Space>s \:vert scs find s <C-R>=expand("<cword>")<CR><CR> "nmap <C-Space><C-Space>g \:vert scs find g <C-R>=expand("<cword>")<CR><CR> "nmap <C-Space><C-Space>c \:vert scs find c <C-R>=expand("<cword>")<CR><CR> "nmap <C-Space><C-Space>t \:vert scs find t <C-R>=expand("<cword>")<CR><CR> "nmap <C-Space><C-Space>e \:vert scs find e <C-R>=expand("<cword>")<CR><CR> "nmap <C-Space><C-Space>i \:vert scs find i ^<C-R>=expand("<cfile>")<CR>$<CR> "nmap <F2> \:vert scs find d <C-R>=expand("<cword>")<CR><CR> set mouse=a set autoindent set cindent filetype plugin indent on "打开文件类型检测, 加了这句才可以用智能补全 set completeopt=longest,menu """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """""新文件标题 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "新建.c,.h,.sh,.java文件,自动插入文件头 autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()" ""定义函数SetTitle,自动插入文件头 func SetTitle() "如果文件类型为.sh文件 if &filetype == 'sh' call setline(,"\#########################################################################") call append(line("."), "\# File Name: ".expand("%")) call append(line(, "\# Author: genglut") call append(line(, "\# Mail: genglut@163.com") call append(line(, "\# Created Time: ".strftime("%c")) call append(line(, "\#########################################################################") call append(line(, "\#!/bin/bash") call append(line(, "") else call setline(, "/*************************************************************************") call append(line("."), " > File Name: ".expand("%")) call append(line(, " > Author: genglut") call append(line(, " > Mail: genglut@163.com") call append(line(, " > Created Time: ".strftime("%c")) call append(line(, " ************************************************************************/") call append(line(, "") endif if &filetype == 'cpp' call append(line(, "#include<iostream>") call append(line(, "using namespace std;") call append(line(, "") endif if &filetype == 'c' call append(line(, "#include<stdio.h>") call append(line(, "") endif " if &filetype == 'java' " call append(line(".")+6,"public class ".expand("%")) " call append(line(".")+7,"") " endif "新建文件后,自动定位到文件末尾 autocmd BufNewFile * normal G endfunc """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " 显示相关 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "set shortmess=atI " 启动的时候不显示那个援助乌干达儿童的提示 "winpos 5 5 " 设定窗口位置 "set lines=40 columns=155 " 设定窗口大小 " set go= " 不要图形按钮 "color asmanian2 " 设置背景主题 "set guifont=Courier_New:h10:cANSI " 设置字体 "syntax on " 语法高亮 " "autocmd InsertLeave * se nocul " 用浅色高亮当前行 "autocmd InsertEnter * se cul " 用浅色高亮当前行 set ruler " 显示标尺 set showcmd " 输入的命令显示出来,看的清楚些 "set cmdheight=1 " 命令行(在状态行下)的高度,设置为1 "set whichwrap+=<,>,h,l " 允许backspace和光标键跨越行边界(不建议) "set scrolloff=3 " 光标移动到buffer的顶部和底部时保持3行距离 " set novisualbell " 不要闪烁(不明白) set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")} "状态行显示的内容 " 启动显示状态行(1),总是显示状态行(2) set foldenable " 允许折叠 set foldmethod=manual " 手动折叠 "set background=dark "背景使用黑色 " set nocompatible "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限 " 显示中文帮助 set helplang=cn endif " 设置配色方案 "colorscheme murphy "字体 "if (has("gui_running")) " set guifont=Bitstream\ Vera\ Sans\ Mono\ 10 "endif """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "键盘命令 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" nmap <leader>w :w!<cr> nmap <leader>f :find<cr> " 映射全选+复制 ctrl+a map <C-A> ggVGY map! <C-A> <Esc>ggVGY map <F12> gg=G " 选中状态下 Ctrl+c 复制 vmap <C-c> "+y "去空行 nnoremap <F2> :g/^\s*$/d<CR> "比较文件 nnoremap <C-F2> :vert diffsplit "新建标签 map <M-F2> :tabnew<CR> "列出当前目录文件 map <F3> :tabnew .<CR> "打开树状文件目录 map <C-F3> \be "C,C++ 按F5编译运行 map <F5> :call CompileRunGcc()<CR> func! CompileRunGcc() exec "w" if &filetype == 'c' exec "!g++ % -o %<" exec "! ./%<" elseif &filetype == 'cpp' exec "!g++ % -o %<" exec "! ./%<" elseif &filetype == 'java' exec "!javac %" exec "!java %<" elseif &filetype == 'sh' :!./% elseif &filetype == 'py' exec "!python %" exec "!python %<" endif endfunc "C,C++的调试 map <F8> :call Rungdb()<CR> func! Rungdb() exec "w" exec "!g++ % -g -o %<" exec "!gdb ./%<" endfunc
Vim学习笔记
星期六, 十月 23, 2010
VIM学习笔记 撤销 (Undo)
单线撤销
在Normal mode下使用u
命令,或者在Command mode下使用:undo
命令,可以撤销上一次的操作。
使用U
命令,可以撤销所有针对当前行最近所做的修改。
Vim可以进行多次撤销,这个次数是由选项undolevels来指定的。例如我们可以使用以下命令,设置撤消次数为5000:
:set undolevels=5000
如果希望重做被撤销的操作,可以使用:redo
或CTRL-R
命令。
分支撤销
以下述操作为例:新建文件并输入“大象”,然后在新的一行中输入“小牛”,返回Normal mode并按下u
命令。这时输入“小牛”的操作被撤消,文件将只包含“大象”。接着输入“猩猩”,然后返回Normal mode并按下u
命令,此时将撤消输入“猩猩”的操作,文件仍然只包含“大象”。所以你的“小牛”就再也找不回来了。而撤消分支(Undo branches)就可以解决这个问题。使用g-
可以使文件重新包含入“大象”和“小牛”。此过程如下图所示:
如果你先撤销了若干改变,然后又进行了一些其它的改变。此时,被撤销的改变就成为一个分支。我们可以使用:undolist
命令查看修改的各个分支。
- "编号" 列是改变号。这个编号持续增加,用于标识特定可撤销的改变。
- "改变" 列是根结点到此叶结点所需的改变数目。
- "时间" 列是此改变发生的时间。
使用:undo
命令并指定编号做为参数,则能够撤销到某个分支。
根据撤消分支,使用g-
命令能够回到较早的文本状态;而g+
命令则返回较新的文本状态。
我们还可以根据时间撤消操作:使用:earlier 10m
命令退回到10分钟前的文本状态。也可以用:later 5s
命令跳转到5秒以后的编辑状态。命令参数中的"s"代表秒,"m"代表分钟,"h"代表小时。
u |
撤消 |
:undo |
|
CTRL-R |
重做 |
:redo |
|
:undolist |
查看撤消分支 |
g- |
返回较早的文本状态 |
g+ |
返回较新的文本状态 |
:earlier |
退回到指定时间前的文本状态 |
:later |
退回到指定时间后的文本状态 |
星期二, 十月 19, 2010
VIM学习笔记 缩进 (Indent)
手动缩进
在Normal Mode下,命令>>
将对当前行增加缩进,而命令<<
则将对当前行减少缩进。我们可以在命令前使用数字,来指定命令作用的范围。例如以下命令,将减少5行的缩进:
5<<
在Insert/Replace Mode下,Ctrl-Shift-t可以增加当前行的缩进,而Ctrl-Shift-d则可以减少当前行的缩进。使用0-Ctrl-Shift-d命令,将移除所有缩进。需要注意的是,当我们输入命令中的“0”时,Vim会认为我们要在文本中插入一个0,并在屏幕上显示输入的“0”;然后当我们执行命令0-Ctrl-Shift-d时,Vim就会意识到我们要做的是减少缩进,这时0会就会从屏幕上消失。
缩进宽度默认为8个空格。我们可以使用以下命令,来修改缩进宽度:
:set shiftwidth=4
通过以下设置,每次点击Tab键,将增加宽度为8列的Tab缩进。
:set tabstop=8
:set softtabstop=8
:set shiftwidth=8
:set noexpandtab
使用以下设置,每次点击Tab键,增加的缩进将被转化为4个空格。
:set tabstop=4
:set softtabstop=4
:set shiftwidth=4
:set expandtab
其中,expandtab选项,用来控制是否将Tab转换为空格。但是这个选项并不会改变已经存在的文本,如果需要应用此设置将所有Tab转换为空格,需要执行以下命令:
:retab!
自动缩进
在Vim中还可以进行自动缩进,主要有cindent、smartindent和autoindent三种。
cindent Vim可以很好的识别出C和Java等结构化程序设计语言,并且能用C语言的缩进格式来处理程序的缩进结构。可以使用以下命令,启用cindent缩进结构:
:set cindent
smartindent 在这种缩进模式中,每一行都和前一行有相同的缩进量,同时这种缩进形式能正确的识别出花括号,当遇到右花括号(}),则取消缩进形式。此外还增加了识别C 语言关键字的功能。如果一行是以#开头的,那么这种格式将会被特殊对待而不采用缩进格式。可以使用以下命令,启用smartindent缩进结构:
:set smartindent
autoindent 在这种缩进形式中,新增加的行和前一行使用相同的缩进形式。可以使用以下命令,启用autoindent缩进形式。
:set autoindent
>> |
增加缩进 |
Ctrl-Shift-t |
|
<< |
减少缩进 |
Ctrl-Shift-d |
|
:set shiftwidth=n |
设置缩进宽度 |
:set cindent |
启用cindent缩进结构 |
:set autoindent |
启用autoindent缩进结构 |
:set smartindent |
启用smartindent缩进结构 |
星期三, 十月 13, 2010
VIM学习笔记 寄存器 (Registers)
将寄存器与各种删除、复制、粘贴命令组合使用,能够大大提高编辑文本的效率。
指定寄存器
在复制或删除文本时,可以使用"register
命令将文本放入指定的寄存器中。例如以下命令,将复制的文本放到寄存器a中,同时文本也会被放入未命名寄存器中。
"ayy
如果再使用相应的大写字母来指定寄存器,那么会将当前行内容追加到寄存器a中,这时该寄存器中就有了两行文本。
"Ayy
查看寄存器
使用registers命令,可以查看特定寄存器中的内容。例如以下命令,可以查看寄存器a中的内容:
如果想要查看所有寄存中的内容,可以使用以下命令:
:registers
寄存器类别
寄存器可以分为以下9类:
类别 | 符号 | 描述 |
---|---|---|
未命名寄存器 | " | 上一次复制或删除的文本 |
数字寄存器 | 0-9 | 文本删除历史 |
短删除寄存器 | - | 删除少于一行的文本 |
命名寄存器 | a-z,A-Z | 存放文本 |
只读寄存器 | % | 当前文件的名字 |
# | 交替文件的名字 | |
. | 上一次插入的文本 | |
: | 上一次执行的命令 | |
表达式寄存器 | = | 返回表达式结果 |
选择和拖拽寄存器 | * | 系统剪切板 |
+ | 系统剪切板(X11) | |
~ | 拖拽的文本 | |
黑洞寄存器 | _ | 永久删除的文本 |
搜索模式寄存器 | / | 搜索模式 |
未命名寄存器(The Unnamed Register) 当使用y命令复制文本,或使用d、c、s、x命令删除文本时,文本将自动被放入""未命名寄存器。即使你在复制或删除文本时,已经指定了寄存器(例如使用"xdd命令),这些文本也将会被同时放入"x和""寄存器。
数字寄存器(The Numbered Registers) "0始终存放最近删除的文本。"1也 包含上次删除的文本。区别在于:"0不断被删除的文本所覆盖;而如果删除文本时,指定了寄存器或者文本小于一行,那么"1将不会被更新。 数字寄存器1-9可以看作是删除历史, 你可以从中找到早先删除的文本。比如你使用了三次dd命令,那么这三行文本被分别存放在寄存器1,2,3中,可以通过命令"1P
,"2P
,"3P
将这些文本再粘贴回来。
短删除寄存器(The Small Delete Register) 当删除少于一行的文本时,除非指定了某个寄存器,否则这些内容将会被放入"-短删除寄存器中。
命名寄存器(The Named Registers) 当文本被放入以小写字母命名的寄存器(例如"a)时,该寄存器原有的内容将被覆盖;而使用以大写字母命名的寄存器(例如"A)时,将会把文本追加到原有内容之后。
只读寄存器(The Read-Only Registers) 你只能从4个只读寄存器中粘贴内容,而不能放入文本。"%包含当前文件名;"#包含交替文件名;".包含最近插入的文本;":包含上次执行的命令行。
表达式寄存器(The Expression Register) 当我们输入"=,就会在Vim底部显示一个以“=”开始的提示行,可以在这里输入表达式并按回车键确认。随后使用命令p
将表达式的结果粘贴到文本中。例如要在文本中插入38*56的值,首先进入命令模式,输入"=
, 在屏幕底部的提示行中输入“38*56”并按回车,然后输入命令p,这样就可以将计算结果插入文本中了。在表达式寄存器中,不仅可以使用通常的算术运算 符,还可以使用Vim特定的函数和运算符。例如通过表达式寄存器来得到环境变量的值(例如"=$HOME)。如果没有输入任何表达式而直接按回车键,那么 Vim将执行最近使用过的表达式。
选择和拖拽寄存器(The Selection and Drop Registers) 有3个寄存器用于保存选中的文本:"*用于访问系统剪切板。在Windows下,"*和"+相同;在Linux下,"+包含选中的文本,"*包含复制的文本。使用"+y
命令,可以将当前选中的文文本复制到系统剪切板中。而"+p
命令,则可以粘贴系统剪切板中的内容。通过剪切板寄存器,能够在不同的Vim编辑器或者是其他应用程序之间,进行文本交换。"~包含上次从其它应用程序拖拽到Gvim中的文本。
黑洞寄存器(The Black Hole Register) 任何放入"_中的文本都将不复存在。如果想要永久删除某些文本而不是将他放入1-9中的某个寄存中,就可以使用黑洞寄存器。例如:命令dd将删除一行文本并将其放入寄存器1中;而命令"_dd
则将该行文本放入黑洞寄存器中,这些文本也就会永久消失了,而寄存器1中的文本会保持不变。
搜索模式寄存器(Search Pattern Register) 当你通过/命令进行搜索时,所使用的模式将自动被放入"/寄存器。
粘贴寄存器
命令:put会将寄存中的内容粘贴到指定的文本行后面。使用以下命令,可以将寄存器中的内容粘贴到第五行的后面:
:5put a
如果要将文本放在这一行的前面,可以用以下命令:
:5put! a
你也可以使用p命令,将x寄存中的文本粘贴到光标之后:
"xp
而P命令,则将x寄存中的文本粘贴到光标之前:
"xP
如果直接使用p
或P
命令,而没有指明特定寄存器,那么将粘贴未命名寄存器中的内容。
使用以下命令,可以粘贴上次插入的文本,方便你录入重复的内容:
".P
如果要粘贴系统剪切板中的内容,在Insert mode下可以利用快捷键Shift+Ins,而在Normal mode下,可以使用以下命令:
"*p
星期日, 九月 12, 2010
VIM学习笔记 拼写检查(Spell Check)
从版本7开始,Vim内置了拼写检查功能,但是在默认情况下并没有打开。
启用
首先,你需要使用:echo &spelllang
命令确认当前使用哪种语言。比如:“en”代表英语。如果想要改语言,可以使用:set spelllang=en_GB.UTF-8
命令。
然后,你可以通过菜单:工具 -> 拼写检查 -> 打开拼写检查,来启用拼写检查功能。Vim将用红色的波浪线标识出错误的拼写。你也可以使用:set spell
命令打开拼写检查,使用:set nospell
命令关闭拼写检查。
检查
如果在文件中有很多拼写错误,可以用]s
命令移动到下一个拼写错误处,用[s
命令移动到上一个拼写错误处。
纠正
如果想要纠正错误的拼写:首先将光标移至错误的单词上,然后执行z=
命令列出一组相近的单词,你可以在其中选择正确的拼写。
有些特殊单词(比如图中的"Gvim")也会被标识为错误拼写,如果你希望Vim能够承认它们为正确的拼写,可以使用zg
命令。还可以用zw
命令取消用户做的拼写识别。
:set spell |
启用拼写检查 |
:set nospell |
关闭拼写检查 |
]s |
移动到下一个拼写错误处 |
[s |
移动到上一个拼写错误处 |
z= |
选择正确的拼写 |
zg |
添加用户拼写 |
zw |
删除用户拼写 |
星期四, 九月 02, 2010
VIM学习笔记 比较文件(diff)
比较
可以从命令行调用以下命令,来打开两个文件进行比较:
vim -d file1 file2
如果已经打开了文件file1,那么可以在Vim中用以下命令,再打开另一个文件file2进行比较:
:diffsplit file2
如果已经使用split打开了两个文件,那么可以分别在两个窗口里面输入以下命令,进行比较:
:diffthis
屏幕将被水平分隔,分别显示一个文件,其中不同的部分将被高亮显示。
- 只在某一文件中存在的行,显示为绿色;
- 在两个文件中都存在的行,显示为红色;
- 相同的行,没有高亮显示并且会被折叠。
如果想要垂直比较两个文件,可以使用以下命令:
:vert diffsplit file2
折叠
使用zo
命令,可以展开被折叠的相同的文本行;而zc
命令,则可以重新折叠相同的行。
查看
比较文件时,经常需要结合上下文来确定最终要采取的操作。缺省情况下,是会把不同之处上下各6行的文本显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数为3行,可以使用以下命令:
:set diffopt=context:3
滚动
如果你在一个文件中滚动屏幕,那么另一个文件也会自动滚动以显示相同的位置。你可以使用以下命令,取消联动:
:set noscrollbind
更新
如果更改了某个文件的内容,vim又没有自动更新diff检查,那么可以使用如下命令更新:
:diffupdate
跳转
你可以用[c
命令;跳转到前一个不同点;或者用]c
命令,跳转到后一个不同点。
:diffsplit |
分隔窗并比较文件 |
:diffthis |
比较文件 |
:diffupdate |
更新比较结果 |
zo |
展开 |
zc |
折叠 |
[c |
跳转到前一个不同点 |
]c |
跳转到后一个不同点 |
星期四, 八月 12, 2010
VIM学习笔记 模板(Template)
在新建文件时,如果有针对该文件扩展名的模板存在,那么模板中的内容,将被自动插入进新文档中。
首先,创建模板文件(Skeleton Document)。例如,包含以下内容的XHTML 1.0 Strict模板。
注:你可以从Web Standards Project获得更多类型的HTML/XHTML模板。
然后,将模板以正确的扩展名,保存至Vim的skel目录中。如果没有skel目录,则需要手工创建。在Windows中,将模板Template.html保存到C:\Program Files\Vim\vimfiles\skel目录下;而在Mac/Liunx/Unix中,则保存模板为~/.vim/skel/Template.html。
最后,vimrc文件中,添加以下命令:
Windows:
autocmd! BufNewFile * silent! 0r $VIM/vimfiles/skel/Template.%:e
Mac/Liunx/Unix:
autocmd! BufNewFile * silent! 0r ~/.vim/skel/Template.%:e
当你使用:new test.html
命令新建一个HTML文档时,模板中的代码就会被自动添加到新建的页面中。这无疑,非常便于我们创建标准化的网页。
星期一, 七月 26, 2010
VIM学习笔记 折行(Wrap)
折行显示
在默认情况下,Vim会自动折行––将超出屏幕范围的文本打断并显示在下一行。我们也可以通过以下命令,取消自动折行––超出屏幕范围的文本将不会被显示,你需要向句末移动光标,以使屏幕水平滚动,查看一行的完整内容。
:set nowrap
可以使用以下命令,恢复Vim的自动折行:
:set wrap
折行形式
我们可以告诉Vim在合适的地方折行:
:set linebreak
所谓合适的地方,是由breakat选项中的字符来确定的。在默认的情况下,这些字符是“^I!@*-+_;:,./?”。如果我们不希望在下划线处打断句子,只要用下面的命令将“_”从这个列表移除就可以了:
:set breakat-=_
如果一行被打断,Vim可能不会在句子连接处显示任何内容。我们可以通过设置showbreak选项,来显示所希望的指示信息:
:set showbreak=->
我们可以使用以下命令,取消自定义折行:
:set nolinebreak
:set wrap |
启用自动折行 |
:set nowrap |
取消自动折行 |
:set linebreak |
自定义折行 |
星期三, 七月 14, 2010
VIM学习笔记 换行 (Line Feed)
换行方式
在早期的打印机时代,开始新的一行要占用两个字符的时间。如果到了一行的结尾处,你要快速回到新的一行的开头,需要打印针头在纸面上飞快地掠过,常 常会在纸面上留下污点。解决这个问题的办法就是,用两个字符:一个字符<Return>来移到第一列,另一个字符<Line feed>来新增一行。计算机产生以后,存储较为昂贵,在如何解决回车换行这个老问题上,人们产生了不同的意见。UNIX人认为在到达一行的结尾时 新增一行<Line feed> (LF),而Mac人则认同<Return> (CR)的解决办法,MS则坚持古老的<Return><Line feed> (CRLF)的方法。这就意味着如果你将一个文件从一个系统转移到另一个系统,就面临着回车换行的问题。而Vim编辑器则会自动的认出这种文件格式方面的 区别,并做出相应处理。
fileformats选项,用于处理文件格式问题。以下命令,告诉vim将UNIX文件格式做为第一选择,而将MS-DOS的文件格式做为第二选择:
:set fileformats=unix,dos
检测到的文件格式会被存放在fileformat选项中,我们可以用以下命令来查询:
:set fileformat?
我们还可以利用fileformat选项,来转换种文件格式。例如,使用以下命令将名为readme.txt的MS-DOS格式的文件,转换为UNIX格式的文件。
:set fileformat=unix
在默认情况下,Vim认为文件是由行组成的,并且文件最后一行是以<EOL>为结束符的。如果你想设置文件以<EOL>结束符结尾,则可以用以下命令:
:set endofline
如果你想设置文件不以<EOL>结束符来结尾,则可以使用以下命令:
:set noendofline
显示换行
如果你使用以下命令进入<list mode>,那么就可以清楚的看到以“$”表示的换行符和以“^I”表示的制表符。
:set list
你可以使用以下命令退出<list mode>:
:set nolist
删除换行
可以用以下命令删除换行符:
:%s/\n//g
可以用以下命令删除DOS文件中的回车符“^M”:
:%s/\r//g
可以用以下命令转换DOS回车符“^M”为真正的换行符:
:%s/\r/\r/g
可以用以下命令删除行尾的空格以及DOS回车符。它没有使用“/”字符作为替换命令各个参数间的分隔符,而是使用了“#”字符。命令还使用了“\?”正则表达式,用来匹配它前面出现的字符0次或1次。
:%s#\s*\r\?$##
可以用以下命令删除三行空行:
:%s/^\n\{3}//
可以用以下命令将连续的两个空行替换成一个空行:
:%s/\n\n/\r/g
自动换行
在默认情况下,Vim是不会自动换行的,也就是说我们需要自己决定回车的位置。但是我们也可以通过指定textwidth选项,让Vim自动在指定 位置换行。例如,使用以下命令指定在30列时自动换行。由于在遇到空格时才会自动换行,所以换行的精确位置可能会小于你指定的列宽。
:set textwidth=29
而以下命令告诉Vim从右面算起当达到10个字符的空格时要换行:
:set wrapmargin=10
在指定了文本宽度的情况下,当我们将一行中的前几个文字删掉时,Vim并不会将后面行中的文本移动上来,而是形成了一些长短不一的段落,这样看起来不是很好。可以有几种方法处理这个问题:
一种方法是,在可视化模式下选中这些文本,然后用gp
命令来格式化选中的段落。另一种方法是,使用gqmotion
命令来完成格式。例如要格式化5行,就可以用命令:gq4j
。这个命令告诉Vim要格式化本行,同时要格式化下面的4行,这样就达到了格式化5行的目的。如果要格式化整个段落,可以将光标放在段落的第一行上,然后执行命令gq}
。而使用命令gqip
可以格式化当前段落,而且并不必要将光标放在段落的第一行上。
如果要想格式化一行,可以使用命令gqgq
,也可以简记为gqq
。
注意:选项textwidth优先于wrapmargin。如果要使wrapmargin选项生效,必须将textwidth设置为0(这也是默认值)。
合并行
命令J
使两行合并为一行,同时用空格分隔这两行。
通过设置joinspace选项,可以控制合并两行时的分隔符(如果一行是以标点符号来结尾)。如果设置:set nojoinspaces
,用J命令合并两行时会用一个空格来分隔;如果设置:set joinspaces
,用J命令合并两行时会用两个空格来分隔。如果不希望用空格来分隔合并的行,可以使用gJ
命令。
我们也可以使用:join
命令,将几行合并为一行并使用空格来分隔各行。如果不希望加入空格,那么可以使用:join!
命令。
:set fileformat |
设置文件格式 |
:set endofline |
设置文件结束符 |
:set noendofline |
取消文件结束符 |
:set list |
进入List Mode |
:set nolist |
退出List Mode |
:%s/\n//g |
删除换行符 |
:set textwidth |
设置行宽 |
:set textwidth |
设置行边距 |
:join |
合并多行 |
J |
合并两行 |
星期六, 七月 03, 2010
VIM学习笔记 多编码处理
在Vim中,有四个与编码有关的选项:“fileencodings (fencs)”、“fileencoding (fenc)”、“encoding (enc)”和“termencoding (tenc)”。在实际使用中,任何一个选项出现错误,都会导致出现乱码。
encoding
encoding是Vim内部使用的字符编码方式。当我们设置了encoding之后,Vim内部所有的buffer、寄存器、脚本中的字符串等, 全都使用这个编码。如果编码方式与Vim的内部编码不一致,它会先把编码转换成内部编码。如果编码中含有无法转换为内部编码的字符,那么这些字符就会丢 失。因此,在选择Vim内部编码的时候,一定要使用一种表现能力足够强的编码,以免影响正常工作。由于encoding选项涉及到Vim中所有字符的内部 表示,因此只能在Vim启动的时候设置一次。在Vim工作过程中修改encoding 会造成非常多的问题。
建议将encoding设置为utf-8。为了避免在非UTF-8的系统(如Windows)下,菜单和系统提示出现乱码,可同时做这以下几项设置:
set encoding=utf-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8
当然,你也可以设置菜单和信息都显示为英文,这样也可以避免Vim程序界面乱码的问题:
set langmenu=en_US
let $LANG = 'en_US'
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
termencoding
termencoding是Vim用于屏幕显示的编码。在显示的时候,Vim会把内部编码转换为屏幕编码,再用于输出。内部编码中含有无法转换为屏
幕编码的字符时,该字符会变成问号,但不会影响对它的编辑操作。如果termencoding没有设置,则直接使用encoding而不进行转换。
例如,你在Windows下通过telnet登录Linux工作站时,由于Windows的telnet是GBK编码的,而Linux则使用
UTF-8编码,因此telnet下的Vim中就会乱码。此时有两种消除乱码的方式:你可以将Vim的encoding改为gbk,或者保持
encoding为utf-8,而将termencoding改为gbk。显然,使用前一种方法时,如果编辑的文件中含有GBK无法表示的字符时,这些字
符就会丢失。但如果使用后一种方法,虽然由于终端所限,这些字符无法显示,但在编辑过程中这些字符并不会丢失。
你可以利用以下命令设置termencoding:
set termencoding=utf-8
对于图形界面下的GVim,它的显示不依赖TERM,因此termencoding对于它没有意义。在GTK2下的GVim中,termencoding永远是utf-8,并且不能修改。而Windows下的GVim则忽略termencoding的存在。
fileencoding
当Vim从磁盘上读取文件时,会对文件编码进行探测。如果文件的编码方式和Vim的内部编码方式不同,Vim就会对编码进行转换。转换完毕
后,Vim会将fileencoding选项设置为文件的编码。当Vim存盘时,如果encoding和fileencoding不一致,Vim就会进行
编码转换。因此,通过打开文件后设置fileencoding,可以将文件由一种编码转换为另一种编码。
set fileencoding=utf-8
因为Vim是在打开文件时,自动探测和设置fileencoding的,所以,如果出现乱码,就无法通过在打开文件后重新设置fileencoding来纠正乱码。
fileencodings
编码的自动识别,是通过设置fileencodings实现的。fileencodings是一个用逗号分隔的列表,列表中的每一项是一种编码的名
称。当我们打开文件时,Vim按顺序使用fileencodings中的编码进行尝试解码,如果成功的话,就使用该编码方式进行解码,并将
fileencoding设置为这个值;如果失败的话,就继续检验下一个编码。
因此,我们在设置fileencodings时,一定要把严格的编码方式放在前面,把宽松的编码方式放在后面。例如,latin1是一种非常宽松的编码方
式,任何一种编码方式得到的文本,用latin1进行解码,都不会发生解码失败。当然,解码得到的结果也很可能会是乱码。因此,如果你把latin1放到
fileencodings的第一位,那么打开任何中文文件都会显示乱码了。推荐使用以下fileencodings设置:
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,latin1
其中, ucs-bom 是一种非常严格的编码,非该编码的文件几乎没有可能被误判为ucs-bom,因此放在第一位。utf-8 也相当严格,除了很短的文件之外也是几乎不可能被误判的,因此放在第二位。接下来是 cp936、gb18030、big5 这些编码相对宽松的编码。 而最为宽松的 latin1 编码,则放在列表的最后。
如果编码被误判了,解码后的结果就无法识别了,也就显示成我们所说的乱码。此时,如果你知道这个文件的正确编码,可以把fileencodings改成只有这一种编码,阻止任何 fall-back 发生,然后重新打开这个文件。
编码转换
当我们看到类似“忽然”的编码时,可以通过以下命令将&#后的数字,经由函数nr2char()转换为可读的文字:
:%s/&#\([0-9]\+\);/\=nr2char(submatch(1))/g
set encoding |
设置Vim的内部编码方式 |
set termencoding |
设置Vim的屏幕显示编码 |
set fileencoding |
设置文件的编码方式 |
set fileencodings |
设置Vim的解码列表 |
星期三, 十月 28, 2009
VIM学习笔记 状态行(statusline)
默认的状态行,左侧显示当前打开的文件名,右侧显示当前所处的行列位置。当你执行Vim命令时,状态行将消失并显示命令输入及输出。
通常状态行用反色显示。你可以通过修改highlight选项中的s字符来改变。例如,sb设置为粗体字。如果状态行没有启用高亮
(sn),那么字符^表示当前窗口,字符=表示其它窗口。如果支持鼠标并且已经通过设置mouse选项使之启动,那么你可以用鼠标拖动状态行以改变窗口的
大小。
定制状态行
我们可以使用以下命令来定义状态行:
:set statusline format
例如下面的命令:
:set statusline=The file is"%f"
其中,%用来指明一个特殊区域。例如%f,将在状行中包含文件名。
选项包含printf风格的%项目,中间可以间杂普通文本。内容默认为右对齐,如果希望左对齐,那么可以在%后面加上-。数字内容是忽略开头0显示的,如果需要显示前导0,那么可以在%后加上一个"0"。单个百分号可以用"%%"给出。最多可给出80个项目。
如果此选项以 "%!" 开始,它用作表达式。计算此表达式的结果用作选项值。
%(...%) | 定义一个项目组。 |
%{n}* | %对其余的行使用高亮显示组Usern,直到另一个%n*。数字n必须从1到9。用%*或%0*可以恢复正常的高亮显示。 |
%< | 如果状态行过长,在何处换行。缺省是在开头。 |
%= | 左对齐和右对齐项目之间的分割点。 |
% | 字符% |
%B | 光标下字符的十六进制形式 |
%F | 缓冲区的文件完整路径 |
%H | 如果为帮助缓冲区则显示为HLP |
%L | 缓冲区中的行数 |
%M | 如果缓冲区修改过则显示为+ |
%N | 打印机页号 |
%O | 以十六进制方式显示文件中的字符偏移 |
%P | 文件中光标前的% |
%R | 如果缓冲区只读则为RO |
%V | 列数。如果与%c相同则为空字符串 |
%W | 如果窗口为预览窗口则为PRV |
%Y | 缓冲区的文件类型,如vim |
%a | 如果编辑多行文本,这个字行串就是({current} of {arguments}),例如:(5 of 18)。如果在命令行中只有一行,这个字符串为空 |
%b | 光标下的字符的十进制表示形式 |
%c | 列号 |
%f | 缓冲区的文件路径 |
%h | 如果为帮助缓冲区显示为[Help] |
%l | 行号 |
%m | 如果缓冲区已修改则表示为[+] |
%n | 缓冲区号 |
%o | 在光标前的字符数(包括光标下的字符) |
%p | 文件中所在行的百分比 |
%r | 如果缓冲区为只读则表示为[RO] |
%t | 文件名(无路径) |
%v | 虚列号 |
%w | 如果为预览窗口则显示为[Preview] |
%y | 缓冲区的文件类型,如[vim] |
%{expr} | 表达式的结果 |
显示状态行
即使已经使用以上命令设置选项,状态行还是保持原样,这是因为Vim在默认情况下是不显示状态行的,而仅显示命令缓冲区等极少的信息。我们可以使用以下命令,将状态行显示在窗口底部倒数第二行:
:set laststatus=2
你也可以使用以下命令,移去状态行:
:set laststatus=0
状态行实例
利用以下命令,可以在状态行中显示:当前文件名,文件格式(DOS, Unix),文件类型 (XHTML),当前位置和文件总行数。
:set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%04l,%04v][%p%%]\ [LEN=%L]
实际效果如下图所示:
除了显示的内容,你还可以使用以下命令定义显示的颜色。
:set
statusline=%2*%n%m%r%h%w%*\ %F\
%1*[FORMAT=%2*%{&ff}:%{&fenc!=''?&fenc:&enc}%1*]\
[TYPE=%2*%Y%1*]\ [COL=%2*%03v%1*]\ [ROW=%2*%03l%1*/%3*%L(%p%%)%1*]\
需要使用以下命令,自定义高亮显示颜色。
hi User1 guifg=gray
hi User2 guifg=red
hi User3 guifg=white
实际效果如下图所示:
你还可以通过在_vimrc文件中包括以下命令,使状态行根据状态的不同,显示不同的颜色。
function! InsertStatuslineColor(mode)
if a:mode == 'i'
hi statusline guibg=peru
elseif a:mode == 'r'
hi statusline guibg=blue
else
hi statusline guibg=black
endif
endfunction
au InsertEnter * call InsertStatuslineColor(v:insertmode)
au InsertLeave * hi statusline guibg=orange guifg=white
hi statusline guibg=black
如下图所示,状态行的文件名部分,在插入状态时显示为橘色背景,这样就能很明显地提醒我们所处的状态:
:set statusline format |
定制状态行 |
:set laststatus |
显示/取消状态行 |
星期一, 八月 31, 2009
VIM学习笔记 编辑多个文件
拷贝
使用传统的Vi风格命令在不同窗口之间拷贝文本,可以使用如下方法:
- 编辑第一文件
- 执行命令
:split second_file
打开另一个窗口并开始编辑第二个文件 - 使用命令
ctrl+Wp
回到含有原始文件的前一个窗口 - 将光标移动到要拷贝文本的第一行
- 用命令
ma
标记这一行 - 移动到要拷贝文本的最后一行
- 执行命令
y'a
来复制当前光标位置到所做标记之间的文本 - 使用命令
ctrl+Wp
回到将要放置文本的文件 - 将光标移到将要插入文本的地方
- 使用命令
P
将复制的文本粘贴到文件中
使用可视化方式在不同窗口之间拷贝文本,可以使用如下方法:
- 编辑第一文件
- 执行命令
:split second_file
打开另一个窗口并开始编辑第二个文件 - 使用命令
ctrl+Wp
p回到含有原始文件的前一个窗口 - 将光标移动到要拷贝文本的第一行
- 执行命令
V
进入可视化模式 - 移动到将要复制文本的最后一行,被选中的文本将会被高亮显示
- 执行命令
y
复制选中的文本 - 使用命令
ctrl+Wp
回到将要放置文本的文件 - 使用命令
P
将复制的文本粘贴到文件中
读取
使用:read filename
命令,可读进一个文件并将内容插在当前行的后面。
写入
命令:write
用来写入文件,可以保存当前文件。我们也可以用命令:write newfile
将
当前的文件内容写入一个新的文件。一般情况下:write命令并不会覆盖已经存在的文件。我们可以用强制操作(!)选项,来覆盖已经存在的文件。而这个命
令对于分拆文件也很有用。可以用可视化模式选定一个范围,然后将这个选定的范围写入新的文件,从而实现分拆文件的目的。
命令:write >> logfile
将文本写入到目标文件的末尾。这样实现了文件添加功能,免去了拷贝,编辑的过程。
命令:wall
可以保存所有已经修改过的文件(包括隐藏缓冲区中的文件)。
退出
:quit
可以退出当前文件。如果同时打开了多个窗口,可以用:qall
命令退出所有文件。如果文件进行了修改但是没有保存,在执行这个命令时会给出警告信息。如果想要放弃所做的修改而强行退出,可以使用:qall!
命令。我们还可以将这个两个命令进行组合,实现对所有文件的保存并退出的命令:wqall
。
参数/缓冲区/窗口 命令对照
:next |
切换到下一文件 | :bnext |
:previous |
切换到上一文件 | :bprevious |
:Next |
:bNext |
|
:first |
切换到第一个文件 | :bfirst |
:last |
切换到最后一个文件 | :blast |
:args |
显示正在编辑的文件名 | :buffers |
:argument [N] |
切换至第N号文件 | :buffer [N] |
:snext |
分割并切换到下一文件 | :sbnext |
:sprevious |
分割并切换到上一文件 | :sbprevious |
:sNext |
:sbNext |
|
:sfirst |
切换到第一个文件 | :sbfirst |
:slast |
分割并切换到最后一个文件 | :sblast |
:sall |
分割并显示所有文件 | :sball |
:sargument [N] |
分割并切换至第N号文件 | :sbuffer [N] |
星期一, 八月 24, 2009
VIM学习笔记 参数(Arguments)
你可以在启动vi时,指定多个文件做为参数,例如vi file1 file2 file3,这样就可以编辑多个文件了。在默认情况下,vi将显示第一个文件。
需要切换到下一个文件时,可以输入:next
命令,如果你没有保存当前文件的修改,vi将给出提示信息,不允许你切换到下一文件。这时可以输入:write
和:next
命令,保存并切换到第二个文件。此命令也可简写为:wnext
。使用:next!
命令也可以强制切换到第二个文件,当然这样你所做的改动也将会丢失。为了避免这种情况,我们可以用:set autowrite
命令,打开vi的自动保存功能。相应的,关闭自动保存命令为:set noautowrite
。
如果想要回到上一个文件,可以使用:previous
或是:Next
命令。如果你要保存当前文件并切换到前一文件,可以使用:wprevious
或是:wNext
命令。
我们可以用:first
或者:rewind
命令快速切换到第一个文件;也可以用:last
命令快速切换到最后一个文件。
如何确定我们在编辑哪一个文件呢?可以注意一下文件的标题。那里应该显示类似"(2 of 3)" 的字样。这表示你正在编辑三个文件中的第二个。命令:args
可以显示我们所打开的文件,并用中括号标识出正在编辑的文件。
如果我们在一个文件中进行一些改动,再切换到另一个文件中进编辑,这时就可以用ctrl+^来切换这两个文件。
:next |
切换到下一文件 |
:wnext |
保存后切换到下一文件 |
:previous |
切换到上一文件 |
:Next |
|
:wprevious |
保存后切换到上一文件 |
:wNext |
|
:first |
切换到第一个文件 |
:last |
切换到最后一个文件 |
:set autowrite |
打开自动保存功能 |
:set noautowrite |
关闭自动保存功能 |
:args |
显示正在编辑的文件名 |
:argument [N] |
切换至第N号文件 |
星期三, 八月 12, 2009
VIM学习笔记 窗口(Window)
窗口(Window)被用来查看缓冲区(Buffer)里的内容。你可以用多个窗口察看同一个缓冲区,也可以用多个窗口察看不同的缓冲区。
Vim主窗口可以容纳多个分割的窗口。此外还有标签页(tab-page),每个标签页也能容纳多个窗口。
在默认情况下,与Vi类似,Vim启动后只打开一个窗口。参数 "-o" 和 "-O" 可以让Vim为参数列表里的每一个文件打开一个窗口。参数
"-o" 水平分割窗口;参数 "-O" 垂直分割窗口。如果 "-o" 和 "-O"
都用了,那么最后一个参数决定分割的方向。例如,下面的例子打开三个水平分割的窗口。
vim -o file1 file2 file3
分割窗口
:split
命令,会将当前窗口平分为两个。并且在这两个窗口中同时显示当前文件。如果你在其中一个窗口进行编辑,那么另一个窗口也会同步显示出你所做的工作。
我们通常并不是要在两个窗口中显示同一个文件,而是要在两个窗口中编辑不同的两个文件。使用:split file
命令,就可以在另一个窗口中打开文件file了。
命令:new
可以直接打开一个新窗口,并对新文件进行编辑。
:sview
是:split和:view两个命令的组合,它可以分隔出一个新窗口,并以只读方式打开指定的文件。
切换窗口
在gvim中,只要用鼠标点击就可以进入不同的窗口。而在vim中,则需要用ctrl+Ww命令在多个窗口中进行切换。
命令ctrl+Wj可以将光标定位在下一个窗口中;ctrl+Wk可以将光标定位在上一个窗口中;ctrl+Wt切换到顶部的窗口;ctrl+Wb切换到底部的窗口。ctrl+Wp切换到进行切换操作以前所在的窗口。
移动窗口
ctrl+Wr命令可以使得窗口向下进行循环移动。这个命令可以带一个数字作为参数,指明向下循环移动所执行的次数。与其相类似的ctrl+WR命令,可以使得窗口向上循环移动。
命令ctrl+Wx,可以将当前窗口与下一窗口进行位置对换。如果当前窗口在底部,则没有下一个窗口,这时命令将当前窗口与上一个窗口进行位置对换。
利用ctrl+WK可以将当前窗口放到最顶端;而ctrl+WJ可以把当前窗口放到最底部。
关闭窗口
可以使用ZZ
或是:q
命令或ctrl+Wc关闭窗口。
命令ctrl+Wo可以使得当前窗口成为屏幕上的唯一窗口,而其他窗口全部关闭。系统会认为我们在其他的每一个窗口中都执行了:quit
命令。
控制窗口大小
在输入split命令时,可以加入参数来指定打开窗口的大小。例如命令:3 split file
,将在一个大小为三行的新窗口中打开文件file。我们也可以将这个命令中的空格去掉,写成:3split file
。
在多文本窗口中进行操作时,可以用ctrl+W+命令增大窗口,默认增量为1;用ctrl+W-命令减小窗口,默认值为1。ctrl+W=命令可以将几个窗口的大小变为相等。而命令countCtrl+W_可以使得当前窗口变得count这样高。如果没有指定count,将会使得当前窗口变得尽可能的最大。
当然,你也可以用鼠标上下拖动状态行来改变窗口的高度。
:split |
新建一个窗口并显示当前文件 |
:new |
新建一个窗口并开始新文件 |
:sview |
新建一个窗口并只读打开文件 |
ctrl+Ww |
切换窗口 |
ctrl+Wj |
切换至下一窗口 |
ctrl+Wk |
切换至上一窗口 |
ctrl+Wt |
切换至顶部的窗口 |
ctrl+Wb |
切换至底部的窗口 |
ctrl+Wp |
切换至刚才所在的窗口 |
ctrl+Wr |
向下循环移动窗口 |
ctrl+WR |
向上循环移动窗口 |
ctrl+Wx |
将当前窗口与下一窗口位置对换 |
ctrl+WK |
将当前窗口放到最顶端 |
ctrl+WJ |
将当前窗口放到最底部 |
ctrl+Wc |
关闭当前窗口 |
ctrl+Wo |
关闭其他所有窗口 |
ctrl+W+ |
增大窗口 |
ctrl+W- |
减小窗口 |
ctrl+W= |
等分窗口 |
Ctrl+W_ |
最大化窗口 |
星期五, 七月 24, 2009
VIM学习笔记 缓冲区 (Buffer)
缓冲区(Buffer)是一块内存区域,里面存储着正在编辑的文件。如果没有把缓冲区里的文件存盘,那么原始文件不会被更改。
列示缓冲区
:buffers
命令将会列出当前编辑中所有的缓冲区状态。在这个状态列表中,前面的数字是缓冲区的数字标记,第二个标记就是缓冲区当前的状态,紧接着是与缓冲区所关联的文件名。有如下几种状态:
- (非活动的缓冲区)
a (激活缓冲区)
h (隐藏的缓冲区)
% (当前的缓冲区)
# (交换缓冲区)
= (只读缓冲区)
+ (已经更改的缓冲区)
打开缓冲区
如果要选择一个缓冲区,可以使用:buffer number
命令,number就是缓冲区状态列表中所显示的数字。我们也可以用文件名来选择缓冲区::buffer file
。
我们可以用:sbuffer number
命令,来分割当前窗口开始编辑一个缓冲区。如果指明了数字,那么当前窗口就会显示数字所标记的缓冲区中的内容;如果没有指明数字,那么就会显示当前缓冲区的内容。当然,这个命令也可以用文件名来做为参数。
使用:ball
命令可以为每一个缓冲区打开一个窗口。
切换缓冲区
:bnext
到下一个缓冲区;:bprevious
或:bNext
到前一个缓冲区;:blast
到最后一个缓冲区;:bfirst
到第一个缓冲区。
增加缓冲区
在编辑的过程中,可以用:badd filename
命令新增一个缓冲区。指定的文件会被加到缓冲区列表中,对这个文件的编辑过程只有切换到那个缓冲区时才会开始。在这个命令中,还可以指明为这个缓冲区打开窗口时,光标所处的位置:badd +linenum filename
。
删除缓冲区
可以使用:bdelete filename
、:bdelete 3
或:3 bdelete
命令来删除一个缓冲区。也可以用:1,3 bdelete
命令来删除指定范围的缓冲区。
如果缓冲区被改动过,那么该命令将失败,除非使用!选项。如果使用了带!选项的:bdelete! filename
命令,那么在缓冲区中的所有改动都会被放弃。
卸载缓冲区
命令:bunload
会从内存中卸载一个缓冲区,所有为这个缓冲区打开的窗口也会关闭。但是这个文件名仍然会存在于缓冲区列表中。如果缓冲区被改动过,那么该命令将失败,除非使用!选项,但是这样所有的改动都会丢失。
:buffers |
列示缓冲区状态 |
:buffer |
编辑指定缓冲区 |
:ball |
编辑所有缓冲区 |
:bnext |
到下一缓冲区 |
:bprevious |
到前一缓冲区 |
:blast |
到最后一个缓冲区 |
:bfirst |
到第一个缓冲区 |
:badd |
增加缓冲区 |
:bdelete |
删除缓冲区 |
:bunload |
卸载缓冲区 |
星期三, 四月 08, 2009
VIM学习笔记 多标签页
新建标签页
使用:tabe
命令和文件名参数,可以在新标签页中打开指定的文件。也可以使用:tabnew
命令,在新标签页中编辑新的文件。命令:tab split
将在新标签页中,打开当前缓冲区中的文件。
命令:tabf
允许你在当前目录搜索文件,并在新标签页中打开。比如我想打开当前目录下的img.txt文件,那么就可以使用:tabf img.*
命令。请注意,此命令只能打开一个文件,如果搜索出多个匹配文件,将提示你“文件名过多”,这时你需要给出更精确的搜索条件以打开文件。
Vim默认最多只能打开10个标签页。你可以用set tabpagemax=15
改变这个限制。
列示标签页
命令:tabs
可以显示已打开标签页的列表,并用“>”标识出当前页面,用“+”标识出已更改的页面。
关闭标签页
命令:tabc
可以关闭当前标签页。而命令:tabo
将关闭所有的标签页。
切换标签页
命令:tabn
或gt
可以移动到下一个标签页。而命令:tabp
或gT
将移动到上一个标签页。如果已经到达最后面或最前面的标签页,将会自动转向循环。
如果你打开了很多标签页,那么可以使用:tabfirst
或:tabr
命令,移动到第一个标签页。使用:tablast
命令,移动到最后一个标签页。
移动标签页
如果你希望按照指定的次序排列标签页,那么你可以使用:tabm
命令。请注意,标签页次序是从0开始计数的。比如命令:tabm 1
将把当前标签页移动到第2的位置。如果你没有为:tabm
命令指定参数,那么当前标签页将会被移动到最后。
配置标签页
默认情况下,只有用户新建了标签页才会在窗口上方显示标签栏,这是由选项set showtabline=1
决定的。如果我们希望总是显示标签栏,那么可以用set showtabline=2
命令来设置。如果我们希望完全不显示标签栏,那么可以使用set showtabline=0
来设置。
多标签页命令
使用:tabdo
命令,我们可以同时在多个标签页中执行命令。比如我们打开了多个标签页,需要把这些文件中的“food”都替换成“drink”,那么就可以使用:tabdo %s/food/drink/g
命令,一次完成对所有文件的替换操作,而不用针对每个文件重复操作。
图形界面
如果你使用的是带有图形界面的gVim,那么新建、关闭和打开标签页的操作,都可以通过在标签页上右击鼠标完成。只需要点击相应标签,就可以在不同的标签页间切换。
通过:help tab-page-intro
命令,可以获得关于标签页使用的更多信息。
:tabnew |
新建标签页 |
:tabs |
显示已打开标签页的列表 |
:tabc |
关闭当前标签页 |
:tabn |
移动到下一个标签页 |
:tabp |
移动到上一个标签页 |
:tabfirst |
移动到第一个标签页 |
:tablast |
移动到最后一个标签页 |
星期二, 三月 03, 2009
VIM学习笔记 查找文本
查找字符
命令f
用于在本行内向前搜索。例如fx
是向前(Forward)搜索字母x。而命令F
是向后(Backward)搜索。例如Fx
是向后搜索字母x。与f和F这两个相类似的是t和T命令。t
命令类似于f向前搜索命令,所不同的是t搜索到时并不是将光标停在目标字符上,而是停在目标字符的前一个字符上。在搜索的过程中,我们可以使用ESC来退出搜索而开始新的工作。
对于以上四个查找命令,我们可以重复执行这些操作。命令;
是按照前一次的查找方向继续查找,如果要向相反的方向查找可以使用,
命令。但是这些查找只是在行本行内进行,并不会将光标移动到其它的行。
查找字符串
我们可以使用/string
命令来向前(Forward)查找字符串string,按下回车后,光标就能跳到正确的地方。在这个命令中,/后的字符是我们想要查找的字符,而回车键则表明了命令的结束。
有时想要查找的内容并不仅在一处,我们可以在整个文章中进行查找:/
可以继续刚才的查找操作。我们还可以使用n
命令来继续刚才的查找命令。这两个命令都能达到同样的效果。
一般来说,在进行查找时总是在向前查找。我们也可以使用?
命令向后(Backward)查找。N
也是逆向查找命令,他可以实现立即反向查找。
如果我们想要停止这一查找,可以使用ctrl+C命令,如果是在Windows系统中,则要使用ctrl+Break命令。
vi具有记录查找命令历史的功能,这样就不用重复输入查找命令了。例如你刚才做过的三次查找分别是:/one,/two,/three。而现在输入/,然后按方向键的上或是下就看到刚才查找的内容显示在vi的下面,这时只要按下回车就会找到想要的内容了。
指定光标放置位置
在默认情况下,查找时Vim会将光标放在第一个匹配的结果的开始处。我们也可以指定查找结束后,光标所处的位置。对于向前查找的命令,我们可以在斜线后用数字来指明光标所处的位置,例如/set/2
命
令会在查找结束后将光标放在第一个set字符串之后第二行的开始处。命令中的数字可以是正数也可以是负数。如果仅是一个简单的数字,光标会被放在第一个匹
配字符串之后或之前的数字所指定的行的开始处。正是向后,负数是向前。如果斜线后是b和数字,那么在查找结束后,光标将会放在第一个匹配字符串的开始处,
然后向左或是右移动n个字符,这里的n即为数字所指定的数。如果为正数则是向右移动,如果是负数,则是向左移动。例如/set/b2
,
这个命令使光标在查找结束后放在第一个匹配字符的开始处,然后向右移动两个字符,也就是说最后光标会位于第一个匹配字符串中的t的位置。将b改为s也是一
样的效果。而参数e会使得光标放在第一个匹配字符串的结尾处。同样我们也可以用数字来指定向右还是向左移动光标以及移动的字符数。例如/set/e
命令会使光标放在第一个匹配字符处的结尾处。如果命令改为/set/e2
,会将光标放在第一个匹配字符串的结尾处,然后向右移动2个字符。这里的数字如果是正数则向右移,如果为负数则向左移。
命令/set/e+2
是在查找set字符串结束后,将光标放在第一个匹配字符串的结尾处,然后向右移动两个字符。在这里我们将这个数字称为偏移量。如果要重复上一次的查找,但是需要不同的偏移量,可以用//5
命令。不使用偏移量时,可以指明一个空的偏移量,如//
命令。/
命令,重复前一次的查找,使用相同的偏移量。
查找命令?
也可以实现类似的功能。例如?set?b5
命令,是将光标放在最后一个匹配字符串的开头部分,然后向右移动5个字符。??-2
命令,则继续前一次的查找命令,但是使用新的偏移量。??
命令,是继续前一次的查找命令,但是不使用偏移量。
立时查找字符串
如果我们想快速查找当前光标下的字符串,可以使用命令*
,这个命令可以向前查找与当前光标下的字符精确匹配的字符串。而命令#
,则向后查找与当前光标下的字符精确匹配的字符串。如果当前光标下的字符串为word,在执行*命令查找时并不会与Word相匹配。与这个立时查找命令相类似的就是g*
命令。他不会进行严格的匹配。如果用这个命令来查找word,那么就有可能和Word相匹配。而g#
命令与其相同,只不过他是向相反的方向进行查找匹配。
设置查找选项
我们可以选择高亮显示查找的文本,命令为::set hlsearch
,关闭高亮显示的命令为::set nohlsearch
。如果想关掉刚才高亮显示的结果,可以使用:nohlsearch
命令。
使用:set incsearch
命令,将打开匹配查找选项。在进行查找时就会显示出不断匹配的过程。例如你想查找的内容是include,在打开这个选项后,当你输入/i,光标定位在i上,再继续输入n光标定位在in上,如此直到查打到所要求的内容。关闭这个选项的命令为::set noincsearch
。
在默认的情况下,Vim是大小写敏感的。如果一个文件中有这样几个字符串:include,INCLUDE,Include。当我们使用命令/include
来查找字符串时,只有include字符会被高亮显示。但是如果我们用:set ignorecase
命令打开ignorecase选项后,所有的类似的字符都会被高亮显示。如果这样的查找结果并不是我们想要的,可以使用:set noignorecase
命令关闭这个选项。
如果设置了ignorecase选项后,我们想要查找字符串word,而匹配的则可能是word、Word,WORD。如果我们要查找字符串WORD,匹配的结里也是一样的。但是如果设置了:set ignorecase
和:set smartcase
两项后,执行结果就会变得不一样了:如果我们输入的是小写字符,那么就会匹配各种可能的组合,这时与设置了ignorecase的情况相同,但是如果我们在输入中有一个大写字符,那么这时就变成了精确查找,与设置了noignorecase的情况相同。
我们在执行查找命令时,也可以用修饰符来控制大小写敏感。在命令中加入修饰符\C将告诉Vim执行大小写敏感的查询,比如?\Cword
命令就只匹配单词word。而在命令中加入修饰符\c则执行忽略大小写的查询。
在默认的情下,我们输入要查找的字符串,vim是从当前光标处向前查找,直到文件的结尾,如果没有找到,那么就会从文件的开头开始查找,直到光标所处的位置。我们可以通过:set nowrapscan
命令,来禁止这种循环查找的方式,这样如果已经查找到文件的底部时,就会在底部显示出一条错误信息。如果我们想要回到正常的状态,可以使用:set wrapscan
命令。
f |
向前搜索并将光标停留在目标字符上 |
F |
向后搜索并将光标停留在目标字符上 |
; |
重复刚才的查找 |
, |
反向重复刚才的查找 |
t |
向前搜索并将光标停留在目标字符的前一个字符上 |
T |
向后搜索并将光标停留在目标字符的后一个字符上 |
/ |
向前查找 |
? |
向后查找 |
n |
继续查找 |
N |
反向查找 |
* |
向前查找与当前光标下字符精确匹配的字符串 |
# |
向后查找与当前光标下字符精确匹配的字符串 |
:set hlsearch |
打开高亮显示查找的文本 |
:set nohlsearch |
关闭高亮显示查找的文本 |
:nohlsearch |
关闭当前高亮显示的结果 |
:set incsearch |
打开显示查找匹配过程 |
:set noincsearch |
关闭显示查找匹配过程 |
:set ignorecase |
忽略大小写 |
:set noignorecase |
精确匹配大小写 |
:set nowrapscan |
禁止循环查找方式 |
:set wrapscan |
启用循环查找方式 |
星期五, 二月 27, 2009
VIM学习笔记 滚动屏幕
滚动屏幕
命令CTRL-U
可以向上翻滚半屏,但是可以通过设置scroll选项来控制这个命令翻滚的行数。例如命令:set scroll=10
可以使得Vim一次翻滚10行。也可以通过改变CTRL-U命令的参数来改变翻滚的行数。例如命令2CTRL-U
可以使得Vim一次向上翻滚两行。
当光标到达窗口上端或下端时,窗口要发生滚动。我们可以通过设置scrolljump选项来控制这个翻滚行数的大小,默认情况下为1。例如命令:set scrolljump=5
将翻滚量设为5。与其相类似的就是sidescroll选项,所不同是后者控制水平的翻滚。
通常情况下,窗口翻滚是在光标到达窗口顶部或底部时才发生的。我们可以通过scrolloff选项来控制光标与顶部或是底部有多少距离时发生。例如命令:set scrolloff=3
将值设为3,当光标与顶部距离为三行时发生翻滚,且翻滚后光标与底部相距三行。
放置行
有时我们希望将指定的行放在屏幕顶端。先将光标放在指定的行上,然后输入z<Enter>
,这一行就会出现在屏幕的顶端了。我们还可以利用参数将指定的行置于屏幕顶端。例如命令8z<Enter>
就是将第八行置于屏幕顶端。这个命令将指定的行置于顶端,并将光标移动到本行第一个非空白字符处。如果要将指定行置于顶端,并将光标保持在一行的当前位置不变,可以使用zt
命令。
如果要将指定的行放在屏幕底部,可以使用命令z-
或是zb
。所不同的是,前者将光标放在这一行中第一个没有空白符的字符处,而后者是保持光标的位置不变。
命令zz
或是z.
可以将指定的行放在屏幕的中部。这两个命令的不同就是,前者保持光标的位置不变,而后者是将光标置于第一个非空白的字符处。
CTRL-E |
向下动滚一行 |
CTRL-F |
向下滚动一屏 |
PageDown |
|
CTRL-B |
向上滚动一屏 |
PageUp |
|
H |
移动到屏幕顶部 |
M |
移动到屏幕中间 |
L |
移动到屏幕底部 |
星期四, 二月 26, 2009
VIM学习笔记 快速移动
在折行内移动
需要注意的是,如果我们设置了wrap选项,那么移动一行在屏幕上显示也许就会是移动几行。因为,此时在屏幕上显示的几行只是被自动折回以便于显示的一行。这时我们可以用命令gj
或是g<Down>
来下移屏幕中显示的一行,而非真正的一行。命令gk
或是g<Up>
命令与其类似,只是用于向上移动。
移动的历史记录
Vim可以记录你曾经到过的地方,并且可以使你回到前一次到过的地方。例如在编辑文件时执行了下面的命令,从而到过不同的行:1G
到第一行;10G
到第十行;20G
到第二十行。现在执行:jumps
命令,就会看到一个曾到过的行的列表。使用命令CTRL-O
跳转到移动记录列表中上一个位置。而命令CTRL-I
跳转到移动记录列表中下一个位置。你不但可以在当前文件内跳转,甚至还可以移动到曾经涉足过的其它文件。
显示位置信息
命令CTRL-G
可在屏幕的下端显示当前所在位置的信息。我们还可以在CTRL-G命令加上一个数字参数,这个数字越大得到的信息就越详细。命令1CTRL-G
会显示文件的全路径。命令2CTRL-G
会同时显示缓冲区的数字标号。
命令gCTRL-G
可显示出当前文件中的字符数的信息。主要显示出当前行数(Line)、列数(Col)、字数(Word)、字符数(Char)和字节数(Byte)等信息。
命令:set ruler
可以打开标尺选项(ruler option)。将在屏幕右下角,显示当前所在的行和列,以及相对于整个文件所处的位置。
^ |
移动到当前行的第一个非空字符处 |
g^ |
|
_ |
|
<Home> |
移动到当前行的第一个字符处 |
g<Home> |
|
0 |
|
g0 |
|
<End> |
移动到当前行的结尾处 |
g<End> |
|
$ |
|
g$ |
|
gm |
移动到当前的中间处 |
count| |
移动到count列 |
counth |
向左移动count个字符 |
countl |
向右移动count个字符 |
countgo |
移动到第count个字符处 |
- |
移动到上一行的第一个非空字符处 |
+ |
移动到下一行的第一个非空字符处 |
) |
向前移动一个句子 |
( |
向后移动一个句子 |
} |
向前移动一个段落 |
{ |
向后移动一个段落 |
G |
移动到文件末尾 |
gg |
移动到文件开头 |
`. |
移动到上次编辑处 |
星期三, 二月 25, 2009
VIM学习笔记 在单词间移动
在word间移动
命令w
使得光标向前移到一个单词;命令b
向后移动一个单词;命令e
也是向前移到一个单词,但是将光标定位在单词的结尾处;命令ge
则是向后移到一个单词并到达前一个单词的结尾处。
那么怎么样来定义一个单词呢?我们都知道单词是一系列字母的组合。然而在C程序中size56却会被认为是一个单词,因为在C程序中我们是通过字
母、数字和下划线来组成一个单词的。但是LISP程序中可以在变量名中使用-,这时会认为total-size是一个单词,而在C程序中这却会被认为是两
个单词。我们如何来解决这样的冲突呢?Vim的解决办法是,用选项来定义哪些是一个单词中的,而哪些又不是。例如下面的命令定义了属于一个单词中的字母:
:set iskeyword=specification
查看当前选项,可以使用下面的命令:
:set iskeyword?
命令会返回一组用用逗号分隔的值:
iskeyword=@,48-57,_,192_255
如果我们想要单词中的字母是专一的元音,可以使用下面的命令:
:set iskeyword=a,e,i,o,u
我们还可以使用横线来指定字母的范围。如果要指定所有的小写字母,可以用下面的命令:
:set iskeyword=a-z
对于那些不能直接指定的字符,可以使用十进制的数字来表示。如果我们要指定小写字母和下划线为一个单词,可以使用下面的命令:
:set iskeyword=a-z,45
排除某一个字符,可以在这个字符前加上一个前缀^。例如我们可以定义一个单词由除了q以外的小写字符组成:
:set iskeyword=@,^q
iskeyword(命令iskeyword可以简记为isk)选项使用以下特殊字符:
a | 字符a |
a-z | 所有由a到z的字符 |
@ | 由函数isalpha()所定义的所有字符 |
@-@ | 字符@ |
^x | 除了x以外的字符 |
^a-c | 除了a到c以外的字符 |
在WORD间移动
除了word之外,Vim还有一种概念WORD。虽然这只是大小写的不同,但是他们却代表了两种不同的事物。word是指由iskeyword选项定义的字符串;而WORD则是指用空白符分隔的字符串。与WORD相关的一些命令如下:
[count]B |
向后移动count个WORDS |
[count]E |
向前移动count个WORDS,并且将光标置于WORD的末尾. |
[count]gE |
向后移动count个WORDS,并且将光标置于WORD的末尾. |
[count]W |
向前移动count个OWRDS. |
w |
向前移动一个word |
e |
|
b |
向后移动一个word |
set iskeyword |
定义word选项 |
W |
向前移动一个WORD |
E |
|
B |
向后移动一个WORD |
2、语法高亮
在文件中找到 "syntax on 这一行,去掉前面的双引号",双引号是注释的意思
3、自动缩进
在文件末尾添加一行,输入 set autoindent
在添加一行,输入 set cindent
其中 autoindent 是自动缩进; cindent是特别针对 C语言语法自动缩进
注意:如果设置好以上设置后,VIM没有作出相应的动作,那么请你把你的VIM升级到最新版,一般只要在终端输入以下命令即可:sudo apt-get install vim
这个是用于程序中自动缩进所使用的空白长度指示的。一般来说为了保持程序的美观,和下面的参数最好一致。同时它也是符号移位长度的制定者。
定义tab所等同的空格长度,一般来说最好设置成8,因为如果是其它值的话,可能引起文件在打印之类的场合中看起来很别扭。除非你设置
了 expandtab模式,也就是把tabs转换成空格,这样的话就不会一起混淆,不过毕竟制表符为8是最常用最普遍的设置,所以一般还是不要改。
如果我们希望改变程序中的缩进怎么办?
shiftwidth 和 tabstop不一样的话,你会发现程序比较难看的。这时候,softtabstop
就起作用了。可以从vim的说明中看到,一旦设置了softtabstop的值时,你按下tab键,插入的是空格和tab制表符的混合,具体如何混合取决
于你设定的softtabstop,举个例子,如果设定softtabstop=8, 那么按下tab键,插入的就是正常的一个制表符;如果设定
softtabstop=16,那么插入的就是两个制表符;如果softtabstop=12,那么插入的就是一个制表符加上4个空格;如
果 softtabstop=4呢?那么一开始,插入的就是4个空格,此时一旦你再按下一次tab,这次的四个空格就会和上次的四个空格组合起来变成一个
制表符换句话说,softtabstop是“逢8空格进1制表符”,前提是你tabstop=8。
举个例子,在多人一起开发项目时,为了使代码风格尽量保持一致,一般不允许在代码使用TAB符,而以4个空格代之。我们可以编辑一个文件,包含下面的内容:
set shiftwidth=4
set expandtab
然后把下面的命令加入到.vimrc中:
autocmd FileType c,cpp set shiftwidth=4 | set expandtab
就可以只在编辑c和cpp文件时实行这种设置了
蓝色部分转载于http://blog.163.com/allan_36983689/blog/static/316982402010118414355/
fileformats选项,用于处理文件格式问题。以下命令,告诉vim将UNIX文件格式做为第一选择,而将MS-DOS的文件格式做为第二选择:
:set fileformats=unix,dos
检测到的文件格式会被存放在fileformat选项中,我们可以用以下命令来查询:
:set fileformat?
我们还可以利用fileformat选项,来转换种文件格式。例如,使用以下命令将名为readme.txt的MS-DOS格式的文件,转换为UNIX格式的文件。
:set fileformat=unix
在默认情况下,Vim认为文件是由行组成的,并且文件最后一行是以<EOL>为结束符的。如果你想设置文件以<EOL>结束符结尾,则可以用以下命令:
:set endofline
如果你想设置文件不以<EOL>结束符来结尾,则可以使用以下命令:
:set noendofline
如果你使用以下命令进入<list mode>,那么就可以清楚的看到以“$”表示的换行符和以“^I”表示的制表符。
:set list
你可以使用以下命令退出<list mode>:
:set nolist
删除换行
可以用以下命令删除换行符:
:%s/\n//g
可以用以下命令删除DOS文件中的回车符“^M”:
:%s/\r//g
可以用以下命令转换DOS回车符“^M”为真正的换行符:
:%s/\r/\r/g
可以用以下命令删除行尾的空格以及DOS回车符。它没有使用“/”字符作为替换命令各个参数间的分隔符,而是使用了“#”字符。命令还使用了“\?”正则表达式,用来匹配它前面出现的字符0次或1次。
:%s#\s*\r\?$##
可以用以下命令删除三行空行:
:%s/^\n\{3}//
可以用以下命令将连续的两个空行替换成一个空行:
:%s/\n\n/\r/g
自动换行
在默认情况下,Vim是不会自动换行的,也就是说我们需要自己决定回车的位置。但是我们也可以通过指定textwidth选项,让Vim自动在指定位置换
行。例如,使用以下命令指定在30列时自动换行。由于在遇到空格时才会自动换行,所以换行的精确位置可能会小于你指定的列宽。
:set textwidth=29
而以下命令告诉Vim从右面算起当达到10个字符的空格时要换行:
:set wrapmargin=10
在指定了文本宽度的情况下,当我们将一行中的前几个文字删掉时,Vim并不会将后面行中的文本移动上来,而是形成了一些长短不一的段落,这样看起来不是很好。可以有几种方法处理这个问题:
一种方法是,在可视化模式下选中这些文本,然后用gp
命令来格式化选中的段落。另一种方法是,使用gqmotion
命令来完成格式。例如要格式化5行,就可以用命令:gq4j
。这个命令告诉Vim要格式化本行,同时要格式化下面的4行,这样就达到了格式化5行的目的。如果要格式化整个段落,可以将光标放在段落的第一行上,然后执行命令gq}
。而使用命令gqip
可以格式化当前段落,而且并不必要将光标放在段落的第一行上。
如果要想格式化一行,可以使用命令gqgq
,也可以简记为gqq
。
注意:选项textwidth优先于wrapmargin。如果要使wrapmargin选项生效,必须将textwidth设置为0(这也是默认值)。
合并行
命令J
使两行合并为一行,同时用空格分隔这两行。
通过设置joinspace选项,可以控制合并两行时的分隔符(如果一行是以标点符号来结尾)。如果设置:set nojoinspaces
,用J命令合并两行时会用一个空格来分隔;如果设置:set joinspaces
,用J命令合并两行时会用两个空格来分隔。如果不希望用空格来分隔合并的行,可以使用gJ
命令。
我们也可以使用:join
命令,将几行合并为一行并使用空格来分隔各行。如果不希望加入空格,那么可以使用:join!
命令。
:set fileformat
|
设置文件格式 |
:set endofline
|
设置文件结束符 |
:set noendofline
|
取消文件结束符 |
:set list
|
进入List Mode |
:set nolist
|
退出List Mode |
:%s/\n//g
|
删除换行符 |
:set textwidth
|
设置行宽 |
:set textwidth
|
设置行边距 |
:join
|
合并多行 |
J
|
合并两行 |
以上灰色部分转载于http://blog.sina.com.cn/s/blog_4c76784c0100uaf9.html
转载于 https://github.com/ma6174/vim
- set sw=4
- set ts=4
- set et
- set smarttab
- set smartindent
- set lbr
- set fo+=mB
- set sm
- set selection=inclusive
- set wildmenu
- set mousemodel=popup
- au FileType php setlocal dict+=~/.vim/dict/php_funclist.dict
- au FileType css setlocal dict+=~/.vim/dict/css.dict
- au FileType c setlocal dict+=~/.vim/dict/c.dict
- au FileType cpp setlocal dict+=~/.vim/dict/cpp.dict
- au FileType scale setlocal dict+=~/.vim/dict/scale.dict
- au FileType javascript setlocal dict+=~/.vim/dict/javascript.dict
- au FileType html setlocal dict+=~/.vim/dict/javascript.dict
- au FileType html setlocal dict+=~/.vim/dict/css.dict
- "
- "syntastic相关
- execute pathogen#infect()
- let g:syntastic_python_checkers=['pylint']
- let g:syntastic_php_checkers=['php', 'phpcs', 'phpmd']
- "golang
- "Processing... % (ctrl+c to stop)
- let g:fencview_autodetect=0
- set rtp+=$GOROOT/misc/vim
- """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- " 显示相关
- """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- syntax on
- set cul "高亮光标所在行
- set cuc
- set shortmess=atI " 启动的时候不显示那个援助乌干达儿童的提示
- set go= " 不要图形按钮
- "color desert " 设置背景主题
- color ron " 设置背景主题
- "color torte " 设置背景主题
- "set guifont=Courier_New:h10:cANSI " 设置字体
- "autocmd InsertLeave * se nocul " 用浅色高亮当前行
- autocmd InsertEnter * se cul " 用浅色高亮当前行
- set ruler " 显示标尺
- set showcmd " 输入的命令显示出来,看的清楚些
- "set whichwrap+=<,>,h,l " 允许backspace和光标键跨越行边界(不建议)
- set scrolloff=3 " 光标移动到buffer的顶部和底部时保持3行距离
- set statusline=%F%m%r%h%w\ [FORMAT=%
{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:
%M\")} "状态行显示的内容 - set laststatus=2 " 启动显示状态行(1),总是显示状态行(2)
- "set foldenable " 允许折叠
- ""set foldmethod=manual " 手动折叠
- set nocompatible "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
- " 显示中文帮助
- if version >= 603
- set helplang=cn
- set encoding=utf-8
- endif
- " 自动缩进
- set autoindent
- set cindent
- " Tab键的宽度
- set tabstop=4
- " 统一缩进为4
- set softtabstop=4
- set shiftwidth=4
- " 不要用空格代替制表符
- set expandtab
- " 在行和段开始处使用制表符
- set smarttab
- " 显示行号
- set number
- " 历史记录数
- set history=1000
- "搜索逐字符高亮
- set hlsearch
- set incsearch
- "语言设置
- set langmenu=zh_CN.UTF-8
- set helplang=cn
- " 总是显示状态行
- set cmdheight=2
- " 侦测文件类型
- filetype on
- " 载入文件类型插件
- filetype plugin on
- " 为特定文件类型载入相关缩进文件
- filetype indent on
- " 保存全局变量
- set viminfo+=!
- " 带有如下符号的单词不要被换行分割
- set iskeyword+=_,$,@,%,#,-
- " 字符间插入的像素行数目
- "markdown配置
- au BufRead,BufNewFile *.{md,mdown,mkd,mkdn,markdown,mdwn} set filetype=mkd
- au BufRead,BufNewFile *.{go} set filetype=go
- au BufRead,BufNewFile *.{js} set filetype=javascript
- "rkdown to HTML
- nmap md :!~/.vim/markdown.pl % > %.html <CR><CR>
- nmap fi :!firefox %.html & <CR><CR>
- nmap \ \cc
- vmap \ \cc
- "将tab替换为空格
- nmap tt :%s/\t/ /g<CR>
- """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- """""新文件标题
- """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- "新建.c,.h,.sh,.java文件,自动插入文件头
- autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java,*.py exec ":call SetTitle()"
- ""定义函数SetTitle,自动插入文件头
- func SetTitle()
- "如果文件类型为.sh文件
- if &filetype == 'sh'
- call setline(1,"\#!/bin/bash")
- call append(line("."), "")
- elseif &filetype == 'python'
- call setline(1,"#!/usr/bin/env python")
- call append(line("."),"# coding=utf-8")
- call append(line(".")+1, "")
- " elseif &filetype == 'mkd'
- " call setline(1,"<head><meta charset=\"UTF-8\"></head>")
- else
- call setline(1, "/*************************************************************************")
- call append(line("."), " > File Name: ".expand("%"))
- call append(line(".")+1, " > Author: ma6174")
- call append(line(".")+2, " > Mail: ma6174@163.com ")
- call append(line(".")+3, " > Created Time: ".strftime("%c"))
- call append(line(".")+4, " ************************************************************************/")
- call append(line(".")+5, "")
- endif
- if &filetype == 'cpp'
- call append(line(".")+6, "#include<iostream>")
- call append(line(".")+7, "using namespace std;")
- call append(line(".")+8, "")
- endif
- if &filetype == 'c'
- call append(line(".")+6, "#include<stdio.h>")
- call append(line(".")+7, "")
- endif
- " if &filetype == 'java'
- " call append(line(".")+6,"public class ".expand("%"))
- " call append(line(".")+7,"")
- " endif
- "新建文件后,自动定位到文件末尾
- endfunc
- autocmd BufNewFile * normal G
- """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- "键盘命令
- """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- :nmap <silent> <F9> <ESC>:Tlist<RETURN>
- map! <C-Z> <Esc>zzi
- map! <C-O> <C-Y>,
- map <C-A> ggVG$"+y
- map <F12> gg=G
- map <C-w> <C-w>w
- imap <C-k> <C-y>,
- imap <C-j> <ESC>
- " 选中状态下 Ctrl+c 复制
- "map <C-v> "*pa
- imap <C-v> <Esc>"*pa
- imap <C-a> <Esc>^
- imap <C-e> <Esc>$
- vmap <C-c> "+y
- set mouse=v
- "set clipboard=unnamed
- "去空行
- nnoremap <F2> :g/^\s*$/d<CR>
- "比较文件
- nnoremap <C-F2> :vert diffsplit
- "nnoremap <Leader>fu :CtrlPFunky<Cr>
- "nnoremap <C-n> :CtrlPFunky<Cr>
- "列出当前目录文件
- map <F3> :NERDTree<CR>
- "打开树状文件目录
- map <C-F3> \be
- :autocmd BufRead,BufNewFile *.dot map <F5> :w<CR>:!dot -Tjpg -o %<.jpg % && eog %<.jpg <CR><CR> && exec "redr!"
- "C,C++ 按F5编译运行
- map <F5> :call CompileRunGcc()<CR>
- func! CompileRunGcc()
- exec "w"
- if &filetype == 'c'
- exec "!g++ % -o %<"
- exec "!time ./%<"
- elseif &filetype == 'cpp'
- exec "!g++ % -o %<"
- exec "!time ./%<"
- elseif &filetype == 'java'
- exec "!javac %"
- exec "!time java %<"
- elseif &filetype == 'sh'
- :!time bash %
- elseif &filetype == 'python'
- exec "!time python2.7 %"
- elseif &filetype == 'html'
- exec "!firefox % &"
- elseif &filetype == 'go'
- " exec "!go build %<"
- exec "!time go run %"
- elseif &filetype == 'mkd'
- exec "!~/.vim/markdown.pl % > %.html &"
- exec "!firefox %.html &"
- endif
- endfunc
- "C,C++的调试
- map <F8> :call Rungdb()<CR>
- func! Rungdb()
- exec "w"
- exec "!g++ % -g -o %<"
- exec "!gdb ./%<"
- endfunc
- "代码格式优化化
- map <F6> :call FormartSrc()<CR><CR>
- "定义FormartSrc()
- func FormartSrc()
- exec "w"
- if &filetype == 'c'
- exec "!astyle --style=ansi -a --suffix=none %"
- elseif &filetype == 'cpp' || &filetype == 'hpp'
- exec "r !astyle --style=ansi --one-line=keep-statements -a --suffix=none %> /dev/null 2>&1"
- elseif &filetype == 'perl'
- exec "!astyle --style=gnu --suffix=none %"
- elseif &filetype == 'py'||&filetype == 'python'
- exec "r !autopep8 -i --aggressive %"
- elseif &filetype == 'java'
- exec "!astyle --style=java --suffix=none %"
- elseif &filetype == 'jsp'
- exec "!astyle --style=gnu --suffix=none %"
- elseif &filetype == 'xml'
- exec "!astyle --style=gnu --suffix=none %"
- else
- exec "normal gg=G"
- return
- endif
- exec "e! %"
- endfunc
- "结束定义FormartSrc
- """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- ""实用设置
- """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- if has("autocmd")
- autocmd BufReadPost *
- \ if line("'\"") > 0 && line("'\"") <= line("$") |
- \ exe "normal g`\"" |
- \ endif
- endif
- "当打开vim且没有文件时自动打开NERDTree
- autocmd vimenter * if !argc() | NERDTree | endif
- " 只剩 NERDTree时自动关闭
- autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif
- " 设置当文件被改动时自动载入
- set autoread
- " quickfix模式
- autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>
- "代码补全
- set completeopt=preview,menu
- "允许插件
- "filetype plugin on
- "共享剪贴板
- "set clipboard+=unnamed
- "自动保存
- set autowrite
- "set ruler " 打开状态栏标尺
- "set cursorline " 突出显示当前行
- set magic " 设置魔术
- set guioptions-=T " 隐藏工具栏
- set guioptions-=m " 隐藏菜单栏
- ""set foldcolumn=0
- ""set foldmethod=indent
- ""set foldlevel=3
- " 不要使用vi的键盘模式,而是vim自己的
- set nocompatible
- " 去掉输入错误的提示声音
- set noeb
- " 在处理未保存或只读文件的时候,弹出确认
- set confirm
- "禁止生成临时文件
- set nobackup
- set noswapfile
- "搜索忽略大小写
- set ignorecase
- set linespace=0
- " 增强模式中的命令行自动完成操作
- set wildmenu
- " 使回格键(backspace)正常处理indent, eol, start等
- set backspace=2
- " 允许backspace和光标键跨越行边界
- set whichwrap+=<,>,h,l
- " 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
- set mouse=a
- set selection=exclusive
- set selectmode=mouse,key
- " 通过使用: commands命令,告诉我们文件的哪一行被改变过
- set report=0
- " 在被分割的窗口间显示空白,便于阅读
- set fillchars=vert:\ ,stl:\ ,stlnc:\
- " 高亮显示匹配的括号
- set showmatch
- " 匹配括号高亮的时间(单位是十分之一秒)
- set matchtime=1
- " 光标移动到buffer的顶部和底部时保持3行距离
- set scrolloff=3
- " 为C程序提供自动缩进
- "自动补全
- "":inoremap ( ()<ESC>i
- "":inoremap ) <c-r>=ClosePair(')')<CR>
- ":inoremap { {<CR>}<ESC>O
- ":inoremap } <c-r>=ClosePair('}')<CR>
- "":inoremap [ []<ESC>i
- "":inoremap ] <c-r>=ClosePair(']')<CR>
- "":inoremap " ""<ESC>i
- "":inoremap ' ''<ESC>i
- ""function! ClosePair(char)
- "" if getline('.')[col('.') - 1] == a:char
- "" return "\<Right>"
- "" else
- "" return a:char
- "" endif
- ""endfunction
- filetype plugin indent on
- "打开文件类型检测, 加了这句才可以用智能补全
- set completeopt=longest,menu
- """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- " CTags的设定
- """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- let Tlist_Sort_Type = "name" " 按照名称排序
- let Tlist_Use_Right_Window = 1 " 在右侧显示窗口
- let Tlist_Compart_Format = 1 " 压缩方式
- let Tlist_Exist_OnlyWindow = 1 " 如果只有一个buffer,kill窗口也kill掉buffer
- ""let Tlist_File_Fold_Auto_Close = 0 " 不要关闭其他文件的tags
- ""let Tlist_Enable_Fold_Column = 0 " 不要显示折叠树
- "let Tlist_Show_One_File=1 "不同时显示多个文件的tag,只显示当前文件的
- "设置tags
- "set tags=tags
- "set autochdir
- """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- "其他东东
- """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
- "默认打开Taglist
- let Tlist_Auto_Open=0
- """"""""""""""""""""""""""""""
- " Tag list (ctags)
- """"""""""""""""""""""""""""""""
- let Tlist_Ctags_Cmd = '/usr/local/bin/ctags'
- let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的
- let Tlist_File_Fold_Auto_Close = 1
- let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim
- let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口
- " minibufexpl插件的一般设置
- let g:miniBufExplMapWindowNavVim = 1
- let g:miniBufExplMapWindowNavArrows = 1
- let g:miniBufExplMapCTabSwitchBufs = 1
- let g:miniBufExplModSelTarget = 1
- nmap tl :Tlist<cr>
- "输入法
- :let g:vimim_map='c-/'
- ":let g:vimim_cloud='sougou' " QQ云输入
- :let g:vimim_punctuation=0 " 不用中文标点
- :set pastetoggle=<C-H>
- :let g:vimim_cloud=-1
- "python补全
- let g:pydiction_location = '~/.vim/after/complete-dict'
- let g:pydiction_menu_height = 20
- let Tlist_Ctags_Cmd='/usr/local/bin/ctags'
- let g:miniBufExplMapWindowNavVim = 1
- let g:miniBufExplMapWindowNavArrows = 1
- let g:miniBufExplMapCTabSwitchBufs = 1
- let g:miniBufExplModSelTarget = 1
- set iskeyword+=.
- set termencoding=utf-8
- set encoding=utf8
- set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030
- autocmd FileType python set omnifunc=pythoncomplete#Complete
- "set nocompatible " be iMproved
- "filetype off " required!
- set rtp+=~/.vim/bundle/vundle/
- call vundle#rc()
- " let Vundle manage Vundle
- " required!
- Bundle 'gmarik/vundle'
- " My Bundles here:
- "
- " original repos on github
- Bundle 'tpope/vim-fugitive'
- Bundle 'rstacruz/sparkup', {'rtp': 'vim/'}
- Bundle 'Yggdroot/indentLine'
- let g:indentLine_char = '┊'
- "ndle 'tpope/vim-rails.git'
- " vim-scripts repos
- Bundle 'L9'
- Bundle 'FuzzyFinder'
- " non github repos
- Bundle 'git://git.wincent.com/command-t.git'
- Bundle 'Auto-Pairs'
- Bundle 'python-imports.vim'
- Bundle 'CaptureClipboard'
- Bundle 'ctrlp-modified.vim'
- Bundle 'last_edit_marker.vim'
- Bundle 'synmark.vim'
- "Bundle 'Python-mode-klen'
- Bundle 'SQLComplete.vim'
- Bundle 'Javascript-OmniCompletion-with-YUI-and-j'
- "Bundle 'JavaScript-Indent'
- "Bundle 'Better-Javascript-Indentation'
- Bundle 'jslint.vim'
- Bundle "pangloss/vim-javascript"
- Bundle 'Vim-Script-Updater'
- Bundle 'ctrlp.vim'
- Bundle 'tacahiroy/ctrlp-funky'
- Bundle 'jsbeautify'
- Bundle 'The-NERD-Commenter'
- "django
- Bundle 'django_templates.vim'
- Bundle 'Django-Projects'
- "Bundle 'FredKSchott/CoVim'
- "Bundle 'djangojump'
- " ...
- let g:html_indent_inctags = "html,body,head,tbody"
- let g:html_indent_script1 = "inc"
- let g:html_indent_style1 = "inc"
- filetype plugin indent on " required!
- "
- " Brief help
- " :BundleList - list configured bundles
- " :BundleInstall(!) - install(update) bundles
- " :BundleSearch(!) foo - search(or refresh cache first) for foo
- " :BundleClean(!) - confirm(or auto-approve) removal of unused bundles
- "
- " see :h vundle for more details or wiki for FAQ
- " NOTE: comments after Bundle command are not allowed..
- "
- "
- "ctrlp设置
- "
- set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*.pyc,*.png,*.jpg,*.gif " MacOSX/Linux
- set wildignore+=*\\tmp\\*,*.swp,*.zip,*.exe,*.pyc,*.png,*.jpg,*.gif " Windows
- let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'
- let g:ctrlp_custom_ignore = '\v\.(exe|so|dll)$'
- let g:ctrlp_extensions = ['funky']
- let NERDTreeIgnore=['\.pyc']
set lbr
以breakat的值的位置回绕长行,而不是以屏幕上可以显示的最后一个字符回绕。breakat=" ^I!@*-+;:,./?"
if &term=="xterm"
set t_Co=8
set t_Sb=^[[4%dm
set t_Sf=^[[3%dm
endif