将条件逻辑与.vimrc中的inoremap相结合

时间:2016-02-02 08:01:57

标签: vim

大家好我只需要一个快速修复,如果可以:使用Vim,我需要我的花括号在键入开始括号时自动关闭。我<authentication mode="Forms" /> <authorization> <allow users="*" /> </authorization> <system.webServer> <modules> <remove name="FormsAuthentication" /> </modules> </system.webServer> 工作正常。但是,如果没有必要,我需要禁用它。所以我在想一个简单的if语句,寻找一个')'因为前一个字符就足够了。但是,我不知道我应该怎么做。有什么帮助吗?

3 个答案:

答案 0 :(得分:2)

这可以通过调用自定义函数来完成。

预赛

  • :help getline()

      

    getline({lnum} [,{end}])

         

    如果没有{end},结果是一个String,它是当前缓冲区中的行{lnum}。当{lnum}是不以数字开头的String时,调用line()将String转换为数字。获取光标下的行:getline(“。”)

  • :help col()

      

    COL({expr}的)

         

    结果是一个Number,它是{expr}给出的列位置的字节索引。

所以你可以通过getline('.')[col('.') - 2]将光标放在光标前面。

  • :help feedkeys()

      

    feedkeys({string} [,{mode}])

         

    {string}中的字符排队等待处理,好像它们来自映射或由用户键入。默认情况下,字符串被添加到预先输入缓冲区的末尾,因此如果仍在执行映射,则字符将在它们之后。

         

    要在{string}中包含特殊键,请使用双引号和“...”表示法expr-quote。例如,feedkeys(“\&lt; CR&gt;”)模拟按下&lt; Enter&gt;。键。但是feedkeys('\&lt; CR&gt;')会推送5个字符。

         

    如果缺少{mode},则会重新映射密钥。 {mode}是一个String,它可以包含这些字符标志:

    'm'     Remap keys. This is default.
    'n'     Do not remap keys.
    
  • :help i_CTRL-O:help i_CTRL-\_CTRL-O

    CTRL-O          execute one command, return to Insert mode   i_CTRL-O
    CTRL-\ CTRL-O   like CTRL-O but don't move the cursor        i_CTRL-\_CTRL-O
    

功能

首先,ko可以缩减为单个命令O

function! s:InsertBrace()
  let l:last_char = getline('.')[col('.') - 2]
  if l:last_char ==# ')'
    call feedkeys("{\<CR>}\<Esc>O", 'n')
  else
    call feedkeys('{', 'n')
  endif
endfunction
inoremap { <C-\><C-O>:call <SID>InsertBrace()<CR>

每当我们按 {时,我们都会调用s:InsertBrace()。该函数检查当前光标下的字符。如果是),那么我们插入{<CR>}<Esc>O,注意转义。否则,我们只需插入单个{

答案 1 :(得分:1)

以下应该这样做: inoremap {&lt; c-o&gt;:调用InsertCurly()&lt; cr&gt; 功能! InsertCurly()     正常! GI {     如果搜索(&#39;)\ s * \%#&#39;)         exe&#34;正常! o} \&lt; esc&gt; ko \&lt; bs&gt;&#34;     万一 ENDF 请注意空格和\&lt; bs&gt;在exe命令的末尾,这可以让你保持创建的自动缩进。 自动关闭括号也有很好的插件,但你必须查看它们以检查它是否可以是条件。

答案 2 :(得分:1)

这可能不是您正在寻找的。但不是编写函数,而是编写复杂的vimrc。我使用的一种更简单但有点有用的方法

每当您不想要映射时,使用 Ctrl + v 转义映射