admin 管理员组

文章数量: 887021

Vim 官网:http://www.vim/
Vim 快捷键 键位图(入门到进阶):https://www.linuxidc/Linux/2016-06/132019.htm

神级编辑器 Vim 使用-基础篇:https://www.hanleylee/articles/usage-of-vim-editor-basic/
神级编辑器 Vim 使用-操作篇:https://www.hanleylee/articles/usage-of-vim-editor/
神级编辑器 Vim 使用-插件篇:https://www.hanleylee/articles/usage-of-vim-editor-plugin/
神级编辑器 Vim 使用-正则操作篇:https://zhuanlan.zhihu/p/346058975
神级编辑器 Vim 使用-最后:https://www.hanleylee/articles/usage-of-vim-editor-last/

通过RPG游戏练习VIM使用:https://vim-adventures/
练习软件快捷键:https://www.shortcutfoo/

实时文本交互聊天:https://collabedit/
在线编写运行分享C++代码编辑器:https://cpp.sh/
浏览器运行虚拟机:http://copy.sh/v86/

1、vim 简介

vim 是什么

Vim / Vi 是一个功能强大的全屏幕文本编辑器。vim ( Vi IMproved ) 是 vi 的一个加强版,主要用来 "创建、编辑、显示" 文本文件。现在主流的 linux 都会安装 vim 文本编辑器。Vim/Vi 没有菜单,只有命令。linux 下还有另一款强大的编辑器 Emacs。

在 windows 中,可以使用 cmd 下 vim,也可以使用带界面的 gvim
windows 版 gvim:https://github/vim/vim-win32-installer

vimRC 中 rc 是什么

在运行一些软件、环境、工具之前,一般都要要初始执行的一些命令,称为 Run Commands,即 RC。根据 Wikipedia 的记载,RC 缩写的用法源自 MIT 的相容分时操作系统(Compatible Time-Sharing System,CTSS)[参考1]。所以以后如果你看到了SystemRC 或者 ScreenRC,也就知其缘由了。

  • .vimrc 是 Vim 的配置文件,它用于存储用户对Vim编辑器的自定义设置。在这个文件中,你可以设置各种选项、键盘映射、插件等,以满足个人的编辑需求。.vimrc文件通常位于用户的主目录下(例如~/.vimrc)。
  • .viminfo 是 Vim 编辑器用于保存编辑历史和会话信息的文件。它记录了Vim打开的文件、光标位置、搜索历史、命令历史等等。当重新打开Vim时,Vim会读取.viminfo文件,恢复上次编辑的状态。.viminfo文件同样位于用户的主目录下(例如~/.viminfo)。

vim 的 3 种模式

vim 的3种模式:

  • Normal Mode:也叫 可视模式。也可以理解为 "查看模式,或者常态模式",从其他任何 "特殊模式 ( 插入模式、命令模式 )"  回到 Normal Mode,只需要按 ESC 键即可。
  • Insert Mode:插入模式。从Normal Mode进入Insert Mode,可以按 i、I、a、A、o、O、r、R 即可。其中 i 和 I 表示插入(Insert),r 和 R 表示替换(replace)。
  • Command-line Mode  (命令模式,也称 "冒号模式"、"末行模式") :从Normal Mode进入Command-line Mode,可以按“:”、“/”、“?”。其中“:”表示输入vim命令,“/”表示后面输入要向下搜索的字符串,“?”表示后面输入要向上搜索字符串。从Command-line Mode进入Normal Mode,只需要按 ESC 键即可了。

vim / vi 工作模式

鼠标可以启动于各种模式中(The mouse can be enabled for different modes):

  1. n  Normal mode,正常模式,进入 vim 后的默认模式
  2. v  Visual mode,可视模式
  3. i  Insert mode,插入模式
  4. c  Command-line mode,命令行模式
  5. h  all previous modes when editing a help file,编辑帮助文件,适用于所有先前的模式
  6. a all previous modes,所有先前的模式
  7. r for |hit-enter| and |more-prompt| prompt

对所有模式启用鼠标功能::set mouse=a
当鼠标模式未启用时,GUI 仍将使用鼠标进行非模态选择。这不会移动文本光标。
所以配置文件中的 set mouse=a 启动了所有模式,这样就屏蔽了鼠标右健功能。
设置 set mouse=v 在可视模式下使用鼠标,用鼠标选中,按 y 键复制,然后点击要粘贴的地方使用鼠标中键粘贴,支持夸文件粘贴,比使用命令很多

简单使用

vim 中文 帮助

在线中文帮助文档

  • :https://yianwillis.github.io/vimcdoc/doc/version9.html
  • :https://vimcdoc.sourceforge/doc/

修改本地帮助为中文

  • 下载中文帮助文档。
    下载地址:https://sourceforge/projects/vimcdoc/files/vimcdoc/
    按日期找到最新版本是 vimcdoc-2.4.0.tar.gz ,
    wget https://jaist.dl.sourceforge/project/vimcdoc/vimcdoc/vimcdoc-2.4.0.tar.gz
    把下载的文档放入文档目录。
            tar -xzvf vimcdoc-2.4.0.tar.gz
            mkdir -p ~/.vim
            mv vimcdoc-2.4.0/doc ~/.vim/
            安装:$sudo ./vimcdoc.sh -i
  • 设置帮助文档的语言为中文。注意:中文文档不会覆盖原英文文档。
            启动 vim,输入:help      查看帮助文档是否已经变成中文
            查看英文文档:set helplang=en
            查看中文文档:set helplang=cn
  • 帮助文件的文本是utf-8编码的, 如果想用vim直接查看, 需要在~/.vimrc中设置:
       set encoding=utf-8

效果如图:

Vim 帮助文档 使用方法

在Vim中获取帮助,可以键入: :help

会出现如图所示界面:

vim 的 help 默认是水平分割窗口的

在窗口右边垂直分割出number的帮助信息

:vertical botright help number
:vert bo h number

第一行代码是完整的输入,第二行代码是简写,vertical 表示将vert后面的命令结果垂直分割出窗口显示,botright 表示分割出的新窗口显示在右边。

如果你不指定一个具体的帮助主题,:help会给你呈现一个普通的窗口。Vim开发者对帮助系统做了很聪明的事。他们把帮助窗口当做一个普通的编辑窗口。你可以用普通模式下所有的命令如h,j,k,l等浏览帮助信息。退出帮助系统,你同样可以使用退出文件命令:ZZ。

对于超链接:

  • Ctrl-]     (转到标签),跳转到标签所在的位置。
  • Ctrl-T   跳转了几次后,如果想返回之前的屏幕,Ctrl+T(返回标签)可以返回到之前的屏幕。
  • Ctrl-O / Ctrl-I   在前后浏览过的帮助信息之间进行切换。

Vim 使用 tag  来处理超链接的。在帮助屏幕的左上角有一个“help.txt",这是用来定义一个标签用的。

要获取给定的帮助主题,请输入以下命令:
:help 主题
例如,要获取命令x的帮助文档,就可以输入:
:help x
要想知道怎么删除文本,使用以下命令:
:help deleting
要想获取所有帮助主题的索引,使用下面的命令:
:help index
获取组合键命令,如Ctrl+A,使用如下命令:
:help ctrl-a
若要指定其它模式,使用模式前缀。 例如,查看插入模式下Ctrl+H命令的帮助,要用的模式前缀是:i_。
:help i_ctrl-h

下表列出了各种模式下的前缀

        WHAT                        PREPEND     EXAMPLE      
        Normal mode command                     :help x
        Visual mode command         v_          :help v_u
        Insert mode command         i_          :help i_<Esc>
        Command-line command        :           :help :quit
        Command-line editing        c_          :help c_<Del>
        Vim command argument        -           :help -r
        Option                      '           :help 'textwidth'
        Regular expression          /           :help /[

编辑时,可以使用命令行选项,选项都以短横线-开头。
示例:查看命令行-t的帮助文档,命令如下::help -t
Vim有很多可以自定义的数字选项,查找有关数字选项的帮助。命令::help 'number'
去查看功能键的帮助文档,你需要使用箭头包含它们::help <up>
其它获取帮助的方法:按F1键也可以查看帮助。

列表显示

我们在输入帮助命令之后,有时候和当前命令相关的帮助信息不止一条,或者和当前命令类似的帮助信息,或者有时候我们只是模糊的记得命令,这时候该怎么办?例如输入:h number之后,再按一下Ctrl-D就可以将列表显示出来,通过<Tab>键来选择我们感兴趣的帮助信息。
但是这里还有一个问题,就是按下<Tab>之后,选中的信息不是很明显,这时候就需要下面这个配置: :set wildmenu

当按下<Tab>之后会显示一个状态栏,状态栏上显示的是帮助信息自动补全的信息,并高亮第一个匹配的信息,可以通过<Tab>键进行切换到一条信息,或者使用Ctrl-P/Ctrl-N进行前后切换。当然,这个配置不仅是针对帮助信息的补全,其他命令也是一样的效果。


链接

  • Ctrl-]     (转到标签),跳转到标签所在的位置。
  • Ctrl-T   跳转了几次后,如果想返回之前的屏幕,Ctrl+T(返回标签)可以返回到之前的屏幕。
  • Ctrl-O / Ctrl-I   在前后浏览过的帮助信息之间进行切换。

Vim 使用 tag  来处理超链接的。在帮助屏幕的左上角有一个“help.txt",这是用来定义一个标签用的。

不同模式下的帮助信息

