如何让 vim 成为我们的神器(小结)

Vim 是一个上古神器,刚刚接触的同学可能很难驾驭,本篇文章主要带领大家快速入门,并持续分享当前流行的一些 vim-plugin,有兴趣的同学还可以参考 to-vim-tmux-zsh 仓库继续研究 Tmux 和 Zsh。

Vim 的优势

  • Vim 是一个完全 跨平台 的编辑器;
  • Vim 是一个高度 可定制、可扩展 的编辑器;
  • Vim 有着 良好的生态 环境;

新手指南

$ vimtutor // vim 教程

Vim 模式

  • 普通模式: 默认模式,可用于文本删除、替换,恢复、粘贴等操作;
  • 插入模式: 输入 i 进入插入模式,相当于普通编辑器的编辑模式;
  • 可视模式: 输入 v 进入可视模式,选择文本,进行复制等操作;
  • 命令模式: 输入 : 进入命令模式,可执行执行内部和外部命令;

移动光标

  • hjkl: 上下左右;
  • 2w:向前移动两个单词;
  • 3e:向前移动到第 3 个单词的末尾;
  • 0:移动到行首;
  • \$:当前行的末尾;
  • H:光标移动到顶部;
  • M:光标移动到中间;
  • L:光标移动到底部;
  • gf:根据 path 跳转到指定文件;
  • gg:第一行;
  • G:最后一行;
  • 行号 + G:指定行;
  • ( ): 移到上一句和下一句;
  • { }: 移到上一段和下一段;
  • ctrl + o:跳转回之前的位置;
  • ctrl + i:返回跳转之前的位置;
  • ctrl + d:向下移动半页;
  • ctrl + u:向上移动半页;
  • ctrl + f:向下移动整页;
  • ctrl + b:向上移动整页;

退出

  • esc:进入普通模式;
  • :q!:不保存退出;
  • :wq:保存后退出;

删除

  • x:删除当前字符;
  • dw:删除至当前单词末尾;
  • de:删除至当前单词末尾,包括当前字符;
  • d\$:删除至当前行尾;
  • dd:删除整行;
  • 2dd:删除两行;

修改

  • i:插入文本;
  • a:在当前字符后面进入插入模式;
  • A:当前行末尾添加;
  • r:替换当前字符;
  • o: 打开新的一行进入插入模式;
  • s:删除一个字符然后进入插入模式;
  • cc:修改整行;

撤销

  • u:撤销
  • ctrl + r: 取消撤销

复制粘贴剪切

  • y:复制
  • p:粘贴
  • yy:复制当前行
  • dd:剪切当前行

文件

  • :e! 强制刷新该文件
  • ctrl + g 显示当前行以及文件信息

