前言

vim 是个非常高效、非常好用的工具,很多人一旦开始使用 Vim 之后就再也无法自拔。然而, Vim 仍然有其自身缺陷,对于普通用户来说,很难在入门的时候就体会到Vim的所谓高效性,同时,为了展示一下自己的软件开发功底,及年限,学精vim使用是必不可少的!

vim 打开文件

0、在VIM中 用正则表达式 批量移动、复制和删除文本:

:n1,n2 m n3     移动n1-n2行(包括n1,n2)到n3行之下;
:n1,n2 co n3    复制n1-n2行(包括n1,n2)到n3行之下;
:n1,n2 d        删除n1-n2行(包括n1,n2)行;

1、vim 打开一个文件后,如何打开另一个文件?

"Esc" --> ":" --> "vsp" --> <file_name>
按下Esc 进入末行模式,之后输入 ":vsp" 空格 文件名
:vsp file_name

2、是否可以在vim直接打开多个文件?

效果类似于先:vsplit, 然后:open file2。

方式:
            vim -o file1 file2
            打开的两个文件上下窗口分布
            vim -O file1 file2
            打开的两个文件左右窗口分布

在搜索中发现其他学习点:
   vim file1 file2 file3
        打开后使用":bn" 可以在不同文件中切换。也可以用":n" , ":e#"来切换
亲自测试之后发现,可以用 vim -O file1 file2 file3这种方式,用bn来进行切换。

终止操作 【ctrl+c】


快速的从命令的尾部切换首部【ctrl+a】


快速的从命令的首部切换尾部【ctrl+e】


使用键盘的上下键可以查看曾经输入过的命令,或者history|grep "hi"


vim指令与键盘映射

在windows中有些组合键,比如win+d可以关闭所有窗口,win+l可以锁屏,而leader就有点像win键,告诉vim:我要用快捷键了。事实上,我们不关心这个leader是什么,只是需要这么一个“前缀”。(该类比并不恰当,windows中组合键需要一起按,leader只是个前缀,先按leader再按其它的键即可)

设置leader

let mapleader = ","

这样我们就把逗号设置为mapleader(逗号是惯例,比较容易按,也不会影响原来的功能)。然后你就可以这样设置:

:echo mapleader
nnoremap <leader>d dd

这样你只需要按下,d就等于执行了dd

配置实例

定义以下快捷键,用于删除当前文件中所有的行尾多余空格:

nnoremap <leader>W :%s/\s\+$//<cr>:let @/=''<CR>

定义以下快捷键,用于快速编辑和重载vimrc配置文件:

nnoremap <leader>ev :vsp $MYVIMRC<CR>
nnoremap <leader>sv :source $MYVIMRC<CR>

定义以下快捷键,使用前缀键和数字键快速切换缓冲区:

nnoremap <leader>1 :1b<CR>
nnoremap <leader>2 :2b<CR>
nnoremap <leader>3 :3b<CR> 

光标移动

Vim的最大好处就是几乎所有的操作都是通过主键区的键位进行操作,双手不用离开键盘主区

◎h、j、k、l,分别是左下上右移动光标,前面加上n,可以重复移动多次,例如3j就可以往下移动3行
◎^,跳到一行的开始
◎$,跳到一行的结束
◎gg,跳到文本的第一行
◎G,跳转到文本的最后一行
◎nG或者ngg,跳转到第n行,例如:10G,跳转到第10行;20gg,跳转到第20行

提高 Git 工程中 Ctrl-P 的执行效率

将下面的内容添加到你的 .vimrc 文件中(配置使用来使用 git 或 silver 查找工具来自动补全):

et g:ctrlp_use_caching = 0
if executable('ag')set grepprg=ag --nogroup --nocolorlet g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
elselet g:ctrlp_user_command = ['.git', 'cd %s && git ls-files . -co --exclude-standard', 'find %s -type f']let g:ctrlp_prompt_mappings = {'AcceptSelection("e")': ['<space>', '<cr>', '<2-LeftMouse>'],}
endif

注:建议使用 vim-scripts/gitignore 插件。

vim插件管理器Vundle

安装git 和 vim,git 其中是用来下载插件包的。

#(Ubuntu)
apt install -y vim git
#(centos)
yum  install -y vim git

