標籤:

VI 學習筆記

一、安裝vim(mac)

1. 環境準備這裡我使用brew來進行安裝

brew install xcodebrew install gitbrew install nodebrew install cmake

2. 查看macos系統自帶的vi是否支持系統剪切板功能

vi --version | grep clipboard# 終端輸出+clipboard(+表示支持系統剪切板,-表示不支持)

如果不支持系統剪切板,需要重新安裝vim

# 安裝vimbrew install vim # 再次查看版本信息,此時終端輸出信息+clipboardvi --version | grep clipboard# 在bash_profile中配置vi別名使其指向我們剛剛安裝的vim alias vi=/usr/local/bin/vim

二、配置vim

我們這裡採用插件管理器Vundle進行vim的配置,下面我就直接翻譯了

1. 安裝Vundle

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

2. 配置插件

將下面的模版代碼放在你的.vimrc文件的頂部。刪除不需要的插件,這裡只是用來說明的。

set nocompatible " be iMproved, requiredfiletype off " required" 將Vundle 添加到運行路徑中並進行初始化set rtp+=~/.vim/bundle/Vundle.vimcall vundle#begin()" 讓 Vundle 管理 Vundle, 必須的Plugin VundleVim/Vundle.vim" 下面是一些列子描述Vundle對不同來源插件的支持" 將需要安裝的插件放在vundle#begin與vundle#end 之間" 安裝來自Github中的插件Plugin tpope/vim-fugitive" 安裝來自http://vim-scripts.org/vim/scripts.html 的插件" Plugin L9" 沒有使用github託管的git插件Plugin git://git.wincent.com/command-t.git" 所有的插件必須配置在call vundle#end() 之前call vundle#end() " requiredfiletype plugin indent on " required" To ignore plugin indent changes, instead use:"filetype plugin on"" Brief help" :PluginList - 列出已安裝的插件" :PluginInstall - 安裝插件" :PluginUpdate - 更新插件" :PluginSearch foo - 搜索插件foo; 追加 `!` 可是刷新本地緩存" :PluginClean - 確認刪除無用插件; 追加 `!` 直接刪除不提示"" 查看幫助文檔 :h vundle " 將非插件相關的設置放置在這行下面

3. 常用插件(我的.vimrc)

"****************************************************************************"* *"* Maintainer: Nate Xu <nate.luup@gmail.com> *"* *"****************************************************************************set nocompatiblefiletype off" append to runtime pathset rtp+=~/.vim/bundle/Vundle.vimcall vundle#begin()Plugin VundleVim/Vundle.vimlet g:vundle_default_git_proto = git"*****************************************************************************" Add package by Vundle"*****************************************************************************" ThemePlugin soso.vim"TREE TABPlugin scrooloose/nerdtree"Fuzzy file, buffer, mru, tag, etc finder. Plugin ctrlpvim/ctrlp.vim"Visual tab {bottom}Plugin vim-airline/vim-airlinePlugin vim-airline/vim-airline-themes"grepPlugin grep.vim"Syntax checking hacks for vimPlugin scrooloose/syntastic"nerdcommenterPlugin scrooloose/nerdcommenter"delimitMatePlugin Raimondi/delimitMate"vim-surroundPlugin (tpope/vim-surround)"Javascript BundlePlugin pangloss/vim-javascriptPlugin (mxw/vim-jsx)Plugin (Valloric/YouCompleteMe)Plugin (ternjs/tern_for_vim)Plugin maksimr/vim-jsbeautify" Plugin sbdchd/neoformat "HTML BundlePlugin (mattn/emmet-vim)"All of your Plugins must be added before the following linecall vundle#end() " requiredfiletype plugin indent on " required

  • Raimondi/delimitMate

功能:自動補全引號(單引號/雙引號/反引號), 括弧(()[]{})

用法:被動技能, 在編輯輸入的時候觸發


  • tpope/vim-surround

功能: 快速給詞加環繞符號,例如單引號/雙引號/括弧/成對標籤等

用法:

