在vim中创建替换宏的最佳方法

时间:2017-07-29 14:12:49

标签: vim macvim

我想在vim中设置一些自定义的自动完成宏。我在想这样的事情(<asp:SqlDataSource ID="DSLeaderboardNorthEast" runat="server" ConnectionString="<%$ ConnectionStrings:DBConnectionString %>" SelectCommand="SELECT tblAccounts.contactName, tblAccounts.profilePic, tblAccounts.minAge, tblAccounts.maxAge, tblAccounts.AccountID, tblAccounts.region FROM tblAccounts WHERE tblAccounts.region='North East' ORDER BY tblAccounts.contactName "> </asp:SqlDataSource> <asp:GridView ID="gdvNorthEast" width="100%" runat="server" AllowPaging="True" AutoGenerateColumns="False" CssClass="mGrid" DataKeyNames="accountID" DataSourceID="DSLeaderboardNorthEast" PageSize="20" AllowSorting="True"> <AlternatingRowStyle CssClass="alt" /> <Columns> <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:Image ID="imgProfilePic" AlternateText="Players profile picture" runat="server" width="100px" height="100px" ImageUrl='<%# "~/catalog/images/" & Eval("ProfilePic").ToString %>' /> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="contactName" HeaderText="Player Name" /> <asp:BoundField DataField="minAge" HeaderText="Won" /> <asp:BoundField DataField="maxAge" HeaderText="Lost" /> <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:HyperLink ID="hypMessage" runat="server" CssClass="nyroModalMsg" NavigateUrl='<%# "~/sendLeaderboardMessage.aspx?" & "&aID=" & Eval("accountID").ToString %>'>Msg</asp:HyperLink> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> 表示光标位置):

|

立即成为:

it<TAB>|

这可能是使用直接vim,还是我需要一个插件?如果是这样,那里有一个首选的插件吗?

2 个答案:

答案 0 :(得分:3)

使用缩写你可以这样写:

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')返回1)。

使用UltiSnips,你可以像这样编写你的代码片段:

snippet it "your description" b
it("$0", function () {
});
endsnippet

此处的定义包含在关键字snippetendsnippet之间。在第1行,您可以用双引号在字符串中描述代码段的用途。如果您使用相同的制表符触发器定义了几个片段,则UltiSnips会在列表中显示它,并且存在歧义。

结尾b是一个选项,可以防止标签触发it扩展到除行首之外的任何地方。

$0是一个tabstop,它代表你想要光标的位置,一旦完全展开了代码片段。

github上的自述文件页面提供了快速入门,以及一些视频链接。

如果您想查看其他人撰写的代码段,可以安装vim-snippets

还有其他代码段管理器,但我不太了解它们以描述其代码段的语法。如果你想进行比较,这里是one,这里有一些链接:

答案 1 :(得分:2)

以下是您可以用于特定示例的abbreviation

:inoreabbrev it it("", function () {<cr>});<esc>kf"a

在插入模式下键入it后跟 ctrl + ] 将呈现

it("|", function () {
});

并让您处于插入模式。

但我绝对会选择ultisnips,并且有一个screencast用于在同一页面上创建代码段。这就是我在这里省略片段的原因,因为你可以自己做。