001 Vim

01. vim的基本操作

graph TD
    SOFT -->  git(GIT)

syntax on:这可以确保 Vim 知道我在使用什么语法。做笔记、写这种文章时我主要使用 Markdown; 而在写小说的时候,纯文本是我的首选格式。 set noerrorbells:为了你的精神状态,我强烈建议打开这个选项。 set textwidth=100:为了便于阅读,没有人愿意横向滚动一个文本文件。 set spell:如果有拼写错误的话提醒你。 set wrap:确保文本以写作者而不是程序员的方式进行折行。

你会注意到,我没有花更多时间讨论其他一些基本配置选项,因为我并不觉得那些对写作者来说有多重要。因为我做一些业余的编码工作,所以我的.vimrc配置反映了这一点。如果你只想在Vim上写作,那么上述配置就应该能让你顺利开始。

从这点上来说,你的 .vimrc 是一个活的文档,它能生动地反映你想用 Vim 做什么,以及你希望 Vim 如何为你做这些事情。

syntax on
set noerrorbells " 取消 Vim 的错误警告铃声,关闭它以免打扰到我们 "
set textwidth=100 " 确保每一行不超过 100 字符 "
set tabstop=4 softtabstop=4
set shiftwidth=4
set expandtab
set smartindent
set linebreak
set number
set showmatch
set showbreak=+++
set smartcase
set noswapfile
set undodir=~/.vim/undodir
set undofile
set incsearch
set spell
set showmatch
set confirm
set ruler
set autochdir
set autowriteall
set undolevels=1000
set backspace=indent,eol,start
" 下面的设置确保按写作者而不是程序员喜欢的方式折行 "
set wrap
nnoremap <F5> :set linebreak<CR>
nnoremap <C-F5> :set nolinebreak<CR>
call plug#begin('~/.vim/plugged')
"   这是颜色风格插件 "
Plug 'colepeters/spacemacs-theme.vim'
Plug 'sainnhe/gruvbox-material'
Plug 'phanviet/vim-monokai-pro'
Plug 'flazz/vim-colorschemes'
Plug 'chriskempson/base16-vim'
Plug 'gruvbox-community/gruvbox'
"   这是为了更容易的诗歌写作选择的一些插件 "
Plug 'dpelle/vim-LanguageTool'
Plug 'ron89/thesaurus_query.vim'
Plug 'junegunn/goyo.vim'
Plug 'junegunn/limelight.vim'
Plug 'reedes/vim-pencil'
Plug 'reedes/vim-wordy'
"   这一部分是为了更容易地与机器集成,用了 vim-airline 这类插件 "
Plug 'vim-airline/vim-airline'
"   这一部分外理工作区和会话管理 "
Plug 'thaerkh/vim-workspace'
"   与上面插件相关, 下面的代码将你的所有的会话文件保存到一个你工作区之外的目录 "
let g:workspace_session_directory = $HOME . '/.vim/sessions/'
"   与上面插件相关,这是一个 Vim 活动的跟踪器 "
Plug 'wakatime/vim-wakatime'
"   一个干扰因素:我在这里使用了一些 Emacs 的功能,特别是 org-mode "
Plug 'jceb/vim-orgmode'
"  这是文件格式相关插件 "
Plug 'plasticboy/vim-markdown'
call plug#end()
colorscheme pacific
set background=dark
if executable('rg')
    let g:rg_derive_root='true'
endif

vim 删除文件中的所有空格

:v/./d

Vim 范围选择

使用 Vim,你可以轻松地对文件中的一系列行执行操作。你可以通过起始行号、逗号和结束行号(包括)来指示范围。除了文字行号之外,你还可以使用句点(.)表示当前行,使用美元符号 ($) 表示文件缓冲区中的最后一行,以及使用百分号(%)表示整个文件。

这里举几个例子来说明。

  • :2,10d 删除第 2 到 10 行
  • :25,$d 删除从第 25 行到文件末尾的每一行:

