home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / life.vim < prev    next >
Text File  |  2003-08-12  |  8KB  |  261 lines

  1. " Macros to play Conway's Game of Life in vi
  2. " Version 1.0m: edges wrap
  3. " by Eli-the-Bearded (eli@netusa.net), Sept 1996
  4. " This file may be free distributed so long as these credits remain unchanged.
  5. "
  6. " Modified by Bram Moolenaar (Bram@vim.org), 1996 Sept 10
  7. " - Made it quite a bit faster, but now needs search patterns in the text
  8. " - Changed the order of mappings to top-down.
  9. " - Made "g" run the whole thing, "C" run one generation.
  10. " - Added support for any uppercase character instead of 'X'
  11. "
  12. " Rules:
  13. "   If a germ has 0 or 1 live neighbors it dies of loneliness
  14. "   If a germ has 2 or 3 live neighbors it survives
  15. "   If a germ has 4 to 8 live neighbors it dies of starvation
  16. "   If an empty box has 3 live neighbors a new germ is born
  17. "
  18. "   A new born germ is an "A".    Every generation it gets older: B, C, etc.
  19. "   A germ dies of old age when it reaches "Z".
  20. "
  21. " Notice the rules do not mention edges. This version has the edges wrap
  22. " around. I have an earlier version that offers the option of live edges or
  23. " dead edges. Email me if you are interested. -Eli-
  24. "
  25. " Note: This is slow!  One generation may take up to ten minutes (depends on
  26. " your computer and the vi version).
  27. "
  28. " Quite a lot of the messy stuff is to work around the vi error "Can't yank
  29. " inside global/macro".  Still doesn't work for all versions of vi.
  30. "
  31. " To use these macros:
  32. "
  33. " vi        start vi/vim
  34. "
  35. " :so life.mac    Source this file
  36. "
  37. " g        'g'o!  runs everything until interrupted: "IR".
  38. "
  39. " I        Initialize everything. A board will be drawn at the end
  40. "        of the current buffer. All line references in these macros
  41. "        are relative to the end of the file and playing the game
  42. "        can be done safely with any file as the current buffer.
  43. "
  44. "    Change the left field with spaces and uppercase letters to suit
  45. "    your taste.
  46. "
  47. " C        'C'ompute one generation.
  48. " +        idem, time running one generation.
  49. " R        'R'un 'C'ompute until interrupted.
  50. " i<nr><Esc>z    Make a number the only thing on the current line and use
  51. "        'z' to time that many generations.
  52. "
  53. " Time to run 30 generations on my 233 AMD K6 (FreeBSD 3.0):
  54. "   vim   5.4 xterm    51 sec
  55. "   gvim  5.4 Athena    42 sec
  56. "   gvim  5.4 Motif    42 sec
  57. "   gvim  5.4 GTK    50 sec
  58. "   nvi   1.79 xterm    58 sec
  59. "   vi      3.7 xterm    2 min 30 sec
  60. "   Elvis 2.1 xterm    7 min 50 sec
  61. "   Elvis 2.1 X11    6 min 31 sec
  62. "
  63. " Time to run 30 generations on my 850 AMD Duron (FreeBSD 4.2):
  64. "   vim   5.8   xterm    21 sec
  65. "   vim   6.0   xterm    24 sec
  66. "   vim   6.0   Motif    32 sec
  67. "   nvi   1.79  xterm     29 sec
  68. "   vi    3.7   xterm    32 sec
  69. "   elvis 2.1.4 xterm    34 sec
  70. "
  71. " And now the macros, more or less in top-down order.
  72. "
  73. "  ----- macros that can be used by the human -----
  74. "
  75. " 'g'o: 'I'nitialize and then 'R'un 'C'ompute recursively (used by the human)
  76. map g IR
  77. "
  78. "
  79. " 'R'un 'C'ompute recursively (used by the human and 'g'o)
  80. map R CV
  81. " work around "tail recursion" problem in vi, "V" == "R".
  82. map V R
  83. "
  84. "
  85. " 'I'nitialize the board (used by the human and 'g'o)
  86. map I G)0)0)0)0)1)0)0)2)0)0)0)0,ok,-11k,-,R,IIN
  87. "
  88. "
  89. " 'C'ompute next generation (used by the human and others)
  90. map C T>>>>>>>>B&
  91. "
  92. "
  93. " Time running one generation (used by the human)
  94. map + <1C<2
  95. "
  96. "
  97. " Time running N generations, where N is the number on the current line.
  98. " (used by the human)
  99. map z ,^,&,*,&<1,*<2
  100. "
  101. "  ----- END of macros that can be used by the human -----
  102. "
  103. "  ----- Initialisation -----
  104. "
  105. map ,- :s/./-/g
  106. map ,o oPut 'X's in the left box, then hit 'C' or 'R'
  107. map ,R 03stop
  108. "
  109. " Write a new line (used by 'I'nitialize board)
  110. map )0 o-                    --....................--....................-
  111. map )1 o-        VIM         --....................--....................-
  112. map )2 o-       LIVES        --....................--....................-
  113. "
  114. "
  115. " Initialisation of the pattern/command to execute for working out a square.
  116. " Pattern is: "#<germ><count>"
  117. " where <germ>   is " " if the current germ is dead, "X" when living.
  118. "       <count>  is the number of living neighbours (including current germ)
  119. "                expressed in X's
  120. "
  121. map ,Il8 O#XXXXXXXXXX .`a22lr 
  122. map ,Id8 o# XXXXXXXX .`a22lr 
  123. map ,Il7 o#XXXXXXXXX .`a22lr 
  124. map ,Id7 o# XXXXXXX .`a22lr 
  125. map ,Il6 o#XXXXXXXX .`a22lr 
  126. map ,Id6 o# XXXXXX .`a22lr 
  127. map ,Il5 o#XXXXXXX .`a22lr 
  128. map ,Id5 o# XXXXX .`a22lr 
  129. map ,Il4 o#XXXXXX .`a22lr 
  130. map ,Id4 o# XXXX .`a22lr 
  131. map ,Il3 o#XXXXX .,a
  132. map ,Id3 o# XXX .`a22lrA
  133. map ,Il2 o#XXXX .,a
  134. map ,Id2 o# XX .`a22lr 
  135. map ,Il1 o#XXX .`a22lr 
  136. map ,Id1 o# X .`a22lr 
  137. map ,Il0 o#XX .`a22lr 
  138. map ,Id0 o#  .`a22lr 
  139. "
  140. " Patterns used to replace a germ with it's next generation
  141. map ,Iaa o=AB =BC =CD =DE =EF =FG =GH =HI =IJ =JK =KL =LM =MN =NO =OP =PQ =QR
  142. map ,Iab o=RS =ST =TU =UV =VW =WX =XY =YZ =Z 
  143. "
  144. " Insert the searched patterns above the board
  145. map ,IIN G?^top,Il8,Id8,Il7,Id7,Il6,Id6,Il5,Id5,Il4,Id4,Il3,Id3,Il2,Id2,Il1,Id1,Il0,Id0,Iaa,Iab
  146. "
  147. "  ----- END of Initialisation -----
  148. "
  149. "  ----- Work out one line -----
  150. "
  151. " Work out 'T'op line (used by show next)
  152. map T G,c2k,!9k,@,#j>2k,$j
  153. "
  154. " Work out 'B'ottom line (used by show next)
  155. map B ,%k>,$
  156. "
  157. " Work out a line (used by show next, work out top and bottom lines)
  158. map > 0 LWWWWWWWWWWWWWWWWWW,rj
  159. "
  160. " Refresh board (used by show next)
  161. map & :%s/^\(-[ A-Z]*-\)\(-[ A-Z]*-\)\(-[.]*-\)$/\2\3\3/
  162. "
  163. "
  164. " Work around vi multiple yank/put in a single macro limitation
  165. " (used by work out top and/or bottom line)
  166. map ,$ dd
  167. map ,% "cp
  168. map ,! "byy
  169. map ,@ "cyy
  170. map ,# "bP
  171. map ,c c$
  172. "
  173. "  ----- END of Work out one line -----
  174. "
  175. "  ----- Work out one square -----
  176. "
  177. " The next three work out a square: put all nine chars around the current
  178. " character on the bottom line (the bottom line must be empty when starting).
  179. "
  180. " 'W'ork out a center square (used by work out line)
  181. map W makh,3`ah,3`ajh,3(
  182. "
  183. "
  184. " Work out a 'L'eft square (used by work out line)
  185. map L makf-h,1`ak,2`af-h,1`a,2`ajf-h,1`aj,2(
  186. "
  187. "
  188. " Work out a 'R'ight square (used by work out line)
  189. map ,r makh,2`akF-l,1`ah,2`aF-l,1`ajh,2`ajF-l,1(
  190. "
  191. " 'M'ove a character to the end of the file (used by all work out square
  192. " macros)
  193. "
  194. map ,1 y G$p
  195. map ,2 2y G$p
  196. map ,3 3y G$p
  197. "
  198. "
  199. "  ----- END of Work out one square -----
  200. "
  201. "  ----- Work out one germ -----
  202. "
  203. " Generate an edit command that depends on the number of living in the last
  204. " line, and then run the edit command. (used by work out square).
  205. " Leaves the cursor on the next character to be processed.
  206. "
  207. map ( ,s,i,X0i?^#A ,df.l,Y21h
  208. "
  209. " Delete 's'paces (deads);
  210. " The number of remaining characters is the number of living neighbours.
  211. map ,s :.g/ /s///g
  212. "
  213. " Insert current character in the last line
  214. map ,i `ay GP
  215. "
  216. " Replace any uppercase letter with 'X';
  217. map ,X :.g/[A-Z]/s//X/g
  218. "
  219. " Delete and execute the rest of the line
  220. map ,d "qd$@q
  221. "
  222. " Yank and execute the rest of the line
  223. map ,Y "qy$@q
  224. "
  225. " Yank the character under the cursor
  226. map ,j y 
  227. "
  228. " Put the current cut buffer after the cursor
  229. map ,m p
  230. "
  231. " Delete the character under the cursor
  232. map ,n x
  233. "
  234. " Replace a character by it's next, A --> B,  B --> C, etc.
  235. map ,a `a,jGi?=,ma,dll,j`a21l,ml,nh
  236. "
  237. "  ----- END of Work out one germ -----
  238. "
  239. "  ----- timing macros  -----
  240. "
  241. " Get current date (used by time a generation)
  242. map << :r!date
  243. map <1 G?^topO<<
  244. map <2 G?^topk<<
  245. "
  246. "
  247. " Turn number on current line into edit command (used by time N generations)
  248. map ,^ AiC
  249. "
  250. "
  251. " Delete current line and save current line (used by time N generations)
  252. map ,& 0"gd$
  253. "
  254. "
  255. " Run saved line (used by time N generations)
  256. map ,* @g
  257. "
  258. "  ----- END of timing macros  -----
  259. "
  260. " End of the macros.
  261.