在 vim 中创建替换宏的最佳方式
Best way to create substitution macros in vim
我想在 vim 中设置一些自定义的自动完成宏。我在想这样的事情(|
代表光标位置):
it<TAB>|
立即变为:
it("|", function () {
});
是否可以直接使用 vim,或者我需要一个插件吗?如果是这样,是否有首选插件?
使用缩写你可以这样写:
inorea it it("", function () {<cr>});<c-o>k<c-o>f"
最后 <c-o>k<c-o>f"
的目的是将光标重新定位在双引号内,但它可能不会一直有效。
使用映射,你可以试试这个:
ino <expr> <tab> <sid>expand_last_word()
let s:your_expansions = {
\ 'it': '\<c-w>it(\"\", function () {\<cr>});\<c-o>k\<right>',
\ }
fu! s:expand_last_word() abort
let last_word = matchstr(getline('.'), '\v<\k+%'.col('.').'c')
return has_key(s:your_expansions, last_word)
\ ? eval('"'.s:your_expansions[last_word].'"')
\ : "\<tab>"
endfu
您必须在词典 s:your_expansions
.
中添加您的缩写及其扩展
使用 :read
命令,您可以定义更大的代码片段,并将它们拆分到多个文件中:
ino <expr> <tab> <sid>expand_last_word()
fu! s:expand_last_word() abort
let last_word = matchstr(getline('.'), '\v<\k+%'.col('.').'c')
if last_word ==# 'it'
return "\<c-w>\<c-o>:r /path/to/some_file\<cr>\<c-o>f\"\<right>"
endif
return "\<tab>"
endfu
此处 /path/to/some_file
应包含您的代码段:
it("", function () {
});
它们是非常简单的解决方案,如果您想要更强大的东西,您可能需要一个片段插件。其中之一是 UltiSnips,它要求您的 Vim 版本编译时带有 Python 支持(:echo has('python')
或 :echo has('python3')
returns 1)。
使用 UltiSnips,您可以像这样编写代码段:
snippet it "your description" b
it("[=14=]", function () {
});
endsnippet
此处定义包含在关键字snippet
和endsnippet
之间。在第一行,您可以在双引号内的字符串中描述您的片段的目的。如果您使用相同的选项卡触发器定义了多个片段,并且存在歧义,它将由 UltiSnips 在列表中显示。
结尾 b
是一个选项,用于防止制表符触发器 it
在行首以外的任何地方展开。
[=25=]
是一个制表位,它代表当代码段完全展开后您希望光标所在的位置。
github 上的自述文件页面提供了快速入门和一些视频链接。
如果你想看看别人写的代码片段,你可以安装vim-snippets。
还有其他代码段管理器,但我对它们的了解还不够深,无法描述其代码段的语法。如果你想要比较,这里是 one,这里是其中一些的链接:
这是一个abbreviation
,您可以将其用于您的特定示例
:inoreabbrev it it("", function () {<cr>});<esc>kf"a
在插入模式下输入 it
然后按 ctrl + ] 将呈现
it("|", function () {
});
并让您处于插入模式。
但我肯定会选择 ultisnips and there is a screencast 在同一页面上创建片段。这就是为什么我在这里省略代码段的原因,因为您可以自己做。
我想在 vim 中设置一些自定义的自动完成宏。我在想这样的事情(|
代表光标位置):
it<TAB>|
立即变为:
it("|", function () {
});
是否可以直接使用 vim,或者我需要一个插件吗?如果是这样,是否有首选插件?
使用缩写你可以这样写:
inorea it it("", function () {<cr>});<c-o>k<c-o>f"
最后 <c-o>k<c-o>f"
的目的是将光标重新定位在双引号内,但它可能不会一直有效。
使用映射,你可以试试这个:
ino <expr> <tab> <sid>expand_last_word()
let s:your_expansions = {
\ 'it': '\<c-w>it(\"\", function () {\<cr>});\<c-o>k\<right>',
\ }
fu! s:expand_last_word() abort
let last_word = matchstr(getline('.'), '\v<\k+%'.col('.').'c')
return has_key(s:your_expansions, last_word)
\ ? eval('"'.s:your_expansions[last_word].'"')
\ : "\<tab>"
endfu
您必须在词典 s:your_expansions
.
使用 :read
命令,您可以定义更大的代码片段,并将它们拆分到多个文件中:
ino <expr> <tab> <sid>expand_last_word()
fu! s:expand_last_word() abort
let last_word = matchstr(getline('.'), '\v<\k+%'.col('.').'c')
if last_word ==# 'it'
return "\<c-w>\<c-o>:r /path/to/some_file\<cr>\<c-o>f\"\<right>"
endif
return "\<tab>"
endfu
此处 /path/to/some_file
应包含您的代码段:
it("", function () {
});
它们是非常简单的解决方案,如果您想要更强大的东西,您可能需要一个片段插件。其中之一是 UltiSnips,它要求您的 Vim 版本编译时带有 Python 支持(:echo has('python')
或 :echo has('python3')
returns 1)。
使用 UltiSnips,您可以像这样编写代码段:
snippet it "your description" b
it("[=14=]", function () {
});
endsnippet
此处定义包含在关键字snippet
和endsnippet
之间。在第一行,您可以在双引号内的字符串中描述您的片段的目的。如果您使用相同的选项卡触发器定义了多个片段,并且存在歧义,它将由 UltiSnips 在列表中显示。
结尾 b
是一个选项,用于防止制表符触发器 it
在行首以外的任何地方展开。
[=25=]
是一个制表位,它代表当代码段完全展开后您希望光标所在的位置。
github 上的自述文件页面提供了快速入门和一些视频链接。
如果你想看看别人写的代码片段,你可以安装vim-snippets。
还有其他代码段管理器,但我对它们的了解还不够深,无法描述其代码段的语法。如果你想要比较,这里是 one,这里是其中一些的链接:
这是一个abbreviation
,您可以将其用于您的特定示例
:inoreabbrev it it("", function () {<cr>});<esc>kf"a
在插入模式下输入 it
然后按 ctrl + ] 将呈现
it("|", function () {
});
并让您处于插入模式。
但我肯定会选择 ultisnips and there is a screencast 在同一页面上创建片段。这就是为什么我在这里省略代码段的原因,因为您可以自己做。