# 替換(雙引號 -> 單引號): cs""Hello world!" -> Hello world!# 替換(單引號 -> <q> 標籤): cs<q>Hello world! -> <q>Hello world!</q># 替換(標籤 -> 雙引號)-標籤t代表tag: cst"<q>Hello world!</q> -> "Hello world!"# 刪除雙引號: ds""Hello world!" -> Hello world!# 添加(ys=you surround): ysiw](iw 是一個文本對象)Hello world! -> [Hello] world!# 替換([ -> {): # 1. cs[{ 此命令單詞左右有空格{ Hello } world!# 2. cs[} 此命令單詞左右無空格{Hello} world!# 整行首尾添加(): yss){Hello} world! -> ({ Hello } world!)


  • Valloric/YouCompleteMe

功能:YouCompleteMe是一款針對Vim的快速,即用型的模糊搜索代碼完成引擎。它有幾個完成引擎:

  1. 一種基於標識符的引擎,可以與每種編程語言一起工作
  2. 一個基於Clang的引擎,為C / C ++ / Objective-C / Objective-C ++(從現在起被稱為「C族語言」)提供本地語義代碼完成
  3. Python 2和3(使用JediHTTP包裝器)的基於Jedi的完成引擎
  4. 基於OmniSharp的C#完成引擎
  5. Go的Gocode和Godef語義引擎的組合
  6. 一個基於TSServer的TypeScript完成引擎
  7. 一個基於Tern的JavaScript完成引擎
  8. 一個基於racer的Rust完成引擎
  9. 一個基於jdt.ls的Java實驗完成引擎。
  10. 以及一個基於omnifunc的完成者,它使用來自Vim的omnicomplete系統的數據為許多其他語言(Ruby,PHP等)提供語義完成.

以下是上述簡短GIF演示中發生的情況的解釋。

首先,要意識到在演示中的任何一點都不需要按鍵盤快捷鍵來獲得完成候選名單。用戶只需鍵入並自行彈出建議。如果用戶沒有找到相關的完成建議和/或只是想輸入,他們可以這樣做;完成引擎不會幹涉。

當用戶看到提供的有用完成字元串時,他們按TAB鍵接受它。這將插入完成字元串。重複按下TAB鍵循環所提供的完成。

如果提供的完成項不夠用,用戶可以繼續輸入以進一步過濾不需要的完成項。

關鍵的一點是,自動完成過濾不是基於字元串前綴(但也可以)。輸入需要是自動完成的子序列匹配。這是一種奇特的說法,即任何輸入字元都需要按輸入字元在輸入中出現的順序出現在完成字元串中。所以abc是xaybgc的子序列,但不是xbyxaxxc。在過濾器之後,一個複雜的分類系統對完成字元串進行排序,以便最相關的字元串出現在菜單的頂部(因此您通常只需按TAB一次)。

上述所有工作都適用於任何編程語言,由於基於標識符的完成引擎。它收集當前文件中的所有標識符以及您訪問的其他文件(以及您的標籤文件)中的所有標識符,並在您鍵入時標識符(標識符放入每個文件類型組)中進行搜索。

該演示還顯示了正在使用的語義引擎。當用戶在插入模式下鍵入.,->或::時(對於C ++,不同的觸發器用於其他語言),語義引擎被觸發(也可以使用鍵盤快捷鍵觸發;也可以參見文檔)。

您可以在演示中看到的最後一件事是,如果您正在編輯C系列文件,YCM的診斷顯示功能(左邊水槽中顯示的小紅色X;受Syntastic啟發)。當Clang編譯您的文件並檢測到警告或錯誤時,它們將以各種方式呈現。你不需要保存你的文件或按任何鍵盤快捷鍵來觸發它,它在後台「只是發生」。

實質上,YCM替代了以下Vim插件,因為它具有所有功能以及額外的功能:

  • clang_complete
  • AutoComplPop
  • Supertab
  • neocomplcache

YCM還提供多種語言的語義IDE特性,包括:

  • 查找標識符的聲明,定義,用法等,
  • 顯示類,變數,函數等的類型信息,
  • 在預覽窗口中顯示方法,成員等的文檔,
  • 修復常見的編碼錯誤,如缺少分號,錯別字等,
  • 文件間變數的語義重命名(僅限JavaScript)。

功能因文件類型而異,因此請確保查看文件類型功能摘要以及完整子命令的完整列表,以了解您最喜愛的語言可用的內容。