获取特定帮助:  在 :help 命令后给出参数可以直接跳转到任何的帮助主题。
还可以通过前缀进一步指定上下文
普通模式命令                         :help x
可视模式命令                v_       :help v_u
插入模式命令                i_       :help i_<Esc>
命令行模式命令              :        :help :quit
命令行编辑                  c_       :help c_<Del>
Vim 命令参数                -        :help -r
选项                        '        :help 'textwidth'
正则表达式                  /        :help /[
更多上下文及说明参见 help-summary。

vim 主题、配色

15个著名的 Vim 配色方案整理:https://zhuanlan.zhihu/p/497315237

好看的 vim 配色:https://www.zhihu/question/19597873

安装 molokai 主题 

github:https://github/tomasr/molokai

Vi / Vim 手工自行安装配色方案的主要步骤包括:

(1) 确认当前用户目录下是否存在 ~/.vim/colors 目录,没有则新建。

(2) 下载或编辑某个配色方案的 .vim 文件,保存到 ~/.vim/colors 目录下。
        cd ~/.vim/colors/
        git clone https://github/tomasr/molokai.git

(3) 修改 vim 配置文件:vim ~/.vimrc
添加 let g:molokai_original = 1

molokai 配色方案非常出名,效果示例:

vim 配置、set 设置

Windows 配置文件:vim 安装目录下的 vimrc 文件。
Linux 配置文件:~/.vimrc (用户)、/etc/vimrc、/etc/vim/vimrc、/usr/share/vim/vimrc
Mac 配置文件:/usr/share/vim/vimrc

sudo vim /etc/vim/vimrc。会影响所有用户
sudo ~/vimrc。只影响当前用户

vim 变量

vim script 基础语法:https://zhuanlan.zhihu/p/658459228

VIM学习笔记 脚本-变量和表达式 (Script-Variables and Expressions):https://zhuanlan.zhihu/p/27081938

vimscript中,变量有几种作用域。可以使用`:help variable-scope`查看。

Vim使用特殊的前缀来指明不同的变量类型:

使用以下命令,可以定义环境变量$PAGER,用于指明查看的命令:
:let $PAGER="/usr/local/bin/less"
使用以下命令,可以显示上一次查找的模式:
:echo "Last search was"@/
使用以下任一命令,都可以设置缩进选项:
:let &autoindent=1
:set autoindent
使用以下命令,可以指定当前缓冲区的语法高亮显示:
:let b:current_syntax=c

Vim 使用以下内部变量(v:name)存储相关信息:

命令模式、Ex 模式

Vim 脚本也可以定义和使用变量。 变量操作通常发生在命令模式(commandline mode)、Ex模式(Ex-mode)和 Vim 脚本中。 进入和退出这些模式的方法如下:

  • 命令模式:在 "正常模式 ( 就是进入 Vim 后默认所处的模式 ) " 键入 : 即可进入命令模式,输入一些命令后按下回车便可执行, 命令执行后 Vim 会自动回到正常模式。
  • Ex 模式 (多行命令模式):Ex 模式是一种命令行模式,在 Ex 模式下,可以执行多个命令,每个命令占据一行,并以回车键结束。在正常模式键入 Q (大写)即可进入 Ex 模式,该模式与命令模式相似,但 Vim 不会回到正常模式因此可以连续输入很多命令。
  • Vim 脚本中也可以写任何 Vim 命令(.vimrc就是一个 Vim 脚本),可以通过 :source /path/to/script.vim 来执行一个外部脚本。

示例:正常模式按下 Q 进入 Ex 模式,然后键入以下命令:

:let str = "Hello World!"
:echo str

可以看到变量打印输出 "Hello World"。这就是一个简单的赋值+打印,这是一个普通的变量。

变量作用域

每种编程语言都定义有自己的变量作用域,比如 JavaScript 的函数作用域、C 语言的块作用域。但是Vim 作为文本编辑器,也有许多不同类型的变量,包括全局变量、局部变量、选项变量等。这些变量可以用来控制编辑器的行为、保存数据、设置环境等。以下是一些常见的 Vim 变量类型:

有缓冲区作用域、窗口作用域、标签页作用域等, 引用时可以通过变量前缀来区分。

当你在命令模式随便敲一些命令式大可不去理会这些作用域,但如果你的编写 Vim 脚本或者插件,就要注意其中区别了。 举个例子,使用 b: 前缀来定义当前 Buffer 内有效的变量,该变量在其他 Buffer 中是未定义的。下面的命令可以拿去试试:

:let b:foo = 'foo'
:echo b:foo

b: 变量虽然对其他 Buffer 不可见,但对其他窗口或标签页中的同一 Buffer 仍然可见。不指定前缀时(比如本文刚开始的例子),变量默认作用域取决于定义的位置,函数内则为函数作用域,外部则为全局变量。 下面是所有的作用域前缀:

|buffer-variable|    b:      Local to the current buffer.
|window-variable|    w:      Local to the current window.
|tabpage-variable|   t:      Local to the current tab page.
|global-variable|    g:      Global.
|local-variable|     l:      Local to a function.
|script-variable|    s:      Local to a |:source|'ed Vim script.
|function-argument|  a:      Function argument (only inside a function).
|vim-variable|       v:      Global, predefined by Vim.

可查阅 :help internal-variables 获取更多变量作用域的使用方式。

变量默认作用域取决于定义的位置,函数内则为函数作用域,外部则为全局变量。 赋值和引用变量时可以使用 b:,g:,l:,t: 等前缀来指定要操作哪个作用域的变量。

使用 let 进行变量赋值,echo 打印变量的值, unlet 销毁变量。 对于 Vim 选项还可用 set 来更方便地操作,比如 set {option}set no{option}set {option}?

  • 普通变量可以直接引用
  • 环境变量要加前缀 $
  • 寄存器变量要加前缀 @,寄存器变量,可以更容易地用程序与vim文本进行交互。vim中有一些预定义的寄存器,可以使用`:help registers`查看所有的10类寄存器。
  • Vim 选项要加前缀 &
  1. 全局变量:在 Vim 中,使用 let g:variable_name = value 来定义全局变量。这些变量可以被整个 Vim 环境中的所有脚本和插件所访问。

  2. 局部变量:局部变量只在当前的脚本或函数,本窗口(window)或者缓冲区中可见。在 Vim 脚本中,可以使用 let l:variable_name = value 来定义局部变量。

  3. 缓冲区变量:这些变量仅在当前缓冲区中可见。可以使用 let b:variable_name = value 来定义缓冲区变量。

  4. 选项变量:Vim 中的许多设置都是通过特定的选项变量来控制的,比如 tabstopexpandtabautoindent 等。这些选项变量可以通过 set 命令进行设置,例如 set tabstop=4

  5. 环境变量:Vim 也可以访问操作系统的环境变量,可以通过 let $VARIABLE_NAME = value 的方式来设置环境变量。

环境变量

引用环境变量时需要添加 $ 前缀。 在下面的例子中,打印出 Vim 所处 Shell 的 PATH 环境变量,并新增一个 PATH 目录:

:echo $PATH
:let $PATH .= ':/foo:/bar'
:echo $PATH

.= 运算符在 Vim 中用来做字符串拼接并赋值。

使用选项变量

Vim 选项是控制着 Vim 编辑器行为的一些变量,比如是否显示行号,使用哪种剪切板。 引用选项变量时需要添加 & 前缀。例如:
:let &number = 1        " 显示行号
:let &number = 0        " 不显示行号

Vim 提供了 set 命令来更方便地操作选项变量,对于布尔选项:

  1. set {option} 把布尔选项设为 1。例如 set number 设置显示行号。
  2. set no{option} 把布尔选项设为 0。例如 set nonumber 设置不显示行号。
  3. set {option}? 显示布尔选项的当前值。例如 set number? 输出 number 为显示行号,输出 nonumber 为不显示行号。

对于其他选项

  1. set {option}=<value> 设置选项值。例如 set shiftwidth=4 设置缩进为 4 空格。
  2. set {option}? 查看选项值。
  3. set {option} 查看选项值。

上述命令通常会写在 ~/.vimrc 中,但你也可以进入命令模式后直接输入。 更多 :set 的用法请参考 :help set

使用寄存器变量

Vim 共有 10 类 48 个寄存器,使用 Vim 寄存器 文中有详细的介绍。 如果能使用这些寄存器作为变量来操作,可以编写极具动态特性的脚本。 寄存器变量的前缀是 @

" 打印当前文件名
echo @%
" 把刚才拷贝的内容放到 a 寄存器中
let @a = @"

查看正在使用的配置文件

查看 vim 当前正在使用的配置文件

:version  执行后,会显示Vim的版本和编译信息。

        "system vimrc file" 的行是系统级别配置
        "user vimrc file"   的行是用户级别的.vimrc文件的位置。

示例:查看 vim 命令 version 的用法。

也可以直接在 Vim 中执行以下命令::e $MYVIMRC

会打开当前正在使用的 .vimrc 文件,查看和编辑其中的配置设置。

vim 基础命令
        :version :    显示版本及默认vimrc配置文件加载路径
        :scriptnames :按加载顺序显示vim启动后所有script
        :function :   查看加载的所有function

VIM 系统变量
        :echo $HOME :VIM HOME目录,对应于OS上的~目录
        Linux上为   /home/username/
        Windows上为 C:\Users\username\

        :echo $VIM :VIM被安装的目录
        VIM的目录路径为:
        \vim
        \vim\vim74
        \vim\vimfiles
        _vimrc
        :echo $VIMRUNTIME :vim.exe程序的目录
        \vim\vim74\

        :echo $MYVIMRC :用户VIMRC文件路径
        Windows下为\vim\ _vimrc
        Linux下为~/.vimrc
        对应:scriptnames命令可以看到生效的VIMRC文件

VIM 环境变量
        :set all 查看所有环境变量的设置
        :set 查看所有与系统默认不同的环境变量
        :set variable? 显示指定环境变量的当前值
        :set runtimepath? 显示script搜索路径

彩蛋
        :smile

:set 命令 设置

set 的一些选项
        all:列出所有选项设置情况
        term:设置终端类型
        ignorance:在搜索中忽略大小写
        list:显示制表位(Ctrl+I)和行尾标志($)
        number:显示行号
        report:显示由面向行的命令修改过的数目
        terse:显示简短的警告信息
        warn:在转到别的文件时若没保存当前文件则显示NO write信息
        nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符
        nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
        mesg:允许vi显示其他用户用write写到自己终端上的信息

常用设置

:set number    显示行号。缩写:set nu    
:set nonumber  不显示行号。缩写:nonu
:set hlsearch     搜索到的关键字反白显示(默认)
:set nohlsearch     搜索到的关键字取消反白显示。缩写:set noh
:set ic          搜寻时忽略大小写 (ic:ignore case)
:set noic        搜寻时不忽略大小写
:set autoindent        自动缩排(默认)
:set noautoindent    不自动缩排
:set backup        自动存储备份档(备份档名为 filename~)
:set ruler        显示右下角状态说明
:set showmode    显示左下角状态说明(比如 INSERT)
:set backspace=(012)    倒退键设置;

                                      2:可以删除任意值;

                                      0 或1 仅可删除刚刚输入的字符,无法删除原来就存在的字符
:set all    显示所有环境参数设定值
:set    显示与系统默认值不同的设定值
:syntax on    开启语法着色
:syntax off    关闭语法着色
:set bg=dark    开启语法着色深色方案
:set bg=light    开启语法着色浅色方案(默认)

常用配置 1

set modelines=0   "禁用模型行功能

let g:molokai_original = 1    "molokai 主题
colorscheme molokai

"设置bg后会覆盖掉molokai配色
"set bg=dark	 " 开启语法着色深色方案
"set bg=light    " 开启语法着色浅色方案 (默认)

set showmode      " 开启模式显示。显示左下角状态说明(比如 INSERT)
set showcmd       " 在状态行显示目前所执行的命令
set wildmenu      "启用命令行的交互式菜单,显示可能的候选项,使用键盘选择
set cursorline    "突出显示当前行
set ruler         "在右下角显示光标位置的状态行


set cmdheight=2   " 命令行(在状态行下)的高度,默认为1,这里是2 
set laststatus=2  " 总是显示状态行
set scrolloff=3  "光标移动到buffer的顶部和底部时保持3行的距离
set linespace=2  "字符间插入的像素行数目

syntax on         "语法高亮,syntax off 关闭代码高亮
set showmatch     "高亮显示对应的括号
set matchtime=5   "对应括号高亮时间(单位是十分之一秒)
set number        "显示行号。缩写: set nu 。关闭显示:set nonu
set smartindent   "智能对齐
set autoindent    "自动对齐
"set noautoindent "不自动缩进
set cindent       "启用C语言的缩进设置(cindent)
set tabstop       "显示tab长度
set tabstop=4     "设置tab键的宽度
set softtabstop=4 "统一缩进为4
set shiftwidth=4  "统一缩进为4
"set smarttab     "在行和段开始处使用制表符
set expandtab     "用空格替代制表符。set noexpandtab 不用空格代替制表符
set backspace=2	  "倒退键的删除设置
"0 或者 1,仅可删除刚刚输入的字符,无法删除原来就存在的字符
"2:可以删除任意值。为了更好的删除,这里 set backspace=2

set nobackup     "覆盖文件时不备份
set autowrite    "在切换buffer时自动保存当前文件
set autoread     "当文件在外部被改变时,vim自动更新载入
set confirm      "在处理未保存或只读文件的时候,弹出确认框

set foldenable              " 允许折叠
set foldmethod=syntax       " 设置语法折叠
set foldcolumn=0            " 设置折叠区域的宽度
set foldlevel=3             " 设置折叠层数为
setlocal foldlevel=1        " 设置折叠层数为
set nocompatible            " 不要使用vi的键盘模式,而是vim自己的

set completeopt=preview,menu 

filetype on          " 侦测文件类型
filetype plugin on   " 载入文件类型插件
filetype indent on   " 为特定文件类型载入相关缩进文件
" 等同于上面三条命令
filetype plugin indent on   "开启侦测文件类型、开启插件、开启缩进

set background=dark   " 设置背景
set t_Co=256  "256色
set mouse=a   "允许鼠标

"一些特殊字符(如 *、[ 等)会被视为正则表达式中的特殊字符,而不是普通字符。
set magic   

autocmd InsertLeave * se nocul   " 用浅色高亮当前行  
autocmd InsertEnter * se cul     " 用浅色高亮当前行 

set history=1000 "历史纪录数
set ignorecase   " 搜索时忽略大小写
" 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感 
set ignorecase smartcase
set nowrapscan   " 禁止在搜索到文件两端时重新搜索  
set hlsearch     " 搜索到的关键字反白显示
set incsearch    " 输入搜索字符串的同时进行搜索
set nohlsearch    " 关闭搜索高亮 或者 命令模式下输入:nohlsearch
" nohlsearch 是 no highlight search 缩写, 可以简写 noh 或者 set noh

set gdefault   "行内替换
"启用了gdefault选项后,当你使用:s/foo/bar/形式的命令进行替换时
"Vim会替换每一行上的所有foo匹配项为bar,而不仅仅是第一个匹配项。
set encoding=utf-8
set fileencodings=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936,utf-16,big5,euc-jp,latin1 "编码设置

set guifont=Menlo:h16:cANSI "设置字体
set langmenu=zn_CN.UTF-8
set helplang=cn "语言设置

"开启normal 或visual模式下的backspace键空格键,左右方向键,
"insert或replace模式下的左方向键,右方向键的跳行功能
set whichwrap=b,s,<,>,[,]

" 状态行显示的内容(包括文件类型和解码)
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [%{&encoding}]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%Y\ -\ %H:%M\")}
" set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
" set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\   

alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

常用配置 2

github:https://github/ma6174/vim

  • 1.按F5可以直接编译并执行C、C++、java代码以及执行shell脚本,按“F8”可进行C、C++代码的调试
  • 2.自动插入文件头 ,新建C、C++源文件时自动插入表头:包括文件名、作者、联系方式、建立时间等,读者可根据需求自行更改
  • 3.映射“Ctrl + A”为全选并复制快捷键,方便复制代码
  • 4.按“F2”可以直接消除代码中的空行
  • 5.“F3”可列出当前目录文件,打开树状文件目录
  • 6. 支持鼠标选择、方向键移动
  • 7. 代码高亮,自动缩进,显示行号,显示状态行
  • 8.按“Ctrl + P”可自动补全
  • 9.[]、{}、()、""、' '等都自动补全
  • 10.其他功能可以自己研究

完整版

执行命令,自动安装:wget -qO- https://raw.github/ma6174/vim/master/setup.sh | sh -x

下面是精简的,没有插件的vim配置文件,保存到自己的.vimrc文件就能使用。

wget  http://filesblogs/ma6174/vimrc.zip
unzip  -f  vimrc.zip  -d  ~/

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 显示相关  
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"set shortmess=atI   " 启动的时候不显示那个援助乌干达儿童的提示  
"winpos 5 5          " 设定窗口位置  
"set lines=40 columns=155    " 设定窗口大小  
"set nu              " 显示行号  
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\")}   "状态行显示的内容  
set laststatus=1    " 启动显示状态行(1),总是显示状态行(2)  
set foldenable      " 允许折叠  
set foldmethod=manual   " 手动折叠  
"set background=dark "背景使用黑色 
set nocompatible  "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限  
" 显示中文帮助
if version >= 603
    set helplang=cn
    set encoding=utf-8
endif
" 设置配色方案
"colorscheme murphy
"字体 
"if (has("gui_running")) 
"   set guifont=Bitstream\ Vera\ Sans\ Mono\ 10 
"endif 
 
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936
set fileencoding=utf-8
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""新文件标题""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新建.c,.h,.sh,.java文件,自动插入文件头 
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()" 
""定义函数SetTitle,自动插入文件头 
func SetTitle() 
    "如果文件类型为.sh文件 
    if &filetype == 'sh' 
        call setline(1,"\#########################################################################") 
        call append(line("."), "\# File Name: ".expand("%")) 
        call append(line(".")+1, "\# Author: ma6174") 
        call append(line(".")+2, "\# mail: ma6174@163") 
        call append(line(".")+3, "\# Created Time: ".strftime("%c")) 
        call append(line(".")+4, "\#########################################################################") 
        call append(line(".")+5, "\#!/bin/bash") 
        call append(line(".")+6, "") 
    else 
        call setline(1, "/*************************************************************************") 
        call append(line("."), "    > File Name: ".expand("%")) 
        call append(line(".")+1, "    > Author: ma6174") 
        call append(line(".")+2, "    > Mail: ma6174@163 ") 
        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
    "新建文件后,自动定位到文件末尾
    autocmd BufNewFile * normal G
endfunc 
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"键盘命令
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
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'
        :!./%
    endif
endfunc
"C,C++的调试
map <F8> :call Rungdb()<CR>
func! Rungdb()
    exec "w"
    exec "!g++ % -g -o %<"
    exec "!gdb ./%<"
endfunc
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""实用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 设置当文件被改动时自动载入
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 nobackup
"make 运行
:set makeprg=g++\ -Wall\ \ %
"自动保存
set autowrite
set ruler                   " 打开状态栏标尺
set cursorline              " 突出显示当前行
set magic                   " 设置魔术
set guioptions-=T           " 隐藏工具栏
set guioptions-=m           " 隐藏菜单栏
"set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\
" 设置在状态行显示的信息
set foldcolumn=0
set foldmethod=indent 
set foldlevel=3 
set foldenable              " 开始折叠
" 不要使用vi的键盘模式,而是vim自己的
set nocompatible
" 语法高亮
set syntax=on
" 去掉输入错误的提示声音
set noeb
" 在处理未保存或只读文件的时候,弹出确认
set confirm
" 自动缩进
set autoindent
set cindent
" Tab键的宽度
set tabstop=4
" 统一缩进为4
set softtabstop=4
set shiftwidth=4
" 不要用空格代替制表符
set noexpandtab
" 在行和段开始处使用制表符
set smarttab
" 显示行号
set number
" 历史记录数
set history=1000
"禁止生成临时文件
set nobackup
set noswapfile
"搜索忽略大小写
set ignorecase
"搜索逐字符高亮
set hlsearch
set incsearch
"行内替换
set gdefault
"编码设置
set enc=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
"语言设置
set langmenu=zh_CN.UTF-8
set helplang=cn
" 我的状态行显示的内容(包括文件类型和解码)
"set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
"set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
" 总是显示状态行
set laststatus=2
" 命令行(在状态行下)的高度,默认为1,这里是2
set cmdheight=2
" 侦测文件类型
filetype on
" 载入文件类型插件
filetype plugin on
" 为特定文件类型载入相关缩进文件
filetype indent on
" 保存全局变量
set viminfo+=!
" 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-
" 字符间插入的像素行数目
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程序提供自动缩进
set smartindent
" 高亮显示普通txt文件(需要txt.vim脚本)
au BufRead,BufNewFile *  setfiletype txt
"自动补全
: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    " 不要显示折叠树  
autocmd FileType java set tags+=D:\tools\java\tags  
"autocmd FileType h,cpp,cc,c set tags+=D:\tools\cpp\tags  
"let Tlist_Show_One_File=1            "不同时显示多个文件的tag,只显示当前文件的
"设置tags  
set tags=tags  
"set autochdir 
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"其他东东
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"默认打开Taglist 
let Tlist_Auto_Open=1 
"""""""""""""""""""""""""""""" 
" Tag list (ctags) 
"""""""""""""""""""""""""""""""" 
let Tlist_Ctags_Cmd = '/usr/bin/ctags' 
let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的 
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

2、vim 实用技巧

《VIM实用技巧》PDF 下载:http://download.csdn/download/freeking101/9882394
《Vim实用技巧》笔记:http://darksun.blog.51cto/3874064/1548082

1 Vim决问题的方式

  • >G命令会增加当前行到文档末尾的缩进层次

  • Vim中可重复的操作及回退

    目的操作重复回退
    做出修改{edit}.u
    在行内查找下一指定字符[前一个字符]f{char}/t{char};,
    在行内查找上一指定字符[后一个字符]F{char}/T{char};,
    在文档中查询下一处匹配项/pattern<CR>nN
    在文档中查询下一处匹配项?pattern<CR>nN
    执行替换:s/target/replacement&u
    宏操作q{register}{changes}q@{register}u
    执行Ex命令:Ex命令@:(:寄存器总是存储最后一次的Ex命令)u

2 普通模式

  • 学会把 d{motion} 与/查找动作一起使用,可以极大提高效率

  • 改变大小写

    • gU{motion} 修改为大写

    • gu{motion} 修改为小写

    • g~{motion} 大小写翻转

    • gUgU 修改当前行为大写

    • gugu 修改当前行为小写

    • g~g~ 当前行大小写翻转

  • 缩进

    • >{motion} 增加缩进

    • <{motion} 减少缩进

    • ={motion} 自动缩进

  • 数字运算

    • C-a +1

    • C-x -1

  • 虚拟替换模式

    • gR 进入虚拟连续替换模式,它把tab当成一组空格来处理

    • gr 进入虚拟单词替换模式,它把tab当成一组空格来处理

  • 移动

    操作作用
    j k按照实际行向下向上移动
    gj和gk按照屏幕行向下向上移动
    ge反向移动到上一个单词的结尾
    gf跳转到光标所在字符串所表示的文件,通过配置suffixesadd选项,允许省略文件后缀名,通过配置path属性可以省略部分目录信息
    ``当前文件中上次跳转动作之前的位置
    `.上次修改的位置
    `^上次插入的地方
    `[上次修改或复制的起始位置
    `]上次修改或复制的结束位置
    `<上次高亮选区的起始位置
    `>上次高亮选区的结束位置
    H跳转到屏幕最上方
    M跳转到屏幕正中间
    L跳转到屏幕最下方
  • 按子串移动

    子串比单词的范围更大,它仅仅以空白字符作为分隔依据.

    • W 类似w,移动到下一个字串

    • B 类似b,移动到上一个字串

    • E 类似e,移动到子串的字部

    • gE 类似ge,移动到上一个字串的尾部

