VIM 使用技巧

在新系统配置 vim.gtk3 时,需要重新安装 NeoBundle, vim.plug 插件管理器。还需要重新安装 YouCompleteMe 插件。

00. NeoBundle 插件管理器的安装

$ mkdir ~/.vim/bundle
$ git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

安装 NeoBundle 之后,就可以在 Vim 中运行 :NeoBundleList:NeoBundleInstall(!) 来列出和安装更新其所管理的插件了。

01. vim.plug 的安装

$mkdir .vim/autoload
$cp ~/code_snippets/vim.plug ~/.vim/autoload/

之后在 Vim 中运行 :PlugInstall 来安装 plug.vim 所管理的插件。

02. Python poetry 的安装

$sudo apt install python3-pip
$pip install --user poetry
$echo 'PATH=${PATH}:~/.local/bin >> ~/.bashrc'

03. YouCompleteMe 的安装

安装编译工具:

$sudo apt install build-essential cmake vim-nox python3-dev

运行下面的命令,克隆子模块。

$cd ~/.vim/bundle
$git clone git@github.com:ycm-core/YouCompleteMe
$git submodule update --init --recursive

安装各种语言的补全之前,需要满足各种条件。比如安装 TyepScript 的支持(--ts-completer),就需要先安装 Node.js 与 npm;要有 Java 的支持(--java-completer),就要有 JDK。

JDK 的安装:

  1. 下载 JDK 的 tar.gz 文件
  2. $sudo tar xf jdk-xx.x.xx_linux-x64_bin.tar.gz -C /opt/
  3. $sudo ln -s /opt/jdk-xx.x.xx/ /opt/jdk
  4. $sudo update-alternatives --install "/usr/bin/java" "java" "/opt/jdk/bin/java" 1
  5. $sudo update-alternatives --install "/usr/bin/javac" "javac" "/opt/jdk/bin/javac" 1

安装完成

$python install.py --ts-completer

gnome-terminal 终端光标丢失问题

ibus-pinyin 1.5.0 on debian 9 will hide terminal cursor

"Recently, I also encountered this problem. I solved this problem by unchecking the item 『Embed preedit text in application window』in the ibus preferences (run ibus-setup from the terminal."

使用 Shougo/dein.vim 来管理 Vim 插件

其中 ycm-core/YouCompleteMe 可手动 git~/.cache/dein/repos/github.com/ycm-core/YouCompleteMe,然后运行 python install.py --java-completer --ts-completer 进行安装。

使用 coc.nvim 时,找不到 utilsnips 目录的问题

在 Windows 系统上的 msys2 环境下运行安装了 coc 插件的 vim,默认会报出 ~/.vim/coc-data/utilsnips 找不到的问题,此时需在 .vimrc 文件中加入下面这行:

let g:coc_data_home="/tools/msys64/home/Lenny.Peng/.vim/coc-data/"

指向 coc-data 的正确位置,随后再度启动 vim 将自动按照 coc.nvim 本身的一些依赖,并不再报出上面目录找不到的问题。

这里记录 VIM 的一些使用技巧。

使用 coc.nvim~/.vimrc

这个 .vimrc 简单好用,特记录于此。


"Get out of VI's compatible mode
set nocompatible
set nofoldenable    " disable folding

"Encoding
set encoding=utf-8
set fileencoding=utf-8
set fileencodings=utf-8,gbk,chinese,cp936,gb18030,utf-16le,utf-16,big5,euc-jp,euc-kr,latin-1

"Update time
set updatetime=300

"I like using light background terminal
set background=light

"Sets how many lines of history VIM has to remember
set history=1000

"Set to auto read when a file is changed from the outside
set autoread

"Keep buffer during switch files
set hidden

"No fold
set nofoldenable

"Always show current position
set ruler

"Show line number and wrap line
set number
set wrap

"Backspace and cursor keys wrap to
set backspace=eol,start,indent
set whichwrap+=<,>,h,l

"show matching bracets
set showmatch

"Text options
set expandtab
set shiftwidth=4
set tabstop=4
set softtabstop=4
set smarttab

"Auto-complete filename command mode
set wildmode=list:longest,full

"Highlight search things
set hlsearch
set incsearch

"viminfo file
"set viminfo+=n~/.vim/.viminfo

"swapfile dir
set directory=/tmp//

"noswapfile
"setlocal noswapfile

"Enable filetype
filetype plugin indent on

"Enable syntax hl
syntax enable

"Highlight trailing spaces/tabs
match ErrorMsg '\s\+$'

"Highlight settings in Visual select and Diff mode
highlight Search ctermfg=DarkBlue
highlight Visual ctermfg=White ctermbg=LightBlue
highlight DiffAdd    cterm=bold ctermfg=10 ctermbg=17 gui=none guifg=bg guibg=Red
highlight DiffDelete cterm=bold ctermfg=10 ctermbg=17 gui=none guifg=bg guibg=Red
highlight DiffChange cterm=bold ctermfg=10 ctermbg=17 gui=none guifg=bg guibg=Red
highlight DiffText   cterm=bold ctermfg=10 ctermbg=88 gui=none guifg=bg guibg=Red
"highlight Comment ctermfg=Blue

"Don't like q:
map q <Nop>

"When highlight words, don't jump to next
nnoremap * :let @/='\<<C-R>=expand("<cword>")<CR>\>'<CR>:set hls<CR>
nnoremap <silent> <C-l> :nohls<CR><C-l>

