Vim Tips Wiki
(Insert TipProposed template + minor manual clean)
(rework and expand)
Line 11: Line 11:
 
|category2=
 
|category2=
 
}}
 
}}
I recently found myself in want of a favicon. Not wanting to mess around with typical WYSIWIG editors, I wrote a Bash script that generated a PPM file based on a data matrix corresponding to the individual pixels of the eventual favicon. By applying syntax highlightning to the data matrix, I effectively had a WYSIWYG display of the eventual image within Vim.
+
I recently found myself in want of a favicon. Not wanting to mess around with typical WYSIWYG editors, I wrote a Bash script that generated a PPM file based on a data matrix corresponding to the individual pixels of the eventual favicon. By applying syntax highlightning to the data matrix, I effectively had a WYSIWYG display of the eventual image within Vim.
   
 
The true favicon was a five color, 32x32 matrix, mixing the Swedish and German flags (that I indeed did some extensive editing on, trying a number of variations). The below gives a simplified version using a 7x5 Swedish flag with two colors.
 
The true favicon was a five color, 32x32 matrix, mixing the Swedish and German flags (that I indeed did some extensive editing on, trying a number of variations). The below gives a simplified version using a 7x5 Swedish flag with two colors.
Line 18: Line 18:
 
<pre>
 
<pre>
 
#!/bin/bash -u
 
#!/bin/bash -u
  +
# basic colors from rgb.txt
 
Y="255 255 0"
+
k = '0 0 0'
B="0 111 253"
+
b = '0 0 139'
  +
g = '0 100 0'
  +
c = '0 139 139'
  +
r = '139 0 0'
  +
m = '139 0 139'
  +
y = '165 42 42'
  +
w = '211 211 211'
  +
K = '169 169 169'
  +
B = '0 0 255'
  +
G = '0 255 0'
  +
C = '0 255 255'
  +
R = '255 0 0'
  +
M = '255 0 255'
  +
Y = '255 255 0'
  +
W = '255 255 255'
   
 
function outputLine() {
 
function outputLine() {
Line 29: Line 43:
 
}
 
}
   
  +
# PNM header
  +
# P1=PBM (B&W) P2=PGM (greyscale) P3=PMM (full-color) P4-P6=binary P7=PNM (any)
 
echo 'P3'
 
echo 'P3'
  +
# with / height
 
echo '7 5'
 
echo '7 5'
  +
# color depth
 
echo '255'
 
echo '255'
   
Line 41: Line 59:
 
</pre>
 
</pre>
   
Syntax highlightning to apply to the Vim buffer to make the matrix appear in solid colors:
+
Syntax highlighting to apply to the Vim buffer to make the matrix appear in solid colors:
 
<pre>
 
<pre>
  +
if version < 600
:syntax clear
+
syntax clear
:syn match Yellow / Y/
 
  +
elseif exists(b:current_syntax)
:syn match Blue / B/
 
  +
finish
:hi Yellow guibg=#FFFF00 guifg=#FFFF00
 
  +
endif
:hi Blue guibg=#006FFD guifg=#006FFD
 
</pre>
 
   
  +
syn region ppmOutputline
Beware that I have mostly been a passive consumer of highlightning, and that the above is not necessarily the optimal way to achieve the wanted effect.
 
  +
\ matchgroup=ppmKeyword
  +
\ keepend
  +
\ start=/^\s*outputline\>/
  +
\ end=/$/
  +
\ contains=ppmBlack,ppmDarkblue,ppmDarkgreen,ppmDarkcyan,ppmDarkred,ppmDarkmagenta,
  +
\ppmBrown,ppmLightgrey,ppmDarkgrey,ppmBlue,ppmGreen,ppmCyan,ppmRed,ppmMagenta,
  +
\ppmYellow,ppmWhite
  +
  +
syn match ppmBlack /\C k/ contained
  +
syn match ppmDarkblue /\C b/ contained
  +
syn match ppmDarkgreen /\C g/ contained
  +
syn match ppmDarkcyan /\C c/ contained
  +
syn match ppmDarkred /\C r/ contained
  +
syn match ppmDarkmagenta /\C m/ contained
  +
syn match ppmBrown /\C y/ contained
  +
