vim/ftplugin/lisp/lispfolding.vim @ 1a3a3aa19a41

Improve lisp folding
author Steve Losh <steve@stevelosh.com>
date Fri, 25 Mar 2016 21:37:22 +0000
parents e7642253ffde
children b69dc77f379c
if exists('loaded_lispfolding') || &cp
    finish
endif
let loaded_lispfolding=1

" ---------------------------------------------------------------------------
"  Automagic Lisp folding on defn's and defmacro's
"

function! GetLispFold()
    let inline_fn_comment_re = '\v^ *;;( .*)?$'

    if getline(v:lnum) =~ '^;;;; .*'
        return "0"
    elseif getline(v:lnum) =~ '^;;;.*'
        return "1"
    elseif getline(v:lnum) =~ inline_fn_comment_re
        if getline(v:lnum + 1) =~ inline_fn_comment_re
            return "2"
        else
            return "<2"
        endif
    elseif getline(v:lnum) =~ '^; .*'
        return "0"
    elseif getline(v:lnum) =~ '^(defun.*\s'
        return ">1"
    elseif getline(v:lnum) =~ '^(test.*\s'
        return ">1"
    elseif getline(v:lnum) =~ '^(defmacro.*\s'
        return ">1"
    elseif getline(v:lnum) =~ '^(defmethod.*\s'
        return ">1"
    elseif getline(v:lnum) =~ '^(defgeneric.*\s'
        return ">1"
    elseif getline(v:lnum) =~ '^(defparameter.*\s'
        return ">1"
    elseif getline(v:lnum) =~ '^(defconstant.*\s'
        return ">1"
    elseif getline(v:lnum) =~ '^(deftype.*\s'
        return ">1"
    elseif getline(v:lnum) =~ '^(defvar.*\s'
        return ">1"
    elseif getline(v:lnum) =~ '^(defclass.*\s'
        return ">1"
    elseif getline(v:lnum) =~ '^(defstruct.*\s'
        return ">1"
    elseif getline(v:lnum) =~ '^(define-.*\s'
        return ">1"
    elseif getline(v:lnum) =~ '^\s*$'
        let my_lispnum = v:lnum
        let my_lispmax = line("$")

        while (1)
            let my_lispnum = my_lispnum + 1
            if my_lispnum > my_lispmax
                return "<1"
            endif

            let my_lispdata = getline(my_lispnum)

            " If we match an empty line, stop folding
            if my_lispdata =~ '^$'
                return "<1"
            else
                return "="
            endif
        endwhile
    else
        return "="
    endif
endfunction

function! TurnOnLispFolding()
    setlocal foldexpr=GetLispFold()
    setlocal foldmethod=expr
endfunction