From 4d7a9e1f61dd6d3f3e55ef28e5f6b0f8fa4b6ca5 Mon Sep 17 00:00:00 2001
From: Kevin Ballard <kevin@sb.org>
Date: Wed, 9 Jul 2014 21:10:01 -0700
Subject: [PATCH] Add an ftplugin for fish profile output files

There's no standard extension for these files, so no ftdetect, but an
ftplugin called `fishprofile` is defined that sets up tabstop and
folding to make it easier to read/navigate these files.

When reading a fish profile file, run `:setf fishprofile` to turn on the
plugin.
---
 ftplugin/fishprofile.vim | 65 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)
 create mode 100644 ftplugin/fishprofile.vim

diff --git a/ftplugin/fishprofile.vim b/ftplugin/fishprofile.vim
new file mode 100644
index 0000000..d5028d2
--- /dev/null
+++ b/ftplugin/fishprofile.vim
@@ -0,0 +1,65 @@
+" File: ftplugin/fishprofile.vim
+" Author: Kevin Ballard
+" Description: Filetype plugin for fish profile files
+" Last Change: Jul 09, 2014
+
+if exists('b:did_ftplugin')
+    finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Functions {{{1
+
+" This function can't be script-local, it doesn't work when recalculating. I
+" don't know why that is.
+function! FishProfileFoldExpr(lnum)
+	let len = strlen(matchstr(getline(a:lnum), '\d*\t\d*\t\zs-*>'))
+	return len ? '>'.len : '='
+endfunction
+
+" This function can't be script-local, apparently that just doesn't work.
+function! FishProfileFoldText(foldstart, foldend) " {{{
+	let line = getline(a:foldstart)
+
+	" expand tabs into spaces
+	while 1
+		let idx = stridx(line, "\t")
+		if idx == -1
+			break
+		endif
+		let width = strdisplaywidth("\t", idx)
+		let line = strpart(line, 0, idx) . repeat(" ", width) . line[idx+1:]
+	endwhile
+
+	let numlines = a:foldend - a:foldstart + 1
+	return line . '… (' . numlines . ')'
+endfunction " }}}
+
+" Variables {{{1
+
+setlocal foldmethod=expr
+setlocal foldexpr=FishProfileFoldExpr(v:lnum)
+setlocal foldlevel=0
+setlocal foldtext=FishProfileFoldText(v:foldstart,v:foldend)
+
+setlocal tabstop=8
+
+" }}}1
+
+" Cleanup {{{1
+
+let b:undo_ftplugin = "
+			\ setlocal foldexpr< foldmethod< foldlevel< foldtext< tabstop<
+			\|delfunction FishProfileFoldExpr
+			\|delfunction FishProfileFoldText
+			\"
+
+" }}}1
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: set noet sw=4 ts=4 sts=4: