x2c 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. data/README +103 -0
  2. data/x2c/config.rb +59 -0
  3. data/x2c/core/args.rb +36 -0
  4. data/x2c/core/client.rb +61 -0
  5. data/x2c/core/collection.rb +136 -0
  6. data/x2c/core/configure.rb +43 -0
  7. data/x2c/core/meta.rb +77 -0
  8. data/x2c/core/prompt.rb +59 -0
  9. data/x2c/core/resulteval.rb +133 -0
  10. data/x2c/doc.rb +243 -0
  11. data/x2c/doc/Array/cdesc-Array.yaml +21 -0
  12. data/x2c/doc/Array/format-i.yaml +10 -0
  13. data/x2c/doc/Array/inspect-i.yaml +10 -0
  14. data/x2c/doc/Array/to_s-i.yaml +10 -0
  15. data/x2c/doc/Fixnum/cdesc-Fixnum.yaml +20 -0
  16. data/x2c/doc/Fixnum/hour-i.yaml +12 -0
  17. data/x2c/doc/Fixnum/min-i.yaml +12 -0
  18. data/x2c/doc/Fixnum/sec-i.yaml +12 -0
  19. data/x2c/doc/Hash/cdesc-Hash.yaml +21 -0
  20. data/x2c/doc/Hash/format-i.yaml +10 -0
  21. data/x2c/doc/Hash/inspect-i.yaml +10 -0
  22. data/x2c/doc/Hash/to_s-i.yaml +10 -0
  23. data/x2c/doc/Help/cdesc-Help.yaml +30 -0
  24. data/x2c/doc/Help/help-c.yaml +10 -0
  25. data/x2c/doc/Help/help_hacks-c.yaml +10 -0
  26. data/x2c/doc/Help/ignore-c.yaml +10 -0
  27. data/x2c/doc/Help/irb_help-c.yaml +10 -0
  28. data/x2c/doc/Help/match%3f-c.yaml +10 -0
  29. data/x2c/doc/Help/trace_help-c.yaml +10 -0
  30. data/x2c/doc/IRB/ExtendCommandBundle/cdesc-ExtendCommandBundle.yaml +15 -0
  31. data/x2c/doc/IRB/Prompt/%5b%5d-i.yaml +10 -0
  32. data/x2c/doc/IRB/Prompt/cdesc-Prompt.yaml +36 -0
  33. data/x2c/doc/IRB/Prompt/config-i.yaml +10 -0
  34. data/x2c/doc/IRB/Prompt/main%3d-i.yaml +12 -0
  35. data/x2c/doc/IRB/Prompt/new-c.yaml +10 -0
  36. data/x2c/doc/IRB/Prompt/pop-i.yaml +10 -0
  37. data/x2c/doc/IRB/Prompt/push-i.yaml +10 -0
  38. data/x2c/doc/IRB/Prompt/set-i.yaml +11 -0
  39. data/x2c/doc/IRB/Prompt/start-i.yaml +10 -0
  40. data/x2c/doc/IRB/cdesc-IRB.yaml +15 -0
  41. data/x2c/doc/Kernel/cdesc-Kernel.yaml +16 -0
  42. data/x2c/doc/Kernel/xmms-i.yaml +12 -0
  43. data/x2c/doc/NilClass/cdesc-NilClass.yaml +16 -0
  44. data/x2c/doc/NilClass/inspect-i.yaml +10 -0
  45. data/x2c/doc/Object/cdesc-Object.yaml +18 -0
  46. data/x2c/doc/Object/format-i.yaml +10 -0
  47. data/x2c/doc/Object/to_d-i.yaml +12 -0
  48. data/x2c/doc/Prompting/activate-i.yaml +12 -0
  49. data/x2c/doc/Prompting/back-i.yaml +12 -0
  50. data/x2c/doc/Prompting/cdesc-Prompting.yaml +45 -0
  51. data/x2c/doc/Prompting/gointo-i.yaml +12 -0
  52. data/x2c/doc/Prompting/inspect-i.yaml +12 -0
  53. data/x2c/doc/Prompting/intersect-i.yaml +12 -0
  54. data/x2c/doc/Prompting/last%3d-i.yaml +12 -0
  55. data/x2c/doc/Prompting/last-i.yaml +12 -0
  56. data/x2c/doc/Prompting/lost-i.yaml +12 -0
  57. data/x2c/doc/Prompting/makelast-i.yaml +12 -0
  58. data/x2c/doc/Prompting/pop-i.yaml +12 -0
  59. data/x2c/doc/Prompting/push-i.yaml +12 -0
  60. data/x2c/doc/Prompting/stack-i.yaml +12 -0
  61. data/x2c/doc/Prompting/to_s-i.yaml +12 -0
  62. data/x2c/doc/Prompting/union-i.yaml +12 -0
  63. data/x2c/doc/String/cdesc-String.yaml +18 -0
  64. data/x2c/doc/String/format-i.yaml +10 -0
  65. data/x2c/doc/String/inspect-i.yaml +10 -0
  66. data/x2c/doc/Xmms/Browse/%5b%5d-i.yaml +12 -0
  67. data/x2c/doc/Xmms/Browse/cd-i.yaml +17 -0
  68. data/x2c/doc/Xmms/Browse/cdesc-Browse.yaml +34 -0
  69. data/x2c/doc/Xmms/Browse/dirs-i.yaml +12 -0
  70. data/x2c/doc/Xmms/Browse/files-i.yaml +12 -0
  71. data/x2c/doc/Xmms/Browse/format-i.yaml +10 -0
  72. data/x2c/doc/Xmms/Browse/get-i.yaml +12 -0
  73. data/x2c/doc/Xmms/Browse/list-i.yaml +12 -0
  74. data/x2c/doc/Xmms/Browse/mlib_add-i.yaml +12 -0
  75. data/x2c/doc/Xmms/Browse/open-i.yaml +12 -0
  76. data/x2c/doc/Xmms/Client/Chains/cdesc-Chains.yaml +39 -0
  77. data/x2c/doc/Xmms/Client/Chains/info-i.yaml +12 -0
  78. data/x2c/doc/Xmms/Client/Chains/remove-i.yaml +12 -0
  79. data/x2c/doc/Xmms/Client/Chains/song-i.yaml +12 -0
  80. data/x2c/doc/Xmms/Client/Config/cdesc-Config.yaml +18 -0
  81. data/x2c/doc/Xmms/Client/Config/config-i.yaml +18 -0
  82. data/x2c/doc/Xmms/Client/Daemon/cdesc-Daemon.yaml +27 -0
  83. data/x2c/doc/Xmms/Client/Daemon/connect-i.yaml +10 -0
  84. data/x2c/doc/Xmms/Client/Daemon/dead_daemon-i.yaml +12 -0
  85. data/x2c/doc/Xmms/Client/Daemon/post_daemon-i.yaml +12 -0
  86. data/x2c/doc/Xmms/Client/Daemon/pre_daemon-i.yaml +12 -0
  87. data/x2c/doc/Xmms/Client/Daemon/start_daemon-i.yaml +12 -0
  88. data/x2c/doc/Xmms/Client/IPlayback/cdesc-IPlayback.yaml +22 -0
  89. data/x2c/doc/Xmms/Client/IPlayback/pause-i.yaml +12 -0
  90. data/x2c/doc/Xmms/Client/IPlayback/play-i.yaml +12 -0
  91. data/x2c/doc/Xmms/Client/IPlayback/skip-i.yaml +12 -0
  92. data/x2c/doc/Xmms/Client/ListNames/cdesc-ListNames.yaml +20 -0
  93. data/x2c/doc/Xmms/Client/ListNames/setup_list-i.yaml +12 -0
  94. data/x2c/doc/Xmms/Client/ListNames/setup_lists-i.yaml +12 -0
  95. data/x2c/doc/Xmms/Client/Mlib/browse-i.yaml +14 -0
  96. data/x2c/doc/Xmms/Client/Mlib/cdesc-Mlib.yaml +20 -0
  97. data/x2c/doc/Xmms/Client/Mlib/rehash-i.yaml +12 -0
  98. data/x2c/doc/Xmms/Client/Remember/cdesc-Remember.yaml +25 -0
  99. data/x2c/doc/Xmms/Client/Remember/gointo-i.yaml +12 -0
  100. data/x2c/doc/Xmms/Client/Remember/inspect-i.yaml +10 -0
  101. data/x2c/doc/Xmms/Client/Remember/push-i.yaml +12 -0
  102. data/x2c/doc/Xmms/Client/Remember/to_s-i.yaml +10 -0
  103. data/x2c/doc/Xmms/Client/Search/cdesc-Search.yaml +17 -0
  104. data/x2c/doc/Xmms/Client/Shortcut/cdesc-Shortcut.yaml +22 -0
  105. data/x2c/doc/Xmms/Client/Shortcut/now-i.yaml +12 -0
  106. data/x2c/doc/Xmms/Client/Shortcut/seek-i.yaml +12 -0
  107. data/x2c/doc/Xmms/Client/Shortcut/volume-i.yaml +14 -0
  108. data/x2c/doc/Xmms/Client/Vote/cdesc-Vote.yaml +24 -0
  109. data/x2c/doc/Xmms/Client/Vote/rating-i.yaml +12 -0
  110. data/x2c/doc/Xmms/Client/Vote/remove_rating%21-i.yaml +12 -0
  111. data/x2c/doc/Xmms/Client/Vote/undo_voting-i.yaml +12 -0
  112. data/x2c/doc/Xmms/Client/Vote/vote-i.yaml +12 -0
  113. data/x2c/doc/Xmms/Client/__connect-i.yaml +12 -0
  114. data/x2c/doc/Xmms/Client/async_start-i.yaml +12 -0
  115. data/x2c/doc/Xmms/Client/bindata_add-i.yaml +10 -0
  116. data/x2c/doc/Xmms/Client/bindata_retrieve-i.yaml +10 -0
  117. data/x2c/doc/Xmms/Client/c-i.yaml +12 -0
  118. data/x2c/doc/Xmms/Client/cdesc-Client.yaml +169 -0
  119. data/x2c/doc/Xmms/Client/coll_find-i.yaml +12 -0
  120. data/x2c/doc/Xmms/Client/coll_get-i.yaml +12 -0
  121. data/x2c/doc/Xmms/Client/coll_idlist_from_playlist_file-i.yaml +12 -0
  122. data/x2c/doc/Xmms/Client/coll_list-i.yaml +12 -0
  123. data/x2c/doc/Xmms/Client/coll_query_ids-i.yaml +12 -0
  124. data/x2c/doc/Xmms/Client/coll_query_info-i.yaml +12 -0
  125. data/x2c/doc/Xmms/Client/coll_remove-i.yaml +12 -0
  126. data/x2c/doc/Xmms/Client/coll_rename-i.yaml +12 -0
  127. data/x2c/doc/Xmms/Client/coll_save-i.yaml +12 -0
  128. data/x2c/doc/Xmms/Client/configure-i.yaml +12 -0
  129. data/x2c/doc/Xmms/Client/configval_get-i.yaml +12 -0
  130. data/x2c/doc/Xmms/Client/configval_list-i.yaml +12 -0
  131. data/x2c/doc/Xmms/Client/configval_register-i.yaml +12 -0
  132. data/x2c/doc/Xmms/Client/configval_set-i.yaml +12 -0
  133. data/x2c/doc/Xmms/Client/connect-i.yaml +10 -0
  134. data/x2c/doc/Xmms/Client/continue-i.yaml +11 -0
  135. data/x2c/doc/Xmms/Client/format-i.yaml +12 -0
  136. data/x2c/doc/Xmms/Client/handled_connect-i.yaml +10 -0
  137. data/x2c/doc/Xmms/Client/help-i.yaml +16 -0
  138. data/x2c/doc/Xmms/Client/main-c.yaml +12 -0
  139. data/x2c/doc/Xmms/Client/main_stats-i.yaml +12 -0
  140. data/x2c/doc/Xmms/Client/medialib_add_entry-i.yaml +10 -0
  141. data/x2c/doc/Xmms/Client/medialib_entry_property_remove-i.yaml +10 -0
  142. data/x2c/doc/Xmms/Client/medialib_entry_property_set-i.yaml +10 -0
  143. data/x2c/doc/Xmms/Client/medialib_entry_remove-i.yaml +10 -0
  144. data/x2c/doc/Xmms/Client/medialib_get_id-i.yaml +10 -0
  145. data/x2c/doc/Xmms/Client/medialib_get_info-i.yaml +10 -0
  146. data/x2c/doc/Xmms/Client/medialib_path_import-i.yaml +10 -0
  147. data/x2c/doc/Xmms/Client/medialib_rehash-i.yaml +10 -0
  148. data/x2c/doc/Xmms/Client/medialib_select-i.yaml +10 -0
  149. data/x2c/doc/Xmms/Client/new-c.yaml +12 -0
  150. data/x2c/doc/Xmms/Client/on_disconnect-i.yaml +10 -0
  151. data/x2c/doc/Xmms/Client/playback_pause-i.yaml +12 -0
  152. data/x2c/doc/Xmms/Client/playback_seek_ms-i.yaml +12 -0
  153. data/x2c/doc/Xmms/Client/playback_seek_ms_rel-i.yaml +12 -0
  154. data/x2c/doc/Xmms/Client/playback_seek_samples-i.yaml +12 -0
  155. data/x2c/doc/Xmms/Client/playback_seek_samples_rel-i.yaml +12 -0
  156. data/x2c/doc/Xmms/Client/playback_start-i.yaml +12 -0
  157. data/x2c/doc/Xmms/Client/playback_stop-i.yaml +12 -0
  158. data/x2c/doc/Xmms/Client/playback_tickle-i.yaml +12 -0
  159. data/x2c/doc/Xmms/Client/playback_volume_get-i.yaml +12 -0
  160. data/x2c/doc/Xmms/Client/playback_volume_set-i.yaml +12 -0
  161. data/x2c/doc/Xmms/Client/playbacklist-i.yaml +10 -0
  162. data/x2c/doc/Xmms/Client/playlist-i.yaml +12 -0
  163. data/x2c/doc/Xmms/Client/playlist_list-i.yaml +12 -0
  164. data/x2c/doc/Xmms/Client/playlist_set_next-i.yaml +12 -0
  165. data/x2c/doc/Xmms/Client/playlist_set_next_rel-i.yaml +12 -0
  166. data/x2c/doc/Xmms/Client/plugin_list-i.yaml +12 -0
  167. data/x2c/doc/Xmms/Client/post_connect-i.yaml +10 -0
  168. data/x2c/doc/Xmms/Client/pre_connect-i.yaml +12 -0
  169. data/x2c/doc/Xmms/Client/quit-i.yaml +12 -0
  170. data/x2c/doc/Xmms/Client/setup-i.yaml +12 -0
  171. data/x2c/doc/Xmms/Client/showprompt-i.yaml +10 -0
  172. data/x2c/doc/Xmms/Client/shutdown-i.yaml +12 -0
  173. data/x2c/doc/Xmms/Client/welcome-i.yaml +10 -0
  174. data/x2c/doc/Xmms/Client/xform_media_browse-i.yaml +10 -0
  175. data/x2c/doc/Xmms/Collection/%26-i.yaml +12 -0
  176. data/x2c/doc/Xmms/Collection/%5b%5d%3d-i.yaml +12 -0
  177. data/x2c/doc/Xmms/Collection/%5b%5d-i.yaml +12 -0
  178. data/x2c/doc/Xmms/Collection/%7c-i.yaml +12 -0
  179. data/x2c/doc/Xmms/Collection/%7e-i.yaml +12 -0
  180. data/x2c/doc/Xmms/Collection/Attributes/add-i.yaml +12 -0
  181. data/x2c/doc/Xmms/Collection/Attributes/cdesc-Attributes.yaml +25 -0
  182. data/x2c/doc/Xmms/Collection/Attributes/field-i.yaml +12 -0
  183. data/x2c/doc/Xmms/Collection/Attributes/field_string-i.yaml +10 -0
  184. data/x2c/doc/Xmms/Collection/Attributes/format-i.yaml +10 -0
  185. data/x2c/doc/Xmms/Collection/Chains/cdesc-Chains.yaml +39 -0
  186. data/x2c/doc/Xmms/Collection/Chains/list-i.yaml +12 -0
  187. data/x2c/doc/Xmms/Collection/Chains/load-c.yaml +12 -0
  188. data/x2c/doc/Xmms/Collection/Chains/load_form_file-c.yaml +12 -0
  189. data/x2c/doc/Xmms/Collection/Chains/play-i.yaml +12 -0
  190. data/x2c/doc/Xmms/Collection/Chains/playlist-i.yaml +12 -0
  191. data/x2c/doc/Xmms/Collection/Chains/save-i.yaml +12 -0
  192. data/x2c/doc/Xmms/Collection/FormQuery/cdesc-FormQuery.yaml +22 -0
  193. data/x2c/doc/Xmms/Collection/FormQuery/method_missing-i.yaml +14 -0
  194. data/x2c/doc/Xmms/Collection/Info/cdesc-Info.yaml +32 -0
  195. data/x2c/doc/Xmms/Collection/Info/info-i.yaml +12 -0
  196. data/x2c/doc/Xmms/Collection/Info/inspect-i.yaml +10 -0
  197. data/x2c/doc/Xmms/Collection/Operands/cdesc-Operands.yaml +18 -0
  198. data/x2c/doc/Xmms/Collection/Operands/empty%3f-i.yaml +10 -0
  199. data/x2c/doc/Xmms/Collection/Query/%3c%3d-i.yaml +10 -0
  200. data/x2c/doc/Xmms/Collection/Query/%3e%3d-i.yaml +10 -0
  201. data/x2c/doc/Xmms/Collection/Query/%7e-i.yaml +10 -0
  202. data/x2c/doc/Xmms/Collection/Query/_-i.yaml +12 -0
  203. data/x2c/doc/Xmms/Collection/Query/cdesc-Query.yaml +32 -0
  204. data/x2c/doc/Xmms/Collection/Query/exist%3f-i.yaml +12 -0
  205. data/x2c/doc/Xmms/Collection/Query/format-i.yaml +10 -0
  206. data/x2c/doc/Xmms/Collection/Query/has-i.yaml +13 -0
  207. data/x2c/doc/Xmms/Collection/Query/new-c.yaml +10 -0
  208. data/x2c/doc/Xmms/Collection/Vote/acceptable-i.yaml +10 -0
  209. data/x2c/doc/Xmms/Collection/Vote/awesome-i.yaml +10 -0
  210. data/x2c/doc/Xmms/Collection/Vote/cdesc-Vote.yaml +32 -0
  211. data/x2c/doc/Xmms/Collection/Vote/good-i.yaml +10 -0
  212. data/x2c/doc/Xmms/Collection/Vote/nice-i.yaml +10 -0
  213. data/x2c/doc/Xmms/Collection/Vote/notsucking-i.yaml +10 -0
  214. data/x2c/doc/Xmms/Collection/Vote/unvoted-i.yaml +12 -0
  215. data/x2c/doc/Xmms/Collection/and-i.yaml +12 -0
  216. data/x2c/doc/Xmms/Collection/attribute-i.yaml +10 -0
  217. data/x2c/doc/Xmms/Collection/cdesc-Collection.yaml +140 -0
  218. data/x2c/doc/Xmms/Collection/complement-i.yaml +12 -0
  219. data/x2c/doc/Xmms/Collection/default-c.yaml +12 -0
  220. data/x2c/doc/Xmms/Collection/format-i.yaml +12 -0
  221. data/x2c/doc/Xmms/Collection/idlis-i.yaml +12 -0
  222. data/x2c/doc/Xmms/Collection/idlist%3d-i.yaml +12 -0
  223. data/x2c/doc/Xmms/Collection/intersect-i.yaml +12 -0
  224. data/x2c/doc/Xmms/Collection/load-c.yaml +10 -0
  225. data/x2c/doc/Xmms/Collection/new-c.yaml +10 -0
  226. data/x2c/doc/Xmms/Collection/new_constructor-c.yaml +12 -0
  227. data/x2c/doc/Xmms/Collection/new_list-c.yaml +12 -0
  228. data/x2c/doc/Xmms/Collection/new_pshuffle-c.yaml +12 -0
  229. data/x2c/doc/Xmms/Collection/new_selection-c.yaml +12 -0
  230. data/x2c/doc/Xmms/Collection/not-i.yaml +12 -0
  231. data/x2c/doc/Xmms/Collection/operand-i.yaml +10 -0
  232. data/x2c/doc/Xmms/Collection/or-i.yaml +12 -0
  233. data/x2c/doc/Xmms/Collection/parent-i.yaml +12 -0
  234. data/x2c/doc/Xmms/Collection/pshuffle-i.yaml +12 -0
  235. data/x2c/doc/Xmms/Collection/queue-i.yaml +12 -0
  236. data/x2c/doc/Xmms/Collection/tree_inject-i.yaml +12 -0
  237. data/x2c/doc/Xmms/Collection/tree_walk-i.yaml +12 -0
  238. data/x2c/doc/Xmms/Collection/typ-i.yaml +10 -0
  239. data/x2c/doc/Xmms/Collection/union-i.yaml +12 -0
  240. data/x2c/doc/Xmms/Collection/universe-c.yaml +12 -0
  241. data/x2c/doc/Xmms/Config/%5b%5d%3d-i.yaml +10 -0
  242. data/x2c/doc/Xmms/Config/%5b%5d-i.yaml +10 -0
  243. data/x2c/doc/Xmms/Config/cdesc-Config.yaml +47 -0
  244. data/x2c/doc/Xmms/Config/configs-i.yaml +10 -0
  245. data/x2c/doc/Xmms/Config/format-i.yaml +10 -0
  246. data/x2c/doc/Xmms/Config/join-i.yaml +10 -0
  247. data/x2c/doc/Xmms/Config/keys-i.yaml +10 -0
  248. data/x2c/doc/Xmms/Config/method_missing-i.yaml +10 -0
  249. data/x2c/doc/Xmms/Config/methods-i.yaml +10 -0
  250. data/x2c/doc/Xmms/Config/new-c.yaml +10 -0
  251. data/x2c/doc/Xmms/Config/parent-i.yaml +10 -0
  252. data/x2c/doc/Xmms/Config/respond_to%3f-i.yaml +10 -0
  253. data/x2c/doc/Xmms/Config/subs-i.yaml +10 -0
  254. data/x2c/doc/Xmms/Config/subtrees-i.yaml +10 -0
  255. data/x2c/doc/Xmms/Duration/cdesc-Duration.yaml +25 -0
  256. data/x2c/doc/Xmms/Duration/format-i.yaml +10 -0
  257. data/x2c/doc/Xmms/Duration/new-c.yaml +10 -0
  258. data/x2c/doc/Xmms/Duration/to_s-i.yaml +10 -0
  259. data/x2c/doc/Xmms/Format/cdesc-Format.yaml +22 -0
  260. data/x2c/doc/Xmms/Format/format-i.yaml +10 -0
  261. data/x2c/doc/Xmms/Format/inspect-i.yaml +10 -0
  262. data/x2c/doc/Xmms/Format/to_s-i.yaml +10 -0
  263. data/x2c/doc/Xmms/Info/cdesc-Info.yaml +32 -0
  264. data/x2c/doc/Xmms/Info/count-i.yaml +12 -0
  265. data/x2c/doc/Xmms/Info/format-i.yaml +12 -0
  266. data/x2c/doc/Xmms/Info/inspect-i.yaml +10 -0
  267. data/x2c/doc/Xmms/Info/method_missing-i.yaml +10 -0
  268. data/x2c/doc/Xmms/Info/new-c.yaml +10 -0
  269. data/x2c/doc/Xmms/Info/search-i.yaml +12 -0
  270. data/x2c/doc/Xmms/Info/to_s-i.yaml +10 -0
  271. data/x2c/doc/Xmms/Media/cdesc-Media.yaml +31 -0
  272. data/x2c/doc/Xmms/Media/format-i.yaml +10 -0
  273. data/x2c/doc/Xmms/Media/media-i.yaml +12 -0
  274. data/x2c/doc/Xmms/Media/mlib_add-i.yaml +12 -0
  275. data/x2c/doc/Xmms/Media/new-c.yaml +10 -0
  276. data/x2c/doc/Xmms/Media/parent-i.yaml +12 -0
  277. data/x2c/doc/Xmms/Options/%5b%5d%3d-c.yaml +10 -0
  278. data/x2c/doc/Xmms/Options/%5b%5d-c.yaml +10 -0
  279. data/x2c/doc/Xmms/Options/cdesc-Options.yaml +24 -0
  280. data/x2c/doc/Xmms/Options/get_argv-c.yaml +10 -0
  281. data/x2c/doc/Xmms/Options/help-c.yaml +10 -0
  282. data/x2c/doc/Xmms/Options/opts-c.yaml +10 -0
  283. data/x2c/doc/Xmms/Playlist/Chains/cdesc-Chains.yaml +18 -0
  284. data/x2c/doc/Xmms/Playlist/Chains/play-i.yaml +12 -0
  285. data/x2c/doc/Xmms/Playlist/Shortcut/add-i.yaml +12 -0
  286. data/x2c/doc/Xmms/Playlist/Shortcut/cdesc-Shortcut.yaml +24 -0
  287. data/x2c/doc/Xmms/Playlist/Shortcut/insert-i.yaml +12 -0
  288. data/x2c/doc/Xmms/Playlist/Shortcut/move-i.yaml +12 -0
  289. data/x2c/doc/Xmms/Playlist/Shortcut/remove_entries-i.yaml +12 -0
  290. data/x2c/doc/Xmms/Playlist/add_collection-i.yaml +12 -0
  291. data/x2c/doc/Xmms/Playlist/add_entry-i.yaml +12 -0
  292. data/x2c/doc/Xmms/Playlist/cdesc-Playlist.yaml +56 -0
  293. data/x2c/doc/Xmms/Playlist/clear-i.yaml +12 -0
  294. data/x2c/doc/Xmms/Playlist/collection-i.yaml +12 -0
  295. data/x2c/doc/Xmms/Playlist/current_pos-i.yaml +12 -0
  296. data/x2c/doc/Xmms/Playlist/entries-i.yaml +12 -0
  297. data/x2c/doc/Xmms/Playlist/format-i.yaml +10 -0
  298. data/x2c/doc/Xmms/Playlist/insert_entry-i.yaml +12 -0
  299. data/x2c/doc/Xmms/Playlist/load-i.yaml +12 -0
  300. data/x2c/doc/Xmms/Playlist/name-i.yaml +12 -0
  301. data/x2c/doc/Xmms/Playlist/new-c.yaml +12 -0
  302. data/x2c/doc/Xmms/Playlist/playlist_move_entry-i.yaml +12 -0
  303. data/x2c/doc/Xmms/Playlist/radd-i.yaml +12 -0
  304. data/x2c/doc/Xmms/Playlist/remove-i.yaml +12 -0
  305. data/x2c/doc/Xmms/Playlist/remove_entry-i.yaml +12 -0
  306. data/x2c/doc/Xmms/Playlist/shuffle-i.yaml +12 -0
  307. data/x2c/doc/Xmms/Playlist/sort-i.yaml +12 -0
  308. data/x2c/doc/Xmms/PropDict/Mlib/cdesc-Mlib.yaml +30 -0
  309. data/x2c/doc/Xmms/PropDict/Mlib/method_missing-i.yaml +10 -0
  310. data/x2c/doc/Xmms/PropDict/Mlib/methods-i.yaml +10 -0
  311. data/x2c/doc/Xmms/PropDict/Mlib/rehash-i.yaml +12 -0
  312. data/x2c/doc/Xmms/PropDict/Mlib/remove%21-i.yaml +12 -0
  313. data/x2c/doc/Xmms/PropDict/Mlib/respond_to%3f-i.yaml +10 -0
  314. data/x2c/doc/Xmms/PropDict/cdesc-PropDict.yaml +27 -0
  315. data/x2c/doc/Xmms/PropDict/format-i.yaml +10 -0
  316. data/x2c/doc/Xmms/PropDict/id-i.yaml +10 -0
  317. data/x2c/doc/Xmms/PropDict/inspect-i.yaml +10 -0
  318. data/x2c/doc/Xmms/PropDict/to_h-i.yaml +10 -0
  319. data/x2c/doc/Xmms/PropDict/to_s-i.yaml +10 -0
  320. data/x2c/doc/Xmms/Remember/cdesc-Remember.yaml +18 -0
  321. data/x2c/doc/Xmms/Result/cdesc-Result.yaml +20 -0
  322. data/x2c/doc/Xmms/Result/val-i.yaml +12 -0
  323. data/x2c/doc/Xmms/Song/cdesc-Song.yaml +29 -0
  324. data/x2c/doc/Xmms/Song/format-c.yaml +12 -0
  325. data/x2c/doc/Xmms/Song/format-i.yaml +10 -0
  326. data/x2c/doc/Xmms/Song/info-i.yaml +10 -0
  327. data/x2c/doc/Xmms/Song/new-c.yaml +10 -0
  328. data/x2c/doc/Xmms/Songlist/Chains/cdesc-Chains.yaml +29 -0
  329. data/x2c/doc/Xmms/Songlist/Chains/idlist-i.yaml +12 -0
  330. data/x2c/doc/Xmms/Songlist/Chains/queue-i.yaml +12 -0
  331. data/x2c/doc/Xmms/Songlist/cdesc-Songlist.yaml +37 -0
  332. data/x2c/doc/Xmms/Songlist/collection-i.yaml +10 -0
  333. data/x2c/doc/Xmms/Songlist/format-i.yaml +10 -0
  334. data/x2c/doc/Xmms/Songlist/format_hash-i.yaml +10 -0
  335. data/x2c/doc/Xmms/Songlist/info_hash-i.yaml +10 -0
  336. data/x2c/doc/Xmms/Songlist/new-c.yaml +10 -0
  337. data/x2c/doc/Xmms/Songlist/songs-i.yaml +12 -0
  338. data/x2c/doc/Xmms/Songlist/to_s-i.yaml +10 -0
  339. data/x2c/doc/Xmms/cdesc-Xmms.yaml +18 -0
  340. data/x2c/doc/Xmms/save_call-c.yaml +12 -0
  341. data/x2c/doc/created.rid +1 -0
  342. data/x2c/plug/async.rb +50 -0
  343. data/x2c/plug/chains.rb +148 -0
  344. data/x2c/plug/config.rb +90 -0
  345. data/x2c/plug/daemon.rb +72 -0
  346. data/x2c/plug/format.rb +251 -0
  347. data/x2c/plug/help.rb +240 -0
  348. data/x2c/plug/info.rb +86 -0
  349. data/x2c/plug/iplayback.rb +49 -0
  350. data/x2c/plug/listnames.rb +43 -0
  351. data/x2c/plug/mlib.rb +128 -0
  352. data/x2c/plug/query.rb +51 -0
  353. data/x2c/plug/remember.rb +124 -0
  354. data/x2c/plug/shortcuts.rb +108 -0
  355. data/x2c/plug/tutorial.rb +134 -0
  356. data/x2c/plug/vote.rb +77 -0
  357. data/x2c/x2c +36 -0
  358. data/x2c/x2c.rb +16 -0
  359. metadata +453 -0
