当前位置:   article > 正文

手动挡编辑器vim操控指南_vim 单手

vim 单手

vim是程序员手中的绣花针,如意金箍棒,可大可小的神兵利器。vim的最大好处就是让程序员能随心所欲地打造一款自主可控的编辑器。它保值,一旦你学会了,用一辈子都不会过时,因为编辑器和IDE再怎么发展,核心内容无非是高效操纵字符。除非哪天人类扔掉键盘,完全用语音和别的方式输入信息。

前言

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

Vi源自QED编辑器,距今已有五十多年的历史。Vim的第一个版本由布莱姆·米勒(Bram Moolenaar)在1991年发布。

1991年11月2日,Vim 1.14:首次发布(Fred Fish disk #591)。
1992年,Vim 1.22:移植到Unix。Vim开始与Vi并驾齐驱。
1994年8月12日,Vim 3.0:支持多个缓冲区和窗口。
1996年5月29日,Vim 4.0:图形用户界面(主要由Robert Webb提供)。
1998年2月19日,Vim 5.0:语法着色/高亮显示。
2001年9月26日,Vim 6.0:折叠,插件,垂直分割。
2006年5月8日,Vim 7.0:拼写检查,自动补齐,撤消分支,标签。
2016年9月12日,Vim 8.0:作业,异步I / O,本机包。

2023-08-03,荷兰自由软件开发者Bram Moolenaar,“vim之父”去世,享年62岁。他的Vim文本编辑器可能是有史以来使用最广泛的Linux程序之一。

由于vim的开发模式被Bram一人掌控,Tarruda 在 2014 年 fork 了 Vim,发起了 Neovim 项目。Neovim 主要改变在软件架构方面,除了增加异步功能和RPC 通信功能外,大部分的功能都可以通过更加强大的编程语言来实现,例如 Python,或者 JavaScript,利用这个特性的最典型的插件如 deoplete 和 coc.nvim,特别是 coc.nvim 插件,利用 JavaScript 实现了非常强大的代码自动补全功能,可以媲美 VS code 提供的代码补全功能。

Vim 8.2 版本中,正式加入了 floating window 功能,在 Neovim 0.4 版本中也正式推出了 floating window 特性。利用该特性,能实现在任意位置开一个新窗口,达到现代IDE的一些效果。

vim支持的编程语言主要是vimscript, neovim支持的语言主要是Lua。所谓插件,就是能在不同阶段被vim/neovim加载运行的脚本。如果不用插件管理工具,直接把插件的文件扔进autoload/plug/pack这些目录也完全可以。插件帮我们更好规划和管理脚本。

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?

其它编辑器如vs code,sublime text,以及JetBrains为什么强?核心就两招:

  • 全局搜索。也就是能快速定位到某个文件和文本片段
  • 自动补全
    至于运行、调试和重构等功能,就不属于一个文本编辑器必须要干的事情了。所以,如果你想玩转vim,就得知道vim中这两大功能怎么个玩法。

vim的进阶层次

第一级: 会基本的编辑:插入,删除,复制,粘贴,选中等,能在远程ssh登录下进行一些配置文件的修改;我估计大部分人到这个程度也够了。
第二级:能同时操纵多个文件,搜索,替换,跳转,控制缓冲区,玩转文本块。常规的编辑任务都能在vim下完成,能脱离图形编辑器完成大部分工作。练到这个层次,就对vim有几分热爱了,了解它的基本哲学了。
第三级:以vim为主打开发环境,熟悉vimscript和插件开发,能深度定制vim。

安装

MacOS上:

brew install vim
brew install macvim
brew install ctags
brew install cscope
brew install fzf    ## 强大的搜索工具
# macOS
brew install ag
或 brew intall the_silver_searcher
# ripgrep
brew install ripgrep
# Ubuntu >= 13.10 (Saucy) or Debian >= 8 (Jessie)
sudo apt-get install silversearcher-ag
sudo apt-get install ripgrep
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

vim配置文件

vim配置目录~/.vim的结构如下:

autoload/               自动载入脚本
colors/                 颜色主题
plugin/                 在 Vim 启动时将被载入的脚本,每次启动vim都会被运行一次
after/                  等插件加载完后执行
ftdetect/               文件类型识别脚本,也会在vim启动时就运行
syntax/                 语法高亮文件
spell/                  拼写检查脚本
ftplugin/               文件类型相关插件
compiler/	             编译器,相应文件类型应该如何编译
indent/                 语法对齐,根据它们的名字来加载
doc/                    插件放置文档
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

~/.vim/ftplugin/ 此目录中的文件有些不同。当vim给缓冲区的filetype设置一个值时,vim将会在~/.vim/ftplugin/ 目录下来查找和filetype相同名字的文件。例如你运行set filetype=derp这条命令后,vim将查找 ~/.vim/ftplugin/derp.vim此文件,如果存在就运行它。不仅如此,它还会运行 ftplugin 下相同名字的子目录中的所有文件, 如~/.vim/ftplugin/derp/这个文件夹下的文件都会被运行。每次启用时,应该为不同的文件类型设置局部缓冲选项,如果设置为全局缓冲选项的话,将会覆盖所有打开的缓冲区。

~/.vim/autoload/ 它里面放置的是当你真正需要的时候才被自动加载运行的文件,而不是在vim启动时就加载。这里的特定条件指的是当某一个 autoload 类型的函数被调用,并且 Vim 当前环境下并未定义该函数时。 比如调用 call helloworld#init() 时,Vim 会先检测当前环境下是否定义了该函数,若没有,则在 autoload/ 目录下找 helloworld.vim 这一文件, 并将其载入,载入完成后执行 call helloworld#init().

这里是我的vim配置文件:

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

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

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模式,不会退出指令模式,就是可连续执行指令(非强需求,稍后举例子说明两个小场景)
  • 列模式
    ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如”#”,再按Esc,就会全部注释了。

帮助文档使用

vim自带的帮助文档就是最好的学习手册。

  • :help
  • :help index , 查看帮助索引
  • <C-]>跳到某个tag对应的帮助,Ctrl+T返回。

