调整cindent“切换”缩进

时间:2011-11-28 01:40:06

标签: vim nemerle

Nemerle是一种类似C语言的语言,并且与cindent的效果非常好。但是,其类似于switch的构造称为match

match (x)                // switch (x)
{                        // {
| "Hello World" => ...   // case "Hello World": ...
| _ => ...               // default: ...
}                        // }

是否可以将cinoptions switch语句应用于此构造,而不是?也许我可以设置一个正则表达式。如果没有,我可以让垂直条与另一种方式对齐吗?


更新

以下是我提出的建议:

" Vim indent file
" Language:   Nemerle
" Maintainer: Alexey Badalov

" Only load this indent file when no other was loaded.
if exists("b:did_indent")
   finish
endif
let b:did_indent = 1

" Nemerle is C-like, but without switch statements or labels.
setlocal cindent cinoptions=L0

" Enable '|', disable ':'.
setlocal indentkeys=0{,0},0),0#,0\|,!^F,o,O,e

setlocal indentexpr=GetNemerleIndent()

let b:undo_indent = "setl cin< cino< indentkeys< indentexpr<"

function! GetNemerleIndent()
    " Nemerle is C-like; use built-in C indentation as a basis.
    let indent = cindent(v:lnum)

    " Set alignment for lines starting with '|' in line with the opening
    " brace. Use default indentation outside of blocks.
    if getline(v:lnum) =~ '^\s*|'
        call cursor(v:lnum, 1)
        silent! normal [{
        if line('.') == v:lnum
            return indent
        endif
        return indent(line('.'))
    endif

    return indent
endfunction

1 个答案:

答案 0 :(得分:3)

请参阅:h indent-expression以获得Vim文档的立足点。基本上我认为你会想要为你的文件类型编写你自己的“缩进文件”,这将返回一个带有匹配结构的适当空格的indentexpr,否则(假设只是更改)返回通常的cindent()值。它涉及的不仅仅是设置正则表达式,缩进文件将具有Vim命令和结构来评估行并返回正确的值。正如文档所述,了解其工作原理的最佳方法是查看其他语言的某些缩进文件。 。 。 。 (C没有缩进文件供您查看,因为它全部集成到Vim自己的c源代码中,但大多数其他语言都使用Vimscript缩进文件。)