zl程序教程

您现在的位置是:首页 >  工具

当前栏目

手动挡编辑器vim操控指南

Vim编辑器 指南 操控
2023-09-11 14:21:24 时间

前言

老一辈的unix程序员对vim和emacs情有独钟,vim是从Vi发展出来的一个文本编辑器。它除了文本编辑,其实也具备代码补全、编译及错误跳转等方便编程的功能,在老一代程序员中广泛使用,和Emacs并列成为类Unix系统用户最喜欢的编辑器。

Vim为什么好?

为什么好,为什么行,为什么能。
首先说,vim是一个优秀的编辑器,是给优秀的程序员用的。程序员一生中要学七八种语言,多学一个编辑器,累不死人。
vim最大的优势: 快!惨绝人寰的快!这里的快不仅包括操作,还包括在任何情况下都能用上自己的编辑器。
其次是轻量级,省去安装,一个配置随身走。试问,哪个Linux环境,MacOS环境不带vim?
最后是功能强大,可编程,可定制化。
vim前期学习是需要一点投入,但这种投入是保值的,终身保修,而且能不断提高,直到你臻入化境。会过时吗?不会,只要人类还需要编辑文字,还需要敲代码,只要还有linux,vim就不会从地球上消失。随着你对它了解的增多,你的享受也越来越大,到了你能随心所欲定制它的时候,你就无所不能。

先说说我的vim使用场景:
1、python、javascript这种动态语言我用vim,写起来那是飞快的,但是java还是必须得IDE来的舒服
2、一些远程服务器上的运维、配置文件用vim来肯定是最自然不过的
3、一些数据格式的批量整理我也会用vim
4、我前几天把iPad越狱了,远程登录上去搞一些开发,有了vim,我无需来回切换,来回上传文件了。

今天买了个阿里云ecs玩,登录上服务器之后发现vim用起来特别不顺手,顺手就把自己mac上的vim配置整理了下,搞了个安装脚本, git地址 。你只需要把代码拉下来,运行install.sh,就能拥有我待会介绍的一些vim经典功能。

vim的便利来自于两点:
1、它的快捷键,他提供了能够快速操作文本,快速移动文本的快捷键,除了自带的一些快捷键,你还可以自定义快捷键,自定义快捷键的配置路径就在~/.vimrc
2、它的插件,网上有很多vim的开源插件,你也可以自己编写插件来提高你的开发效率,而插件的路径是~/.vim/
所以我的安装脚本做的事情就是把我的这些配置和插件复制到了你的运行环境上,还有一些动态安装的配置在.vimrc中,所以当你安装后第一次运行vim会提示你安装一些插件,你只需要输入yes即可。

Vim基础

Vim几种模式

  • 插入模式(Insert),可编辑文件,也叫作编辑模式,这个键盘输入的大部分内容都会插入。退出输入模式:esc
  • 普通模式(Normal),开始进入的时候就是这种(Esc之后也是这种模式),不同于windows下的一个非常大的区别的说
  • 命令模式(Command Line),能够在编辑器底部通过冒号加指令的形式进行命令的执行,比如:wq表示保持当前文件的修改内容并且关闭/退出当前文件的编辑
  • 可视化模式(Visual),通过v,V,Ctrl+v进入该模式,之后可以执行某些指令
    1. v是字符可视模式(默认选中一个字符,可上下左右移动选择更多字符)
    2. V是行可视模式(默认就是选择一行)
    3. Ctrl+v是块的可视模式(上下左右移动的覆盖范围),该模式对于需要列输入的时候有时候很有效,后面举例说明
  • 选择模式(Select),通过gh进入该模式,并且选择一个字符,这个时候输入一个可打印的字符之后,将会删除当前选择的字符,并且进入插入模式;如果通过鼠标进行选择操作,那么将可以在终端下使用Command+c等进行复制,Command+v进行粘贴操作;如果通过鼠标进行选择,这个时候输入一个可打印的字符之后,将会删除当前选择的字符,并且进入插入模式,与gh进入的模式差异就只有选择的内容不同而已。
  • 扩展模式(Ex),指令执行之后,还是保留在Ex模式,不会退出指令模式,就是可连续执行指令(非强需求,稍后举例子说明两个小场景)

主要命令

命令功能示例
从控制台打开一个文件vim /etc/hosts
:e从vim编辑器中打开一个文件:e /etc/hosts
:w保存文件
:write保存文件
:up保存文件
:update保存文件
:w newfile,:up newfile,:w! newfile,:up! newfile另存文件,w与up可以等同看待
:x关闭文件
:wq关闭文件
ZZ关闭文件
:q!退出并且丢失修改的内容
:qa退出当前Vim会话的所有文件
:qa!退出所有会话的文件,并且丢弃修改的内容
j向下导航
k向上导航
h向左导航
l向右导航
x删当前光标所在的一个字符。
:wq存盘 + 退出 (:w 存盘, :q 退出 :q!强制退出)
dd删除当前行,并把删除的行存到剪贴板里
p粘贴剪贴板 (也可以进入insert 后 ctrl + v粘贴)

w newfile与up newfile有些许不同,修改了当前文件之后,只要保存当前文件(写入buffer的内容),之后总是可以up newfile(另存文件),无论newfile是否已经存在;但是,如果使用w newfile,会检查当前文件是否被修改,即使已经将修改保存到了当前文件(写入buffer的内容),还是会提示需要强制write,需要使用w! newfile

