摘要:博客原文同步安裝插件安裝分兩部分,一個(gè)是插件本身,另外一個(gè)是代碼片段倉(cāng)庫(kù)。一般來(lái)說(shuō)把默認(rèn)的代碼片段倉(cāng)庫(kù)下載下來(lái)按需修改后上傳到自己的即可。這時(shí)需要使用參數(shù)選項(xiàng)使用正則代碼片段通常寫(xiě)代碼的時(shí)候需要使用等來(lái)打印上下文中的變量。
博客原文同步
安裝Ultisnips 插件安裝分兩部分,一個(gè)是 ultisnips 插件本身,另外一個(gè)是代碼片段倉(cāng)庫(kù)。一般來(lái)說(shuō)把默認(rèn)的代碼片段倉(cāng)庫(kù)下載下來(lái)按需修改后上傳到自己的 github 即可。如果你和我一樣也使用 vim-plug 來(lái)管理插件的話(huà),添加下面的代碼到你的 vimrc 中保存刷新即可
Plug "SirVer/ultisnips" # 你自己的代碼倉(cāng)庫(kù) git 地址 Plug "keelii/vim-snippets"
上面的示例中所有的代碼片段都存放在插件安裝目錄下面的 vim-snippets/UltiSnips 中,文件命名格式為 ft.snippets, ft 就是 vim 中的 filetype,其中有個(gè) all.snippets 是唯一一個(gè)所有文件都適用的代碼片段
配置快捷鍵設(shè)置,我一般使用 tab 來(lái)觸發(fā)代碼片段補(bǔ)全,且不使用 YCM (官方文檔表示使用YCM的話(huà)就不能使用tab補(bǔ)全)
let g:UltiSnipsExpandTrigger="依賴(lài)" " 使用 tab 切換下一個(gè)觸發(fā)點(diǎn),shit+tab 上一個(gè)觸發(fā)點(diǎn) let g:UltiSnipsJumpForwardTrigger=" " let g:UltiSnipsJumpBackwardTrigger=" " " 使用 UltiSnipsEdit 命令時(shí)垂直分割屏幕 let g:UltiSnipsEditSplit="vertical"
ultisnips 插件需要你的 vim 支持 python,可以在 vim 命令模式下使用下面的檢測(cè)你的 vim 版本是否支持 python
# 1 表示支持 :echo has("python") :echo has("python3")定義一個(gè)代碼片段 定義格式
snippet 觸發(fā)字符 ["代碼片段說(shuō)明" [參數(shù)]] 代碼片段內(nèi)容 endsnippet最小化的一個(gè)代碼片段
snippet if "if (condition) { ... }" if (${1:true}) { $0 } endsnippet
這時(shí)當(dāng)你在 vim 中輸入 if 敲 tab 就會(huì)展開(kāi)一條 if 語(yǔ)句,第一個(gè)觸發(fā)點(diǎn)是 if 條件表達(dá)式,最后一個(gè)是 if 語(yǔ)句體
${1:true} 表示這是第一個(gè)觸發(fā)點(diǎn),占位符為 true,如果占位符沒(méi)有默認(rèn)值可直接使用 $1, $2, $3...
可視選擇區(qū)的內(nèi)容為占位符snippet if "if (...)" if (${1:true}) { ${VISUAL} } endsnippet
${VISUAL} 表示在 vim 中使用可視模式下選擇的文本,這個(gè)在重構(gòu)代碼的時(shí)候非常有用(后面會(huì)有高級(jí)用法),上個(gè)圖感受一下
代碼片段的參數(shù)b 表示觸發(fā)字符應(yīng)該在一行的開(kāi)始
i 表示觸發(fā)字符可以在單詞內(nèi)(連續(xù)展示會(huì)使用這個(gè)選項(xiàng))
w 表示觸發(fā)字符的前后必須是一個(gè)字母分界點(diǎn)
r 表示觸發(fā)字符可以是一個(gè)正則表達(dá)式
t 表示展開(kāi)的代碼片段中如果有制表符,原樣輸出,即使你的 vimrc 里面設(shè)置了 expandtab
m 表示刪除代碼片段右邊的所有空白字符
e 表示自定義上下文
A 表示自動(dòng)觸發(fā),不需要按 tab,類(lèi)似于 VIM 中的 abbr
內(nèi)容解釋器Ultisnips 定義的代碼片段中支持三種不同的語(yǔ)言注入:shell, vimscript, python,在代碼片段中用反引號(hào)表示
shell 代碼就是在你的命令行 shell 能執(zhí)行的代碼片段,比如輸出當(dāng)前時(shí)間
? date 2018年 8月27日 星期一 18時(shí)19分38秒 CST
在代碼片段中用反引號(hào)「`」引用即可
snippet today Today is the `date`. endsnippet
輸入 today 按 tab 展開(kāi)后(格式和上面shell中的不一樣,估計(jì)是因?yàn)?vim 語(yǔ)言設(shè)置的問(wèn)題):
Today is the Mon Aug 27 18:24:51 CST 2018.vimscript 代碼
使用 indent 來(lái)輸出當(dāng)前縮進(jìn)值,使用前綴 !v 表示是 vimscript
snippet indent Indent is: `!v indent(".")`. endsnippetpython 代碼
在代碼片段中解釋執(zhí)行 python 代碼是 ultisnips 最強(qiáng)大的功能,以前綴 !p 開(kāi)始。系統(tǒng)會(huì)向 python 中注入一些變量,可以使用 python 代碼直接對(duì)其進(jìn)行操作
fn - 表示當(dāng)前文件名
path - 當(dāng)前文件名的路徑
t - 占位符的字典,可以使用 t[1], t[2], t.v 來(lái)取占位符內(nèi)容
snip - UltiSnips.TextObjects.SnippetUtil 對(duì)象的一個(gè)實(shí)例
match - 正則代碼片段時(shí)返回的匹配元素(非常強(qiáng)大)
其中最常用的 snip 對(duì)象提供了下面一些變量:
snip.rv 表示 return value,python 代碼執(zhí)行后處理過(guò)的字符串賦給 rv 即可
snip.fn 表示當(dāng)前文件名
snip.ft 表示當(dāng)前文件類(lèi)型
snip.v 表示 VISUAL 模式變量,其中 snip.v.mode 表示模式類(lèi)型,snip.v.text 表示 VISUAL 模式中選擇的字符
占位符選擇UltiSnips 支持使用快捷鍵切換占位符,我使用
自定義上下文可以通過(guò)正則匹配來(lái)決定代碼片斷是否可用,比如判斷在指定的 if 語(yǔ)句里面才起作用的代碼片斷,定義格式如下:
snippet 觸發(fā)字符 "描述" "表達(dá)式" 參數(shù)
比如我們定義一個(gè) 只有 在上一行以 if (DEVELOPMENT) { 開(kāi)頭才可以展開(kāi)的代碼片段
snippet dbg "if (DEVELOPMENT) dbg" "re.match("^if (DEVELOPMENT) {", snip.buffer[snip.line-1])" be debugger; endsnippet常見(jiàn)用法 行內(nèi)連續(xù)展開(kāi)
這個(gè)常見(jiàn)于需要連續(xù)展開(kāi)代碼片段的情況,比如,有兩個(gè)片段,一個(gè)打印變量,一個(gè)處理 JSON 序列化。這時(shí)需要使用參數(shù)選項(xiàng) in-word
使用正則代碼片段通常寫(xiě)代碼的時(shí)候需要使用 log, print 等來(lái)打印上下文中的變量。使用普通片段按 cl 展示 console.log() 然后把變量字符復(fù)制進(jìn)括號(hào),這樣操作會(huì)比較復(fù)雜。使用正則來(lái)動(dòng)態(tài)匹配前面的字符可以很好的解決這個(gè)問(wèn)題
# 展開(kāi) console.log snippet "([^s]w+).log" "console.log(postfix)" r console.log(`!p snip.rv = match.group(1)`)$0 endsnippet # 當(dāng)前行轉(zhuǎn)換成大寫(xiě) snippet "([^s].*).upper" "Uppercase(postfix)" r `!p snip.rv = match.group(1).upper()`$0 endsnippet # 上一個(gè)單詞轉(zhuǎn)換成小寫(xiě) snippet "([^s]w+).lower" "Lowercase(postfix)" r `!p snip.rv = match.group(1).lower()`$0 endsnippet
動(dòng)圖演示
注意:正則代碼片段只適用于單行文本處理,如果是多行轉(zhuǎn)換還是得用到下面的 python + VISUAL 代碼片段來(lái)處理
使用 python 解釋器 + VISUAL 模式實(shí)現(xiàn)代碼注釋功能通常我們需要使用一大堆插件來(lái)實(shí)現(xiàn)各種代碼的注釋功能。不過(guò) Ultisnips 提供了 VISUAL 模式可以提取 vim 可視模式中選擇的內(nèi)容到代碼片段里面,于是我們就可以結(jié)合起來(lái)制作一個(gè)具有注釋功能的代碼片段
流程大概是這樣的:
進(jìn)入 vim 可視模式,選擇要注釋的內(nèi)容
按 tab,清除選擇內(nèi)容
輸入代碼片段觸發(fā)字符,按 tab 完成
由于實(shí)現(xiàn)的 python 代碼相對(duì)復(fù)雜一些,主要分成兩個(gè)方法。單行注釋和多行注釋?zhuān)⒁?Ultisnips 中可以直接寫(xiě) python 但是大段的方法建議放在插件目錄下面的 pythonx 目錄下面,使用的時(shí)候在對(duì)應(yīng)的代碼片段中的全局 python 代碼 global !p 引入即可
單行注釋(pythonx/javascript_snippets.py):
def comment(snip, START="", END=""): lines = snip.v.text.split(" ")[:-1] first_line = lines[0] spaces = "" initial_indent = snip._initial_indent # Get the first non-empty line for idx, l in enumerate(lines): if l.strip() != "": first_line = lines[idx] sp = re.findall(r"^s+", first_line) if len(sp): spaces = sp[0] break # Uncomment if first_line.strip().startswith(START): result = [line.replace(START, "", 1).replace(END, "", 1) if line.strip() else line for line in lines] else: result = [f"{spaces}{START}{line[len(spaces):]}{END}" if line.strip() else line for line in lines ] # Remove initial indent if result[0] and initial_indent: result[0] = result[0].replace(initial_indent, "", 1) if result: return " ".join(result) else: return ""
多行注釋?zhuān)?/strong>
def comment_inline(snip, START="/* ", END=" */"): text = snip.v.text lines = text.split(" ")[:-1] first_line = lines[0] initial_indent = snip._initial_indent spaces = "" # Get the first non-empty line for idx, l in enumerate(lines): if l.strip() != "": first_line = lines[idx] sp = re.findall(r"^s+", first_line) if len(sp): spaces = sp[0] break if text.strip().startswith(START): result = text.replace(START, "", 1).replace(END, "", 1) else: result = text.replace(spaces, spaces + START, 1).rstrip(" ") + END + " " if initial_indent: result = result.replace(initial_indent, "", 1) return result
代碼片段定義:
global !p from javascript_snippets import ( comment, comment_inline ) endglobal # ... snippet c "Toggle comment every single line" `!p snip.rv = comment(snip, START="http:// ", END="") `$0 endsnippet snippet ci "Toggle comment inline." `!p snip.rv = comment_inline(snip, START="/* ", END=" */") `$0 endsnippet
動(dòng)圖演示
不同的語(yǔ)言可以在對(duì)應(yīng)的片段文件中定義并傳入注釋符號(hào)參數(shù)即可,有了這個(gè)功能就可以愉快的刪除其它的 vim 注釋插件了
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/25041.html
摘要:創(chuàng)建相比于,在中創(chuàng)建是稍微麻煩點(diǎn)。主要跟隨這幾點(diǎn)找到插件目錄,是位于下的和。必須在文件夾下創(chuàng)建一個(gè)文件夾,所有自定義代碼都存在這里。文件保存后即刻生效,無(wú)需重啟。其它還有等模式,具體可以在的中查看文檔。 想要Vim像Sublime一樣快速編程,就需要各種好的snippets快速生成一段預(yù)備好的代碼。一般常用的插件是UltiSnips作為生成代碼的引擎,Vim-snippets插件作為各...
摘要:配置驗(yàn)證,輸入。按鍵,自動(dòng)補(bǔ)全則成功添加相關(guān),將里面目錄下的文件移動(dòng)到目錄下的文件下,就可以使用了,如 安裝plug (https://github.com/junegunn/v... curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent... 編輯~/.vimrc文件(不...
摘要:配置驗(yàn)證,輸入。按鍵,自動(dòng)補(bǔ)全則成功添加相關(guān),將里面目錄下的文件移動(dòng)到目錄下的文件下,就可以使用了,如 安裝plug (https://github.com/junegunn/v... curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent... 編輯~/.vimrc文件(不...
摘要:一組就是一個(gè)插件,的很多功能都由各式插件實(shí)現(xiàn)。與相反到行頭到本行的第一個(gè)非字符到行尾到本行最后一個(gè)不是字符的位置。到逗號(hào)前的第一個(gè)字符。在當(dāng)前行查找第三個(gè)出現(xiàn)的。工程文件菜單自定義快捷鍵顯示文件菜單自帶快捷鍵顯示隱藏隱藏文件在新 這里是我新配置出來(lái)的 jaywcjlove/vim-web 一直在打磨中,基本上可以用了。拿出來(lái)騙 star 先上圖 showImg(https://segm...
閱讀 2696·2021-10-14 09:43
閱讀 3639·2021-10-13 09:39
閱讀 3354·2019-08-30 15:44
閱讀 3208·2019-08-29 16:37
閱讀 3782·2019-08-29 13:17
閱讀 2790·2019-08-26 13:57
閱讀 1895·2019-08-26 11:59
閱讀 1347·2019-08-26 11:46