键盘映射

在vim中,很多操作需要组合键,典型的如"三键齐发",就是同时按下三个键完成某个操作,例如<C-r>h表示先按住Ctrl和r键,再按h键。按一个键通常是输入该键代表的字符,按两个或三个键通常是完成某个功能。几乎没有按四个键的,因为三个键组合的表示空间已经足够大了。

前缀键默认为“\”,也可以修改,设为逗号或空格:

let mapleader=","
let mapleader = "\<space>"
  • 1
  • 2

要查看哪些键被定义,可以:

:verbose map <C-S-H>

上面命令查看Ctrl+Shift+H的组合键是否被定义。

vim的设置中,可以在.vimrc文件中使用map命令设置键位映射,如在.vimrc中增加一行map a b,那么在普通模式下输入a就会起到b的效果(在vim按b是光标向后移动一个词)。更tricky一点,用inoremap a b,那么在编辑模式下输入的a字符全都会变成b。

如果要表示一个ctrl开头的快捷键,可以用<C表示,如在map命令中,C-r表示快捷键ctrl+r,用法是先按住ctrl不放,再按r键。相应的<M和<A都是表示Alt键,<S表示shift键。

但有些键是vim无法识别的,如Mac下的Fn键,就无法利用上。Mac下的Command键在普通vim模式下也无法使用。

要启用鼠标,只需设置mouse=n。很多人喜欢mouse=a。鼠标能够:打开或关闭折叠效果,选择标签,双击跳转,拖动窗口等

特殊键的映射

Alt键

