91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

VIM 代碼片段插件 ultisnips 使用教程

發布時間:2020-06-15 11:29:13 來源:網絡 閱讀:1159 作者:keelii 欄目:web開發

博客原文

安裝

Ultisnips 插件安裝分兩部分,一個是 ultisnips 插件本身,另外一個是代碼片段倉庫。一般來說把默認的代碼片段倉庫下載下來按需修改后上傳到自己的 github 即可。如果你和我一樣也使用 vim-plug 來管理插件的話,添加下面的代碼到你的 vimrc 中保存刷新即可

Plug 'SirVer/ultisnips'
" 你自己的代碼倉庫 git 地址
Plug 'keelii/vim-snippets'

上面的示例中所有的代碼片段都存放在插件安裝目錄下面的 vim-snippets/UltiSnips 中,文件命名格式為 ft.snippets, ft 就是 vim 中的 filetype,其中有個 all.snippets 是唯一一個所有文件都適用的代碼片段

配置

快捷鍵設置,我一般使用 tab 來觸發代碼片段補全,且不使用 YCM (官方文檔表示使用YCM的話就不能使用tab補全)

let g:UltiSnipsExpandTrigger="<tab>"
" 使用 tab 切換下一個觸發點,shit+tab 上一個觸發點
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<S-tab>"
" 使用 UltiSnipsEdit 命令時垂直分割屏幕
let g:UltiSnipsEditSplit="vertical"

依賴

ultisnips 插件需要你的 vim 支持 python,可以在 vim 命令模式下使用下面的檢測你的 vim 版本是否支持 python,返回 1 表示支持

:echo has("python")
:echo has("python3")

定義一個代碼片段

定義格式

snippet 觸發字符 ["代碼片段說明" [參數]]
代碼片段內容
endsnippet

最小化的一個代碼片段

snippet if "if (condition) { ... }"
if (${1:true}) {
    $0
}
endsnippet

這時當你在 vim 中輸入 if 敲 tab 就會展開一條 if 語句,第一個觸發點是 if 條件表達式,最后一個是 if 語句體

${1:true} 表示這是第一個觸發點,占位符為 true,如果占位符沒有默認值可直接使用 $1, $2, $3...

可視選擇區的內容為占位符

snippet if "if (...)"
if (${1:true}) {
    ${VISUAL}
}
endsnippet

${VISUAL} 表示在 vim 中使用可視模式下選擇的文本,這個在重構代碼的時候非常有用(后面會有高級用法),上個圖感受一下

VIM 代碼片段插件 ultisnips 使用教程

代碼片段的參數

  • b 表示觸發字符應該在一行的開始
  • i 表示觸發字符可以在單詞內(連續展示會使用這個選項)
  • w 表示觸發字符的前后必須是一個字母分界點
  • r 表示觸發字符可以是一個正則表達式
  • t 表示展開的代碼片段中如果有制表符,原樣輸出,即使你的 vimrc 里面設置了 expandtab
  • m 表示刪除代碼片段右邊的所有空白字符
  • e 表示自定義上下文
  • A 表示自動觸發,不需要按 tab,類似于 VIM 中的 abbr

內容解釋器

Ultisnips 定義的代碼片段中支持三種不同的語言注入:shell, vimscript, python,在代碼片段中用反引號表示

shell 代碼

就是在你的命令行 shell 能執行的代碼片段,比如輸出當前時間

? date
2018年 8月27日 星期一 18時19分38秒 CST