vim的插件都是默认安装在~/.vim下面,vim缺乏默认的插件管理器,如果每个插件都手动下载然后在vi ~/.vimrc中配置的话会很繁琐很费劲,所以选用Vundle来管理插件,vundle分别是 Vim 和 Bundle 的缩写,它是一款能够管理 Vim 插件的工具,Vundle 为每一个你安装的插件创建一个独立的目录树,并在相应的插件目录中存储附加的配置文件。

因此,相互之间没有混淆的文件。简言之,Vundle 允许你安装新的插件、配置已有的插件、更新插件配置、搜索安装的插件和清理不使用的插件,所有的操作都可以在一键交互模式下完成。

git clone https://github.com/VundleVim/Vundle.vim.git  ~/.vim/bundle/Vundle.vim

将vundle插件,安装到vim,然后在用户目录下,新建文件 vim ~/.vimrc,在里面写配置文件

set nocompatible " be iMproved, required
set autoindent
set tabstop=4
set shiftwidth=4
set expandtab
set number
filetype off " required
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'tpope/vim-fugitive'
Plugin 'rkulla/pydiction'
Plugin 'git://git.wincent.com/command-t.git'
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
call vundle#end() " required
filetype plugin indent on " required
filetype plugin on
let g:pydiction_location ='/root/.vim/bundle/pydiction/complete-dict'

然后打开vim,输入 :PluginInstall安装插件(命令模式),输入后不用管,插件会自动下载,安装成功会在每个插件面前会显示+号,或者使用 vim +PluginInstall +qall (Linux命令)命令安装插件。

需要添加新的插件,只需要在配置文件里面,添加 Plugin '用户/插件名'(GitHub用户/仓库名),然后同样执行插件安装命令,就可以安装了,然后配置插件工作目录,就行比如

let g:pydiction_location ='/root/.vim/bundle/pydiction/complete-dict'
记录几个插件常用命令:
:PluginList #列出安装的插件列表
:PluginUpdate #更新插件
:PluginClean #在配置文件中注释掉不要的插件行,然后执行这个命令就可以卸载对应的插件
:PluginSearch xxx #查找vim插件

vim-vroom 插件及tmux 配置,提高单元测试执行效率

用 vim-vroom 插件以及相应的 tmux 配置来进行我的测试。

使用Vundle管理器安装

在你的.vimrc下添加:

Plugin 'skalnik/vroom'

然后在Vim中运行以下命令:

:source %
:PluginInstall

对于Vundle版本 < 0.10.2,请用上面的Bundle替换Plugin。

随后在您的vundle下的.vimrc设置:

Plugin 'skalnik/vim-vroom'

然后运行

:PluginInstall

vim-room 缺省使用r 执行测试,由于我已将 Leader 映射为,因此我通过r 来运行测试工具。

由于测试在 tmux 的单独窗口运行,因此可以边看测试进展共修订代码。

Vim处理文本之使用normal命令实现奇偶行删除

使用 :normal 命令来实现奇偶行删除的功能。

normal 命令的使用形式为 :{range}norm[al][!] {commands},表示在 range 指定范围内的每行,执行若干普通模式命令 commands。

在具体介绍使用 normal 命令完成奇偶行删除之前,需要强调下 normal 命令的内部运行机制,即:纯粹根据 range 指定的行数,来逐行运行Vim普通模式下的命令 commands。

例如,在下面名为 test.txt 文本中,执行Vim命令 :normal 1,3 dd 并不是删除了1~3行的内容,而是删除了1、3、5行的内容,剩下了原始文件中的2、4、6行。

aa
bb
cc
dd
ee
ff

这是因为,normal 命令是纯粹根据行号来逐行执行的,在第一行执行完 dd 命令,删除第一行后,原文件的第二行变成了第一行,接着,normal 命令将在文件的第二行继续执行 dd 命令,此时通过 dd 命令删除的第二行实则是原始文件的第三行。

这样一来,使用 :normal 1,3 dd 命令,并没有删除掉原始文件中的1、2、3行,而是删除了原始文件中的1、3、5行。

注:normal 命令只有在与会更改文件行信息的普通模式命令结合,才会出现上述的副作用,其他情况下的命令效果都是非常容易理解的。例如,命令 :normal 1,3 yy 会复制当前文件1~3行的内容到Vim无名寄存器。