查找

  • /:正向查找(n:继续查找,N:相反方向继续查找)
  • ?:逆向查找
  • %:查找配对的 {,[,(

替换

  • :s/old/new:替换该行第一个匹配串
  • :s/old/new/g:替换全行的匹配串
  • :%s/old/new/g:替换整个文件的匹配串

基本配置

创建 Vim 的配置文件 .vimrc

touch ~/.vimrc

文件编码

set enc=utf-8

不和 vi 兼容

set noswapfile

备份和撤销文件

set nobackup
set noswapfile

if has('persistent_undo')
 set undofile
 set undodir=~/.vim/undodir
 if !isdirectory(&undodir)
  call mkdir(&undodir, 'p', 0700)
 endif
endif

中文

set fileencodings=ucs-bom,utf-8,gb18030,latin1

鼠标支持

if has('mouse')
 if has('gui_running') || (&term =~ 'xterm' && !has('mac'))
  set mouse=a
 else
  set mouse=nvi
 endif
endif

set clipboard=unnamed

设置文本菜单

if has('gui_running')
 let do_syntax_sel_menu = 1
 let do_no_lazyload_menus = 1
endif

if !has('gui_running')
 if has('wildmenu')
  set wildmenu
  set cpoptions-=<
  set wildcharm=<C-Z>
  nnoremap <F10>   :emenu <C-Z>
  inoremap <F10> <C-O>:emenu <C-Z>
 endif
endif

查找

set ignorecase
set smartcase
set hlsearch
set incsearch

nnoremap <silent> <F2>   :nohlsearch<CR>
inoremap <silent> <F2> <C-O>:nohlsearch<CR>

显示行号

set number

设置缩进

set shiftwidth=2
set tabstop=2

突出显示当前行

set cursorline

启动 vim 时关闭折叠代码

set nofoldenable

主题

syntax enable
colorscheme one
set background=dark

背景透明

hi Normal ctermfg=252 ctermbg=none

插件配置

使用 vim-plug 管理插件

树形目录

Plug 'scrooloose/nerdtree'              " https://github.com/preservim/nerdtree
Plug 'jistr/vim-nerdtree-tabs'            " https://github.com/jistr/vim-nerdtree-tabs
Plug 'Xuyuanp/nerdtree-git-plugin'          " https://github.com/Xuyuanp/nerdtree-git-plugin
Plug 'ryanoasis/vim-devicons'             " https://github.com/ryanoasis/vim-devicons
Plug 'tiagofumo/vim-nerdtree-syntax-highlight'    " https://github.com/tiagofumo/vim-nerdtree-syntax-highlight
Plug 'tpope/vim-eunuch'                " https://github.com/tpope/vim-eunuch

map <C-n> :NERDTreeToggle<CR>

let NERDTreeMinimalUI = 1
let NERDTreeShowHidden = 1

let g:nerdtree_tabs_open_on_console_startup = 1

nnoremap <F5> :UndotreeToggle<cr>

" i 在新的水平分割的窗口中打开
" s 在新的竖直分割的窗口中打开
" t 在标签页中打开
" go 预览文件
" r 刷新光标所在的目录
" R 刷新当前根路径
" I 显示隐藏文件
" m 显示文件操作菜单
" C 将根路径设置为光标所在的目录
" u 设置上级目录为根路径
" gT 前一个 tab
" gt 后一个 tab
" <C-W> 加方向键(h、j、k、l、<Left> 等)可以在窗口之间跳转
" <C-W> + w 跳转到下一个窗口
" <C-W> + s 和 :split 作用相同,把当前窗口横向一分为二
" <C-W> + v 和 :vsplit 作用相同,把当前窗口纵向一分为二
" <C-W> + o 或 :only 只保留当前窗口,关闭其他所有窗口

标签

Plug 'majutsushi/tagbar'             " https://github.com/majutsushi/tagbar

nnoremap <F9>   :TagbarToggle<CR>
inoremap <F9> <C-O>:TagbarToggle<CR>

自动补全

Plug 'Valloric/YouCompleteMe'             " https://github.com/ycm-core/YouCompleteMe
Plug 'Raimondi/delimitMate'              " https://github.com/Raimondi/delimitMate

nnoremap <Leader>fi :YcmCompleter FixIt<CR>
nnoremap <Leader>gd :YcmCompleter GoToDefinition<CR>

语法高亮,检查

Plug 'sheerun/vim-polyglot'              " https://github.com/sheerun/vim-polyglot
Plug 'w0rp/ale'                    " https://github.com/w0rp/ale

let g:ale_fix_on_save = 1
let g:ale_sign_column_always = 1
let g:ale_sign_error = '●'
let g:ale_sign_warning = '▶'

nmap <silent> <C-k> <Plug>(ale_previous_wrap)
nmap <silent> <C-j> <Plug>(ale_next_wrap)

全局搜索,快速打开文件

Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }  " https://github.com/junegunn/fzf
Plug 'junegunn/fzf.vim'                " https://github.com/junegunn/fzf.vim
Plug 'ctrlpvim/ctrlp.vim'               " https://github.com/ctrlpvim/ctrlp.vim

let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files -co --exclude-standard']
let g:ctrlp_regexp = 1

" <c-r>: 切换匹配模式
" <c-t>:在新的 tab 中打开
" :Rg

状态条

Plug 'vim-airline/vim-airline'            " https://github.com/vim-airline/vim-airline
Plug 'vim-airline/vim-airline-themes'         " https://github.com/vim-airline/vim-airline-themes

let g:airline_theme='onedark'
let g:airline_powerline_fonts = 1

let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#formatter = 'unique_tail'
let g:airline#extensions#ale#enabled = 1
let g:airline#extensions#tabline#buffer_nr_show = 1
let g:airline#extensions#nerdtree_statusline = 0
let g:airline_section_c = ''

注释

Plug 'scrooloose/nerdcommenter'            " https://github.com/preservim/nerdcommenter

let g:NERDSpaceDelims = 1
let g:NERDDefaultAlign = 'left'

" <leader>c<space> 注释/取消注释
" <leader>ca 切换 // 和 /* */
" <leader>cs /* 块注释 */
" <leader>cm 只用一组符号注释
" <leader>cA 在行尾添加注释

git

Plug 'airblade/vim-gitgutter'             " https://github.com/airblade/vim-gitgutter
Plug 'tpope/vim-fugitive'               " https://github.com/tpope/vim-fugitive
Plug 'tpope/vim-rhubarb'               " https://github.com/tpope/vim-rhubarb

set updatetime=100
let g:gitgutter_max_signs = -1

" jump to next hunk: ]c
" jump to previous hunk: [c
" stage the hunk: <Leader>hs
" undo the hunk: <Leader>hu
" preview the hunk: <Leader>hp

" :G
" :Gvdiffsplit
" :GBrowse
"
" s: 加到暂存区中
" u: 重置加入暂存区的修改
" =: 切换 diff 显示
" cc: 提交当前暂存区中的文件

Markdown

Plug 'iamcco/markdown-preview.nvim', { 'do': 'cd app && yarn install' }   " https://github.com/iamcco/markdown-preview.nvim

" :MarkdownPreview
" :MarkdownPreviewStop

Emmet

Plug 'mattn/emmet-vim'                " https://github.com/mattn/emmet-vim

let g:user_emmet_leader_key='<C-Z>'

" <C-Z>,

Prettier

Plug 'prettier/vim-prettier', { 'do': 'npm install' }   " https://github.com/prettier/vim-prettier

autocmd BufWritePre *.js,*.jsx,*.mjs,*.ts,*.tsx,*.css,*.less,*.scss,*.json,*.graphql,*.md,*.vue,*.yaml,*.html PrettierAsync

" :PrettierAsync

Wakatime

Plug 'wakatime/vim-wakatime'               " https://github.com/wakatime/vim-wakatime "

Whitespace

Plug 'ntpeters/vim-better-whitespace'           " https://github.com/ntpeters/vim-better-whitespace

let g:better_whitespace_enabled=1

" :StripWhitespace

总结

最后,呈上 to-vim-tmux-zsh 仓库可供参考,顾名思义,除了 vim,还有 tmux 和 zsh 的相关内容。

到此这篇关于如何让 vim 成为我们的神器(小结)的文章就介绍到这了,更多相关vim 使用入门 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vim中查找替换及正则表达式的使用详解

    前言 正则表达式是文本处理领域中的一个强大的工具,它可以让文本处理的能力呈指数级的提升,如果一款文本编辑器不支持正则表达式,那么它就算不上是一个现代化的编辑器,这绝非虚言. 下面这篇文章主要跟大家介绍了关于Vim查找替换及正则表达式使用的相关内容,分享出来供大家参考学习,下面来一起看看吧. 简单替换表达式 :[range]s/from/to/[flags] range:搜索范围,如果没有指定范围,则作用于但前行. :1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索

  • 解决vim语法高亮不起作用的方法

    一.首先将vim更新为最新版yum -y install vim,并安装Vim的加强版vim-enhanced ,以安装支持彩色的组件    yum -y install vim-enhanced 二.接下来配置vim配置文件  vi   /etc/vimrc     增加一行  syntax on 或者我们干脆下载个干净版的vimrc吧 三.为了让vi命令也可以使用vim的配置,需要修改   vi /etc/bashrc        增加一行   alias vi='vim' 此时,经过上面

  • Vim 多行剪切、复制和删除功能

    剪切 快捷键方式: dd:剪切光标所处当前行 n + dd:剪切光标所在行及以下共 n 行 按 p 粘贴在光标所在行 命令行方式: 例如剪切1到10行,并粘贴在12行处: 1,10 m 12 快捷键方式: yy:复制光标所处当前行 n + yy:复制光标所在行及以下共 n 行 按 p 粘贴在光标所在行 命令行方式: 例如复制1到10行,并粘贴在12行处: 1,10 co 12 删除 快捷键方式: dd:删除光标所处当前行 n + dd:删除光标所在行及以下共 n 行 命令行方式: 例如删除1到1

  • Vim进行文件目录操作小结

    一.当前文件名 我们知道Vim有48个寄存器,其中%只读寄存器中保存着当前文件路径. 例如在/home/harttle/下打开src/main.cpp,我们打印%的值: :echo @% " 文件路径 src/main.cpp 通过关键字展开可得到绝对路径.所在目录等信息: :echo expand('%:t') " 文件名 main.cpp :echo expand('%:p') " 绝对路径 /home/harttle/src/main.cpp :echo expand(

  • Vim中特殊字符的读写详解

    一.查看特殊字符 Vim中可见特殊字符会直接显示,不可见特殊字符会显示为该字符在命令行的输入方式, 例如\r显示为^M.通过:help digraph-table可看到所有Vim中可输入的特殊字符, 该文档的第一页如下: char digraph hex dec official name ^@ NU 0x00 0 NULL (NUL) ^A SH 0x01 1 START OF HEADING (SOH) ^B SX 0x02 2 START OF TEXT (STX) ^C EX 0x03

  • vi与vim如何修改tab为4个空格方法示例

    前言 本文主要给大家介绍了关于vi与vim修改tab为4个空格的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法如下: 配置文件位置:/etc/virc 和 /etc/vimrc 配置文件中如果要添加注释,不能用#,要使用" " add by school1024.com set ts=4 set softtabstop=4 set shiftwidth=4 set expandtab set autoindent ts是tabstop的缩写,设TAB宽度

  • Vim 强制保存只读类型文件的方法

    发现问题: 在使用vim时,当我们以普通用户去打开一个只有root用户才有权限操作的文件时,我们编辑完成之后,正要保存,却发现,这个文件我们没有权限修改. 每次遇到这样的问题,我都很头疼,好不容易把文件编辑完了,却无法保存,就只能放弃,然后退出,再以root权限打开,重新编辑. 我总是相信,所有的问题都有解决的方法.通过查阅资料,终于解决了这个问题. 解决方案: 底行命令模式执行: :w !sudo tee % w: 表示保存文件 !: 表示执行外部命令 tee: linux命令,这个有点复杂,

  • vim配置显示行号和语法高亮 即.vimrc文件的配置

    在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号.语法高亮度显示.智能缩进等功能的. 为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc. 在启动vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置甚至脚本,所以,一般情况下把.vimrc文件创建在当前用户的根目录下比较方便,即创建的命令为: $vi ~/.vimrc 设置完后 $:x 或者 $wq 进行保存退出即可. 下面给出一个例子,其中列出了经常用到的设置,详细的设置信息请参

  • 如何让 vim 成为我们的神器(小结)

    Vim 是一个上古神器,刚刚接触的同学可能很难驾驭,本篇文章主要带领大家快速入门,并持续分享当前流行的一些 vim-plugin,有兴趣的同学还可以参考 to-vim-tmux-zsh 仓库继续研究 Tmux 和 Zsh. Vim 的优势 Vim 是一个完全 跨平台 的编辑器; Vim 是一个高度 可定制.可扩展 的编辑器; Vim 有着 良好的生态 环境; 新手指南 $ vimtutor // vim 教程 Vim 模式 普通模式: 默认模式,可用于文本删除.替换,恢复.粘贴等操作; 插入模式

  • [JAVA]十四种Java开发工具点评

    在计算机开发语言的历史中,从来没有哪种语言象Java那样受到如此众多厂商的支持,有如此多的开发工具,Java菜鸟们如初入大观园的刘姥姥,看花了眼,不知该何种选择.的确,这些工具各有所长,都没有绝对完美的,就算是老鸟也很难做出选择.在本文中我简要介绍了常见的十四种Java开发工具的特点,管中窥"器",希望能对大家有所帮助. 1.JDK (Java Development Kit) 2.Java Workshop 3.NetBeans 与Sun Java Studio 5 4.Borlan

  • 微服务效率工具 goctl 深度解析

    目录 前言 goctl 的由来 1. goctl 的诞生 2. 为什么需要 goctl? 3. 怎么理解开发规范? 4. 怎么理解工程效率? 二 .goctl 的安装及功能介绍 1. 介绍 2. 安装 go get/install docker 3. 功能介绍 goctl completion 1.3.5 1.3.6 goctl migrate goctl env 1. 环境查看 2. 修改参数 3. 依赖检测/安装 goctl rpc 4. 编辑器插件 三.goctl 使用中遇到的问题 1.

  • node.js 开发指南 – Node.js 连接 MySQL 并进行数据库操作

    Node.js是一套用来编写高性能网络服务器的JavaScript工具包   通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选,本篇就来介绍下如何通过NodeJS来操作 MySQL 数据库. 安装MySQL模块到NodeJS中 我们需要让NodeJS支持MySQL,则需要将MySQL模块添加到系统支持库   想要快速了解Node.js ,赞生推荐亲看看 node.js_guide.pdf  - node.js 开发指南 :想要电

  • 零基础写Java知乎爬虫之先拿百度首页练练手

    上一集中我们说到需要用Java来制作一个知乎爬虫,那么这一次,我们就来研究一下如何使用代码获取到网页的内容. 首先,没有HTML和CSS和JS和AJAX经验的建议先去W3C(点我点我)小小的了解一下. 说到HTML,这里就涉及到一个GET访问和POST访问的问题. 如果对这个方面缺乏了解可以阅读W3C的这篇:<GET对比POST>. 啊哈,在此不再赘述. 然后咧,接下来我们需要用Java来爬取一个网页的内容. 这时候,我们的百度就要派上用场了. 没错,他不再是那个默默无闻的网速测试器了,他即将

  • 利用Python中的mock库对Python代码进行模拟测试

     如何不靠耐心测试 通常,我们编写的软件会直接与那些我们称之为"肮脏的"服务交互.通俗地说,服务对我们的应用来说是至关重要的,它们之间的交互是我们设计好的,但这会带来我们不希望的副作用--就是那些在我们自己测试的时候不希望的功能. 比如,可能我们正在写一个社交软件并且想测试一下"发布到Facebook的功能",但是我们不希望每次运行测试集的时候都发布到Facebook上. Python的unittest库中有一个子包叫unittest.mock--或者你把它声明成一

  • 详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)

    在生活中有一种东西几乎已经快要成为我们的另一个电子"身份证",那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) ,又称二维条码,是在一维条码的基础上扩展出的一种具有可读性的条码.设备扫描二维条码,通过识别条码的长度和宽度中所记载的二进制数据,可获取其中所包含的信息.相比一维条码,二维码记载更复杂的数据,比如图片.网络链接等. 今天介绍一种免费开源的二维码操作组件,ThoughtWorks.QRCode

  • 在Python中处理XML的教程

    XML虽然比JSON复杂,在Web中应用也不如以前多了,不过仍有很多地方在用,所以,有必要了解如何操作XML. DOM vs SAX 操作XML有两种方法:DOM和SAX.DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点.SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件. 正常情况下,优先考虑SAX,因为DOM实在太占内存. 在Python中使用SAX解析XML非常简洁,通常我们关心的事件是start_element,end_e

随机推荐