syn match ppmLightgrey /\C w/ contained
  +
syn match ppmDarkgrey /\C K/ contained
 
syn match ppmBlue /\C B/ contained
  +
syn match ppmGreen /\C G/ contained
  +
syn match ppmRed /\C R/ contained
  +
syn match ppmMagenta /\C M/ contained
 
syn match ppmYellow /\C Y/ contained
  +
syn match ppmWhite /\C W/ contained
  +
  +
hi ppmBlack ctermbg=Black ctermfg=LightGrey guibg=black guifg=white
  +
hi ppmDarkblue ctermbg=DarkBlue ctermfg=LightGrey guibg=darkblue guifg=white
  +
hi ppmDarkGreen ctermbg=DarkGreen ctermfg=LightGrey guibg=darkgreen guifg=white
  +
hi ppmDarkCyan ctermbg=DarkCyan ctermfg=LightGrey guibg=darkcyan guifg=white
  +
hi ppmDarkRed ctermbg=DarkRed ctermfg=LightGrey guibg=darkred guifg=white
  +
hi ppmDarkMagenta ctermbg=DarkMagenta ctermfg=LightGrey guibg=darkmagenta guifg=white
  +
hi ppmBrown ctermbg=Brown ctermfg=LightGrey guibg=brown guifg=white
  +
hi ppmLightgrey ctermbg=LightGrey ctermfg=Black guibg=lightgrey guifg=black
  +
hi ppmDarkgrey ctermbg=DarkGrey ctermfg=White guibg=darkgrey guifg=white
  +
hi ppmBlue ctermbg=Blue ctermfg=White guibg=blue guifg=white
  +
hi ppmCyan ctermbg=Cyan ctermfg=DarkGrey guibg=cyan guifg=white
  +
hi ppmRed ctermbg=Red ctermfg=White guibg=red guifg=black
  +
hi ppmMagenta ctermbg=Magenta ctermfg=White guibg=magenta guifg=black
  +
hi ppmYellow ctermbg=Yellow ctermfg=DarkGrey guibg=yellow guifg=black
  +
hi ppmWhite ctermbg=White ctermfg=DarkGrey guibg=white guifg=black
  +
  +
hi def link ppmKeyword Keyword
  +
 
