是否可以在vim中进行条件缩写?

时间:2014-03-10 02:27:04

标签: vim

我的.vimrc中有以下缩写:

:iab stdio #include <stdio.h>

是否可以仅在stdio前面没有<时进行替换,这样如果我粘贴的代码中包含#include <stdio.h>行,则不会扩展到以下

#include <#include <stdio.h>.h>

3 个答案:

答案 0 :(得分:4)

可能有一种比这更简单的方法,但这就是我所做的。

function! InsertHeader(replacement, mapping)
    if getline('.')[col('.')-len(a:mapping)-2] != '<'
        return a: replacement
    endif
    return a:mapping
endfunction

iabbrev <expr> stdio InsertHeader('#include <stdio.h>', 'stdio')

我使用了一个函数,如果返回映射,则检查映射是否前面有<。如果没有返回您返回的替换件。返回值是被替换的。


重新阅读这个问题似乎是在粘贴代码。在粘贴任何内容之前使用

:set paste

这会阻止任何缩写激活。粘贴后使用

:set nopaste

(或使用:set paste!切换它)

答案 1 :(得分:0)

我希望将其映射为以下内容,以便stdio只有在<leader>被按下之前才会展开。因此,如果您的<leader>,,则键入,stdio会在仅键入时展开它 stdio不会展开它。您可以通过将以下行添加到vimrc但请记住先禁用旧的缩写)来尝试。

inoremap <leader>stdio #include <stdio.h>

但是,如果您想在问题中提问,可以从VimTips上获取提示,这解释了如何仅在快捷方式上扩展缩写

http://vim.wikia.com/wiki/VimTip481

答案 2 :(得分:0)

以下是我在lh-brackets中使用的功能 - &gt; http://code.google.com/p/lh-vim/source/browse/map-tools/trunk/autoload/lh/cpp/brackets.vim#32(注意:这是一个回调函数。它的结果将由lh-bracket框架解释)

<<>或各种演员阵容之前展开为template 光标 #include。< / p>

否则,在您的情况下,您应该使用inoreab:h inoreab)(以及<buffer> - &gt; :h :abbreviate-<buffer>

定义您的缩写