您還會發現YCM具有文件路徑完成器(嘗試在文件中輸入./)以及與UltiSnips集成的完成器。

安裝:

請記住:YCM是一個帶有編譯組件的插件。如果您使用Vundle更新YCM並且ycm_core庫API已更改(很少發生),YCM將通知您重新編譯它。然後您應該重新運行安裝過程。

# 第一步:添加下面代碼到.vimrc, 然後執行PluginInstall Plugin Valloric/YouCompleteMe# 第二步:編譯插件brew install cmakecd ~/.vim/bundle/YouCompleteMe# JavaScript支持:安裝Node.js和npm,並在調用./install.py時添加--js-completer。./install.py --js-completer

功能:JavaScript

  1. 智能自動完成
  2. 重命名變數(RefactorRename <new name>)
  3. 去定義位置,找到引用(GoToDefinition,GoToReferences)
  4. 標識符的類型信息(GetType)
  5. 查看標識符的文檔注釋(GetDoc)
  6. Tern伺服器實例的管理

用法

  • 一般用法:
  1. 如果提供的補全太寬泛,請繼續輸入字元; YCM將根據您的意見繼續完善提供的完成項目。
  2. 過濾是「智能」的敏感;如果您只輸入小寫字母,則不區分大小寫。如果您的輸入包含大寫字母,則查詢中的大寫字母必須與完成字元串中的大寫字母匹配(小寫字母仍與兩者匹配)。所以,「foo」匹配「Foo」和「foo」,「Foo」匹配「Foo」和「FOO」,但不匹配「foo」。
  3. 使用TAB鍵接受完成,並繼續按TAB循環完成。使用Shift-TAB向後循環。請注意,如果您使用控制台Vim(即不是Gvim或MacVim),那麼Shift-TAB綁定可能不起作用,因為控制台不會將它傳遞給Vim。您可以重新映射密鑰;請參閱下面的選項部分。

了解一點YCM如何在內部工作將防止混淆。 YCM有幾個完成引擎:基於標識符的完成程序,用於收集當前文件中的所有標識符以及您訪問的其他文件(以及標籤文件),並在您輸入時標識符被放入每個文件類型組中。

YCM中還有幾個語義引擎。有一個基於libclang的完成器為C族語言提供了語義完成。有一個基於Jedi的用於Python語義完成的完成者。另外還有一個基於omnifunc的完成器,它使用來自Vim的omnicomplete系統的數據提供語義完成,當YCM中沒有該語言的本地完成器時。

還有其他完成引擎,如UltiSnips完成程序和文件路徑完成程序。

在任何情況下,YCM自動檢測哪個完成引擎是最好的。有時,它會立即查詢其中的幾個,合併輸出並將結果呈現給您。

  • 客戶端 - 伺服器架構

YCM有一個客戶 - 伺服器體系結構; YCM的Vim部分只是一個瘦客戶端,它與ycmd HTTP + JSON伺服器進行通信,該伺服器擁有絕大多數YCM邏輯和功能。在啟動和停止Vim時,伺服器會自動啟動和停止。

  • 完成字元串排名

子序列過濾器刪除任何不匹配輸入的完成,但是然後排序系統啟動。它實際上非常複雜並且使用很多因素。實際上,這意味著給定「gua」的輸入,完成「getUserAccount」將在列表中高於「Fooguxa」完成(兩者都是子序列匹配)。

  • General Semantic Completion

您可以使用Ctrl + Space在任何地方觸發完成建議,即使沒有字元串前綴。這對於查看哪些頂級功能可供使用很有用。

  • JavaScript語義完成

JavaScript快速入門

  1. 確保您已啟用JavaScript完成程序。詳情請參閱安裝指南。
  2. 按照Tern文檔中的說明,在JavaScript項目的根目錄中創建一個.tern-project文件。
  3. 從您的項目編輯文件。

說明

JavaScript完成基於Tern。該完成引擎需要一個名為.tern-project的文件存在於當前工作目錄或當Tern伺服器啟動時作為當前工作目錄祖先的目錄。 YCM在第一次編輯JavaScript文件時啟動Tern伺服器,並將其目錄用作工作目錄,因此當時該文件的目錄需要是包含.tern-project文件的目錄的後代(或該目錄本身)。