</pre>
   
 
A [http://www.aswedeingermany.de/50MetaInformation/50Favicon.html much larger write-up] with the full examples and some screen-shots is available. (I hope that the size justifies the external link.) The above should suffice to reproduce everything, however.
 
A [http://www.aswedeingermany.de/50MetaInformation/50Favicon.html much larger write-up] with the full examples and some screen-shots is available. (I hope that the size justifies the external link.) The above should suffice to reproduce everything, however.
   
 
==Comments==
 
==Comments==
  +
'''TODO:'''
  +
* Include "sh" syntax for lines other than "outputline"
  +
* Foreground: same as bg (for solid colors) or distinct from bg (to facilitate editing)?

Revision as of 06:46, 27 August 2009

Proposed tip Please edit this page to improve it, or add your comments below (do not use the discussion page).

Please use new tips to discuss whether this page should be a permanent tip, or whether it should be merged to an existing tip.
created August 7, 2009 · complexity basic · author Michael.Eriksson · version 7.0

I recently found myself in want of a favicon. Not wanting to mess around with typical WYSIWYG editors, I wrote a Bash script that generated a PPM file based on a data matrix corresponding to the individual pixels of the eventual favicon. By applying syntax highlightning to the data matrix, I effectively had a WYSIWYG display of the eventual image within Vim.

The true favicon was a five color, 32x32 matrix, mixing the Swedish and German flags (that I indeed did some extensive editing on, trying a number of variations). The below gives a simplified version using a 7x5 Swedish flag with two colors.

Bash (output to be directed into a .ppm file):

#!/bin/bash -u
# basic colors from rgb.txt
k = '0 0 0'
b = '0 0 139'
g = '0 100 0'
c = '0 139 139'
r = '139 0 0'
m = '139 0 139'
y = '165 42 42'
w = '211 211 211'
K = '169 169 169'
B = '0 0 255'
G = '0 255 0'
C = '0 255 255'
R = '255 0 0'
M = '255 0 255'
Y = '255 255 0'
W = '255 255 255'

function outputLine() {
    for color in $*
    do
        eval echo "\$$color"
    done
}

# PNM header
# P1=PBM (B&W) P2=PGM (greyscale) P3=PMM (full-color) P4-P6=binary P7=PNM (any)
echo 'P3'
# with / height
echo '7 5'
# color depth
echo '255'

#           The below is the colored matrix. (Could be in a separate file.)
outputLine  B B Y B B B B
outputLine  B B Y B B B B
outputLine  Y Y Y Y Y Y Y
outputLine  B B Y B B B B
outputLine  B B Y B B B B

Syntax highlighting to apply to the Vim buffer to make the matrix appear in solid colors:

if version < 600
  syntax clear
elseif exists(b:current_syntax)
  finish
endif

syn region ppmOutputline
 \ matchgroup=ppmKeyword
 \ keepend
 \ start=/^\s*outputline\>/
 \ end=/$/
 \ contains=ppmBlack,ppmDarkblue,ppmDarkgreen,ppmDarkcyan,ppmDarkred,ppmDarkmagenta,
    \ppmBrown,ppmLightgrey,ppmDarkgrey,ppmBlue,ppmGreen,ppmCyan,ppmRed,ppmMagenta,
    \ppmYellow,ppmWhite

syn match ppmBlack       /\C k/ contained
syn match ppmDarkblue    /\C b/ contained
syn match ppmDarkgreen   /\C g/ contained
syn match ppmDarkcyan    /\C c/ contained
syn match ppmDarkred     /\C r/ contained
syn match ppmDarkmagenta /\C m/ contained
syn match ppmBrown       /\C y/ contained
syn match ppmLightgrey   /\C w/ contained
syn match ppmDarkgrey    /\C K/ contained
syn match ppmBlue        /\C B/ contained
syn match ppmGreen       /\C G/ contained
syn match ppmRed         /\C R/ contained
syn match ppmMagenta     /\C M/ contained
syn match ppmYellow      /\C Y/ contained
syn match ppmWhite       /\C W/ contained

hi ppmBlack       ctermbg=Black       ctermfg=LightGrey     guibg=black       guifg=white
hi ppmDarkblue    ctermbg=DarkBlue    ctermfg=LightGrey     guibg=darkblue    guifg=white
hi ppmDarkGreen   ctermbg=DarkGreen   ctermfg=LightGrey     guibg=darkgreen   guifg=white
hi ppmDarkCyan    ctermbg=DarkCyan    ctermfg=LightGrey     guibg=darkcyan    guifg=white
hi ppmDarkRed     ctermbg=DarkRed     ctermfg=LightGrey     guibg=darkred     guifg=white
hi ppmDarkMagenta ctermbg=DarkMagenta ctermfg=LightGrey     guibg=darkmagenta guifg=white
hi ppmBrown       ctermbg=Brown       ctermfg=LightGrey     guibg=brown       guifg=white
hi ppmLightgrey   ctermbg=LightGrey   ctermfg=Black         guibg=lightgrey   guifg=black
hi ppmDarkgrey    ctermbg=DarkGrey    ctermfg=White         guibg=darkgrey    guifg=white
hi ppmBlue        ctermbg=Blue        ctermfg=White         guibg=blue        guifg=white
hi ppmCyan        ctermbg=Cyan        ctermfg=DarkGrey      guibg=cyan        guifg=white
hi ppmRed         ctermbg=Red         ctermfg=White         guibg=red         guifg=black
hi ppmMagenta     ctermbg=Magenta     ctermfg=White         guibg=magenta     guifg=black
hi ppmYellow      ctermbg=Yellow      ctermfg=DarkGrey      guibg=yellow      guifg=black
hi ppmWhite       ctermbg=White       ctermfg=DarkGrey      guibg=white       guifg=black

hi def link ppmKeyword Keyword

A much larger write-up with the full examples and some screen-shots is available. (I hope that the size justifies the external link.) The above should suffice to reproduce everything, however.

Comments

TODO:

  • Include "sh" syntax for lines other than "outputline"
  • Foreground: same as bg (for solid colors) or distinct from bg (to facilitate editing)?