Vim:写作功能骨架

时间:2013-11-18 09:45:32

标签: formatting vim

当用Vim编写新功能时,我似乎总是需要做一些“手动”工作。

x =光标位置

如果我开始输入一个函数并插入几个大括号和结尾

function Apples() {x}

然后点击输入,显然看起来像这样

function Apples() {
x}

这导致我必须 ESC,O 才能将关闭的大卷曲向下移动。 虽然这看起来像是一件小事,但在过去的5个月里这样做很麻烦,我知道有很多像我这样的人知道应该有一个优雅的解决方案。我对插件建议持开放态度。

2 个答案:

答案 0 :(得分:1)

你可以使用像这样的简单映射(在SO和网络上有很多变种):

inoremap {} {<CR>}<C-o>O

您还可以在www.vim.org搜索专用插件。

但我强烈建议您尝试使用SnipmateUltiSnips之类的代码段扩展插件。这两个插件都遵循相同的模型,但它们的片段语法和功能略有不同。它的工作原理如下:

  1. 您输入了一个触发器:

    fun
    
  2. 您点击<Tab>并在选择模式下使用function_name获得以下内容:

    function [function_name]() {
    
    }
    
  3. 您输入所需的名称:

    function Apples|() {
    
    }
    
  4. 您点击<Tab>将光标放在括号之间:

    function Apples(|) {
    
    }
    
  5. 再次点击<Tab>,将光标放在下面一行,并显示正确的缩进:

    function Apples() {
        |
    }
    

答案 1 :(得分:0)

使用lh-bracket(在C或C ++模式下),当您在两个括号之间点击enter时,会插入您期望的换行符。

我的想法是测试:getline(".")[col(".")-2:col(".")-1]=="{}"并在条件为真时执行/插入"\<cr>\<esc>O",否则为"\<cr>"

在lh-bracket中,我有以下into a C-ftplugin

call lh#brackets#enrich_imap('<cr>',
          \ {'condition': 'getline(".")[col(".")-2:col(".")-1]=="{}"',
          \   'action': 'Cpp_Add2NewLinesBetweenBrackets()'},
          \ 1,
          \ '\<cr\>'
          \ )
function! Cpp_Add2NewLinesBetweenBrackets()
  return "\<cr>\<esc>O"
endfunction

我猜(代码未测试)它会(*)翻译成:

" put it into ftplugin/{yourfiltetype, javascript?}.vim
inoremap <buffer> <silent> <expr> <cr> s:SmartCR()

function s:SmartCR()
    return getline(".")[col(".")-2:col(".")-1]=="{}"
    \ ? "\<cr>\<esc>O"
    \ : "\<cr>"
endfunction

(*)实际上,lh#brackets#enrich_imap做了一些其他事情(映射与LaTeXSuite的IMAP.vim存在兼容;映射可以与lh-bracket的所有其他映射一起打开/关闭)< / p>