1. 程式人生 > 程式設計 >如何讓 vim 成為我們的神器(小結)

如何讓 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 使用入門 內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!