@@ -0,0 +1,90 @@
1
+ # Copyright by Daniel Waeber, see the LICENSE file for details
2
+
3
+ module Xmms
4
+ # The Config Class is used as an interface to the configuration of the deamon
5
+ # use config.subtree to show value, or config.subfield = <val> to set it
6
+ # normal you start to browse the config by calling the config method on the client,
7
+ # afterwords you can just go into subtrees by typing there name and get back with
8
+ # the parent config
9
+ class Config
10
+ attr_reader :root
11
+ def initialize root=nil
12
+ @root=root
13
+ end
14
+ def configs
15
+ xmms.configval_list.reject do |k,v|
16
+ @root && !(k.to_s =~ /^#{@root}/)
17
+ end
18
+ end
19
+ def subs
20
+ configs.map{|k,v| k.to_s.sub(/^#{@root}\./,'')}
21
+ end
22
+ def keys
23
+ subs.reject{|s| s.include?('.')}
24
+ end
25
+ def subtrees
26
+ subs.map{|s| s.include?('.') && s.split('.').first}.compact.uniq
27
+ end
28
+ def join *keys
29
+ "#{@root ? @root+'.' : ''}#{keys.join('.')}"
30
+ end
31
+
32
+ def [] key
33
+ if keys.include?(key.to_s)
34
+ xmms.configval_get(join(key))
35
+ else
36
+ Xmms::Config.new(join(key))
37
+ end
38
+ end
39
+ def []= key, val
40
+ puts " #{join(key)}"
41
+ xmms.configval_set(join(key), val.to_s)
42
+ end
43
+ def parent
44
+ r=@root.split('.')[0..-2] if @root
45
+ Xmms::Config.new(r && !r.empty? && r.join('.'))
46
+ end
47
+
48
+ alias_method :__respond_to?, :respond_to?
49
+ alias_method :__methods, :methods
50
+ def respond_to? id
51
+ __respond_to?(id) || (subtrees+keys+keys.map{|k| "#{k}="}).include?(id.to_s)
52
+ end
53
+ def methods
54
+ __methods + subtrees + keys + keys.map{|k| "#{k}="}
55
+ end
56
+ def method_missing id,*args
57
+ if id.to_s[-1] == ?=
58
+ id = id.to_s[0..-2]
59
+ self[id] = args.first.to_s
60
+ else
61
+ self[id]
62
+ end
63
+ end
64
+
65
+ include Format rescue nil
66
+ include Prompting rescue nil
67
+ def format idt=' '
68
+ (subtrees.map{|s| s ? "#{s} ->" : "parent <-"} +
69
+ keys.map{|k| "#{k} = '#{self[k]}'"}.sort).format(idt)
70
+ end
71
+ end
72
+ class Client
73
+ # the config plugin just adds the config method.
74
+ # with the help of the remember plugin, you will get a nice interface to the config
75
+ module Config
76
+ # returns a config object. it will show its subtrees and key-value paris
77
+ # if you have the remember module, you can simply walk deeper into the tree:
78
+ # >> config
79
+ # >> output
80
+ # afterwrods you can set values. beacause key=value would set local variables, use something like this
81
+ # >> last.buffersize = 1337
82
+ # >> last['buffersize']= 1337
83
+ # >> config.output.buffersize = 1337
84
+ def config
85
+ Xmms::Config.new
86
+ end
87
+ end
88
+ include Config
89
+ end
90
+ end
@@ -0,0 +1,72 @@
1
+ # Copyright by Daniel Waeber, see the LICENSE file for details
2
+ module Xmms
3
+ class Client
4
+ module Daemon
5
+ Options['start-daemon' => [true, 'start the daemon, if x2c can\'t connect'],
6
+ 'auto-daemon' => [false, 'force to start daemon']]
7
+ attr_reader :log
8
+ # called berfore before starting daemon
9
+ def pre_daemon; end
10
+ # called after connected to stated daemon
11
+ def post_daemon(path); end
12
+ # called when deamon dies
13
+ def dead_daemon; end
14
+ # starts the daemon
15
+ def start_daemon
16
+ puts "... starting deamon"
17
+ @log = Array.new
18
+ path = 'unix:///tmp/xmms-ipc'
19
+ client = Thread.current
20
+ Xmms.save_call{pre_daemon}
21
+ daemon = Thread.new do
22
+ File.popen('echo & setsid xmms2d 2>&1 &','r') do |f|
23
+ begin
24
+ path = f.each_line do |l|
25
+ @log.push l.chomp!
26
+ break $1 if l =~ /IPC listening on '(.*)'/
27
+ end
28
+ ensure
29
+ client.wakeup
30
+ end
31
+ f.each_line do |l|
32
+ if @log.length > 40
33
+ @log.pop
34
+ end
35
+ @log.push l.chomp!
36
+ end
37
+ puts "\n... deamon stoped running"
38
+ daemon = false
39
+ Xmms.call_save{dead_daemon}
40
+ end
41
+ end
42
+ sleep
43
+ begin
44
+ handled_connect(path)
45
+ Xmms.save_call{post_daemon(path) if daemon}
46
+ puts "... connected #{path}"
47
+ rescue ClientError => e
48
+ puts "\n... #{path}: #{e}"
49
+ exit 1
50
+ end
51
+ end
52
+ def connect; end
53
+ end
54
+ include Daemon
55
+ def connect path=Options['xmms-path']
56
+ if Options['auto-daemon']
57
+ start_daemon
58
+ else
59
+ begin
60
+ handled_connect(path)
61
+ rescue ClientError => e
62
+ if Options['start-daemon']
63
+ start_daemon
64
+ else
65
+ puts "\n... #{path}: #{e}"
66
+ exit 1
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,251 @@
1
+ # Copyright by Daniel Waeber, see the LICENSE file for details
2
+
3
+ # Definitions for the formtion of common xmms classes
4
+ # It will try to show visaul nice resuals for the command line client
5
+ # The output will get improved if the client.rb module is loaded
6
+ # by giving the modules acces to a the xmms function
7
+ module Xmms
8
+ # The format module is used to show results in a cool way.
9
+ # you can overwright the format method to get a custom autoput
10
+ module Format
11
+ def to_s
12
+ ' '+format
13
+ end
14
+ def inspect
15
+ ' '+format
16
+ end
17
+ def format idt=' '
18
+ "<#{self.class}:#{self.object_id}>"
19
+ end
20
+ end
21
+ class ::Object
22
+ def format idt=' '
23
+ to_s
24
+ end
25
+ end
26
+ class ::String
27
+ def inspect; ' '+format end
28
+ def format idt=' '
29
+ self.gsub(/\n/,"\n"+idt)
30
+ end
31
+ end
32
+ class ::NilClass
33
+ def inspect; ' kk' end
34
+ end
35
+ class ::Array
36
+ include Format
37
+ def to_s; ' '+format end
38
+ def inspect; ' '+format end
39
+ def format idt=' '
40
+ self.map{|v| v.format(idt)}.join("\n"+idt)
41
+ end
42
+ end
43
+ class ::Hash
44
+ include Format
45
+ def to_s; ' '+format end
46
+ def inspect; ' '+format end
47
+ def format idt=' '
48
+ keys = Hash.new
49
+ max = self.keys.map do |k|
50
+ keys[k] = k.format(idt)
51
+ keys[k].length
52
+ end.max
53
+ self.to_a.map do |k,v|
54
+ keys[k] + ' ' * (max-keys[k].length) + " => " + v.format(idt+' '*(max))
55
+ end.format(idt)
56
+ end
57
+ end
58
+
59
+ class Result
60
+ alias_forward :to_s, :val
61
+ alias_forward :inspect, :val
62
+ alias_forward :format, :val
63
+ end
64
+ class Collection
65
+ class Query
66
+ include Format
67
+ def format idt=' '
68
+ idt=idt.sub(/ /,'!!')
69
+ "Medialib-Query-Constructor-Class based on \n"+
70
+ "#{idt+' '}#{@base.format(idt+' ')}\n"+
71
+ "#{idt}waiting for a specification of the field #{@field.format(idt)}"
72
+ end
73
+ end
74
+ class Attributes
75
+ include Format
76
+ def format idt=' '
77
+ self.map do |k,v|
78
+ "#{k}:#{v}"
79
+ end.join(' ')
80
+ end
81
+ def field_string
82
+ field.to_a.join(":")
83
+ end
84
+ end
85
+
86
+ include Format
87
+ # you don't want to change this, but you could
88
+ def format ident=' '
89
+ self.tree_inject(self.name || 'collection',0) do |a,d,c|
90
+ idt = ident+" "*(d+1)
91
+ a + "\n" + ident + " "*d + case c.type
92
+ when Collection::TYPE_IDLIST ; ": "+Songlist.new(idlist).to_s
93
+ when Collection::TYPE_REFERENCE ; c.operands.empty? ? "[ universe ]" : ">>"
94
+ when Collection::TYPE_COMPLEMENT ; "!"
95
+ when Collection::TYPE_INTERSECTION ; "&"
96
+ when Collection::TYPE_UNION ; "|"
97
+ when Collection::TYPE_EQUALS ; "= #{c.attributes.field_string}"
98
+ when Collection::TYPE_MATCH ; "~ #{c.attributes.field_string}"
99
+ when Collection::TYPE_GREATER ; "> #{c.attributes.field_string}"
100
+ when Collection::TYPE_SMALLER ; "< #{c.attributes.field_string}"
101
+ when Collection::TYPE_HAS ; "E #{c.attributes.field_string}"
102
+ when Collection::TYPE_QUEUE ; "] #{c.attributes.format}\n#{idt}"+Songlist.new(idlist).to_s
103
+ when Collection::TYPE_PARTYSHUFFLE ;
104
+ q = (c["upcomming"]||c["size"]||10).to_i
105
+ p = (c["position"].to_i||0).to_i
106
+ p = 0 if p=1
107
+ "% #{p}+#{q} " + Songlist.new(idlist).to_s
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ class Playlist
114
+ include Format
115
+ def format idt=' '
116
+ head = begin collection.format(idt)
117
+ rescue Client::DisconnectedError; "" end
118
+
119
+ now = begin; current_pos.val
120
+ rescue Result::ValueError; -1 end
121
+ pos = -1
122
+ h = entries.format_hash
123
+ head + "\n" + entries.map do |i|
124
+ idt[0..4] = (((pos+=1)==now ? '>%3i' : '%4i') % pos)
125
+ idt + h[i.to_i]
126
+ end.join("\n")
127
+ end
128
+ end
129
+ class PropDict
130
+ include Format
131
+ def inspect; ' '+format end
132
+ def to_s; ' '+format end
133
+ def format idt=nil
134
+ to_h.format
135
+ end
136
+ end
137
+ class Client
138
+ include Format
139
+ # overwrite this method in config.rb to cusotmize the status line
140
+ def format idt=' '
141
+ p = case playback_status.val
142
+ when PLAY ; '>>'
143
+ when PAUSE ; '||'
144
+ when STOP ; '[]'
145
+ else ; "<#{s.to_s}>"
146
+ end rescue "<error in clientstatus: #{$!}>"
147
+ id = begin
148
+ playback_current_id.val
149
+ rescue Result::ValueError
150
+ -1
151
+ end
152
+ t = playback_playtime/1000
153
+
154
+ r = "%i#{t>600 ? '':':'}%02i" % [t/60,t%60]
155
+ i = "%9i" % id
156
+ i[0..r.length-1] = r
157
+ "#{i} #{p}"
158
+ end
159
+ end
160
+
161
+ class Song
162
+ include Format
163
+ # overwrite this method in config.rb to cusotmize list output
164
+ def self.format info, max=nil
165
+ return self.class.name unless max
166
+ # get info and length info
167
+ id,dur,art,ttl,alb,tnr,rate = [:id,:duration,:artist,:title,:album,:tracknr,:rating].map{|f| info[f]}
168
+ aspace,lspace,skip = [:artist,:tilum, :album].map{|f| max[f]}
169
+ # format for title (album tr)
170
+ tnr = tnr ? "%3i" % tnr+')' : ') '
171
+ alb = alb ? '('+alb+tnr : ''
172
+ # scale it up, at least to fill 80 chars
173
+ lspace+= 7 unless skip == 0
174
+ if aspace + lspace < 55
175
+ aspace = [20,55-lspace].min if aspace < 20
176
+ lspace = 55 - aspace
177
+ end
178
+ lspace-= alb.length
179
+ # put it all in the string
180
+ "%5i %#{aspace}s - %-#{lspace}s%s%7s %s" % [id,art,ttl,alb,dur.format,rate]
181
+ end
182
+ def format idt=' '
183
+ Songlist.new(xmms.playlist.entries.val.map{|v| v.to_i} + [@id]).format_hash[@id].format(idt)
184
+ end
185
+ end
186
+ class Songlist
187
+ include Format
188
+ def to_s
189
+ state = nil
190
+ fst = -1
191
+ @ids.inject('') do |acc,snd|
192
+ acc += if(fst+1==snd)
193
+ state ? "" : (state="..")
194
+ else
195
+ (state ? (state=nil;fst.to_s) : '') + ':' + snd.to_s
196
+ end
197
+ fst = snd; acc
198
+ end + (state ? @ids.last.to_s : '')+": => #{@ids.length}"
199
+ end
200
+ def info_hash
201
+ info = xmms.coll_query_info(collection,
202
+ ['id','artist','title','album','duration','tracknr','date','genre',
203
+ 'mine','url','comment','rating','vote_count']).val
204
+ max = Hash.new(0)
205
+ ids = Hash.new
206
+ info.reverse!.map! do |h|
207
+ id = h[:id]
208
+ next nil if ids[id]
209
+ ids[id] = true
210
+ # guess some values, to extract all the info
211
+ url = File.basename(h[:url]).split('-',2).map{|s| s.gsub(/\+/,' ').gsub(/\.\w{3,5}/,'')}
212
+ h[:artist] ||= url.first
213
+ h[:title] ||= url.last
214
+ h[:rating] = "#{h[:rating]||'-'}/#{h[:vote_count]||0}"
215
+ h[:duration] = h[:duration] ? Duration.new(h[:duration]) : Duration.new(0)
216
+ h[:arlum] = h[:artist].to_s + h[:album].to_s
217
+ h[:tilum] = h[:title].to_s + h[:album].to_s
218
+ h.each_pair do |field,val|
219
+ val.replace(val.gsub(/\(.*\)/,'').gsub(/^ | $/,'')) if val.is_a?(String)
220
+ length = val ? val.to_s.length : 0
221
+ max[field] = length if length > max[field]
222
+ end
223
+ end.compact!
224
+ return info,max
225
+ end
226
+ def format_hash
227
+ info, max = info_hash
228
+ ret = Hash.new
229
+ info.each do |h|
230
+ ret[h[:id]] = Song.format h,max
231
+ end
232
+ ret
233
+ end
234
+ def format idt=nil
235
+ if idt
236
+ to_s
237
+ else
238
+ idt = ' '
239
+ h = format_hash
240
+ @ids.map{|i| h[i]}.join("\n#{idt}") + "\n#{idt}=> "+to_s
241
+ end
242
+ end
243
+ end
244
+ class Duration
245
+ include Format
246
+ def format idt=' '
247
+ d = @val/1000
248
+ "%i:%02i" % [d/60, d%60]
249
+ end
250
+ end
251
+ end
@@ -0,0 +1,240 @@
1
+ # This is based on the magic_help.rb file form tow.
2
+ # neither I found any Licnece nor contact to the writer,
3
+ # but hopefully I'm allowed to use it. all credit goes to him,
4
+ # whoever he is. The only thing I got is this website:
5
+ # http://taw.chaosforge.org/magic_help/
6
+
7
+ require 'irb'
8
+ require 'irb/extend-command'
9
+ require 'rdoc/ri/ri_driver'
10
+
11
+ module IRB::ExtendCommandBundle # :nodoc:
12
+ @ALIASES.delete_if{|a| a == [:help, :irb_help, NO_OVERRIDE]}
13
+ end
14
+
15
+ module Help
16
+ class Xmms::Client
17
+ # Help will show you autogenerated ri help on Functions and objects.
18
+ # It can be called with either a block, an Object or a String argument.
19
+ # Wenn called with an Object, it will show help on the objects Class.
20
+ # Strings arguments are simply look up inside the ri System.
21
+ # If you call it with a block, it will try to give you docomentation
22
+ # about what the block does. Here are some examples for that:
23
+ #
24
+ # >> help skip => help on Xmms::Result
25
+ # >> help 'skip' => help on Xmms::Client#skip
26
+ # >> help {skip} => help on Xmms::Client#skip
27
+ #
28
+ # >> help 'artist' => help on Xmms::PropDict#artist
29
+ # >> help {artist} => help on Xmms::Collection::method_missing
30
+ #
31
+ # >> help 'Chains' => no help
32
+ # >> help Chains => help on Xmms::Client::Chains
33
+ # >> help {Chains} => help on Xmms::Client::Chains
34
+ #
35
+ # >> help Collection::Chains => help on Xmms::Collection::Chains
36
+ # >> help 'Collection::Chains' => no help
37
+ # >> help {Collection::Chains} => help on Xmms::Collection::Chains
38
+ #
39
+ # So, most often you want to use {}, because it the help on what would be done.
40
+ def help *args, &block
41
+ Help.help *args, &block
42
+ end
43
+ end
44
+
45
+
46
+
47
+ argv = ::ARGV.dup
48
+ ::ARGV.clear
49
+ begin
50
+ ENV['RI'] = "--format plain --no-pager
51
+ --doc-dir #{File.join(Xmms::X2C_ROOT,'doc')} --system --gems --site"
52
+ @@ri = RiDriver.new
53
+ rescue
54
+ puts $!
55
+ ENV['RI'] = "--format plain --no-pager --system --gems --site"
56
+ @@ri = RiDriver.new
57
+ end
58
+ ::ARGV<< argv
59
+ ::ARGV.flatten!
60
+
61
+ def self.irb_help topic
62
+ begin
63
+ @@ri.get_info_for topic
64
+ rescue RiError => e
65
+ puts "!! #{e}"
66
+ puts "!! either you help query is not accessable"
67
+ puts "!! or perhaps you have to generate the doc in you install dir"
68
+ puts "!!"
69
+ end
70
+ topic
71
+ end
72
+ def self.help_hacks(m, res=nil)
73
+ if res and m == "Kernel#method_missing"
74
+ m = res unless res =~ /\A(?:.*)(?:\#|::|\.)method_missing\Z/
75
+ elsif res and (m =~ /\A(.*)\#new\Z/ or m =~ /\A(.*)::new\Z/)
76
+ cls = $1
77
+ if res =~ /\A(.*)(::|\.)new\Z/
78
+ cls_requested, k = $1, $2
79
+ m = "#{cls_requested}::new" unless cls == cls_requested
80
+ end
81
+ end
82
+ if m =~ /\AKernel(\#|::|\.)([^\#\:\.]+)\Z/
83
+ k, mn = $1, $2
84
+ exceptions = ["singleton_method_added", "remove_instance_variable", "singleton_method_removed", "singleton_method_undefined"]
85
+ correctly_located_docs = Kernel.private_instance_methods - exceptions
86
+ unless correctly_located_docs.include?(mn)
87
+ m = "Object#{k}#{mn}"
88
+ end
89
+ end
90
+
91
+ m
92
+ end
93
+
94
+
95
+ @@ignore ||= Hash.new
96
+ def self.ignore klass, hash
97
+ @@ignore[klass] = (@@ignore[klass] || Hash.new).merge hash
98
+ end
99
+
100
+ def Help.match? chain, klass, func
101
+ return nil unless chain
102
+ return chain[klass][func] if(chain[klass] and chain[klass][func])
103
+ klass.included_modules.find do |k|
104
+ if(chain[k] and chain[k][func])
105
+ break chain[k][func]
106
+ end
107
+ end or
108
+ klass.class == Module && chain.keys.find do |k|
109
+ if(k.include?(klass) and chain[k][func])
110
+ break chain[k][func]
111
+ end
112
+ end
113
+ end
114
+ def Help.trace_help
115
+ skipstack = []
116
+ chainstack = []
117
+ argument_error = nil
118
+ catch(:magic_help_topic) do
119
+ set_trace_func proc{ |event, file, line, id, binding, klass|
120
+ id = id.to_sym
121
+ case event
122
+ when /return/
123
+ # wait till we get out of error handling and return topic of error-throwing function
124
+ if argument_error && !skipstack.last
125
+ argument_error = nil
126
+ throw(:magic_help_topic,[klass,id])
127
+ end
128
+ while skipstack.last == [klass,id]
129
+ skipstack.pop
130
+ end
131
+ while chainstack.last and chainstack.last[0,1] == [klass,id]
132
+ chainstack.pop
133
+ end
134
+ when /call/
135
+ match = Help.match?(chainstack.last && chainstack.last.last, klass, id) ||
136
+ Help.match?(@@ignore, klass, id)
137
+ if match
138
+ case match
139
+ when :skip
140
+ when :over
141
+ skipstack.push [klass,id]
142
+ when Hash
143
+ chainstack.push [klass,id,{klass => match}]
144
+ end
145
+ elsif [klass,id] == [Kernel,:send]
146
+ elsif [klass,id] == [Kernel,:set_trace_func]
147
+ elsif [klass,id] == [Class,:new]
148
+ # skip argument errors
149
+ if eval("self", binding) == ArgumentError
150
+ argument_error = true
151
+ skipstack.push [klass,id]
152
+ end
153
+ elsif skipstack.last
154
+ else
155
+ throw(:magic_help_topic,[klass,id])
156
+ end
157
+ end
158
+ }
159
+ begin
160
+ yield
161
+ ensure
162
+ set_trace_func nil
163
+ end
164
+ end
165
+ end
166
+
167
+ def self.help(*args,&block)
168
+ raise ArgumentError, "wrong number of arguments (#{args.size} for 1)" if args.size > 1
169
+ raise ArgumentError, "help cannot take both arguments and block" if args.size > 0 and block_given?
170
+
171
+ if block
172
+ res_mm = trace_help(&block)
173
+ query = if res_mm.is_a?(Array) and
174
+ res_mm.length == 2 and
175
+ res_mm.first.is_a?(Module) and
176
+ res_mm.last.is_a?(Symbol)
177
+ klass, meth = *res_mm
178
+ if(klass.to_s == 'NameError::message')
179
+ query='this function'
180
+ else
181
+ help_hacks("#{klass}##{meth}")
182
+ end
183
+ else
184
+ if res_mm.is_a?(Module)
185
+ res_mm.to_s
186
+ else
187
+ res_mm.class.to_s
188
+ end
189
+ end
190
+ return irb_help(query)
191
+ elsif !args.empty?
192
+ res = args[0]
193
+ else
194
+ res = "Xmms::Client#help"
195
+ end
196
+
197
+ query = case res
198
+ when Module
199
+ res.to_s
200
+ when UnboundMethod, Method
201
+ help_method_extract(res)
202
+ when /\A(.*)(#|::|\.)(.*)\Z/
203
+ cp, k, m = $1, $2, $3
204
+ begin
205
+ c = cp.split(/::/).inject(Object){|c, path_elem| c.const_get(path_elem) }
206
+ case k
207
+ when "#"
208
+ m = c.instance_method(m)
209
+ m = help_method_extract(m)
210
+ when "::"
211
+ m = c.method(m)
212
+ m = help_method_extract(m)
213
+ m = m.sub(/\#/, "::") if c == Class && m == "Class#new"
214
+ when "."
215
+ begin
216
+ m = c.instance_method(m)
217
+ rescue NameError
218
+ m = c.method(m)
219
+ end
220
+ m = help_method_extract(m)
221
+ end
222
+ help_hacks(m, res)
223
+ rescue NameError
224
+ res
225
+ end
226
+ when String
227
+ res
228
+ else
229
+ res.class.to_s
230
+ end
231
+ irb_help query
232
+ end
233
+
234
+ def self.help_method_extract(m) # :nodoc:
235
+ unless m.inspect =~ %r[\A#<(?:Unbound)?Method: (.*?)>\Z]
236
+ raise "Cannot parse result of #{m.class}#inspect: #{m.inspect}"
237
+ end
238
+ $1.sub(/\A.*?\((.*?)\)(.*)\Z/){ "#{$1}#{$2}" }.sub(/\./, "::").sub(/#<Class:(.*?)>#/) { "#{$1}::" }
239
+ end
240
+ end