Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/sh
- #! vi: set noautoindent :: Vi/ViM
- #!/usr/bin/env vim
- #! This is a shell script that executes itself as a vimscript to do its work
- #!-
- #! Copyright (c) 2008 Matthew J. Wozniski <mjw@drexel.edu>
- #! Copyright (c) 2017 Devin Teske <dteske@FreeBSD.org>
- #! All rights reserved.
- #!
- #! Redistribution and use in source and binary forms, with or without
- #! modification, are permitted provided that the following conditions
- #! are met:
- #! 1. Redistributions of source code must retain the above copyright
- #! notice, this list of conditions and the following disclaimer.
- #! 2. Redistributions in binary form must reproduce the above copyright
- #! notice, this list of conditions and the following disclaimer in the
- #! documentation and/or other materials provided with the distribution.
- #!
- #! THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- #! ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- #! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- #! ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- #! FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- #! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- #! OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- #! HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- #! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- #! OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- #! SUCH DAMAGE.
- #!
- #! $FreeBSD$
- #! $FrauBSD$
- #!
- #!########################################################## SH MAIN
- : if 0
- : "Bourne shell code goes here, but you cannot use if-statements"
- case "$0" in
- /*) script="$0" ;;
- *) script="$PWD/$0"
- esac
- : ${UNAME_s:=$( uname -s )}
- export darwin=0
- case "$UNAME_s" in
- Darwin) darwin=1 ;;
- esac
- [ $# -lt 1 -o "$1" = "-" ] && {
- tmpfile=$( mktemp -t "${0##*/}.XXXXXXXX" )
- trap 'rm -f "$tmpfile"' EXIT
- eval 'cat > "$tmpfile" || exit'
- [ $# -gt 0 ] && shift 1 # -
- set -- "$tmpfile" "$@"
- }
- vim -e -X -R "$@" -c "source $script" -c "visual" \
- -c "bufdo call AnsiHighlight()" -c qa < /dev/tty | awk '
- NR == 1 { sub(/^[^"]*"[^"]*"[[:space:]]*/, "") }
- gsub(/\x1b\[[[:digit:]]+;1H/, "") { }
- !/^\x1b\[\?1l/
- '
- exit
- : "The remainder of this file is vimscript"
- : endif
- #!########################################################## VIM FUNCTIONS
- :
- : "Convert info for a highlight group to a string of ANSI color escapes"
- :
- function! s:GroupToAnsi(groupnum)
- if !exists("s:ansicache")
- let s:ansicache = {}
- endif
- let groupnum = a:groupnum
- if !groupnum
- let groupnum = hlID("Normal")
- endif
- if has_key(s:ansicache, groupnum)
- return s:ansicache[groupnum]
- endif
- let rv = synIDattr(groupnum, "reverse", s:type)
- if rv == "" || rv == -1
- let rv = 0
- endif
- let bd = synIDattr(groupnum, "bold", s:type)
- if bd == "" || bd == -1
- let bd = 0
- endif
- let fg = synIDattr(groupnum, "fg", s:type)
- let bg = synIDattr(groupnum, "bg", s:type)
- if rv
- let temp = bg
- let bg = fg
- let fg = temp
- endif
- if fg >= 8 && fg < 16
- let fg -= 8
- let bd = 1
- endif
- if fg == "" || fg == -1
- unlet fg
- endif
- if !exists("fg") && !groupnum == hlID("Normal")
- let fg = synIDattr(hlID("Normal"), "fg", s:type)
- if fg == "" || fg == -1
- unlet fg
- endif
- endif
- if bg == "" || bg == -1
- unlet bg
- endif
- if !exists("bg") && !groupnum == hlID("Normal")
- let bg = synIDattr(hlID("Normal"), "bg", s:type)
- if bg == "" || bg == -1
- unlet bg
- endif
- endif
- let retv = "\<Esc>[0"
- if bd
- let retv .= ";1"
- endif
- if exists("fg") && fg < 8
- let retv .= ";3" . fg
- elseif exists("fg")
- let retv .= ";38;5;" . fg
- endif
- if exists("bg") && bg < 8
- let retv .= ";4" . bg
- elseif exists("bg")
- let retv .= ";48;5;" . bg
- endif
- let retv .= "m"
- let s:ansicache[groupnum] = retv
- return retv
- endfunction
- function! AnsiHighlight()
- let retv = []
- for lnum in range(1, line("$"))
- let last = hlID("Normal")
- let output = s:GroupToAnsi(last) . "\<Esc>[K"
- : "Hopefully fix highlighting sync issues"
- exe "norm! " . lnum . "G$"
- let line = getline(lnum)
- for cnum in range(1, col("."))
- if synIDtrans(synID(lnum, cnum, 1)) != last
- let last = synIDtrans(synID(lnum, cnum, 1))
- let output .= s:GroupToAnsi(last)
- endif
- let output .= matchstr(line, '\%(\zs.\)\{'.cnum.'}')
- endfor
- let retv += ["\r" . output]
- endfor
- : "Reset the colors to default after displaying the file"
- let retv[-1] .= "\<Esc>[0m"
- if !$darwin
- echo ""
- endif
- return writefile([""] + retv, "/dev/stdout", "b")
- endfunction
- #!########################################################## VIM MAIN
- set nocompatible
- if &t_Co
- let s:type = "cterm"
- else
- let s:type = "term"
- endif
- : "Prevent statusmsg on exit when reading stdin on Darwin"
- if $darwin
- let ignored = system(":")
- endif
- #!##############################################################################
- #! END
- #!##############################################################################
Add Comment
Please, Sign In to add comment