你可以使用以下命令删除每一行: :%d

要将第 5 到 10 行复制(或转移)到第 15 行之后:

  1. :5,10t 15

要将第 5 行到第 10 行移动到第 15 行之后(而不是复制):

  1. :5,10m 15

vim diff 对比文件

vimdiff  file_left  file_right 或者  vim -d  file\_left  file\_right

方式二

vim file_left

vertical diffsplit file_right
  1. 在差异点跳转

    • 向下跳转:]c
    • 向上跳转:[c
    • 跳转到更远的差异点: 3]c
  2. 文件合并

    • 将当前文件内容合并到另一边:dp  (diff “put”)
    • 将另一边内容合并到当前行:do  (diff “obtain”)
    • 手动刷新比较结果: :diffupdate
  3. 窗口移动

    • Ctrl-w K(把当前窗口移到最上边)
    • Ctrl-w H(把当前窗口移到最左边)
    • Ctrl-w J(把当前窗口移到最下边)
    • Ctrl-w L(把当前窗口移到最右边)

vim 启动速度的测量与优化

=======

vim -u NONE #执行以下命令,以最干净的配置启动Vim
  • 如果瞬间启动成功:恭喜,问题基本可以锁定在你的个人配置文件 (~/.vimrc) 或插件上。
  • 如果依然卡顿:问题可能出在Vim的历史记录文件、系统环境或Vim自身。

状态栏的优化与显示

statusline

vim -u NONE #执行以下命令,以最干净的配置启动Vim
  • 如果瞬间启动成功:恭喜,问题基本可以锁定在你的个人配置文件 (~/.vimrc) 或插件上。
  • 如果依然卡顿:问题可能出在Vim的历史记录文件、系统环境或Vim自身。

状态栏的优化与显示

statusline

查看 VIM 启动时间

  1. 使用内置命令生成启动日志

打开你的终端,执行以下命令。这条命令会启动 Vim,记录详细的启动时间到 /tmp/vim.log 文件,然后立即退出 。

vim --startuptime /tmp/vim.log +qall
  1. 分析日志,找到耗时最长的项目

日志文件生成后,你需要从中找出最耗时的部分。最简单的办法是按耗时(第二列)进行排序,这样最慢的项目就会排在最后,一目了然 。

执行下面的命令,它会排序并显示日志内容:

sort -n -k 2 /tmp/vim.log

如果你想只看最耗时的前几名(例如前10名),可以这样:

sort -n -k 2 /tmp/vim.log | tail -n 10
  1. 如何阅读和分析日志

你需要关注的是日志中的第二列(数字),它代表了每个环节消耗的时间,单位通常是毫秒 (ms) 。

快速判断标准:如果启动总时间在 200ms 以下,体验会非常流畅;超过 500ms 就会感觉到卡顿;如果超过 1秒,就需要认真优化了 。

找出罪魁祸首:排在末尾的那些行,就是加载最慢的环节。它们通常是某个具体的插件脚本或你的 .vimrc 中的某段配置 。例如,如果看到某个以 nerdtree 或 syntax 开头的脚本耗时很长,就知道问题所在了。

4.

在vim中设置viminfo的大小

" 完全控制 viminfo 存储的内容
set viminfo='100,<50,s10,h,%

" 参数说明:
" '100  - 最多保存 100 个文件的标记(不是历史命令!)
" <50   - 每个寄存器最多保存 50 行
" s10   - 寄存器大小超过 10KB 就不保存
" h     - 禁用高亮搜索的历史记录(hlsearch)
" %     - 保存/恢复缓冲区列表
" !     - 保存/恢复全局变量(以大写字母开头的)
" /     - 保存搜索历史的最大条数(未指定时默认50)
" :     - 保存命令历史的最大条数(未指定时默认50)
" @     - 保存输入行历史的最大条数(未指定时默认50)