在用Vim的时候,Alt一直无法使用,Alt+key(<A+key>)的设置一直不成功,
答案:在网上找了一下资料才明白原来将"<A+key>“的输入格式改为”^[key"就可以了,
注意:这里的"^[key"不是直接将符号打上去哦,需要按照下面的方法输入才可以。
输入方式:在插入模式下,先按下 Crtl+v会出现^ ,后在按下 Alt+key(你想设置的键),这样vim中显示为:^[key,

如果要表示一个ctrl开头的快捷键,可以用<C表示,如在map命令中,C-r表示快捷键ctrl+r,用法是先按住ctrl不放,再按r键。相应的<M和<A都是表示Alt键,<S表示shift键。

映射MacOS下的Command键(只适用于MacVim):

With IdeaVim you can use: <M-*>, for example means Cmd + c, that <D- maps to command key.
You can see it by :help <D-.

示例
:map <F5> i{ea}<Esc>
  • 1

其中:i{将插入字符{,然后使用Esc退回到命令状态;接着用e移到单词结尾,a}增加字符},最后退至命令状态。在执行以上命令之后,光标定位在一个单词上(例如amount),按下F5键,这时字符就会变成{amount}的形式。

文件、缓冲区、窗格、Tab

vim可以同时打开多个文件,打开后的每个文件放到一个缓冲区,每个窗口展现一个缓冲区,初始只有一个窗口。也可以多个窗口展现同一个缓冲区。

Tab相当于虚拟桌面,每个Tab里管理多个窗口。

多个窗格间切换
分割窗口:

sp: 水平分割当前窗口
vp: 垂直分割当前窗口
  • 1
  • 2

切换:

let NERDTreeMapUpdir='a'

map <F3> :NERDTreeMirror<CR>
map <F3> :NERDTreeToggle<CR>

nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

多个文件之间切换

nnoremap <C-[> :bp<cr>
nnoremap <C-]> :bn<cr>
  • 1
  • 2

在一个缓冲区中穿梭

vim 的基础快捷键非常简洁,记住以下三条,你就能快速上手vim:

  • 移动光标:hjklweb
  • 删除字符: dx
  • 复制粘贴用yp,配合 vim 独有的 text object 属性(i 表示 in,a 表示 around),可以组合出非常强大的快捷操作。

在这里插入图片描述
简单的移动光标

  • gg → 到第一行。
  • shift + g → 到最后一行。
  • 0 → 数字零,到行头
  • $ → 到本行行尾
  • ngg / nG 跳转到指定行,n为行号

命令

定义一个命令:

command! -nargs=* -complete=custom,helloworld#complete HelloWorld call helloworld#test()
nargs取值为*, 0, 1, ?,+, 表示接收参数的个数

例如:

:command -nargs=+ Say :echo “”

创建文件和文件夹

命令模式下:

:e <文件名>
:! mkdir <文件夹名>
  • 1
  • 2

搜索文件

命令模式下:

set path=.,src
find ebook<Tab> 
  • 1
  • 2

在项目目录运行:

ctags -R --extra=f
cscope -Rbq

ctags --languages=c,c++,java --exclude=kerne* --exclude=lk* -R //排除kerne*及lk*表示的文件及文件夹
ctags --languages=c,c++,java kerne* lk* -R //只检索kerne*及lk*表示的文件及文件夹

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

相当于建立文件索引。

搜索插件:

  • FuzzyFinder
  • fzf-lua
  • LeaderF
  • Ctrlp: 一个vim插件,可以帮助用户在文件系统中查找文件或缓冲区
  • Telescope.nvim: 又一个基于neovim的模糊查找插件,支持多种源和模式
  • lookupfile: 即在Buffer中查找、在指定路径下查找和在Tags文件中查找。
    也可以使用ripgrep,the_silver_searcher等外部程序来加速搜索速度。

智能补全

智能补全类的插件有很多,常见的有YouCompleteMe、deoplete.nvim、coc.nvim等,其中YCM被誉为传说中最智能的vim补全插件了,其包括语法智能补全、语法检错、函数跳转等功能。但是其依赖环境复杂,而公司内网的开发机无法连接外网,一个个手动升级/安装依赖实在伤不起

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/233760?site
推荐阅读
相关标签