"Map :Q to :q, :W to :w
cnoreabbrev Q <C-r>=(getcmdtype()==':'? 'q!' : 'Q')<CR>
cnoreabbrev W <C-r>=(getcmdtype()==':'? 'w' : 'W')<CR>
cnoreabbrev Wq <C-r>=(getcmdtype()==':'? 'wq' : 'Wq')<CR>
cnoreabbrev WQ <C-r>=(getcmdtype()==':'? 'wq' : 'WQ')<CR>

"Map VIM command/insert mode shortcut to bash shortcut
cnoremap <C-a> <Home>
cnoremap <C-e> <End>
cnoremap <C-b> <Left>
cnoremap <C-f> <Right>
cnoremap <C-d> <Del>
cnoremap <C-k> <Nop>
inoremap <C-a> <Home>
inoremap <C-e> <End>
inoremap <C-k> <Up>
inoremap <C-j> <Down>
inoremap <C-b> <Left>
inoremap <C-f> <Right>
inoremap <C-d> <Del>
inoremap <C-c> <ESC>
inoremap <C-z> <ESC><C-z>

noremap <Leader>W :w !sudo tee % > /dev/null

"autocmd settings
if !exists("autocommands_loaded")
    let autocommands_loaded = 1

    "Strip trailing withspace
    fun! StripTrailingWhitespace()
        let l = line(".")
        let c = col(".")
        " if &ft =~ 'mkd'
        "     return
        " endif
        %s/\s\+$//e
        call cursor(l, c)
    endfun
    autocmd BufWritePre * call StripTrailingWhitespace()
endif

"FileType
autocmd FileType go setlocal noexpandtab
autocmd FileType html,javascript,css,json,jsonc,yaml setlocal shiftwidth=2 tabstop=2 softtabstop=2

"vim-plug setting
fun! VimPlug()
    call plug#begin('~/.vim/bundle')
        Plug 'scrooloose/nerdtree', {'on': 'NERDTreeToggle'}
        Plug 'neoclide/coc.nvim', {'branch': 'release'}
        Plug 'plasticboy/vim-markdown'
        Plug 'rust-lang/rust.vim'
        Plug 'vim-airline/vim-airline'
    call plug#end()
endfun
silent! call VimPlug()

"nerdtree plugin
nmap <F8> :NERDTreeToggle<CR>

" tab navigation mappings
nnoremap tn  :tabnext<CR>
nnoremap tp  :tabprev<CR>
nnoremap tt  :tabedit<Space>
nnoremap tm  :tabm<Space>
nnoremap tq  :tabclose<CR>
nnoremap t1 1gt
nnoremap t2 2gt
nnoremap t3 3gt
nnoremap t4 4gt
nnoremap t5 5gt
nnoremap t6 6gt
nnoremap t7 7gt
nnoremap t8 8gt
nnoremap t9 9gt

coc.nvim 插件的配置文件

使用 :CocConfig 可以打开 coc.nvim 的配置文件。示例配置文件如下。

{
  "rust-analyzer.server.extraEnv": {
    "RUSTUP_TOOLCHAIN": "stable"
  },
  "workspace.ignoredFolders": [
    "$HOME",
    "$HOME/.cargo/**",
    "$HOME/.rustup/**"
  ],
  "rust-analyzer.server.path": "/usr/lib/rustup/bin/rust-analyzer"
}

这个配置文件主要对 rust-analyzercoc-rust-analyzer 进行了配置。其中 coc-rust-analyzer 是通过 vim 的以下命令安装的。

:CocInstall coc-rust-analyzer

查找两个汉字之间的 ASCII 字符串:

:%s/[^\x00-\x7f]\zs[A-Za-z0-9.]\+\ze/ & /g

其中:

  • %s/ - 指在整个文件中查找;
  • [^\x00-\x7f] - Unicode 汉字部分
  • \zs...\ze - 只查找和替换的部分边界
  • [a-zA-Z0-9.]\+ - 正则表达式
  • / & /g - & 表示前面 \zs...\ze 中的 ...

围栏代码块

Fenced Code Blocks

参考:Fenced Code Blocks

基本 Markdown 语法允许咱们通过缩进 4 个空格或一个制表符,创建代码块。而当咱们发现那样不方便时,就要尝试使用围栏代码块。依据咱们的 Markdown 处理器或编辑器,咱们将在代码块的前一行与后一行上,使用三个反引号(backtick, `)或三个波浪号(代字号,tilde, ~)。最重要的是什么?那就是咱们不必缩进任何行!

```json
{
    "firstName": "John",
    "lastName": "Smith",
    "age": 25
}
```

渲染出的数据看起来是这样的:

{
    "firstName": "John",
    "lastName": "Smith",
    "age": 25
}

注:上面为了在代码块中显示 ```,使用了 ~~~ 方式。

在多个行前插入文本

  1. 按下 Esc 进入 “命令模式”;

  2. 使用 Ctrl + V 进入可视块模式;

  3. Up/Down 键选择咱们要注释的行;

  4. 然后按 Shift + i,并输入咱们打算插入的文本;

  5. 随后按下 Esc,等 1 秒钟,插入的行就会出现在每一行上。

参考:How to insert text at beginning of a multi-line selection in vi/Vim

%s 中模式匹配与捕获

在要将 **图 n.m, xxxxx** 这样的大写文字,批量修改为 ### 图 n.m,xxx 这样的标题时,就要用到 Vim 中,用到模式匹配与捕获特性。使用下面的命令:

:%s/\*\*图\(.*\)\*\*/\#\#\#\ 图\1/g

其中 \(.*\),就表示要捕获 字后面、** 前面的任意个字符。而后面替换字符串中的 \1,就表示这个捕获的子字符串。

Last change: 2023-11-24, commit: f995ca9