或者,如Tern文檔中所述,可以使用全局.tern-config文件。

不支持多個Tern伺服器。要切換到不同的JavaScript項目,需要在編輯該項目的文件時使用RestartServer子命令重新啟動Tern伺服器:

:YcmCompleter RestartServer

技巧和竅門

本節包含一些關於配置.tern-project和使用JavaScript文件的建議。正確配置Tern的規範參考是Tern文檔。應該從Tern項目中尋求任何問題,改進,建議等。例如,請參閱tern插件列表,以獲取可在.tern-project文件的插件部分中啟用的插件列表。

  • 配置Tern以獲得node支持

# 以下簡單的示例.tern-project文件支持nodejs支持:{ "plugins": { "node": {} }}


  • ternjs/tern_for_vim

在使用 Vim 開發的過程中,發現 僅僅使用 YouCompleteMe 並不能很好的支持 JavaScript 的自動補全,後來發現 Tern 可以跟 YouCompleteMe 很好的配合來完成自動補全

安裝:

cd ~/.vim/bundle/tern_for_vimnpm install

配置:

let g:tern_map_keys=1let g:tern_map_prefix=,*<LocalLeader>tD* |:TernDoc|*<LocalLeader>tb* |:TernDocBrowse|*<LocalLeader>tt* |:TernType|*<LocalLeader>td* |:TernDef|*<LocalLeader>tpd* |:TernDefPreview|*<LocalLeader>tsd* |:TernDefSplit|*<LocalLeader>ttd* |:TernDefTab|*<LocalLeader>tr* |:TernRefs|*<LocalLeader>tR* |:TernRename|

Tern概述:

Tern是一個獨立的JavaScript代碼分析引擎。它旨在與代碼編輯器插件一起使用,以增強編輯器對智能JavaScript編輯的支持。提供的功能有

  • 自動完成變數和屬性
  • 函數參數提示
  • 查詢表達式的類型
  • 尋找某種東西的定義
  • 自動重構

Tern是開源的(MIT許可證),用JavaScript編寫,能夠在node.js和瀏覽器上運行。

配置說明:

# .tern_project{ "ecmaVersion": 6, "libs": [ "browser", "underscore", "jquery" ], "plugins": { "node": {} }}# ecmaVersion 選擇 ECMAScript 版本# libs browser 表示原生 js 補全,jquery 代表 jQuery 補全# loadEagerly 指定載入解析的 js 文件# dontLoad 排除載入的文件# plugins ternjs 使用的插件,配置的擴展補全的庫等


  • pangloss/vim-javascript

功能:這個包提供了javascript語法高亮和改進的縮進

用法:被動技能

  • vim-jsx

功能: JSX的語法高亮和縮進。JSX是一種JavaScript語法轉換器,它將內嵌XML文檔片段轉換為JavaScript對象。它由Facebook開發。

vim-jsx不是一個JavaScript語法包,所以為了使用它,你還需要選擇一個基本的JS高亮器。 pangloss / vim-javascript是推薦的軟體包---它是vim-jsx的「官方」依賴項,並且是它定期測試的唯一軟體包。

用法:默認情況下,將為擴展名為.js和.jsx的文件啟用JSX語法高亮和縮進。如果您只想在.jsx文件中使用JSX,請添加

let g:jsx_ext_required = 1

默認可以當做被動技能使用

  • maksimr/vim-jsbeautify

功能:這個插件允許你在vim裡面使用jsbeautifier來快速格式化javascript,html和css文件。

用法:TODO

  • mattn/emmet-vim

功能:emmet-vim是一個vim插件,功能同emmet類似

用法:

打卡或創建一個html文件輸入(_代表游標位置):

html:5_

輸入 <c-y>, (Ctrly,), 你將看到:

<!DOCTYPE HTML><html lang="en"><head> <meta charset="UTF-8"> <title></title></head><body> _</body></html>

更多用法可以參考Emmet使用手冊

推薦閱讀:

怎麼向新手解釋 Emacs?
SpaceVim release v0.6.0
Vim 比起 IDE 的優勢是什麼?
vim配置詳解——行號
Stack Overflow:幫助一百萬開發者退出 Vim

TAG:Vim |