上下左右:h,j,k,l
查看左侧文件树:F1
打开左侧文件树中的文件夹或文件:o
上下分屏,左右分屏:光标在文件树的文件上i,s
在切分出来的屏幕左右上下移动:control + h,j,k,l
全局搜索:光标移动到要搜索的词或方法上 control + |
各种插入模式
a → 在光标后插入 直接进入 Insert模式
o → 在当前行后插入一个新行
shift + o → 在当前行前插入一个新行
cw → 替换从光标所在位置后到一个单词结尾的字符
简单的移动光标
gg → 到第一行。
shift + g → 到最后一行。
0 → 数字零,到行头
$ → 到本行行尾
/pattern → 搜索 pattern 的字符串(陈皓注:如果搜索出多个匹配,可按n键到下一个)
Undo/Redo
u → undo
ctrl + r → redo

到了这一步 你已经可以用妖怪一般的操作,晃瞎新手程序员了~~,妖怪的光标移动:

% : 匹配括号移动,包括 (, {, [. (注:你需要把光标先移到括号上,有多牛逼试试就知道)
妖怪的列操作
 将一段代码删除
 在普通模式下 v 然后选择你要删除的区域 x (一大段干掉)
 将一段代码注释
 在普通模式下 ctr + v , 然后下拉到指定的行区域,shift + i , 输入// 后 按一下esc
 将一段代码取消注释
 在普通模式下 ctr + v , 然后下拉右拉到指定的注释符区域 按 x 

vim在复制的时候 如果有注释,就复制的乱七八糟
试试先在普通模式下:set paste
然后在insert

vim配置文件

这里是我的vim配置文件:

https://github.com/vim4program/vim4program.git​

mv掉自己的.vim和.vimrc并备份好。

用Vundle管理插件

vundle是Vim的一个插件,用来管理其他插件,使得原始复杂繁琐的插件安装配置流程变得更加轻松,方便管理。其所有源来自于Github。
类似iOS平台大名鼎鼎的CocoaPods以及Ruby环境下的RubyGems。
先下载vundle:

git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

然后:

下载我的配置文件:curl -k -O https://raw.github.com/vim4program/vim4program/master/.vimrc覆盖$HOME/.vimrc
下载我的配置文件:curl -k -O https://raw.github.com/vim4program/vim4program/master/.vimrc覆盖$HOME/.vimrc
打开vim,执行“:”安装插件,提示安装完成就可以用了
打开vim,执行“:BundleInstall”安装插件,提示安装完成就可以用了。

.vimrc中Vundle配置

" Vundle setting {
    filetype off " required!
 
    set rtp+=~/.vim/bundle/vundle/
    set rtp+=$GOROOT/misc/vim
    call vundle#rc()
 
    " let Vundle manage Vundle(required!)
    Bundle 'gmarik/vundle'
 
    " plugins repos { 
        " The-NERD-tree
        Bundle 'SeanXiao1988/The-NERD-tree-Extension'
 
        " pbcopy plugin
        Bundle 'SeanXiao1988/vim-pbcopy'
 
        " a css/html helper
        Bundle 'vim-scripts/Emmet.vim'
 
    " }
 
    " required!
    filetype plugin indent on
" }

Vim插件开发

VimScript是Vim插件开发官方建议语言。如果你很熟悉Python,完全可以用Python等其他语言进行插件功能逻辑开发。外层Wrapper。
帮助:help Vim-script

Vim插件目录结构

以taglist为例

├── README
├── doc
│   ├── taglist.txt
│   └── tags
└── plugin
    └── taglist.vim

plugin主要存放VimScript。doc主要存放该插件的help文档以及文档导航tag信息(更多Vim插件文档相关知识请自行Google)。 此例中:help taglist

实战

实战以自己写的一个Vim中的copy to clipboard为例。整个插件功能很简单。
复制Visual模式下选中内容、Normal模式下光标所处单词。然后重新绘制Vim窗口。

function! <SID>s:Copy(mode)
    let s:isCopy = 1
    let s:isGrep = 0
    let copyStr = s:_getSelectionWithMode(a:mode)
    exe "silent !echo -n " . copyStr . " | " . "pbcopy"
    redraw!
endfunction

绑定快捷键:

" Key Mapping
exec 'nmap ' . g:copyAndGrepMap_copy . " :call <SID>s:Copy('n')<CR>"
exec 'vmap ' . g:copyAndGrepMap_copy . " :call <SID>s:Copy('v')<CR>"
So
BDE6F3EB_392F_4098_B574_F08332074F4C

了解一下神之编辑器spacemacs

Spacemacs是由社区驱动的一套Emacs配置,同时支持Vim和Emacs两种模式,叫Spacemacs是因为它用Space键作为了编辑器的Leader键。这套Emacs配置简单易用、高效又美观,独特的Layer概念也是它一大特点。

A community-driven Emacs distribution - The best editor is neither Emacs nor Vim, it’s Emacs and Vim!

Layer可以理解为一个插件集合,当我们配置一个编辑器来支持开发某种编程语言时,通常是需要配置多个功能插件的,语法支持、代码补全、文档、语法纠错等等,并且可能其中单单某一个插件的配置就已经非常繁琐,比如Vim的代码补全插件“YouCompleteMe”。Layer的存在大大简化了插件的配置,要写Go语言,在Spacemacs的Layers配置项加上"go",编辑器就会自动下载开发Go语言所需要的插件,重启编辑器就能开发Go语言了,这样的设计简直不要太舒心。
这种设计理念太受欢迎了,以至于现在还有了SpaceVim项目。

题外话,Spacemacs实现Vim输入方式用的插件叫Evil,Emacs + Vim = Evil,这款把水火不相容的Emacs和Vim融合在一起的插件叫“邪恶”,真的是神来之笔。

地址:http://spacemacs.org

附录

  • Vim配置:https://github.com/SeanXiao1988/Vim
  • Copy To Clipboard: https://github.com/SeanXiao1988/vim-pbcopy
  • 基于Nerd-Tree增加功能的插件:https://github.com/SeanXiao1988/The-NERD-tree-Extension