从vim输入缓冲区中删除按下的键

时间:2017-01-13 13:23:46

标签: c++ c vim

我正在为cpp文件编写vim自动命令,我想要 #include 行的缩写。

目标是缩写扩展为 #include < > ,管道是扩展后光标的位置。< / p>

由于自然缩写后面跟着一个空格,我试图从寄存器中移除输入空间并继续前进。 然而,即使退出插入模式并返回,或者我能想到的任何技巧:删除下一个键,键入bs等,在iabbrev包括的任何系列命令之后输入空格。

因此,我正在寻找能够从寄存器中删除空间并让我仍然处于插入模式的东西。

感谢。

3 个答案:

答案 0 :(得分:3)

将此添加到您的.vimrc

   autocmd FileType cpp iab <buffer> #i #include <><Left><C-R>=Eatchar('\s')<CR>

   func Eatchar(pat)
      let c = nr2char(getchar(0))
      return (c =~ a:pat) ? '' : c
   endfunc

答案 1 :(得分:0)

lh-cpp中,我有一个C ftplugin(应该是这样定义的地方)

lh#map#no_context()

#n阻止在字符串和评论环境中扩展auto s = "#n"; - 有时,我们希望能够输入识别出来的lh#cpp#brackets#lt<我可以将<>扩展为""的几种情境(包括模板,演员等)。

如您所见,我不会在此处自动添加<>#include <foo>,因为我希望能够在#include "foo"command! -narg=+ Iabbr execute "iabbr " <q-args>."<C-R>=lh#map#eat_char('\\s')<CR>" command! -narg=+ Inoreabbr \ execute "inoreabbr " <q-args>."<C-R>=lh#map#eat_char('\\s')<CR>" 之间进行选择

回到不吃空格字符的缩写,答案在帮助中,请参阅Menix的答案。

为了简化我的任务,我已经定义了一个自动应用这种功能的命令(这次是lh-brackets):

:Inoreabbr <silent> <buffer> #n< #include <><left>
:Inoreabbr <silent> <buffer> #n" #include ""<left>

因此,我会以这种方式定义你的缩写

:Inoreab  <buffer> <silent> #n<    <C-R>=lh#map#no_context("#n< ",'\<esc\>0i#include <>\<left\>')<CR>
" and so on

或者甚至更好地看不到在字符串和评论上下文中触发的这些缩写:

SELECT CONVERT(VARCHAR(10),Save_Timestamp,112) AS Date,
       DATEPART(hh,Save_Timestamp) AS Hour,
       SUM(TEMPERATURE)/COUNT(*) AS AvgTemp
FROM CLIMATE_TABLE
GROUP BY
       CONVERT(VARCHAR(10),Save_Timestamp,112),
       DATEPART(hh,Save_Timestamp)

答案 2 :(得分:0)

正如你可以从@LucHermitte的答案(以及之前@Meninx的类似尝试)中看到的那样,吃这个角色有点牵扯。

相反,我建议您升级到代码段插件(如果您还没有使用它)。 Snippets 就像类固醇上的内置:abbreviate一样,通常带有参数插入,镜像和内部多个停靠点。第一个非常着名(并且仍然广泛使用)的Vim插件之一是snipMate(受 TextMate 编辑器的启发);不幸的是,它不再维持;虽然有a fork。现代替代方案(虽然需要Python)是UltiSnips。还有更多内容,请参阅this list on the Vim Tips Wiki

根据片段插件的不同,可能需要显式触发扩展,其他人可能已经支持插入而没有尾随空格。通常,您可以为包含的文件名配置默认值(可以轻松覆盖) - 仅通过Vim缩写就无法使用此功能。

替代

如果您不想要完整的代码段功能,我建议您使用<Enter>代替<Space>来定义缩写。这应该适用于此示例(无论如何,下一个代码/ #include将在新行上),因此您不必人为删除任何内容。