上述 :normal 命令的执行机制,与Vim的 :global 命令是完全不一样的。:[range]g[lobal]/{pattern}/[cmd] 命令是在 range 指定的范围内,对匹配 pattern 的行进行标记,只要文件行上的标记未被移除,就会在该行执行 cmd。

1. 奇偶行删除

使用Vim的 :normal 命令来提取所有奇数行或所有偶数行文本,达到奇偶行删除/奇偶行分离的目的。

仍然假设有一段如下的《泰坦尼克号》电影对白,需要分别提取出ROSE和JACK的所有台词,并分别保存到两个文件中。

ROSE: I love you Jack.
JACK: No... don't say your good-byes, Rose. Don't you give up. Don't do it.
ROSE: I'm so cold.
JACK: You're going to get out of this... you're going to go on and you're going to make babies and watch them grow and you're going to die an old lady, warm in your bed. Not here. Not this night. Do you understand me?
ROSE: I can't feel my body.
JACK: You must do me this honor... promise me you will survive... that you will never give up... no matter what happens... no matter how hopeless... promise me now, and never let go of that promise.
ROSE: I promise.
JACK: Never let go.
ROSE: I promise. I will never let go, Jack. I'll never let go.

2. :%normmal jdd 删除偶数行

根据前面对 normal 命令的介绍,:%normmal jdd 表示在当前文档的所有行( % ) 上执行 jdd 命令。jdd 是Vim普通模式下的一个命令组合,表示将光标从所在当前行,下移一行 ( j ) 后执行删除行操作 ( dd )。

同样地,根据前面的分析,在第一行执行完 jdd ,删除第二行后,原始文件的第三行变成了第二行,在新的第二行继续执行 jdd 会删除原始文件的第四行……直到原始文件的最后一行上执行 jdd 时,由于执行 j 命令出错 (无法再移动) 而终止 normal 命令的执行。从而完成了删除原始文件所有偶数行的操作。

3. :%normmal jkdd 删除奇数行

在分析 :%normmal jkdd 为什么能删除奇数行之前,需要再强调一下:normal 命令是纯粹根据行数来运行的,如果使用 % 来指定操作当前文档所有行,那么即便原始文件的最后一行,已经执行过 normal 命令,只要不报错,normal 都会重复执行。

因此,出乎你的意料,在本文开头介绍的包含6行文本的 test.txt 文件中执行Vim命令 :%normal dd 时,确实会删除该文档的所有行,但是删除顺序却是: 第1行被删除、第3行被删除、第5行被删除、第6行被删除、第4行被删除、第2行被删除。

出现上述现象的原因是:normal 命令在执行到末行的时候,并不会停止,而是会不断的重复执行。

那么有什么办法停止 normal 命令的执行呢?有!那就是出错。

normal 命令在执行到末行的时候,遇到出错,就会自行停止。

jkdd 实际上就是我们人为加上的一个 错误,在除文件末行外的其他行执行 jkdd 命令时,会先将光标从当前行下移一行 ( j ),然后再将光标上移一行 ( k ),这么一下一上操作后,光标仍然处于原始行上,此时再执行 dd 则会删除当前行。因此,从文件第一行开始执行 jkdd 命令时,会逐步删除原始文件中的奇数行。

当删除到原始文件的末行时,此时因为已经位于末行而没法执行 j 操作而错误,所以 normal 命令就会停止,从而阻止了前面介绍的执行到末尾行后重复执行删除操作,最终导致整个文件都被删除的结果。注::%normal jkdd 会使得原始文件的末行无法被删除,因此,如果原始文件总行数是奇数,则最后一个奇数行无法被删除。

4. 编辑Markdown文件,让普通文本行变成无序列表

可以先用 V 选中这些行,然后按 :'<,'>normal I- 并回车即可实现。

Vim替换命令s

Vim命令行模式下使用 :substitute 命令 (缩写形式 s ) 可以将指定范围内的字符替换成其他目标字符,实现同时处理多个目标行的操作效果。
例如,假设希望将Vim当前打开文件的所有行尾多余的空格删除,可以使用Vim命令 :%s= *$==。

其中,% 表示整个文件范围, *$ 表示以0个或多个 * 结尾的文本行。

