# HG changeset patch # User Steve Losh # Date 1693335919 14400 # Node ID 619b0d73e6aee7f271fe028f6153e2196f5e550b # Parent b0aaacce2d6d66ca300fd08ecffc44e6db259b42 More diff -r b0aaacce2d6d -r 619b0d73e6ae vim/ftdetect/snakemake.vim --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vim/ftdetect/snakemake.vim Tue Aug 29 15:05:19 2023 -0400 @@ -0,0 +1,9 @@ +" Vim ftdetect file +" Language: Snakemake (extended from python.vim) +" Maintainer: Jay Hesselberth (jay.hesselberth@gmail.com) +" Last Change: 2020 Oct 6 +" +" Usage +" +" copy to $HOME/.vim/ftdetect directory +au BufNewFile,BufRead Snakefile,*.smk set filetype=snakemake diff -r b0aaacce2d6d -r 619b0d73e6ae vim/ftplugin/snakemake/folding.vim --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vim/ftplugin/snakemake/folding.vim Tue Aug 29 15:05:19 2023 -0400 @@ -0,0 +1,61 @@ +setlocal foldmethod=expr +setlocal foldexpr=GetSnakemakeFold(v:lnum) + +function! GetSnakemakeFold(lnum) + " fold preamble + if a:lnum == 1 + return '>1' + endif + + let thisline = getline(a:lnum) + + " blank lines end folds + if thisline =~? '\v^\s*$' + return '-1' + " start fold on top level rules or python objects + elseif thisline =~? '\v^(rule|def|checkpoint|class)' + return ">1" + elseif thisline =~? '\v^\S' + if PreviousLineIndented(a:lnum) && NextRuleIndented(a:lnum) + return ">1" + endif + endif + + return "=" + +endfunction + +function! NextRuleIndented(lnum) + let numlines = line('$') + let current = a:lnum + 1 + + while current <= numlines + let thisline = getline(current) + if thisline =~? '\v^(rule|def|checkpoint|class)' + return 0 + elseif thisline =~? '\v^\s+(rule|checkpoint)' + return 1 + endif + + let current += 1 + endwhile + + return 0 +endfunction + +function! PreviousLineIndented(lnum) + let current = a:lnum - 1 + + while current >= 1 + let thisline = getline(current) + if thisline =~? '\v^\S' + return 0 + elseif thisline =~? '\v^\s+\S' + return 1 + endif + + let current -= 1 + endwhile + + return 0 +endfunction diff -r b0aaacce2d6d -r 619b0d73e6ae vim/ftplugin/snakemake/sections.vim --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vim/ftplugin/snakemake/sections.vim Tue Aug 29 15:05:19 2023 -0400 @@ -0,0 +1,43 @@ +function! s:NextSection(type, backwards, visual) + if a:visual + normal! gv + endif + + if a:type == 1 + let pattern = '\v(^rule|^checkpoint|^def|%^)' + elseif a:type == 2 + let pattern = '\v\n\zs\n^(rule|checkpoint|def)' + endif + + if a:backwards + let dir = '?' + else + let dir = '/' + endif + + execute 'silent normal! ' . dir . pattern . dir . "\r" +endfunction + +noremap