如何讓 vim 成為我們的神器(小結)
阿新 • • 發佈:2020-10-21
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 使用入門 內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!