在代碼片段中用反引號「`」引用即可

snippet today
Today is the `date`.
endsnippet

輸入 today 按 tab 展開后(格式和上面shell中的不一樣,估計是因為 vim 語言設置的問題):

Today is the Mon Aug 27 18:24:51 CST 2018.

vimscript 代碼

使用 indent 來輸出當前縮進值,使用前綴 !v 表示是 vimscript

snippet indent
Indent is: `!v indent(".")`.
endsnippet

VIM 代碼片段插件 ultisnips 使用教程

python 代碼

在代碼片段中解釋執行 python 代碼是 ultisnips 最強大的功能,以前綴 !p 開始。系統會向 python 中注入一些變量,可以使用 python 代碼直接對其進行操作

  • fn - 表示當前文件名
  • path - 當前文件名的路徑
  • t - 占位符的字典,可以使用 t[1], t[2], t.v 來取占位符內容
  • snip - UltiSnips.TextObjects.SnippetUtil 對象的一個實例
  • match - 正則代碼片段時返回的匹配元素(非常強大)

其中最常用的 snip 對象提供了下面一些變量:

  • snip.rv 表示 return value,python 代碼執行后處理過的字符串賦給 rv 即可
  • snip.fn 表示當前文件名
  • snip.ft 表示當前文件類型
  • snip.v 表示 VISUAL 模式變量,其中 snip.v.mode 表示模式類型,snip.v.text 表示 VISUAL 模式中選擇的字符

VIM 代碼片段插件 ultisnips 使用教程

占位符選擇

UltiSnips 支持使用快捷鍵切換占位符,我使用 &lt;tab&gt;&lt;shift-tab&gt; 來切換 下一個上一個 占位符,占位符切換的作用域為當前代碼片段內部(即使占位符已被修改過),當光標移動出去以后就不起作用了

VIM 代碼片段插件 ultisnips 使用教程

自定義上下文

自定義上下文可以通過正則匹配來決定代碼片斷是否可用,比如判斷在指定的 if 語句里面才起作用的代碼片斷,定義格式如下:

snippet 觸發字符 "描述" "表達式" 參數

比如我們定義一個 只有 在上一行以 if (DEVELOPMENT) { 開頭才可以展開的代碼片段

snippet dbg "if (DEVELOPMENT) dbg" "re.match('^if \(DEVELOPMENT\) \{', snip.buffer[snip.line-1])" be
debugger;
endsnippet

常見用法

行內連續展開

這個常見于需要連續展開代碼片段的情況,比如,有兩個片段,一個打印變量,一個處理 JSON 序列化。這時需要使用參數選項 in-word

VIM 代碼片段插件 ultisnips 使用教程

使用正則代碼片段

通常寫代碼的時候需要使用 log, print 等來打印上下文中的變量。使用普通片段按 cl 展示 console.log() 然后把變量字符復制進括號,這樣操作會比較復雜。使用正則來動態匹配前面的字符可以很好的解決這個問題

snippet "([^\s]\w+)\.log" "console.log(postfix)" r
console.log(`!p snip.rv = match.group(1)`)$0
endsnippet
snippet "([^\s].*)\.upper" "Uppercase(postfix)" r
`!p snip.rv = match.group(1).upper()`$0
endsnippet
snippet "([^\s]\w+)\.lower" "Lowercase(postfix)" r
`!p snip.rv = match.group(1).lower()`$0
endsnippet

動圖演示

VIM 代碼片段插件 ultisnips 使用教程

注意:正則代碼片段只適用于單行文本處理,如果是多行轉換還是得用到下面的 python + VISUAL 代碼片段來處理

使用 python 解釋器 + VISUAL 模式實現代碼注釋功能

通常我們需要使用一大堆插件來實現各種代碼的注釋功能。不過 Ultisnips 提供了 VISUAL 模式可以提取 vim 可視模式中選擇的內容到代碼片段里面,于是我們就可以結合起來制作一個具有注釋功能的代碼片段

流程大概是這樣的:

  1. 進入 vim 可視模式,選擇要注釋的內容
  2. 按 tab,清除選擇內容
  3. 輸入代碼片段觸發字符,按 tab 完成

由于實現的 python 代碼相對復雜一些,主要分成兩個方法。單行注釋和多行注釋,注意 Ultisnips 中可以直接寫 python 但是大段的方法建議放在插件目錄下面的 pythonx 目錄下面,使用的時候在對應的代碼片段中的全局 python 代碼 global !p 引入即可

單行注釋(pythonx/javascript_snippets.py):

def comment(snip, START="", END=""):
    lines = snip.v.text.split('\n')[:-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 '\n'.join(result)
    else:
        return ''

多行注釋:

def comment_inline(snip, START="/* ", END=" */"):
    text = snip.v.text
    lines = text.split('\n')[:-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('\n') + END + '\n'

    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='// ', END='')
`$0
endsnippet

snippet ci "Toggle comment inline."
`!p
snip.rv = comment_inline(snip, START="/* ", END=" */")
`$0
endsnippet

動圖演示

VIM 代碼片段插件 ultisnips 使用教程

不同的語言可以在對應的片段文件中定義并傳入注釋符號參數即可,有了這個功能就可以愉快的刪除其它的 vim 注釋插件了

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海城市| 海丰县| 娄底市| 德清县| 枝江市| 四川省| 安达市| 通化市| 牡丹江市| 滦平县| 军事| 台湾省| 监利县| 沂源县| 通榆县| 沿河| 肥西县| 山丹县| 白山市| 孝感市| 陆良县| 霍州市| 鹿邑县| 永登县| 萍乡市| 乃东县| 买车| 长白| 博野县| 收藏| 贺兰县| 霸州市| 静海县| 平定县| 贡觉县| 台北县| 错那县| 芦溪县| 榆树市| 临漳县| 湖南省|