3 插入模式

  • 更正错误

    • C-h 删除前一个字符

    • C-w 删除前一个单词

    • C-u 删除到行首

  • 返回普通模式

    • ESC 或者 C-[ 切换到普通模式

    • C-o 切换到插入-普通模式

  • 寄存器

    • C-r {register} 访问寄存器中的内容

    • C-r C-p {register} 访问寄存器中的内容

    • C-r = 访问表达式寄存器,通过访问该特殊寄存器可以执行计算式甚至一段Vim脚本

  • 插入特殊字符

    • C-v u {1234} 以4为16进制编码来输入字符

    • 普通模式下ga 显示光标所在的字符编码

    • C-v 非数字键 插入这个按键本身所代表的字符

    • C-k{char1}{char2} 以二合字母插入非常用字符

    • :digraphs 查看可用的二合字母列表

    • :digraph-table 查看另一个更为有用的列表

4 可视模式

  • gv 重选上次的高亮选区

  • o 切换高亮选区的活动端

  • 当实用命令.重复对高亮选区所做的修改时,此修改会重复作用域相同范围的文本

  • 在windows下使用C-q进入列块编辑模式,而在linux下使用C-v进入列块编辑模式,在emacs的evil-mode下,也使用C-v进入列块模式

5 命令行模式

5.1 操作文本的 Ex 命令

命令用途
:[range]delete [register]删除指定范围的行到register中
:[range]yank [register]赋值指定范围的行到register中
:[line]put [register]在指定行后粘贴register的内容
:[range]copy {address}将指定范围的行拷贝到{address}所指定的行之下
:[range]move {address}将指定范围的行移动到{address}所指定的行之下
:[range]join连接指定范围的行
:[range]normal {commands}对指定范围的每一行执行普通命令
:[range]substitute/{pattern}/{string}/{flag}正则替换
:[range]global/{pattern}/{cmd}对给定范围内匹配的行,在上面执行Ex命令
:[range]vglobal/{pattern}/{cmd}global的取反
:[range]global!/{pattern}/{cmd}global的取反
:grep /vimgrep搜索关键字

5.2 range服务说明

符号地址
N文件的第N行
$文件的最后一行
0虚拟行,位于文件第一行的上方
.光标所在行
'm包含位置标记m的行
'<高亮选区的起始行
'>高亮选区的结束行
%整个文件(:1,$的简写形式)

5.3 补全

  • C-d 显示可用的补全列表

  • Tab 自动补全

  • C-r C-w 插入光标下的单词

  • C-r C-a 插入光标下的子串

5.4 命令行窗口–使用vim的编辑能力编辑Ex命令

命令动作
q/打开查找命令历史的命令行窗口
q:打开Ex命令历史的命令行窗口
C-f从命令行模式切换到命令行窗口
:help cmdwin查看命令行帮助

5.5 执行外部命令

命令用途
:shell  或者  :sh启动 shell
:!{cmd}在 shell 中执行 cmd
:read !{cmd}在 shell 中执行 cmd,并把标准输出插入到光标下方

[range]write !{cmd}

缩写为::[range]w !<cmd>

在 shell 中执行 {cmd},以 [range] 作为其标准输入。

w !sh 是写入给<cmd>命令作为输入,注意 w 后面有空格

w!<cmd>是写入名为<cmd>的文件,注意 w 后面没空格

[range]!{fiter}使用外部命令 {filter} 过滤指定的 [range]

read

  • 1.:r!<cmd>读取 ls 的输出(插入内容),read 后可加空格
  • 2:%!<cmd>读取命令输出 (替换全文内容)
  • 3:.!<cmd>读取命令输出 (替换当前行内容)
  • 4.!!<cmd>读取命令输出 (替换当前行内容)。这种是直接在 normal模式下执行的,不需要切换至命令模式。其实输入了 !! 后,vim 就自动转换到 :.! 等待你继续输入

多个文件重命名,把*.c 更名为*.cpp。
:r !ls *C
:%s/\(.*).c/mv & 1.cpp
:w !sh

6 管理多个文件

6.1 缓冲区列表管理

命令用途
:ls列出缓冲区列表
:bnext上一个缓冲区
:bprev下一个缓冲区
:bfirst列表开头的buffer
:blast列表结尾的buffer
:buffer N第N号buffer
:buffer {bufname}匹配bufname的buffer
:bdelete N1 N2…删除buffer
:N,M bdelete删除buffer
:bufdo在:ls列出的所有缓冲区执行Ex命令

6.2 参数列表

参数列表记录了在启动时作为参数传递給Vim的文件列表. 通过设置参数列表,可以通过:nexthe :prev来打开下一个/上一个文件

  • :args 显示当前参数列表的内容

  • :args {filelist} 设置文件列表

  • :args {文件通配符} 设置符合文件通配的文件列表

    其中,

  1. *符号用于匹配0到多个字符,但范围仅限于指定的目录

  2. ** 也匹配0到多个字符,范围递归进入目录的子目录

:args `shell命令` 以shell命令的输出作为参数列表的值:argdo命令在列表中的每个缓冲区上执行同一条命令在使用:argdo/:bufdo前,最好启用'hidden'设置.启用hidden选项后,如果活动的缓冲区的内容发生了变化,Vim会在离开该缓冲区时自动将其隐藏. 否则Vim会阻止离开该缓冲区. 这样我们就无法用:argdo或:bufdo命令来修改一组缓冲区.

6.3 窗口操作

操作用途
C-w s水平分割当前窗口
C-w v垂直分割当前窗口
:split {file}水平分割当前窗口,并在新窗口载入file
:vsplit {file}垂直分割当前窗口,并在新窗口载入file
C-w w在窗口间循环切换
C-w c或:close关闭活动窗口
C-w o或:only只保留活动窗口,关闭其他所有窗口
C-w =使所有窗口等宽,等高
C-w _最大化活动窗口的高度
[N]C-w _将活动窗口的高度设为N行
C-w 竖线类似C-w _,但设置窗口的宽

6.4 标签页操作

Vim的标签页是可以容纳一系列窗口的容器,它类似于Linux中的虚拟桌面的概念

命令用途
:tabedit {filename}在新标签页打开{filename}
C-w T把当前窗口移到一个新标签页
:tabclose关闭当前标签页
:tabonly只保留当前标签页,关闭其他标签页
:tabnext{n}或{N}gt切换到编号为{N}的标签页
:tabnext或gt切换到下一个标签页
:tabprevious或gT切换到上一个标签页
:tabmove [N]将当前标签页移动到第N个位置,默认为最后一个位置

7 打开及保存文件

7.1 打开文件

  • :pwd 查看当前工作目录,所谓工作目录只的是vim启动时的那个目录,该目录 不随着 buffer路径的不同而不同

  • :edit %<TAB> %符号代表缓冲区中的完整路径

  • :edit %:h :h修饰符会去除文件名,但保留路径部分,使用这种方式可以快速打开与活动缓冲区中文件属于同一个目录的文件

7.2 使用find查找文件

:find命令运行我们通过文件名打开一个文件,而无需输入该文件的完整路径.

在使用该功能前先需要配置path选项

  1. :set path+=app/**

  2. :find recvfrommb<tab>

7.3 使用netrw管理文件系统

8 寄存器

  • 使用寄存器

    "{register}复制/删除操作

  • 无名寄存器

    若没有指定寄存器,则Vim缺省使用无名寄存器,可以使用""表示. 它是极其易变的

  • 复制专用寄存器

    使用y{motion}时,不仅会把内容存入无名寄存器,而会存入复制专用寄存器,可用"0来表示

  • 有名寄存器

    用小些字母a-z引用寄存器,会覆盖原寄存器内容. 而用大写字母A-Z引用寄存器,则会将新内容添加到该寄存器的原有内容之后

  • 黑洞寄存器

    使用"_来引用,该寄存器不保存任何内容

  • 系统剪贴板

    使用"+来引用,该寄存器与系统剪贴板相关联

  • 主剪贴板

    X11视窗支持另一种叫做主剪贴板的剪贴板(primary),它高村者上次被高亮选中的文本,可用用鼠标中键把他们粘贴出来. 使用"*来引用

    Windows/Mac OS没有主剪贴板的概念,因此"*也代表系统剪贴板

  • 其他寄存器

    寄存器内容
    "=表达式寄存器
    "%当前文件名
    "#轮换文件名
    ".上次插入的文本
    ":上次执行的Ex命令
    "/上次查找的模式

9 宏

  • 对多行同时执行某个宏

    • [range]normal @{register}

    • global/pattern/@{register}

  • 对多个文件同时执行宏

    • :argdo normal @{register}

    • :bufdo normal @{register}

10 模式匹配

10.1 调整大小写敏感

  • 匹配式中任何地方出现\C则表示开启大小写敏感模式

  • 匹配式中任何地方出现\c则表示大小写不敏感模式

10.2 调整正则表达式的匹配模式

  • \v表示开启very magic搜索模式,即假定除_,大小写字符和数字之外的所有字符都具有特殊含义

  • \V表示开启very nomagic原义开关,即默认消除大多数字符上的特殊含义.

10.3 特殊匹配符

  • <匹配左定界符

  • >匹配右定界符

  • \_s匹配空格或者回车符

  • %()只使用括号的分组功能,不捕获其内容

  • \ze和\zs对匹配进行裁剪

    一个匹配的边界通常对应于一个模式的起始与结尾. 但我们可以使用元字符\zs和\ze对匹配进行裁剪,使其成为这个完成模式的一个子集.

    \zs标志着一个匹配的起始,\ze用来界定匹配的结束

10.4 统计当前模式的匹配个数

使用:%s///gn就可以统计当前模式的匹配个数

标志位n会抑制正常的替换动作. 该命令不会对每次匹配进行替换,而是简单地统计匹配的次数

11 查找功能

  • /pattern//e 定位到查找匹配的结尾

  • // 将查找域留空,则Vim将重用上一次的查找模式

  • 类似的s//中将查找域留空,Vim也会重用上一次的查找模式

  • normal模式下q/打开查询历史的命令行窗口

12 替换功能

12.1 标志位总结

标志位功能
g修改一行内的所有匹配
c让我们有机会可以确认或拒绝每一处修改
n不真正作替换,而只报告本次substitute命令匹配的个数
e屏蔽错误提示
&指示Vim重用上一次substitute命令所用过的标志位

12.2 替换域中的特殊字符

具体可用过:h sub-replace-special来查询完整的列表

符号描述
\r插入一个换行符
\t插入一个制表符
\\插入一个反斜杠
\{数字}插入第N个子匹配
\0插入匹配模式的所有内容
&插入匹配模式的所有内容
~使用上一次调用substitute时的替换域
\={Vim Script}插入{Vim Script}表达式的结果

12.3 使用寄存器内容

在命令模式下也能通过C-r{register}的方式来将寄存器内容插入命令行.

因此在输入查询域时可以用C-r\来代替

12.4 重复上一次substitute命令

  • 使用g&在整个文件范围内重复substitute命令

  • 使用[range]&&在指定范围内重新执行替换操作.

  • normal模式下的&命令是:s的同义词,用于重复上一次的替换操作.但它不包含替换的标志位.

13 Quckfix列表与位置列表

对于每一条用于填充quickfix列表的命令都有一条对应的命令,把结果保存到位置列表.

:make,:grep以及:vimgrep会实用quickfix列表,而:lmake,:lgrep,:lvimgrep实用位置列表.

这两者的区别在于在任一特定的时刻,只能有一个quickfix列表,而位置列表却可以有多个.

命令用途
:cnext跳转到下一项
:cprev跳转到上一项
:cfirst跳转到第一项
:clast跳转到最后一项
:cnfile跳转到下一个文件的第一项
:cpfile跳转到上一个文件的最后一项
:cc N跳转到第N项
:copen打开quickfix窗口
:cclose关闭quickfix窗口
:colderquickfix的前一个版本
:cnewquickfix的后一个版本

位置窗口的操作,只需要把quickfix的命令起始字符改为l即可

14 与外部程序的交互

  • makeprg选项允许我们指定运行:make时所调用的程序

  • errorformat选项允许我们告诉Vim如何解析:make产生的结果

  • grepprg选项允许我们指定允许:grep所调用的程序

  • grepformat选项指示Vim如何解析来自:grep命令的输出结果

  • :vimgrep命令允许我们实用Vim自带的正则表达式引擎,实现跨越文件的查找功能

    :vimgrep[!] /{pattern}/[g][j] {files}

15 Vim中的补全功能

  • ignorecase选项会影响到补全时的大小写敏感问题

  • 触发自动补全的方法

    命令补全类型
    C-n普通关键字,可以通过设置complete选项来定制普通关键字补全时所扫描的位置
    C-x C-n当前缓冲区关键字
    C-x C-i包含文件关键字,Vim本身就理解C语言的包含方式,但通过设置include选项,我们也可以让它了解其他语言的对应提示符
    C-x C-]tag文件关键字
    C-x C-k字典查找,可以通过dictionary选项来指定一个或多个含有单词列表的文件
    C-x C-l整行补全
    C-x C-f文件名补全,需要注意的是,Vim的文件自动补全功能只相对于工作目录的路径进行扩展,而不是相对于当前编辑文件的路径. 可以通过:cd命令来却换工作目录,:cd -切换到之前的工作目录
    C-x C-o全能补全
  • 与自动补全的弹出式菜单相互交互

    按键作用
    C-n / C-p实用下一个/上一个匹配项
    C-y确认选用当前选中的匹配项
    C-e还原最少输入的文本
    C-h /BackSpace从当前匹配项删除一个字符
    C-l从当前匹配项增加一个字符
    {char}中止补全,并插入字符

16 拼写检查

16.1 Vim拼写检查器的基本命令

命令用途
:set spell开启检查
[s 或 ]s在拼写错误间响应地进行反向及正向的跳转
z=来获取Vim提供的更正建议列表,也可以使用N z=来跳过提示,直接采纳第N个更正建议
zg把当前单词添加到拼写文件
zw将当前单词从拼写文件中删除
zug撤销对当前单词的zg或zw命令

16.2 使用其他拼写字典

Vim默认以英文字典作为拼写字典,通过配置spelllang选项可以让我们更改 本地缓冲区 的缺省设置.

如果我们试着加载某个尚未支持的拼写文件,Vim会自动为我们提供下载和安装的方法

通过配置spellfile选项,我们可以指定一个文件路径,用于保存由zg和zw命令所添加,删除的单词

spellfile可以设置多个文件,在zg前加上数字标号能指定添加到那个文件中

16.3 在插入模式下更正拼写错误

在插入模式下按C-x s 或C-x C-s会触发一个特殊的自动补全(参见compl-spelling).

Vim会从光标位置开始进行反向扫描,直到发现一处拼写错误为止;然后提供更正建议.

3、vim 常用 操作

vim 键位图

vim键位图如果网页图片看不清,可以 “右键->在新标签页中打开图片” 查看)

英文版(基础版)

简体中文版(基础版)

程序员定制版

https://blog.csdn/zhlh_xt/article/details/52458672

vim 常用操作

进入 vi 的命令

    vi filename :          打开或新建文件,并将光标置于第一行首
    vi +n filename :      打开文件,并将光标置于第n行首
    vi + filename :       打开文件,并将光标置于最后一行首
    vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
    vi -r filename :      在上次正用vi编辑时发生系统崩溃,恢复filename
    vi filename....filename :打开多个文件,依次进行编

"Insert Mode、Command-line"  --->  Normal Mode

    按下ESC键

Normal Mode  --->  Insert Mode

    (i=insert、a=append、r=replace、o=open)。
    i    小写字母i,在  光标前  插入
    a    小写字母a,在  光标后  附加文本
    I    大写字母I,在  本行行首  插入文本。在光标所在行的第一个非空格处插入
    A    大写字母A,在  本行行尾  附加文本
    o    小写字母o,在光标所在行的  下一行  处插入新行
    O    大写字母O,在光标所在行的  上一行  处插入新行
    r    小写字母r,替换光标所在处的字符一次
    R    大写字母R,持续替换光标所在处的字符,直到按下ESC

Normal Mode  --->  Command-line Mode

    :w                     保存文件
    :w <filename>          另存为名为filename文件
    :w! filename           强制保存到指定文件,文件存在则覆盖
    :wq! filename          强制保存到指定文件,文件存在则覆盖,并退出
    :n1,n2 w <filename>    将n1行到n2行的数据另存为名为filename文件
    :w!                    强制保存文件(前提是用户有修改文件访问权限的权限)
    :q                     退出缓冲区,即退出vi,如果文件修改但没有保存,会提示无法退出
    :q!                    不保存文件,直接退出 。
    :wq!                   保存并强制退出
    :wq                    保存退出。
    :x                     如果文件有更改,则保存后退出,否则直接退出。
    ZZ                     (Normal 模式下 ZZ)同 :wq
    :wq!                   强制保存文件并退出缓冲区(前提是用户有修改文件访问权限的权限)

    :e filename         打开文件filename进行编辑
    :x                  保存当前文件并退出
    :!command           执行shell命令command(也就是在VIM里面执行shell命令)
    :n1,n2 w!command    将文件中 n1 行至 n2 行的内容作为command 的输入并执行之,
                        若不指定n1,n2,则表示将整个文件内容作为command的输入
    :r!command          将命令command的输出结果放到当前行
    :r 文件名            在光标所在处插入一个文件的内容。(read)
    :r /etc/passwd       在打开的文件中,在光标所在处读入/etc/passwd内容
    :3r /etc/passwd      在打开文件的第3行开始读入 /etc/passwd的所有内容。
    :35 r 文件名         将文件插入至 35 行之后。

    打开一个文件编辑后才知道登录的用户对该文件没有写的权限,不能存盘,
    需要将所做修改存入临时文件。
    vi file
    :w /tmp/1 

    把第20~59行之间的内容存盘成文件/tmp/1,我们可以键入如下命令。
    vi file
    :20,59w /tmp/1

命令 ( 末行 ) 模式

因为命令模式下,光标都是在最后一行,所以 "命令模式" 又叫做 "末行模式"

set:设置
        set nu number
        set nonu nonumber
        set readonly
        
/:查找
        /after(查找指定字符串)
        n,N(向下跳,向上跳)
        ?向上查找
        !:执行命令
        :!ls -l /
        
s 查找并替换
        s/str1/str2/gi
        /:临近s命令的第一个字符为边界字符:/,@,#
        g:一行内全部替换
        i:忽略大小写
 
范围
        n:行号
        .:当前光标行
        +n:偏移n行
        $:末尾行,$-3
        %:全文

"可视、块(矩形)" 模式 (选择文本)

区域选择

按键说明
v字符选择,移动游标,游标经过的地方会反白选择
V行选择,移动游标,游标经过的行会反白选择
Ctrl + v区块选择,移动游标以长方形方块的方式反白选择
y复制反白选择的地方
d删除反白选择的地方
p将之前复制的区块,粘贴在游标所在处

vim 块选择
        V: 字符选择,会把光标经过的位置反白选择
        v: 行选择,会把光标经过的行反白选择
        Ctrl + v: 块选择,可以使用长方形的方式反白选择内容
        y: 将反白的地方复制
        d: 将反白的地方删除
其中 V 或者 v 来选择内容都可以使用 鼠标 来完成,至于块选择就比就特殊了。
如图,使用 Ctrl+v 来选择图中矩形反白的部分,可以按y进行复制,或者按d删除。

可视模式 (选择文本):在 vim 中选中指定字符,进行 复制、剪切、粘贴。

进入vim 中 visual 模式的 3 种方式:   

  • 在普通模式 按 v(小写字母v):按字符移动,选中文本。 可以使用 j/k/h/l 进行文本选择
           
            d  : 剪切操作
            y  : 复制操作
            >> : 右移
            << : 左移
  • 在普通模式 按 V (大写字母V):选择一行,按行移动,选中文本。
  • ctrl+v:按下 ^v ( ctrl + 小写字母v) 后 ,可进行矩形的选择。
    在块模式下,可以进行多列的同时修改,修改方法是:
    首先进入块模式 Ctrl+ v,使用按键 j/k/h/l 进行选中多列。
    按键 Shift + i 进行 块模式下的插入,输入字符之后,按键 ESC,完成多行的插入。
      对于选中的文本进行如下按键:
      d:剪切操作
      y:复制操作
      p:粘贴操作
      ^:选中当前行,光标位置到行首(或者使用键盘的HOME键)
      $:选中当前行,光标位置到行尾(或者使用键盘的END键)
      :join  合并多行
      J    合并两行

vim 分屏 (多视窗)

按键说明
:sp [filename]开启一个新视窗。如果有加 filename,表示是在新视窗开启一个新文件;否则,表示两个视窗为同一个文件的内容(即同步显示)
[ctrl]+w+向下方向键先按下[ctrl]不放,然后再按下 w 后放开所有按键,最后再按下向下方向键,游标就会移动到下方的视窗
[ctrl]+w+向上方向键按键方法同上,游标会移动到上方的视窗
[ctrl]+w+q关闭当前游标所在的视窗

Vim 分屏(:split 文件名  同时在一个页面显示多个文件的内容,类似多窗口,用切换当前窗口。
       多窗口是split,用 e 打开多个文件是将文件放在缓冲区中)
  sp: 上下分屏,后可跟文件名。  :sp 001.txt
  vsp: 左右分屏,后可跟文件名   :vsp 001.txt
  Ctr+w+w:在多个窗口切换
  wqall:保存退出关闭所有。 
  qall:退出所有

    启动分屏:
            1.使用 大写O 参数进行垂直分屏  vim -On file1 file2 ...
            2.使用 小写o 参数进行水平分屏  vim -on file1 file2 ...
            注: n 是数字,表示分屏的数量,n 要大于等于文件个数
    关闭分屏
            1.关闭当前窗口 ctrl+w c (同时按下ctrl和w,松开按下c)      
              关闭分割窗口可以用:close,剩下只有一个窗口的话就不能关了。
            2.关闭当前窗口,如果只剩最后一个,则退出vim。ctrl+w q
    编辑中分屏
            1.上下分割当前打开的文件              ctrl+w s
            2.上下分割,并打开一个新的文件        :sp filename
            3.左右分割当前打开的文件              ctrl+w v
            4.左右分割,并打开一个新的文件        :vsp filename
    分屏编辑中光标的移动
            vi 中的光标键是 h,j,k,l,要在各个屏之间切换,只需要先按一下ctrl+w
            1.把光标移动到上边的屏         ctrl+w k
            2.把光标移动到下边的屏         ctrl+w j
            3.把光标移动到右边的屏         ctrl+w l
            4.把光标移动到左边的屏         ctrl+w h
            5.把光标移动到下一个的屏       ctrl+w w
    移动分屏
            1. 当前分屏向上移动         ctrl+w K
            2. 当前分屏向下移动         ctrl+w J
            3. 当前分屏向右移动         ctrl+w L
            4. 当前分屏向左移动         ctrl+w H
    屏幕尺寸
            1.增加高度                 ctrl+w +
            2.减少高度                 ctrl+w -
            3.让所有屏的高度一致       ctrl+w =
            4.左加宽度                 ctrl+w >
            5.右加宽度                 ctrl+w <
            6.右增加n宽 (如:n=30)     ctrl+w n <

光标移动、光标字符、光标词、光标页

在 vi 中,"移动光标 (普通模式)" 和 "编辑(编辑模式)" 是2件事。

移动游标

按键说明
h 或向左方向键游标向左移动一个字元
j 或向下方向键游标向下移动一个字元
k 或向上方向键游标向上移动一个字元
l 或向右方向键游标向右移动一个字元
[ctrl]+[f]屏幕向下移动一页,相当于[Page Down](常用)
[ctrl]+[b]屏幕向上移动一页,相当于[Page Up](常用)
[ctrl]+[d]屏幕向下移动半页
[ctrl]+[u]屏幕向上移动半页
n+[Space]n 表示数字,按下数字后再按空格键,游标会向右移动到这一行的第 n 个字元。
功能键[Home]或 0游标移动到这一行的第一个字元处
功能键[End]或 $游标移动到这一行的最后一个字元处 (常用)
H游标移动到这个屏幕最上方那一行的第一个字元
M游标移动到这个屏幕中央那一行的第一个字元
L游标移动到这个屏幕最下方那一行的第一个字元
G游标移动到这个档案的最后一行 (常用)
nGn 为数字。游标移动到这个档案的第 n 行
gg游标移动到这个档案的第一行 (常用)
n+[Enter]n 为数字。游标向下移动 n 行 (常用)

Ctrl+o        回到光标的上一位置
h、j、k、l    移动光标命令:左、下、上、右。
$             光标移动到行尾(End),注意要按Shift键
0             (注意是数字零)光标移至当前行首(Home)
^             光标移动到行首第一个非空白字符(Home),注意要按Shift键
space         光标右移一个字符
Backspace     光标左移一个字符
Enter         光标下移一行

''   此命令相当有用, 它移动光标到上一个标记处, 比如用 gd, * 等查
     找到某个单词后, 再输入此命令则回到上次停留的位置
'    此命令相当好使, 它移动光标到上一次的修改行
`    此命令相当强大, 它移动光标到上一次的修改点

光标 "词操作、句操作、行操作、段操作、页操作"

词操作
        w 或 W        光标右移一个字至字首
        b 或 B        光标左移一个字至字首
        e 或 E        光标右移一个字至字尾

句操作
        )     光标移动到后一句的句首
        (     光标移动到前一句的句首
        }     光标移动到下一段的段首
        {     光标移动到上一段的段首
        nG     定位到 第 n 行首 (G 是goto 的意思)
        :n     定位到 第 n 行
        gg     移动到文件第一行行首
        G      移动到文件最后一行。
        Ctrl+G   光标所在位置的行数和列数报告
        数字n   光标向下移动 n 行。正常模式下,按下数字5,然后回车,代表向下移动5行。
        n+     光标下移n行,例如10+。 
        n-     光标上移n行,例如5-。
        n$     光标移至第n行尾

光标页操作。屏幕翻滚类命令
        Ctrl+f   向下翻页(Pagedown)
        Ctrl+b   向上翻页(Pageup)
        Ctrl+d   向下翻半页
        Ctrl+u   向上翻半页
        nz:     将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。
        H        光标移至屏幕顶行(Head)
        M        光标移至屏幕中间行(Middle)
        L        光标移至屏幕最后行(Last)

高效移动

光标移动效率是vim程序员达到甚至超过鼠标流程序员的关键技能。vim中的移动光标的方式有很多,我来举几个我实际使用过程中应用比较频繁的技巧:

set relativenumber(显示相对行号)。我无意间发现的一个十分实用的技巧,比set number显示行号更好用。通过这个设置,行号的显示会根据当前的光标的相对位置显示成偏移数,并动态变化。这个好处是,可以利用数字+j 数字+k来进行多行跳转,因为是编译行数,所以数字不会太大。否则就算要向下移动10行,我们可能也需要用138gg

  • web:按照单词进行前后光标跳转,也可以组合数字进行跳转,不过以我的经验,与其去算要跳多少个单词,不如多按几次吧。

  • IA:移动到行首或行末的第一个字符处,并进入插入模式。

  • HML:光标分别跳转到可视区域的最上面、中间、最下面。

  • Ctrl+DCtrl+U:有时,需要看的文本不在可视区域,通过这些组合进行上下翻页。

  • ^$0:光标移动到行首和行尾(0是绝对行首)。不过因为^$都需要同时按住shift,而且数字键我们往往难以盲打,所以我一般直接使用I+EscA+Esc

  • %:移动到与当前括号匹配的括号处。

  • gjgk:有时可视区域不够宽,而一行的字符有很多,导致了wrap。那么通过jk是无法直观的定位到同一物理行,却不在同一个可视行里的位置,此时需要gjgk

  • fF:通过上面的例子,我们知道,f是find的意思,可以在一行内查找某个字符出现的位置,并直接跳转过去。比如f<可以从当前光标开始向右,找到第一个<,并移动过去。F是向左查找。

  • ;:重复上一次的f查找操作

  • .:重复上一次的修改操作,跟;可以说是好基友,经常用来实现一些简单的重复操作,比录制宏要简单很多。经常有意识的使用这种简单重复,是vimer编辑思路进阶的分水岭。

vim 分屏 打开多个文件

1、用 vim 打开一个文件,例如:test.cpp
2、命令 (冒号) 模式 :sp 横向分屏。vsp 纵向分屏。分屏的窗口打开的是同一个文件。
3、命令 (冒号) 模式 :e test_new.cpp 在其中一个窗口里打开另一个文件。
4、普通模式:ctrl+w,再按一下 w,可以在两个窗口之间切换

5、v 模式下 可以选择文本,然后按 y 可以复制选中的文本,切换到其他分屏,按 p 就可以实现两个分屏文件之间的 复制

vim 同时 打开多个文件

同时编辑2个文件,拷贝一个文件中的文本并粘贴到另一个文件中。
  vi file1 file2
  yy 在 文件1 的光标处拷贝所在行
  :n 切换到下一个文件 (n=next)
  p 在 文件2 的光标所在处粘贴所拷贝的行
  :N 切换回上一个文件

Vim 跨文件 复制

现在把 a.txt 的三行复制到 b.txt
1、用 vim 打开 a.txt
    # vim a.txt
    Esc 进入指令模式(默认刚打开就是这个模式)
    输入"a3yy
    解释:引号要结合shift输入,a 代表剪贴板 a(26个英文字母都可以),3yy当然代表从当前行复制3行了
    退出a.txt
    :q
2、打开 b.txt
    光标移动到你想要复制的位置
    进入指令模式,输入"ap
    解释:引号要结合shift输入,a 代表使用剪贴板 a,p 当然代表粘贴了

vim 复制到 系统 剪贴板

1、首先查看 vim --version | grep clipboard 中 clipboard 选项是否开启
2、ubuntu 中通过下载 vim-gnome 可以开启系统剪贴板 sudo apt-get install vim-gnome
3、复制粘贴通过 "+y 和 "+p 实现 (在一般模式下按 v 进入visual 模式 G 全选后复制)

vim 命令模式:拷贝,粘贴

在 vim 的普通模式下,输入':' 进入命令行模式,然后在屏幕下方输入让 vim 执行的命令。但有时需要在命令行中执行拷贝粘贴,

例如:我们想要查找替换正文中的特殊字符,但我们又不知道怎么在命令行中输入这个特殊字符。查找还好说,不一定非要在命令行中输入这个特殊字符,只要把光标放在这个特殊字符上,按'*'向下查找,按'#'向上查找。但是如果我们要替换这个特殊字符,就必须在命令行中输入它了,但是又不知道怎么输入这个特殊字符,怎么办?
答案是拷贝粘贴,先在正文中复制这个字符,然后粘贴在命令行中。

可是怎么在命令行中实现粘贴呢?别急,介绍一个好东西:命令行窗口。在正常模式下,输入'q:',就打开了命令行窗口。命令行窗口中都是我们输入过的命令,在这个窗口中我们可以像编辑正文一样编辑新的命令,或修改旧的命令。因为像编辑普通缓冲区一样,自然可以拷贝粘贴了。编辑完之后,在想要执行的命令上按回车,就ok了。命令执行后,命令行窗口也自动关闭了。

格式化、排版、缩进、tab、折叠

补齐

按键说明
[ctrl]+x -> [ctrl]+n依据目前正在编辑的文件内容作为关键字,予以补齐(语法依据副档名)
[ctrl]+x -> [ctrl]+f依据当前目录下的文件名,予以补齐
[ctrl]+x -> [ctrl]+o以副档名作为语法关键字,予以补齐

如果出现 vim 鼠标右键不能复制粘贴并且进入visual,可能是终端配置问题,把 Xterm 模式改为 linux 模式。或者设置 set mouse-=a【用来开启鼠标功能的,a表示所有模式】

gg=G    (自动格式化全部代码)
mG=nG(自动格式化第m到第n行)
==         (格式化当前行)

排版
    :le<ft>     光标所在行左对齐(left)
    :ri<ght>    光标所在行右对齐(right)
    :ce<nter>   光标所在行居中(cneter)
    gg=G        可用于代码的自动缩进排版
    [n]>>       从光标所在行开始向下[n]行文本行右移一个tab操作(编程时格式对齐有用)
    [n]<<       从光标所在行开始向下[n]行文本行左移一个tab操作(编程时格式对齐有用)

缩进代码
  >    行左移。可视模式(按v键后)。选中文本左移。该命令用于调整源码缩进格式简便速。
  <    行右移。可视模式(按v键后)。选中文本右移。该命令用于调整源码缩进格式简便快速。
  v    选定后按 = 就是自动格式化代码,自动缩进,内部的递归的缩进都做到了

函数间跳转
        ctrl+] 和 ctrl+T    分别是查找函数的定义和返回, 需要ctag的支持
        i                 跳转到光标所指标识符的定义行,是打开一个新的小窗口显示,记住要加个 i,
                          最好是找自己项目下的文件,否则找库函数的话还不如man.
        大写 K       看光标所指标识符的 man 帮助页

TAB 就是制表符
    >                    输入此命令则光标所在行向右移动一个 tab。
    5>>                  输入此命令则光标后 5 行向右移动一个 tab。
    :12,24>              此命令将12行到14行的数据都向右移动一个 tab。
    :12,24>>             此命令将12行到14行的数据都向右移动两个 tab。

vim 设置 tab 空格个数
        :set shiftwidth=4  设置自动缩进 4 个空格, 当然要设自动缩进先。
        :set sts=4         即设置 softtabstop 为 4. 输入 tab 后就跳了 4 格。
        :set tabstop=4     实际的 tab 即为 4 个空格, 而不是缺省的 8 个。
        :set expandtab     在输入 tab 后, vim 用恰当的空格来填充这个 tab。

折叠代码
    zf      进行折叠, 用 zo 打开折叠,也可以方向键向右打开折叠,
    zc      折叠 (只要在被折叠的块中的任一个语句就行)
    zi      展开所有折叠
    zC      对所在范围内所有嵌套的折叠点进行折叠
    zo      展开折叠
    zO      对所在范围内所有嵌套的折叠点展开

编辑

一般指令模式切换到编辑模式

按键说明
:w将编辑的文件写入硬盘 (常用)
:w!如果文件为只读状态,可以强制写入硬盘,是否写入成功,与你所拥有的文件权限有关
:q离开 vi (常用)
:q!即使文件未保存,仍强行离开 vi
:wq文件写入硬盘后(即保存)离开 vi (常用)
:wq!文件强制写入硬盘后(即保存)离开 vi
ZZ大写字母 Z,如果文件没有修改,则直接离开;如果文件被修改,则保存后离开
:w [filename]将当前文件另存为另一个文件,这个新文件的保存路径为当前路径
:r [filename]在当前文件中读入另一个文件的数据,插入到当前游标所在列的后面
:n1,n2 w [filename]将第 n1 行到第 n2 行的数据储存为新的文件
:! command暂时离开 vi 到指令列模式下执行 command 的显示结果

注意: ! 表示强制执行

    :n1,n2 co n3      将n1行到n2行之间的内容“拷贝”到第n3行下
    :.,5 copy 10      把从当前行开始直至后序第5行的内容“复制”到第10行之后
    :6,$ co 2         把从第6行开始至文件尾的内容“复制”到第2行之后
    :n1,n2 m n3       将n1行到n2行之间的内容“移至”到第n3行下
    :1,5 move 12      把第1行到第5行的内同“移动”到第12行之后
    :n1,n2 d          将n1行到n2行之间的内容删除
    :1,5 delete       删除第1行到第5行内容

[n]s      从当前光标位置处开始,以输入的文本替代指定数目的字符。加上n代表替换n个
S         删除光标所在行。即清空光标所在行。按esc 键结束
C         替换光标位置开始直至行尾的所有数据内容。清空光标所在位置到行尾内容。
ncw或nCW  修改指定数目的字
nCC       修改指定数目的行
[n]cc     删除整行,但是删除的行不会消失,而是变为空,然后可以修改整行的内容。
cw        删除一个单词并进入插入模式,   cc:删除一行并进入插入模式。
J         把下一行合并到当前行尾
v(view)->选中内容->d    先在命令模式下按v,再使用方向键选择内容,然后按d删除选中的内容

"?nyy   将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyw   将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyl   将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
"?p     取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
ndd     将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存

高效修改

vim 的另一个优势是高效修改。在vim下修改就要改掉传统鼠标流的思维方式,切忌提到修改就按i。有很多高效的修改办法,而且这些办法往往是可重复的。下面举一些我常用的例子:

  • r:替换模式,替换当前光标所在位置的一个字符。虽然你同样可以i进入插入模式,然后删掉那个字符,再输入需要的字符,但这种操作是鼠标流思维方式。替换是一个可重复操作,多用没坏处。

  • cwchange word可以删除从当前位置到一个单词的结尾,并进入插入模式。这种操作常用于修改一个变量。比如对于:int count=0;希望把count改成cnt,那么当光标位于c字符处的时候,按cw可直接删除count,并进入插入模式。然后直接继续输入cnt即可。

  • cawchange a word可以删除当前光标所在位置的单词。对于int count=0;的例子,如果此时光标在count中间某处,比如u处,直接键入caw可以达到同样的效果。所以caw更强大一些。

  • c$c^:举一反三,可以猜到c$是从当前位置删除到行尾,并进入插入模式。

  • ci"change inside "可以用于修改当前位置附近,在相同配对的"中的内容。比如对于const char *str="hello world";。当在双引号中间的任意位置键入ci"可以直接清空字符串,并继续输入新的希望的字符串。

  • ci(ci[:举一反三change inside ( change inside [

  • cit:这个比较特殊,可以直接编辑匹配的xml标签中的内容!经常编写html的童鞋可以熟悉一下。

  • yi"yank inside " 猜猜是啥意思?类似ci"只是把编辑操作编程复制操作,因为y是复制!是不是很强大。

  • ya"yank around " 复制整个字符串,包括双引号。

  • ywyawdawd$...:好了,这些可以"发明"出来了。

  • oO:向下向上增加空行

  • uCtrl+r:undo和redo

上面的例子体现了vim组合的思想,很多命令可以通过组合得到不同的效果。

删除、复制、粘贴

按键说明
[Del] 或 x向后删除一个字元 (常用)
X向前删除一个字元 (常用)
nxn 为数字,表示连续向后删除 n 个字元
dd删除游标所在的那一行 (常用)
nddn 为数字,删除游标所在的那一行往下数 的 n 个行 (常用)
d1G删除游标所在的那行到第一行的所有数据
dG删除游标所在的那行到最后一行的所有数据
d$删除游标所在处到该行的最后一个字元
d0是数字 0,删除游标所在处到该行的第一个字元
yy复制游标所在的那一行 (常用)
nyyn 为数字, 复制游标所在的那一行往下数 n 行 (常用)
y1G复制游标所在行到第一行的所有数据
yG复制游标所在行到最后一行的所有数据
y0复制游标所在的字元到该行行首的所有数据
y$复制游标所在的字元到该行行尾的所有数据
p将已复制的数据粘贴在游标所在的那一行的下一行 (常用)
P将已复制的数据粘贴在游标所在的那一行的上一行,原来游标所在的那一行会被推后一行 (常用)
J将游标所在的行与下一行的数据合并为一行
u撤销前一个操作 (常用)
[ctrl]+r重做上一个被撤销的操作 (常用)
.这是小数点,表示重复前一个操作 (常用)

注意: 最后三个按键乃是神器,熟悉后记得经常使用它们,会让你觉得使用 vim 是一件很快乐的事情哦 :)

删除(delete)

dd   删除光标所在行。 ( 剪切dd --- 粘贴p ),yw 复制单词,yy 复制行
ndd  删除从光标所在行开始,向下的n行
d1G  删除从光标所在行开始,到第一行的所有行
dG   删除光标所在开始到文件尾的所有字符
d$   删除从光标所在位置,到行尾的所有字符
d0   删除从光标所在位置,到行首的所有字符d0 删除到某一行的开始位置
d^   删除到某一行的第一个字符位置(不包括空格或TAB字符)
D    以行为单位,删除包括光标在内及其后面的所有字符。即 删除 至 行尾 
dw   删除到某个单词的结尾位置
d3w  删除到第三个单词的结尾位置   或者 ndw 或 ndW 删除光标处开始及其后的 n-1 个字
db   删除该行光标前字符(delete begin)。  
de   删除自光标开始后面的字符(delete end)

cw、dw  改变(置换)/删除光标所在处的单词(或者字) (c=change、d=delete)。
nx      向后删除n个字符。nX 是向前删除n个字符。3x:删除光标开始3个字符
x 或 X  删除一个字符。x(相当于delete)删除光标后的,而X(相当于backspace)删除光标前的

dW     删除到某个以空格作为分隔符的单词的结尾位置
dB     删除到某个以空格作为分隔符的单词的开始位置
d7B    删除到前面7个以空格作为分隔符的单词的开始位置
d)     删除到某个语句的结尾位置
d4)    删除到第四个语句的结尾位置
d(     删除到某个语句的开始位置
d)     删除到某个段落的结尾位置
d{     删除到某个段落的开始位置
d7{    删除到当前段落起始位置之前的第7个段落位置
dd     删除当前行
d/text 删除从文本中出现“text”中所指定字样的位置,
       一直向前直到下一个该字样所出现的位置(但不包括该字样)之间的内容
dfc    删除从文本中出现字符“c”的位置,
       一直向前直到下一个该字符所出现的位置(包括该字符)之间的内容
dtc    删除当前行直到下一个字符“c”所出现位置之间的内容

dL  删除直到屏幕上最后一行的内容
dH  删除直到屏幕上第一行的内容
dG  删除直到工作缓存区结尾的内容
d1G 删除直到工作缓存区开始的内容


将光标移到需要删除的行处按 Ctrl+G 显示行号,再到结尾处 Ctrl+G 显示结尾的行号。
假设2次得到的行号为20和100,则把这期间的内容全删除
:20,100d 删除从20行到100行的内容

在要删除的开始行和结束行中用分别用ma、mb命令标记,然后用下面命令删除。
:a,bd

删除换行
        :%s/\n//g             删除换行符
        :%s/\r//g             删除DOS文件中的回车符 ^M
        :%s/\r/\r/g           转换DOS回车符^M为真正的换行符
        :%s/^\n\{3}//         删除三行空行
        :%s/\n\n/\r/g         将连续的两个空行替换成一个空行
:%s#\s*\r\?$##       删除行尾的空格以及DOS回车符
        它没有使用“/”字符作为替换命令各个参数间的分隔符,而是使用了“#”字符。
        命令还使用了 \? 正则表达式,用来匹配它前面出现的字符0次或1次。

复制(yank) 

    yy 或者 Y      复制光标所在行。拷贝一行到剪贴板中
    nyy 或者 nY    复制从光标所在行开始向下的n行。拷贝n行到剪切板中
    y1G    复制从光标所在行开始,到第一行的所有行
    yG     复制从光标所在行开始,到最后一行的所有行
    y$     复制从光标所在位置,到行尾的所有字符
    y0     复制从光标所在位置,到行首的所有字符  
    yw     拷贝一个单词。如果要复制整行的最简单办法就是V,y,p 就行了  
    yfa              表示拷贝从当前光标到光标后面的第一个a字符之间的内容.
    dfa              表示删除从当前光标到光标后面的第一个a字符之间的内容.
    5fx              表示查找光标后第 5 个 x 字符.
    5w(e)            移动光标到下五个单词.
    5yy              表示拷贝光标以下 5 行.
    5dd              表示删除光标以下 5 行.
    y2fa             表示拷贝从当前光标到光标后面的第二个a字符之间的内容.
    :12,24y          表示拷贝第12行到第24行之间的内容.
    :12,y            表示拷贝第12行到光标所在行之间的内容.
    :,24y            表示拷贝光标所在行到第24行之间的内容. 删除类似.

粘贴(paste)

p(小写):取出剪贴板中内容的命令,并在光标所在位置向下新开辟一行,粘贴
P(大写):向当前行的上面一行粘贴    

撤销、重做(undo,redo)

Ctrl+u   向上滚动半个屏幕的内容

u      (Undo)撤销上一个操作(也就是一步一步撤销)
U:     撤销当前文本的全部编辑
Ctrl+r (Redo)重做上一个操作

重复

    .(英文的句号)       重复上一操作,就是重复上一次操作命令

搜索、查找

:set path+=path_to_search  "参考 :h path',将"path_to_search"添加到Vim的搜索路径中。
                           这样,在使用诸如:find等命令时,Vim将会搜索这个路径以查找文件
:find path_name_to_edit    "可以是文件或目录!

按键说明
/word在当前游标所在位置往下寻找关键字为 word 的字符串 (常用)
?word在当前游标所在位置往上寻找关键字为 word 的字符串
n这里的 n 是按键 n。代表重复前一个搜索动作。下一个
N这里的 N 是按键 N。功能与 n 相反,代表反向执行前一个搜索动作。上一个
:n1,n2s/word1/word2/gn1 与 n2 都为数字,表示行数。可在第 n1 行与第 n2 行之间寻找 word1 字符串,并替换为 word2 (常用)
:1,$s/word1/word2/g表示从第一行到最后一行,将 word1 字符串替换为 word2 (常用)
:1,$s/word1/word2/gc表示从第一行到最后一行,也是将 word1 字符串替换为 word2,不同之处是在替换前显示提示字元,由用户确认是否最终替换 (常用)

注意: 使用 /word 的同时,配合使用 n 或者 N,搜索可以变得很方便的啦 :)

1. 搜索字符串               
        :%s/word//gn  统计 word 个数
        /string    向下 搜索字符串“string”
        ?string    向上 搜索字符串“string”
        /^字符串   查找以“字符串开始”的行
        /字符串$   查找以“字符串结尾”的行
        /a.b       查找字符串a任意字符串b
2. 重复上次搜索
        n  根据上次搜索条件找到下一个匹配的字符串(即搜索完向下查找)。即 寻找下一个。
        N  根据上次搜索条件找到上一个匹配的字符串(即搜索完向上查找)。即 回到前一个。
3. 搜索单词
        *   向下 搜索光标所在处的单词(完全匹配)
        #   向上 搜索光标所在处的单词(完全匹配)
        g*  向下 搜索光标所在处的单词(部分匹配)。即 匹配包含该单词的所有字符串.
        g#  向上 搜索光标所在处的单词(部分匹配)。即 匹配包含该单词的所有字符串.
        gd  查找与光标所在单词相匹配的单词, 并将光标停留在文档的非。
           注释段中第一次出现这个单词的地方. 
        %   本命令查找与光标所在处相匹配的反括号, 包括 () [] {}
        f(F)x   在光标所在行进行查找, 查找光标右(左)方第一个x字符。
             找到后:输入 ; 表示继续往下找输入 , 表示反方向查找

可以使用如下方式来实现快速查找:

  1. 最快的方式是让光标停留在想要查找的单词的任意一个字母上面, 然后输入Shift + * ,即可快速选中该单词,并且可以通过 n 或 N 进行上一个或下一个的匹配。
  2. 让光标停留在单词的第一个字母上, 然后输入yw拷贝该单词, 然后输入 / (Ctrl + R) 0 (即 /”0),回车, 就查找到了第一个匹配的单词, 并且可以通过 n 或 N 进行上一个或下一个的匹配。
    解释一下:
    Ctrl + r 是指使用寄存器 , 你会发现先输入/ , 然后输入 Ctrl + r , 会立刻变为 “ , 即寄存器的前缀, 然后 ”0 就可以理解了吧? 合起来就是 /“0, 就是查找刚才复制的那个单词, 不懂的请查看上一个帖子:
    vim的复制粘贴(系统剪切板):http://blog.csdn/hk2291976/article/details/42196559
    vim之寄存器的使用和配置:http://blog.csdn/ballack_linux/article/details/53078836
  3. 还有一种方式, 和第二种方式差不多,不过是将单词拷贝到系统剪贴板, 然后再从系统剪贴板拿出来。 即选中需要查找的单词, 然后输入 “+y, 然后输入/(Shfit + Ctrl + v), 就查找到了第一个匹配的单词, 并且可以通过 n 或 N 进行上一个或下一个的匹配。

高亮显示

一个单词并查找的方发,将光标移动到所找单词.

1: shift + "*"  向下查找并高亮显示

2: shift + "#"  向上查找并高亮显示

3: "g" + "d"    高亮显示光标所属单词,"n" 查找!

替换 s[ubstitute]

默认不指定范围的行为是替换当前行,用 % 才能替换整个文件
g - global
c - confirm
i - ignore case
e - don't show error?

替换命令的语法:s / old / new /  
s 表示 替换,这将把当前中模式 old 的第一次出现修改为 new。  
/(斜杆)是命令不同部分之间的分隔符(当斜杆为该行的最后一个字符时,可不写)

示例::s / old / new / g
把当前行old的每次出现改为new,而不只是该行的第一个old。
:s命令允许替换串后面带有选项,上面语法中的g代表全局
(g选项影响一行中的每个模式,不要把它与影响文件中所有行的:g命令混淆)
 
通过在:s命令前加上地址前缀,可以把它的范围扩展到多行。
例如下面命令把50行到100行的old的每次出现都改为new:
:50, 100 s / old / new / g
 
下面的命令把整个文件中的old的每次出现都改为new:
:1, $s / old / new / g
我们知道%等价于1,$,所以上行命令也可以这样写:
:% s / old / new / g

确认替换
在替换命令尾部加上c (confirm用于确认),在替换每个old前都会提示并确认:
:1, 30 s /old/new/ gc
将会出现提示replace with hehe (y/n/a/q/l/^E/^Y)?  
y替换,n不替换,a替换所有,q放弃,l替换第一个并进入插入模式,
^E和^Y是提示你用Ctrl+e或Ctrl+y来滚动屏幕的。

上下文相关替换
除了直接使用一个单词(或短语)替换另一个,还有稍微复杂的全局替换语法。
这些语法可以对一个模式进行搜索,一旦找到含有模式的行,就可以使用不同与模式的串进行替换,把这种替换叫做上下文相关替换。
语法格式如下:
:g /pattern/s/old/new/g    将会把包含pattern的行中,把所有old替换为new
第一个g表示是在文件的所有行上执行的命令,模式pattern识别要发生替换的行。
在那些包含模式pattern的行上,ex将把old替换(s)为new。最后的g表示在该行上进行全部替换。
如果用来进行搜索的模式与想要修改的模式相同,那么就不必重复它:
:g/string/s//new/g  等价于  :g/string/s/string/new/g
还要注意:
:g/string/s//new/g  也等价于 :% s/string/new/g
可以用第二种方式少输一些字符
回车在vim的输入方法是ctrl+V,会得到^,此时再按回车,会得到 ^M 这个就是回车
示例:把全文件所有 str 换成 str回车 的语句是:
: 1,$ s/str/str^M/g
^M用上面的方法输入
1,$表示从1到最后一行,s是switch,g是global

    r     替换光标所在处字符
    R     进入替换模式,直至按ESC退出
    cc    替换光标所在行
    cw    替换光标所在的英文单词
    ~     转换大小写

格式:s/str1/str2/gi  
        / : 临近s命令的第一个字符为边界字符:/,@,#
        g : 一行内全部替换
        i : 忽略大小写
    注意: 其中s为substitute(替代、代替),%表示所有行,g表示global(总体的)。

  :g/^/exec "s/^/".strpart(line(".")." ", 0, 4)  在行首插入行号
  :runtime! syntax/2html.vim      转换 txt 成 html, 会按照你的颜色配置来转
  :s/p1/p2/g       将当前行中 所有p1 均用p2替代
  :s/p1/p2/        不加g表示只把“当前行的第一个”替换
  :%s/abc/123/g    将所有行的abc替换成123
  :12,23s/aa/bb/g  将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
  :12,23s/^/#/     将从12行到23行的行首加入 # 字符
  :%s/:.*//g       删除 文件中 从冒号开始直到行尾的所有部分。例如 文件 /etc/passwd
  :n1,n2s/p1/p2/g  将第n1至n2行中所有p1均用p2替代
  :20,30s/word1/word2/g  将从20到30行的所有word1全部替换成word2
  :1,$s/start/end/g      从第一行开始到文件最后,将字符串start替换为end
  :1,$s/word1/word2/g    或 :1,$s/word1/word2/gc (需要使用者确认)
  :g/p1/s//p2/g          将文件中所有p1均用p2替换
  :r 文件名              在当前光标位置载入另一个文件
 
  :3,$s/^/some string/    在文件的第3行到最后一行所有的行首插入“some string”。
  :%s/$/some string/g     在整个文件每一行的行尾添加“some string”。
  :%s/string1/string2/g   在整个文件中替换“string1”成“string2”。
  :3,7s/string1/string2/  仅替换文件中的第3行到第7行中的“string1”成“string2”。
 
  :%s#/usr/bin#/bin#g  把文件中所有路径/usr/bin换成/bin。
  也可以使用命令 “:%s//usr/bin//bin/g” 实现,其中“#”是转义字符,
  表明其后的“/”字符是具有实际意义的字符,不是分隔符。
 
  使用以下方法删掉文件中所有的空行及以#开始的注释行。
  cat squid.conf.default | grep -v ^$ | grep -v ^#

  :%s/r//g             删除DOS方式的回车^M
  :%s= *$==            删除行尾空白
  :%s/^(.*)n1/1$/      删除重复行
  :%s/^.pdf/new.pdf/   只是删除第一个pdf
  :%s///               又是删除多行注释(咦?为什么要说「又」呢?)
  :g/^\s*$/d           删除所有空行
  :g!/^dd/d            删除不含字符串'dd'的行
  :v/^dd/d             同上 (译释:v == g!,就是不匹配!)
  :g/str1/,/str2/d     删除所有第一个含str1到第一个含str2之间的行
  :v/./.,/./-1join     压缩空行
  :g/^$/,/./-j         压缩空行
  ndw 或 ndW           删除光标处开始及其后的 n-1 个字符。

正则替换

正则替换篇:https://zhuanlan.zhihu/p/346058975 

特殊变量
    \<n>         匹配的第<n>部分
    ()          用来表明需要匹配的子域
    & 表示匹配的整个字串

示例:%s/^(.*)\n\1/\1$/    删除重复行
示例:3,7s/.*/ &/          将3至7行向右移2空白

特殊语法
\{-}    非贪婪匹配,non-greedy matching
\{n,m}  匹配 n 至m个前面的匹配原。尽可能多
\{n}    匹配 n 个前面的匹配原
\{n,}   匹配至少 n 个前面的匹配原。尽可能多
\{,m}   匹配 0至m个前面的匹配原。尽可能多 
\{}     匹配 0个以上前面的匹配原。尽可能多 (和 * 等价)
\{-n,m} 匹配 n 至m个前面的匹配原。尽可能少
{-n}    匹配 n 个前面的匹配原
\{-n,}  匹配至少 n 个前面的匹配原。尽可能少
\{-,m}  匹配 0至个前面的匹配原。尽可能少
\{-}    匹配 0 个以上前面的匹配原。尽可能少

示例:%s/^.{-}pdf/new.pdf/ 只是删除第一个 pdf

vim 中 printf 用法

vim global命令

VIM 全局命令(Global Command):https://zhuanlan.zhihu/p/270402117

用法:[rangel]g/pattern/[cmd]

即针对在[range]范围内,所有匹配{pattern}模式的行,执行[command]命令。
range 不指定的话,默认是全文,这与 s 默认是单行的行为有差别!
而且:s 只更改一行里的内容,但无法作出删除一行的动作
命令:g!及其同义词:v,则可以针对所有不匹配模式的行执行操作。

其命令格式为::[range]g!/{pattern}/[command]
即针对在[range]范围内,所有不匹配{pattern}条件的行,执行[command]命令。

如果没有指定[range],则针对文件中的所有行执行命令。也可以使用行地址,把全局搜索限定在指定的行或行范围内。
如果没有指定[command],则执行:print命令来显示行内容。
使用以下命令,可以查看全局命令的帮助信息:
:h :g 

全局查找
查找并显示文件中所有包含模式pattern的行,并移动到最后一个匹配处:
:g/pattern
查找并显示文件中所有包含模式pattern的行:
:g/pattern/p
查找并显示文件中所有精确匹配单词pattern的行:
:g/\<pattern\>/p
查找并显示第20到40行之间所有包含模式pattern的行:
:20,40g/pattern/p
查找并显示文件中所有不包行模式pattern的行,并显示这些行号:
:g!/pattern/nu

全局删除
删除包含模式patternn的行:
:g/pattern/d
删除不包含模式pattern的行:
:g!/pattern/d
删除所有空行:
:g/^$/d
删除所有空行以及仅包含空格和Tab制表符的行:
:g/^[ tab]*$/d
删除指定范围内的文本,例如以下文本中的“DESCRIPTION”部分:
:g/DESCRIPTION/,/PARAMETERS/-1d

全局替换
利用全局命令,可以仅针对符合查询条件的行,进行替换操作。例如使用以下命令,将包含“microsoft antitrust”的行中的“judgment”替换为“ripoff”:
:g/microsoft antitrust/s/judgment/ripoff/
可以在命令中指定查找的范围。比如以下命令,将在包含“microsoft antitrust”的前两行及后两行中进行替换:
:g/microsoft antitrust/-2,/microsoft antitrust/+2s/judgment/ripoff/c
以上命令末尾的c参数,用于提示用户对每一个替换操作进行确认。
假设希望在以“end”结尾的行中,将第1部分文字替换为“The greatest of times;”:
the best of times; the worst of times: end
由于会尽可能多(as much text as possible)的匹配,以下命令将替换至第2个“of”处:
:g/end$/s/.*of/The greatest of/
The greatest of times: end
为了只替换第1部分,则需要更精确的匹配条件:
:g/end$/s/.*of times;/The greatest of times;/
The greatest of times; the worst of times: end
全局移动
将所有的行按相反的顺序排列。其中,查找模式.*将匹配所有行,m0命令将每一行移动到0行之后:
:g/.*/m0
将指定标记(Mark)之间的行按相反的顺序排列:
:'a,'bg/^/m'b
将以下文本中的“DESCRIPTION”部分,上移到“SYNTAX”之前:
:g /SYNTAX/.,/DESCRIPTION/-1 move /PARAMETERS/-1
首先匹配从包含“SYNTAX”的行到包含“DESCRIPTION”的上一行;然后将这些行移动到包含“PARAMETERS”的上一行。
以下两条命令均可以将所有不是以数字开头的行,移动到文件末尾:
:g!/^[[:digit:]]/m$
:g/^[^[:digit:]]/m$
全局复制
使用以下命令,可以重复每一行。其中:t或:copy为复制命令:
:g/^/t.
将包含模式pattern的行,复制到文件末尾:
:g/pattern/t$
重复每一行,并以“print ''”包围:
:g/./yank|put|-1s/'/"/g|s/.*/Print '&'/ 
Chapter 1
Print 'Chapter 1'

多缓冲区 ( 多文件 )  操作

按键说明
:n编辑下一个文件
:N编辑上一个文件
:files列出 vim 所打开的所有文件

注意:使用 vim a.txt b.txt … 指令,就能一次打开多个文件

vim下每一个打开的文件对应一个缓冲区(buffer)。多文件编辑会有两种情形:

  • 1、进入 vim 前所用的参数就是多个文件( 这种情形称为 argument list )。
  • 2、进入 vim 后另外再开其它的文件( 称为 buffer list )。不过都可以统称为buffer。
  • 注意::e 或者:new 或者:split 后边可以跟目录,这样就可以在目录下慢慢找要打开的文件

:n       编辑下一个文件。
:2n      编辑下二个文件。
:N       编辑前一个文件。注意,这种用法只能用于 argument list 的情形。
:rew     回到首文件
:args    查看当前编辑缓冲文件状态
:e# 或 Ctrl-^  编辑前一个档案,用于两文件互相编辑时相当好用。
:ls    显示缓冲区中的文件,编号后边有#的代表是前一个文件,可以通过:e#来进入,
       有%a的代表是当前文件,什么也没有的可以通过:bn来进入,这里的n代表文件编号。
:b     文件名或编号,移至该文件。
:ls    列出打开各个文件的编号,没有离开vim前编号是不会变的。这个指令 elvis 也是可以使用。
       当然 :e#编号 也是可以的,这样的用法则是所有 vi clone 都通用了。
:files 或 :buffers 或 :ls  会列出目前 buffer 中的所有文件。

在 buffers 中,减号 - 表示这个 buffer 并未载入,不过,不必担心,载入相当快速的。
加号 + 表示这个 buffer 已经修改过了。

:b 序号(代号)   此命令将指定序号(代号)的文件在本窗口打开,
                其中的序号(代号)就是用 :ls 命令看到的.
:set diff       此命令用于比较两个文件, 可以用 :vsp filename命令打开另一个文件,
                然后在每个文件窗口中输入此命令,就能看到效果了.

1、多文件编辑模式
    argument list 模式,就是在打开vim编辑器时,携带多个文件路径参数。
    buffer list   模式,就是在进入vim编辑器后,打开多个缓冲区进行编辑。

2、单一缓冲区打开多个文件
        :files 显示目前打开了哪些文件
        :n 切换到下一个缓冲区内容
        :N 切换到上一个缓冲区内容
        :2n 切换到下下个缓冲区内容
        :bn 下一个缓冲区内容(buffer next)
        :bp 上一个缓冲区内容(buffer previous)

3、多个缓冲区打开多个文件
        :sp [filename] 打开一个新的缓冲区,如果有filename则内容为该文件,否则为当前文件
        Ctrl+w n 新建一个缓冲区
        Ctrl+w q 退出光标所在的缓冲区
        Ctrl+w j 光标移动到下一缓冲区
        Ctrl+w k 光标移动到上一缓冲区
        Ctrl+w l 光标移动到右一缓冲区
        Ctrl+w h 光标移动到左一缓冲区
        Ctrl+w v 左右切割窗口新建缓冲区
        Ctrl+w s 上下切割窗口新建缓冲区
        Ctrl+w o 使光标所在缓冲区最大化,其他缓冲区隐藏

4.重新编辑
        (1)使用命令:q! 强行退出后,再vi flname重新进入。
        (2)使用命令:e! 放弃修改,重新编辑。

书签

4. 标记书签(mark)
        ma a为小写字母,为光标所在处设定文档书签a
        mA A为大写字母,为光标所在处设定全局书签A
5. 使用书签(mark)
        `a 到文档书签a处,Tab键上方
        'a 到文档书签a所在行行首处,Enter键左边
        `A 到全局书签A处,Tab键上方
        'A 到全局书签A所在行行首处,Enter键左边
        `n 如果n=0,缓冲区将打开上一次的文档,
            且光标在上次编辑最后的位置,1-9 以此类推
        'n 如果n=0,缓冲区将打开上一次的文档,
            且光标在上次编辑最后的位置所在行的行首,1-9 以此类推
6. 查看书签列表
        :marks 查看当前所有书签

编辑 windos 文件特殊字符问题

在 linux 下,不可避免的会用 VIM 打开一些 windows 下编辑过的文本文件。会发现文件的每行结尾都会有一个^M符号,这是因为 DOS下的编辑器和Linux编辑器对文件行末的回车符处理不一致。

^M字符的来历和作用:在DOS/Windows里,文本文件的换行符为\r\n,而在*nix系统里则为\n,所以DOS/Windows里编辑过的文本文件到了*nix里,每一行都多了个^M。所以^M只是一个换行符号,没有实际的用处,我们可以将它保留,也可以将它删除。

回车符

windows:0D0A      // 对应 \r\n
unix\linux: 0A           // 对应  \n
MAC: 0D                 // 对应  \r

去除 回车符

比较快捷的去除这些符号的方法有这么几种: 

(1) 使用VI的命令: 
    使用vi打开文本文件 
    vi dos.txt 
    命令模式下输入 
    :set fileformat=unix 
    :w 
(2) VI下使用正则表达式替换 
   g/\r/s///g
    或者 
   %s/\r//g 
(3) 使用sed 工具 
    sed ’s/\r//’ filename > tmp_filename 
(4) 既然window下的回车符多了\r,那么当然通过删除 \r ,也可以实现: 
    tr -d '\r' 
(5) 最常用、最方便,在终端下敲命令: dos2unix filename 

3、vim 插件管理器:Vundle

安装 vundle

Vundle 的具体介绍和配置:https://github/VundleVim/Vundle.vim
vundle.txt:https://github/VundleVim/Vundle.vim/blob/master/doc/vundle.txt
搜索Vim插件:https://www.vim/scripts/

查找到新的脚本或插件后,多使用插件的帮助文档。

Vundle 是 Vim 的插件管理器,能够自动安装和管理插件。安装的插件都在 ~/.vim/bundle 文件夹下。如果目录不存在,可以手动创建。下载 Vundle:git clone https://github/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

下载完成后,可以看到压缩包里面的文件 就是 图中 Vundle.vim 目录下面的所有文件

插件有三种类型: 

  1. Github 上 vim-scripts 仓库的插件 
  2. Github上非 vim-scripts 仓库的插件 
  3. 不在 Github 上的插件 

对于不同的插件,vundle 自动管理和下载插件的时候,有不同的地址填写方法,有如下三类: 

  1. 在 Github 上 vim-scripts 用户下的仓库,只需要写出repos(仓库)名称 
  2. 在 Github 其他用户下的 repos,需要写出”用户名/repos名” 
  3. 不在Github上的插件,需要写出git全路径

旧版配置:vundle#rc()、Bundle。         新版配置:vundle#begin()、Plugin。

现在都使用新版的配置格式

可以在终端通过 vim 打开 ~/.vimrc 文件:$vim ~/.vimrc

也可以直接在目录中打开( 快捷键 ctrl+H 显示隐藏文件 )。将以下加在 .vimrc 文件头部,加入之后保存之后就可以使用vundle了。

必须放在 vimrc 文件所有内容的前面

直接把 github 上 的配置 全部复制 粘贴到 vimrc 文件的开头

github 上配置:https://github/VundleVim/Vundle.Vim

以后安装新插件就直接编辑vimrc,添加 plugin就行了

如不明白,看 github 上说明

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 'VundleVim/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/vim/scripts.html
" Plugin 'L9'
" Git plugin not hosted on GitHub
Plugin 'git://git.wincent/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/'}
" Install L9 and avoid a Naming conflict if you've already installed a
" different version somewhere else.
" Plugin 'ascenator/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
set nocompatible              " 这是必需的,去除VI一致性
filetype off                  " 这是必需的 


" 在此设置运行时路径。即设置包括vundle和初始化相关的runtime path
set rtp+=~/.vim/bundle/Vundle.vim


" vundle初始化 
call vundle#begin()  

" 另一种选择, 指定一个vundle安装插件的路径
"call vundle#begin('~/some/path/here')


" 让vundle管理插件版本,必须。" 这应该始终是第一个
Plugin 'VundleVim/Vundle.vim'


" 以下范例用来支持不同格式的插件安装.
" 请将安装插件的命令放在vundle#begin和vundle#end之间.

" Github上的插件
" 格式为 Plugin '用户名/插件仓库名'
Plugin 'tpope/vim-fugitive'

" 来自 http://vim-scripts/vim/scripts.html 的插件
" Plugin '插件名称' 实际上是 Plugin 'vim-scripts/插件仓库名' 只是此处的用户名可以省略
Plugin 'L9'

" 由Git支持但不再github上的插件仓库 Plugin 'git clone 后面的地址'
Plugin 'git://git.wincent/command-t.git'

" 本地的Git仓库(例如自己的插件) Plugin 'file:///+本地插件仓库绝对路径'
Plugin 'file:///home/gmarik/path/to/plugin'

" 插件在仓库的子目录中.
" 正确指定路径用以设置runtimepath. 以下范例插件在sparkup/vim目录下
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}

" 安装L9,如果已经安装过这个插件,可利用以下格式避免命名冲突
Plugin 'ascenator/L9', {'name': 'newL9'}


" 你的所有插件需要在下面这行之前
call vundle#end()            " 必须
filetype plugin indent on    " 必须 加载vim自带和插件相应的语法和文件类型相关脚本

" 忽视插件改变缩进,可以使用以下替代:
"filetype plugin on
"

" 常用的命令
" :PluginList       - 列出所有已配置的插件
" :PluginInstall     - 安装插件,追加 `!` 用以更新或使用 :PluginUpdate
" :PluginSearch foo - 搜索 foo ; 追加 `!` 清除本地缓存
" :PluginClean      - 清除未使用插件,需要确认; 追加 `!` 自动批准移除未使用插件
"
" 查阅 :h vundle 获取更多细节和wiki以及FAQ


" 将自己的非插件片段放在这行之后(也就是上面的所有全部放在文件所有内容之前。)

vimrc中把上面代放在最前面即可。添加插件的话,只需要在 begin 和 end 之间加入即可

使用 vundle 时,只需要去 Github 上找到想要的插件,后续插件的安装,更新和卸载都可由 vundle 来完成。

老版的配置格式

在.vimrc 中添加 bundle 的配置

filetype off
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
Bundle 'gmarik/vundle'
Bundle '其他的 github 位置...'
filetype plugin indent on

Vundle 自己本身也是插件,上面实现了其对自己的管理。

set nocompatible              " 这是必需的,去除VI一致性
filetype off                  " 这是必需的 

set rtp+=~/.vim/bundle/vundle/
call vundle#rc()


" 现在让我们开始管理插件

Bundle 'gmarik/vundle'
"my Bundle here:
"
" original repos on github
Bundle 'kien/ctrlp.vim'
Bundle 'sukima/xmledit'
Bundle 'sjl/gundo.vim'
Bundle 'jiangmiao/auto-pairs'
Bundle 'klen/python-mode'
Bundle 'Valloric/ListToggle'
Bundle 'SirVer/ultisnips'
Bundle 'Valloric/YouCompleteMe'
Bundle 'scrooloose/syntastic'
Bundle 't9md/vim-quickhl'
" Bundle 'Lokaltog/vim-powerline'
Bundle 'scrooloose/nerdcommenter'
"..................................
" vim-scripts repos
Bundle 'YankRing.vim'
Bundle 'vcscommand.vim'
Bundle 'ShowPairs'
Bundle 'SudoEdit.vim'
Bundle 'EasyGrep'
Bundle 'VOoM'
Bundle 'VimIM'
"..................................
" non github repos
" Bundle 'git://git.wincent/command-t.git'
"......................................
filetype plugin indent on

修改完 vimrc 文件之后,可以验证下结果:

king@kali:~# vi
:BundleList

如果看到上面结果,恭喜你,成功了。。。。。

"安装、更新、搜索、清理" 插件

只要使用 Vundle 设置好了插件,就可以使用几个Vundle命令 来安装、更新、搜索和清理闲置未用的插件。

将想要安装的插件,按照地址填写方法,将地址填写在vundle#begin和vundle#end之间,保存之后,有两种方法安装插件。

打开一个vim, 运行:BundleInstall 

$vim
:PlugInstall                         命令会安装在你的.vimrc文件中列出来的所有插件。
:PluginInstall <plugin-name>         还可以只安装某一个特定的插件,只要传递其名称。

:BundleList             -列举列表(也就是.vimrc)中配置的所有插件  
:BundleInstall          -安装列表中的全部插件  
:BundleInstall!         -更新列表中的全部插件  
:BundleSearch foo       -查找foo插件  
:BundleSearch! foo      -刷新foo插件缓存  
:BundleClean            -清除列表中没有的插件  
:BundleClean!           -清除列表中没有的插件  

或者在命令行运行 vim +BundleInstall +qall 

vim +PluginInstall +qall

安装完成后插件就能用了。安装插件所在的目录截图

####其它常用命令:

移除不需要的插件:编辑.vimrc文件移除的你要移除的插件所对应的plugin那一行。保存退出当前的vim重新打开vim,输入命令BundleClean。

搜索插件:如果你想从所提供的插件列表安装一个插件,搜索功能就很有用。:PluginSearch <text-list>

在搜索过程中,你可以在交互式分屏上安装、清理、研究或重新装入同一列表。安装插件不会自动装入你的插件。想自动装入插件,将插件添加到你的.vimrc文件。

附上一则vundle新老命令的对比(现在目测都可用)

自动补全插件:youcompleteme

Vim 自动补全神器:YouCompleteMe

安装向导:https://github/ycm-core/YouCompleteMe#full-installation-guide

YouCompleteMe 简称 YCM,是一个快速的模糊搜索的代码补全引擎。可以媲美 VS 的自动补全,当然可能有一点点过,但可见其强大。YCM 由 google 公司搜索项目组的软件工程师 Strahinja Val Markovic 所开发,YCM 后端调用 libclang (以获取AST,当然还有其他语言的语义分析库)、前端由 C++ 开发(以提升补全效 率)、外层由 python 封装(以成为 vim 插件),这是至今为止最强大也是最难安装的插件之一,有很多人都砸在这个插件上了,我们来看看如何安装这个插件。

官方推荐通过 Vundle 来安装 YCM。在 vim 的配置文件 ~/.vimrc 中添加一行(在call vundle#begin() 和 call vundle#end() 之间)

call vundle#begin()
. . . 
Plugin 'Valloric/YouCompleteMe’
. . .
call vundle#end()

然后,打开vim,输入:PluginInstall,vim 会自动从 git 上 clone 项目并安装。需要特别注意的是这个时候可能等的时间会相当的长

cd ~/.vim/bundle/YouCompleteMe
./install.sh --all      //或者  ./install.py --all

也可以直接从 GitHub 下载安装。

cd ~/.vim/bundle
git clone https://github/Valloric/YouCompleteMe.git
cd ~/.vim/bundle/YouCompleteMe
./install.py --all

home 目录有两个文件:

  • 一个是 vim 的配置文件 .vimrc
  • 一个是 YouCompleteMe 的配置文件 .ycm_extra_conf.py 。语意补全要正确工作,需要配置好.ycm_extra_conf.py 文件,模板可以在github上搜索。可以把这个文件放在项目的根目录下,打开项目文件时,YCM 会循环向上搜索并加载这个文件,或者在 vimrc 文件中加入:let g:ycm_global_ycm_extra_conf = 'your path to .ycm_extra_conf.py'  如果.ycm_extra_conf.py 中 include path 等配置没有问题,YCM就可以工作了。

在 vimrc 中配置 YouCompleteMe:

let g:ycm_key_list_select_completion = ['<Down>']
let g:ycm_key_list_previous_completion = ['<Up>']
let g:ycm_confirm_extra_conf=0 "关闭加载.ycm_extra_conf.py提示
let g:ycm_min_num_of_chars_for_completion=2 " 从第2个键入字符就开始罗列匹配项
let g:ycm_cache_omnifunc=0  " 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_seed_identifiers_with_syntax=1    " 语法关键字补全
" 在注释输入中也能补全
let g:ycm_complete_in_comments = 1
" 在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
"注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'

nnoremap <F5> :YcmForceCompileAndDiagnostics<CR>
nnoremap <leader>lo :lopen<CR> "open locationlist                                                                                                                      
nnoremap <leader>lc :lclose<CR>   "close locationlist
inoremap <leader><leader> <C-x><C-o>"
inoremap <leader><leader> <C-x><C-o>
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>

代码跳转

YCM支持代码跳转了,又一项对程序开发极有用的功能,现在支持c, cpp, object-c, object-cpp, python代码跳转到声明和实现。特别对c和c++, 这个跳转可不是像基于ctags的那些插件,经常让你在一大堆重名的tag里人肉搜索,十跳九不中。得利于clang的强大功能,YCM的代码跳转几乎没有失手,当然前提是你要设置好.ycm_extra_conf.py,代码被YCM解析时没太多编译错误。

主要功能是3个YcmCompleter的subcommands:

  • GoToDeclaration
  • GoToDefinition
  • GoToDefinitionElseDeclaration

在vim配置文件中加上一行就搞定了

nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>

效果:首先新建一个 hello.c 文件,

 dsaf

YouCompleteMe

下面这幅图是借用Valloric/YouCompleteMe来展示强大的C++补全功能 

文件搜索

ctrlp 提供文件搜索,支持模糊查询。

vim-airline

vim-airline提供漂亮的状态栏支持。

vim-surround

vim-commentary

auto-pairs

incsearch.vim

vim-devicons

vim-coloresque

vim-dirdiff

vim-startify

Change the colorscheme

4、定制化的 vim:vimplus

github 上搜索 vim,可以找星最多:

终极 vimrc:https://github/amix/vimrc
强大的 vim 配置文件,让编程更随意:https://github/ma6174/vim
:https://github/humiaozuzu/dot-vimrc
:https://github/spf13/spf13-vim

vim 和 emacs 都是 linux 环境下的文本编辑利器,vim 是 linux 下的默认编辑器。《vim实用技巧》是教会 vimer 怎么使用 vim,使用 vim 写代码时,给 vim 装上一些插件,将会如虎添翼。

网上别人配置的 vim 始终不能够满足自己的需求(自己需要有强大的 C/C++ 代码提示补全功能、头文件/源文件切换、静态代码分析等功能),所以最近自己有时间,自己归纳了一些 vim 的插件,然后做成一键安装程序,供有相同需求的 vimer 们参考。

超级强大的 vim 配置介绍:vimplus,vimplus 是 vim 的超级配置安装程序 

  • :https://github/chxuan/vimplus
  • :https://wwwblogs/highway-9/p/5984285.html

通过 vimplus 可快速定制自己的 vim。相比较传统的方式(vundle)安装配置起来更快。可以根据需要修改适合自己的快捷键。如果不想折腾,可以一试。

安装 vimplus

vimplus 是 vim 的超级配置安装程序 。安装 vimplus 时将自动安装一些软件,比如:

  • vim
  • g++
  • ctags
  • cmake
  • python2
  • python3

安装vimplus
        git clone https://github/chxuan/vimplus.git ~/.vimplus
        cd ~/.vimplus
        ./install.sh //不加sudo
设置 Nerd Font
        为防止vimplus显示乱码,需设置linux终端字体为Droid Sans Mono Nerd Font。
多用户支持
        将vimplus在某个用户下安装好后,若需要在其他用户也能够使用vimplus,则执行
        sudo ./install_to_user.sh username1 username2 //替换为真实用户名
更新vimplus
        紧跟vimplus的步伐,尝鲜新特性:./update.sh

Android 64-bit (Termux)

安装vimplus
        git clone https://github/chxuan/vimplus.git ~/.vimplus
        cd ~/.vimplus
        ./install.sh
更新vimplus
        紧跟vimplus的步伐,尝鲜新特性:./update.sh

安装完成后

运行 setup.sh 脚本程序一键安装完成后,HOME 目录将会存在.ycm_extra_conf.py,该文件就是YCM实现C++等语言语法补全功能的配置文件,一般我会在HOME目录放一个,然后每一个项目拷贝一个.ycm_extra_conf.py,更改.ycm_extra_conf.py文件里面的 flags 变量的值即可实现相关include文件的语法补全功能。

vimplus 配置

  • ~/.vimrc:为 vimplus 的默认配置,一般不做修改

  • ~/.vimrc.custom.plugins:为用户自定义插件列表,用户增加、卸载插件请修改该文件

  • ~/.vimrc.custom.config:为用户自定义配置文件,一般性配置请放入该文件,可覆盖~/.vimrc里的配置

效果:

其他效果(快速搜索,markdown预览,git记录,以及主题切换等)

vimplus 快捷键

可通过vimplus的,h命令查看vimplus帮助文档。

插件相关

快捷键说明
,Leader Key
<leader>n打开/关闭代码资源管理器
<leader>t打开/关闭函数列表
<leader>a.h .cpp 文件切换
<leader>u转到函数声明
<leader>U转到函数实现
<leader>u转到变量声明
<leader>o打开include文件
<leader>y拷贝函数声明
<leader>p生成函数实现
<leader>w单词跳转
<leader>f搜索当前目录下的文件
<leader>F搜索当前目录下的文本
<leader>g显示git仓库提交记录
<leader>G显示当前文件提交记录
<leader>gg显示当前文件在某个commit下的完整内容
<leader>ff语法错误自动修复(FixIt)
<c-p>切换到上一个buffer
<c-n>切换到下一个buffer
<leader>d删除当前buffer
<leader>D删除当前buffer外的所有buffer
vim运行vim编辑器时,默认启动开始页面
<F5>显示语法错误提示窗口
<F9>显示上一主题
<F10>显示下一主题
<leader>l按竖线对齐
<leader>=按等号对齐
Ya复制行文本到字母a
Da剪切行文本到字母a
Ca改写行文本到字母a
rr替换文本
<leader>r全局替换,目前只支持单个文件
rev翻转当前光标下的单词或使用V模式选择的文本
gcc注释代码
gcap注释段落
vif选中函数内容
dif删除函数内容
cif改写函数内容
vaf选中函数内容(包括函数名 花括号)
daf删除函数内容(包括函数名 花括号)
caf改写函数内容(包括函数名 花括号)
fa查找字母a,然后再按f键查找下一个
<leader>e快速编辑~/.vimrc文件
<leader>s重新加载~/.vimrc文件
<leader>vp快速编辑~/.vimrc.custom.plugins文件
<leader>vc快速编辑~/.vimrc.custom.config文件
<leader>h打开vimplus帮助文档
<leader>H打开当前光标所在单词的vim帮助文档
<leader><leader>t生成try-catch代码块
<leader><leader>y复制当前选中到系统剪切板
<leader><leader>i安装插件
<leader><leader>u更新插件
<leader><leader>c删除插件

插入模式

快捷键说明
i在光标处进入插入模式
I在行首进入插入模式
a在光标后进入插入模式
A在行尾进入插入模式
o在下一行插入新行并进入插入模式
O在上一行插入新行并进入插入模式
gi进入到上一次插入模式的位置
<esc>退出插入模式

缓存操作

快捷键说明
:e <filename>新建buffer打开文件
:bp切换到上一个buffer
:bn切换到下一个buffer
:bd删除当前buffer

窗口操作

快捷键说明
:sp <filename>横向切分窗口并打开文件
:vsp <filename>竖向切分窗口并打开文件
<c-w>h跳到左边的窗口
<c-w>j跳到下边的窗口
<c-w>k跳到上边的窗口
<c-w>l跳到右边的窗口
<c-w>c关闭当前窗口
<c-w>o关闭其他窗口
:only关闭其他窗口

光标移动

快捷键说明
h上下左右移动
j上下左右移动
k上下左右移动
l上下左右移动
0光标移动到行首
^跳到从行首开始第一个非空白字符
$光标移动到行尾
<c-o>跳到上一个位置
<c-i>跳到下一个位置
<c-b>上一页
<c-f>下一页
<c-u>上移半屏
<c-d>下移半屏
H调到屏幕顶上
M调到屏幕中间
L调到屏幕下方
:n跳到第n行
w跳到下一个单词开头(标点或空格分隔的单词)
W跳到下一个单词开头(空格分隔的单词)
e跳到下一个单词尾部(标点或空格分隔的单词)
E跳到下一个单词尾部(空格分隔的单词)
b上一个单词头(标点或空格分隔的单词)
B上一个单词头(空格分隔的单词)
ge上一个单词尾
%在配对符间移动, 可用于()、{}、[]
gg到文件首
G到文件尾
fx跳转到下一个为x的字符
Fx跳转到上一个为x的字符
tx跳转到下一个为x的字符前
Tx跳转到上一个为x的字符前
;跳到下一个搜索的结果
[[跳转到函数开头
]]跳转到函数结尾

文本编辑

快捷键说明
r替换当前字符
R进入替换模式,直至 ESC 离开
s替换字符(删除光标处字符,并进入插入模式,前可接数量)
S替换行(删除当前行,并进入插入模式,前可接数量)
cc改写当前行(删除当前行并进入插入模式),同 S
cw改写光标开始处的当前单词
ciw改写光标所处的单词
caw改写光标所处的单词,并且包括前后空格(如果有的话)
ct,改写到逗号
c0改写到行首
c^改写到行首(第一个非零字符)
c$改写到行末
C改写到行末(同 c$)
ci"改写双引号中的内容
ci'改写单引号中的内容
ci)改写小括号中的内容
ci]改写中括号中内容
ci}改写大括号中内容
cit改写 xml tag 中的内容
cis改写当前句子
ciB改写'{}'中的内容
c2w改写下两个单词
ct(改写到小括号前
x删除当前字符,前面可以接数字,3x代表删除三个字符
X向前删除字符
dd删除当前行
d0删除到行首
d^删除到行首(第一个非零字符)
d$删除到行末
D删除到行末(同 d$)
dw删除当前单词
dt,删除到逗号
diw删除光标所处的单词
daw删除光标所处的单词,并包含前后空格(如果有的话)
di"删除双引号中的内容
di'删除单引号中的内容
di)删除小括号中的内容
di]删除中括号中内容
di}删除大括号中内容
diB删除'{}'中的内容
dit删除 xml tag 中的内容
dis删除当前句子
d2w删除下两个单词
dt(删除到小括号前
dgg删除到文件头部
dG删除到文件尾部
d}删除下一段
d{删除上一段
u撤销
U撤销整行操作
CTRL-R撤销上一次 u 命令
J连接若干行
gJ连接若干行,删除空白字符
.重复上一次操作
~交换大小写
g~iw替换当前单词的大小写
gUiw将单词转成大写
guiw将当前单词转成小写
guu全行转为小写
gUU全行转为大写
gg=G缩进整个文件
=a{缩进光标所在代码块
=i{缩进光标所在代码块,不缩进"{"
<<减少缩进
>>增加缩进
==自动缩进
CTRL-A增加数字
CTRL-X减少数字
p粘贴到光标后
P粘贴到光标前
v开始标记
y复制标记内容
V开始按行标记
CTRL-V开始列标记
y$复制当前位置到本行结束的内容
yy复制当前行
Y复制当前行,同 yy
yt,复制到逗号
yiw复制当前单词
"+y复制当前选中到系统剪切板
3yy复制光标下三行内容
v0选中当前位置到行首
v$选中当前位置到行末
vt,选中到逗号
viw选中当前单词
vi)选中小括号内的东西
vi]选中中括号内的东西
viB选中'{}'中的内容
vis选中句子中的东西
gv重新选择上一次选中的文字
:set paste允许粘贴模式(避免粘贴时自动缩进影响格式)
:set nopaste禁止粘贴模式
"?yy复制当前行到寄存器 ? ,问号代表 0-9 的寄存器名称
"?p将寄存器 ? 的内容粘贴到光标后
"?P将寄存器 ? 的内容粘贴到光标前
:registers显示所有寄存器内容
:[range]y复制范围,比如 :20,30y 是复制20到30行,:10y 是复制第十行
:[range]d删除范围,比如 :20,30d 是删除20到30行,:10d 是删除第十行
ddp交换两行内容:先删除当前行复制到寄存器,并粘贴

文件操作

快捷键说明
:w保存文件
:w <filename>按名称保存文件
ZZ保存文件(如果有改动的话),并关闭窗口
:e <filename>打开文件并编辑
:saveas <filename>另存为文件
:r <filename>读取文件并将内容插入到光标后
:r !dir将dir命令的输出捕获并插入到光标后
:close关闭文件
:q退出
:q!强制退出
:wa保存所有文件
:cd <path>切换Vim当前路径
:new打开一个新的窗口编辑新文件
:enew在当前窗口创建新文件
:vnew在左右切分的新窗口中编辑新文件
:tabnew在新的标签页中编辑新文件

使用外部程序

快捷键说明
!告诉vim正在执行一个过滤操作
!5Gsort<Enter>使用外部sort命令对1-5行文本排序
!!对当前行执行过滤命令
!!date<Enter>用"date"的输出代替当前行

宏录制

快捷键说明
qa开始录制名字为a的宏
q结束录制宏
@a播放名字为a的宏
100@a播放名字为a的宏100次
:normal@a播放名字为a的宏直到自动结束

实用命令

快捷键说明
/pattern从光标处向文件尾搜索 pattern
?pattern从光标处向文件头搜索 pattern
n向同一方向执行上一次搜索
N向相反方向执行上一次搜索
*向前搜索光标下的单词
#向后搜索光标下的单词
:s/p1/p2/g替换当前行的p1为p2
:%s/p1/p2/g替换当前文件中的p1为p2
:%s/<p1>/p2/g替换当前文件中的p1单词为p2
:%s/p1/p2/gc替换当前文件中的p1为p2,并且每处询问你是否替换
:10,20s/p1/p2/g将第10到20行中所有p1替换为p2
:%s/1\\2\/3/123/g将“1\2/3” 替换为 “123”(特殊字符使用反斜杠标注)
:%s/\r//g删除 DOS 换行符 ^M
:g/^\s*$/d删除空行
:g/test/d删除所有包含 test 的行
:v/test/d删除所有不包含 test 的行
:%s/^/test/在行首加入特定字符(也可以用宏录制来添加)
:%s/$/test/在行尾加入特定字符(也可以用宏录制来添加)
:sort排序
:g/^\(.\+\)$\n\1/d去除重复行(先排序)
:%s/^.\{10\}//删除每行前10个字符
:%s/.\{10\}$//删除每行尾10个字符

帮助

快捷键说明
h tutor入门文档
h quickref快速帮助
h index查询Vim所有键盘命令定义
h summary帮助你更好的使用内置帮助系统
h pattern.txt正则表达式帮助
h eval脚本编写帮助
h function-list查看VimScript的函数列表
h windows.txt窗口使用帮助
h tabpage.txt标签页使用帮助
h tips查看Vim内置的常用技巧文档
h quote寄存器
h autocommand-events所有可能事件
h write-plugin编写插件

其他

快捷键说明
vim -u NONE -N开启vim时不加载vimrc文件
vimdiff file1 file2显示文件差异
vim -R filename以只读方式打开(阅读模式)

插件  列表

插件说明
cpp-mode提供生成函数实现、函数声明/实现跳转、.h .cpp切换等功能(I'm author😄)
vim-edit方便的文本编辑插件(I'm author😄)
change-colorscheme随心所欲切换主题(I'm author😄)
prepare-code新建文件时,生成预定义代码片段(I'm author😄)
vim-buffervim缓存操作(I'm author😄)
vimplus-startifyvimplus开始页面(修改自mhinz/vim-startify)
tagbar使用preservim/tagbar的最新版本,taglist的替代品,显示类/方法/变量
vim-plug比Vundle下载更快的插件管理软件
YouCompleteMe史上最强大的基于语义的自动补全插件,支持C/C++、C#、Python、PHP等语言
NerdTree代码资源管理器
vim-nerdtree-syntax-highlightNerdTree文件类型高亮
nerdtree-git-pluginNerdTree显示git状态
vim-devicons显示文件类型图标
Airline可以取代powerline的状态栏美化插件
auto-pairs自动补全引号、圆括号、花括号等
LeaderF比ctrlp更强大的文件的模糊搜索工具
ack强大的文本搜索工具
vim-surround自动增加、替换配对符的插件
vim-commentary快速注释代码插件
vim-repeat重复上一次操作
vim-endwiseif/end/endif/endfunction补全
tabular代码、注释、表格对齐
vim-easymotion强大的光标快速移动工具,强大到颠覆你的插件观
incsearch.vim模糊字符搜索插件
vim-fugitive集成Git
gv显示git提交记录
vim-slash优化搜索,移动光标后清除高亮
echodoc补全函数时在命令栏显示函数签名
vim-smooth-scroll让翻页更顺畅
clever-f.vim强化f和F键

安装的插件:

  • Vundle
  • YouCompleteMe
  • NerdTree
  • nerdcommenter
  • Airline
  • auto-pairs
  • DoxygenToolkit
  • ctrlp
  • tagbar
  • vim-devicons
  • vim-surround
  • vim-commentary
  • vim-repeat
  • vim-endwise
  • tabular
  • vim-dirdiff
  • vim-coloresque
  • incsearch.vim
  • vim-startify
  • change-colorscheme
  • etc...

nerdtree 插件

在 begin 和 end之 间加入:Plugin 'scrooloose/nerdtree'
输入命令::PluginInstall
配置 nerdtree:
let NERDTreeQuitOnOpen=1 "打开文件时关闭树
let NERDTreeShowBookmarks=1 "显示书签
配置快捷键:
let mapleader = ","
map <leader>ne :NERDTreeToggle<CR>
map <leader>tl :TlistToggle<cr>
nnoremap <leader>ma :set mouse=a<cr>
nnoremap <leader>mu :set mouse=<cr>
保存vimrc,输入,ne,查看效果:

tagbar 插件

安装方式:Plugin 'majutsushi/tagbar' 
设置键:nmap <leader>tb :TagbarToggle<CR>

autopair 插件

这个插件就是给括号自动配对的:Plugin 'jiangmiao/auto-pairs'

minibuffer 插件

安装插件:Plugin 'minibufexpl.vim'
配置插件
let g:miniBufExplMapWindowNavVim = 1 
let g:miniBufExplMapWindowNavArrows = 1 
let g:miniBufExplMapCTabSwitchBufs = 1 
配置快捷键:
nmap <leader>mmbe :MiniBufExplorer<CR>
nmap <leader>mmbc :CMiniBufExplorer<CR>
nmap <leader>mmbu :UMiniBufExplorer<CR>
nmap <leader>mmbt :TMiniBufExplorer<CR>
效果如下

taglist 插件

功能类似于 tagbar。安装:

Plugin 'taglist.vim' 
配置:

let Tlist_Use_Right_Window=1 "taglist 显示在右侧 
let Tlist_Exit_OnlyWindow=1 "taglist 只剩下一个窗口时,自动关闭
let Tlist_File_Fold_Auto_Close=1
快捷键:
map tl :TlistToggle
nnoremap ev :vsplit $MYVIMRC
nnoremap sv :source $MYVIMRC

nerd comment 插件

自动添加注释的插件。安装:Plugin 'scrooloose/nerdcommenter'

代码折叠

配置:
"使用语法高亮定义代码折叠
set foldmethod=syntax
"打开文件是默认不折叠代码
set foldlevelstart=99
zc 折叠
zC 对所在范围内所有嵌套的折叠点进行折叠
zo 展开折叠
zO 对所在范围内所有嵌套的折叠点展开
[z 到当前打开的折叠的开始处。]z 到当前打开的折叠的末尾处。
zj 向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
zk 向上移动到前一折叠的结束处。关闭的折叠也被计入。

markdown 插件安装

安装:
Plugin 'godlygeek/tabular'
Plugin 'plasticboy/vim-markdown'
配置:
let g:vim_markdown_math = 1
let g:vim_markdown_frontmatter = 1
let g:vim_markdown_toml_frontmatter = 1
let g:vim_markdown_json_frontmatter = 1
效果

完整 配置 文件

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 'VundleVim/Vundle.vim'

" nerdtree插件
Plugin 'scrooloose/nerdtree'

" tagbar
Plugin 'majutsushi/tagbar'

" auto pair
Plugin 'jiangmiao/auto-pairs'

" mini buffer
Plugin 'minibufexpl.vim'

" tag list
Plugin 'taglist.vim'

" nerd commit
Plugin 'scrooloose/nerdcommenter'

" PHP mannual
Plugin 'alvan/vim-php-manual'

" snippets mate
Plugin 'MarcWeber/vim-addon-mw-utils'
Plugin 'tomtom/tlib_vim'
Plugin 'garbas/vim-snipmate'
Plugin 'honza/vim-snippets'

" markdown插件
Plugin 'godlygeek/tabular'
Plugin 'plasticboy/vim-markdown'

" you complete me插件
Plugin 'Valloric/YouCompleteMe'

" 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

set modelines=0

"设置更好的删除
set backspace=2

syntax on "语法高亮

"用浅色高亮当前行
autocmd InsertLeave * se nocul
autocmd InsertEnter * se cul

set smartindent "智能对齐

set autoindent "自动对齐

set confirm "在处理未保存或只读文件的时候,弹出确认框

set tabstop=4 "tab键的宽度
set softtabstop=4
set shiftwidth=4 "统一缩进为4
set expandtab "不要用空格替代制表符

set number "显示行号
set history=50  "历史纪录数
set hlsearch
set incsearch "搜素高亮,搜索逐渐高亮

set gdefault "行内替换
set encoding=utf-8
set fileencodings=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936,utf-16,big5,euc-jp,latin1 "编码设置

colorscheme molokai

set guifont=Menlo:h16:cANSI "设置字体
set langmenu=zn_CN.UTF-8
set helplang=cn  "语言设置

set ruler "在编辑过程中,在右下角显示光标位置的状态行

set laststatus=1  "总是显示状态行

set showcmd "在状态行显示目前所执行的命令,未完成的指令片段也会显示出来

set scrolloff=3 "光标移动到buffer的顶部和底部时保持3行的距离
set showmatch "高亮显示对应的括号
set matchtime=5 "对应括号高亮时间(单位是十分之一秒)

set wildmenu  "增强模式中的命令行自动完成操作

set linespace=2 "字符间插入的像素行数目
set whichwrap=b,s,<,>,[,] "开启normal 或visual模式下的backspace键空格键,左右方向键,insert或replace模式下的左方向键,右方向键的跳行功能

filetype plugin indent on "分为三部分命令:file on,file plugin on,file indent on 分别是自动识别文件类型, 用用文件类型脚本,使用缩进定义文件


syntax enable
set foldenable  "允许折叠
set cursorline "突出显示当前行
set magic  "设置魔术?神马东东
set ignorecase "搜索忽略大小写
filetype on "打开文件类型检测功能
set background=dark
set t_Co=256   "256色
set mouse=a  "允许鼠标
"使用语法高亮定义代码折叠
set foldmethod=syntax
""打开文件是默认不折叠代码
set foldlevelstart=99"

" nerdtree 配置
let NERDTreeQuitOnOpen=1 "打开文件时关闭树
let NERDTreeShowBookmarks=1 "显示书签

" taglist 配置
let Tlist_Use_Right_Window=1 "taglist 显示在右侧 
let Tlist_Exit_OnlyWindow=1 "taglist 只剩下一个窗口时,自动关闭
let Tlist_File_Fold_Auto_Close=1

" -- MiniBufferExplorer --   
let g:miniBufExplMapWindowNavVim = 1  " 按下Ctrl+h/j/k/l,可以切换到当前窗口的上下左右窗口  
let g:miniBufExplMapWindowNavArrows = 1  "按下Ctrl+箭头,可以切换到当前窗口的上下左右窗口  
let g:miniBufExplMapCTabSwitchBufs = 1 "启用以下两个功能:Ctrl+tab移到下一个buffer并在当前窗口打开;Ctrl+Shift+tab移到上一个buffer并在当前窗口打开;ubuntu好像不支持  
let g:miniBufExplMapCTabSwitchWindows = 1 "  启用以下两个功能:Ctrl+tab移到下一个窗口;Ctrl+Shift+tab移到上一个窗口;ubuntu好像不支持  
let g:miniBufExplModSelTarget = 1     " 不要在不可编辑内容的窗口(如TagList窗口)中打开选中的buffer

" markdown 配置
let g:vim_markdown_math = 1
let g:vim_markdown_frontmatter = 1
let g:vim_markdown_toml_frontmatter = 1
let g:vim_markdown_json_frontmatter = 1

" YouCompleteMe配置
let g:ycm_key_list_select_completion = ['<Down>']
let g:ycm_key_list_previous_completion = ['<Up>']
let g:ycm_confirm_extra_conf=0 "关闭加载.ycm_extra_conf.py提示
let g:ycm_min_num_of_chars_for_completion=2 " 从第2个键入字符就开始罗列匹配项
let g:ycm_cache_omnifunc=0  " 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_seed_identifiers_with_syntax=1    " 语法关键字补全
" 在注释输入中也能补全
let g:ycm_complete_in_comments = 1
" 在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
"注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'

let mapleader = ","
map <leader>ne :NERDTreeToggle<CR>
nmap <leader>tb :TagbarToggle<CR>
nmap <leader>mmbe :MiniBufExplorer<CR>
nmap <leader>mmbc :CMiniBufExplorer<CR>
nmap <leader>mmbu :UMiniBufExplorer<CR>
nmap <leader>mmbt :TMiniBufExplorer<CR>
map <leader>tl :TlistToggle<cr>
nnoremap <leader>ev :vsplit $MYVIMRC<cr>
nnoremap <leader>sv :source $MYVIMRC<cr>
nnoremap <leader>ma :set mouse=a<cr>
nnoremap <leader>mu :set mouse=<cr>
nnoremap <F5> :YcmForceCompileAndDiagnostics<CR>
nnoremap <leader>lo :lopen<CR> "open locationlist                                                                                                                      
nnoremap <leader>lc :lclose<CR>   "close locationlist
inoremap <leader><leader> <C-x><C-o>"
inoremap <leader><leader> <C-x><C-o>
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>

"对搜索的设置
map ft :call Search_Word()<CR>:copen<CR>
function Search_Word()
let w = expand("<cword>") " 在当前光标位置抓词
execute "vimgrep " . w . " %"
endfunction

5、Linux Nano 编辑器

Linux 上文本编辑器比较常用的有 vim 和 nano,一般 nano 编辑器都是系统自带的,没有可以自行安装,安装完成之后就可以使用。

Ubuntu / Debian:apt-get install nano -y
CentOS / Fedora:yum -y install nano

以第一个为例,^G 就是一个快捷键,其中 ^ 就是键盘上的 Ctrl 键。其他的以此类推。简单总结一些对应规则:

  • ^ = Ctrl,比如 ^G 就是按 Ctrl + G 键。
  • M = Alt,比如 M-E 就是按 Alt + E 键。此外,对于 Mac 用户来说,M = Esc

Ctrl + x 退出时,输入 y,再按 enter 即可保存退出 nano

一些常用操作。打开文件后,下方有一堆文字,那就是快捷键说明。例如:^G 即为 Ctrl+G ,功能为显示帮助文本。

  • Ctrl+G,显示帮助文本
  • Ctrl+O,保存当前文件
  • Ctrl+R,读取其他文件并插入光标位置
  • Ctrl+Y,跳至上一屏幕
  • Ctrl+K,剪切当前一行
  • Ctrl+C,显示光标位置
  • Ctrl+X,退出编辑文本
  • Ctrl+J,对其当前段落(以空格为分隔符)
  • Ctrl+W,搜索文本位置
  • Ctrl+V,跳至下一屏幕
  • Ctrl+U,粘贴文本至光标处
  • Ctrl+T,运行拼写检查
  • Ctrl+_,跳转到某一行
  • ALT+U,撤销
  • ALT+E,重做
  • ALT+Y, 语法高亮
  • ALT+#,显示行号

nano 配置文件(~/.nanorc)

set tabsize 4       # 设置制表符宽度
set autoindent      # 允许自动缩进
set cut             # 设置 CTRL-K 可以剪贴到行末
set noconvert       # 不要转换 DOS/UNIX 换行符
set nowrap          # 不要自动换行
set nohelp          # 不显示下面两行帮助
set morespace       # 隐藏标题下的空白行,换取更多编辑空间
set smooth          # 平滑卷屏
set suspend         # 允许 ctrl-z 将 nano 置于后台
set smarthome       # 第一次 Home 跳到行首非空字符,第二次到行首
set tabstospaces    # 展开制表符为空格(如果需要的话)
set mouse           # 允许鼠标
set linenumbers     # 显示行号(可以在编辑时 ALT-# 切换)
set backupdir path  # 设置备份路径
set backup          # 允许保存备份
set casesensitive   # 搜索使用大小写敏感
set multibuffer     # 使用 CTRL-r 读取文件时,默认读取到新缓存
set nonewlines      # 不在文件末尾添加新行
include <filename>  # 加载额外配置,通常是 /usr/share/nano 下的各种语法文件

语法高亮。nanorc 是一个 nano 语法高亮的项目,如果没有 nano 的语法高亮文件,可以安装它。

curl https://raw.githubusercontent/scopatz/nanorc/master/install.sh | sh

Nano 新建并打开文件

CTRL + S    保存
CTRL + O    另存为
CTRL + R    在当前缓存区插入文件
CTRL + X    关闭缓存区,推出Nano

1、新建文件

直接执行命令即可:nano

2、打开文件

直接用nano跟上文件名即可:nano /home/example.html
如果example.html不存在,会直接新建一个名为example.html的文件。
还可以打开特定行或列的文件:
nano +LINE /path/to/file
nano +LINE,COLUMN /path/to/file
以只读方式打开文件:
nano -v myfile

3、打开配置文件

-w 标志可以防止行的长度太长而不会在屏幕上显示出来。
nano -w /etc/mysql/myf

Nano 编辑修改文件

编辑 (复制、粘贴、剪切、删除)

如果剪切多行,对于每行都使用 ^K,然后一次性粘贴即可。

        剪切:^K
        粘贴:^U

光标控制
        移动光标:使用用方向键移动。
        选择文字:按住鼠标左键拖动(然后就可以复制了)。

复制文本
        取决于用的是什么 SSH 软件。
        Putty 要复制文本是选择要复制的文本点击鼠标左键即可。
        Xshell 要复制文本则是选择要复制的文本按下 Ctrl+INSERT 键。

粘贴文本
        取决于用的是什么 SSH 软件。
        Putty 要粘贴文本点击鼠标右键即可。
        Xshell 要粘贴文本则是按下 Shift+INSERT 键。

CTRL + K    剪切当前行到缓存区
ALT + 6    复制当前行到缓存区
CTRL + U    粘贴缓冲区数据到文件
ALT + T    从光标的位置剪切到文件末尾
CTRL + ]    补全当前的单词
ALT + 3    对所选行或区域进行注释或取消注释。
ALT + U    取消操作
ALT + E    重做操作

CTRL + H    删除光标前的字符
CTRL + D    删除当前被光标选中的字符
CTRL + SHIFT + D    删除光标左边的字
CTRL + DEL    删除光标右边的字
ALT + DEL    删除当前选择的行

搜索、查找、替换

搜索命令:^W

查找和替换文本:先 ^W 进入搜索界面,然后 ^R 输入要替换的文本,然后回车即可。

正则搜索:ALT + R(Mac:ESC + R)

CTRL + Q    开始向后搜索
CTRL + W    开始向前搜索
ALT + Q    向后搜索下一个匹配的文本
ALT + W    向前搜索下一个匹配的文本
ALT + R    搜索和替换

跳转

^T 然后输入行号即可。

CTRL + B    将光标向后移动一个字符
CTRL + F    将光标向前移动一个字符
CTRL + ←    将光标向后移动一个字
CTRL + →    将光标向前移动一个字
CTRL + A    将光标移动到该行的起点
CTRL + E    将光标移动到行尾
CTRL + P    将光标向上移动一行
CTRL + N    将光标向下移动一行
CTRL + ↑    将光标移动到前一个文本块
CTRL + ↓    将光标移动到下一个文本块
CTRL + Y    将光标向上移动一整页文字
CTRL + V    将光标向下移动一整页文字
ALT + \    将光标移动到文件的顶部
ALT + /    将光标移动到文件的底部

ALT + G    转到指定行
ALT + ]    –
ALT + ↑    向上滚动视口
ALT + ↓    向下滚动视口
ALT + <    切换到前一个缓冲区
ALT + >    切换到下一个缓冲区

拼写检查

安装 spell 包即可拼写检查。

Ubuntu / Debian:apt-get install spell -y
CentOS / Fedora:yum -y install spell
安装完成之后使用 ^T 进行拼写检查。

CTRL + T    对当前文件进行拼写检查
CTRL + J    说明当前选择的段落或区域的理由
ALT + J    校验缓冲区
ALT + B    对文件进行语法检查
ALT + F    在文件上运行格式化程序
ALT + :    开始/停止录制宏
ALT + ;    重播录制的宏

CTRL + C    显示光标在文件中的当前位置
ALT + D    显示文件或选区的字数、行数和字符数。
CTRL + G    显示nano的帮助信息

ALT + A    设置和取消标记区域的开始
TAB    缩进当前标记的区域
SHIFT + TAB    解除当前标记区域的indents
ALT + N    打开/关闭行号
ALT + P    允许你逐字输入下一个按键
CTRL + L    刷新屏幕
CTRL + Z    暂停

本文标签: 编辑器 管理器 插件 实用技巧 文本