" 更激进的限制(如果还想进一步压缩):
" set viminfo='20,<10,s1,h

Vim 的启动参数

在 Vim 中,你可以通过以下两种主要方式用标签页(tab)打开多个文件:在启动 Vim 时在 Vim 会话中

🚀 启动 Vim 时打开多个标签页

如果你想在打开 Vim 的同时,就让每个文件都位于独立的标签页中,可以使用 -p 选项:

vim -p file1.py file2.py file3.py

这个命令会启动 Vim,并将 file1.pyfile2.pyfile3.py 分别在不同的标签页中打开 -1-7

Vim 默认最多只能打开 10 个标签页。如果你想一次打开超过 10 个文件,可以在你的 .vimrc 配置文件中设置一个更大的值,例如 set tabpagemax=50 -9

🔧 在 Vim 会话中打开新标签页

当你已经处于 Vim 中,想要在当前会话里打开一个新标签页来编辑文件时,可以使用以下命令:

  • :tabnew filename:tabe[dit] filename:这两个命令都会在一个新的标签页中打开指定的文件 filename。如果文件不存在,Vim 会为你创建一个新文件 -1-2-5。这是最常用的方法。
  • :tabf[ind] filename*:这个命令允许你在 'path' 定义的路径中搜索匹配 filename* 模式的文件,并在新标签页中打开它。注意:这个命令要求搜索结果唯一,如果匹配到多个文件,会报错 -1-2

🧭 标签页的常用操作

打开多个标签页后,熟练地在它们之间切换和管理是关键。这里有一份常用操作速查表 -1-2-7

操作 命令/快捷键 说明
切换标签页 gt:tabnext 切换到下一个标签页。
  gT:tabprevious 切换到上一个标签页。
  {N}gt 直接跳转到第 N 个标签页。例如,2gt 跳转到第二个标签页。
  :tabfirst:tabrewind 跳转到第一个标签页。
  :tablast 跳转到最后一个标签页。
管理标签页 :tabs 列出所有打开的标签页以及其中包含的窗口 \-3\-8
  :tabclose 关闭当前标签页 \-1
  :tabonly 关闭除当前标签页外的所有其他标签页 \-1
  :tabmove [N] 将当前标签页移动到第 N 个标签页之后。如果 N0,则移动到开头 \-1\-3
批量操作 :tabdo [command] 所有标签页中执行同一个命令。例如,:tabdo %s/foo/bar/g 会在所有标签页中将 “foo” 替换为 “bar” \-1\-4

💡 一个小提示:在 Vim 中,一个标签页可以包含多个窗口(即分割窗口),这使得它成为一个非常强大的工作区组织工具。你可以把相关的一组文件(例如,一个HTML文件、它的CSS文件和对应的JavaScript文件)放在一个标签页里,并通过窗口分割来同时查看和编辑它们 -1-7

vimscript 中,判断是否拥有某些特性

if !has('patch-9.1.0276')
    " 如果版本低于 9.1.0276,安装插件
    Plug 'vim-pandoc/vim-pandoc'
    Plug 'vim-pandoc/vim-pandoc-syntax'
endif

在 Vim 中删除所有包含 “sel” 的行,可以使用以下命令:

vim

:g/sel/d

命令解释:

  • :g - 全局命令(global)

  • /sel/ - 匹配包含 “sel” 的行

  • d - 删除匹配的行

其他相关命令:

  1. 删除不包含 “sel” 的行:

    vim

    :v/sel/d
    

    vim

    :g!/sel/d
    
  2. 删除时忽略大小写:

    vim

    :g/sel/di
    

    vim

    :g/\csel/d
    
  3. 删除前确认(交互式):

    vim

    :g/sel/d | c
    
  4. 删除指定范围内的行:

    vim

    :10,50g/sel/d
    

注意事项:

  • 删除操作不可逆,建议先备份或使用 u 命令撤销

  • 可以使用 :g/sel/p 先预览匹配的行(p 表示 print)