VIM妙用及linux使用技巧(包括vim插件管理器、指令与键盘映射、打开多个文件、奇偶删除行、vim替换等)相关推荐

  1. Vim安装插件管理器Vundle

    安装vundle $ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 默认安装在/.vim ...

  2. Linux Vim插件管理器Vundle安装和使用

    Vundle是vim的一个插件管理器, 同时它本身也是vim的一个插件.插件管理器用于方便.快速的安装.删除.Vim更新插件.vim Vundle插件官方地址:https://github.com/V ...

  3. vim 中的杀手级插件: vundle (vim 插件管理器)

    From:http://zuyunfei.com/2013/04/12/killer-plugin-of-vim-vundle/ vundle.txt:https://github.com/Vundl ...

  4. Vim Vundle 插件管理器

    /*********************************************************************** Vim Vundle 插件管理器* 说明:* 话说Vi ...

  5. 面向Linux的10款最佳剪贴板管理器

    许多时候,你将内容拷贝到剪贴板后,最终因某人或某物导致的分心而清空剪贴板,而找不回来.如果出现这种情况,确实很烦人.那么,你如何杜绝这种令人沮丧的局面?这正是我们在本文中所要解答的问题. 这里不妨看一 ...

  6. vim win装_vim插件管理器的安装和配置-windows

    # vim插件管理器的安装和配置-windows ### 前言 ----------------------------- - vim做一框功能强大的编辑器,扩展功能令人称奇,插件机制非常灵活 - 本 ...

  7. vim插件管理器:Vundle的介绍及安装(很全)(转载)

    转载自:https://blog.csdn.net/zhangpower1993/article/details/52184581 背景 Vim缺乏默认的插件管理器,所有插件的文件都散布在~/.vim ...

  8. vim插件管理器:Vundle的介绍及安装(很全)

    背景 Vim缺乏默认的插件管理器,所有插件的文件都散布在~/.vim下的几个文件夹中,插件的安装与更新与删除都需要自己手动来,既麻烦费事,又可能出现错误. Vundle简介 Vundle 是 Vim ...

  9. Vim插件管理器——Vundle

    文章目录 Vim插件管理器--Vundle Vundle简介 如何安装 1 确保已经安装git 2 安装Vundle 3 配置 4 运行 几个常用的Vundle命令 Vim插件管理器--Vundle ...

最新文章

  1. F5负载均衡会话保持技术及原理技术白皮书
  2. 开启报名丨智源论坛 · 北大教授宋令阳:超材料感知与通信
  3. SVG(H5可缩放的矢量图形)
  4. MySQL中的Text类型
  5. 中国大学单身 (民间)排行榜!你上榜了没
  6. python webdriver api-操作日期元素的方法
  7. linux-防火墙有关知识积累
  8. 如何从JSF获取JSON响应?
  9. 周末想找个地方敲代码_观看我们的代码游戏,全周末直播
  10. 7.1 pdo 宝塔面板php_大商创X2.0宝塔环境保姆式完整安装教程
  11. Java类加载过程梳理,一篇搞定
  12. 2021年前端还好找工作吗?
  13. Hyper-V的安装准备
  14. 计算机专业简述,简述计算机专业毕业论文完整版.doc
  15. Linux命令行手动配置无线wiff网络 iwconfig
  16. 交警对开车人的“真言”
  17. 蓝牙bluetooth
  18. python-patterns
  19. 特征工程中的数据标准化
  20. xyoj 6042:让人头疼的“双十一”

热门文章

  1. [QQ机器人]nonebot2土味情话插件
  2. YouTube 数据库如何保存巨量视频文件?
  3. 【Web技术】623- 简单好用的前端深色模式/主题化开发方案
  4. vue element UI 学习总结笔记(九)_ 导航菜单与路由
  5. Android UI设计——ViewPager中设置底部显示圆点焦点(二)
  6. python prettytable输出对齐_Python 使用 prettytable 库打印表格美化输出功能
  7. 菜鸟学习网安写的笔记---1
  8. 商户们的赚钱利器,消费者的剁手助手:支付宝钱包
  9. 室内定位技术之UWB(超宽带):精确人员/物资定位解决方案
  10. 小米需要折叠机,但消费者需要吗?