From 6c1efec2a542f59b7f37826f733bee03a40709e9 Mon Sep 17 00:00:00 2001 From: Anthony Perkins Date: Thu, 20 Jun 2019 21:41:02 +0100 Subject: [PATCH] Slim down vim config --- pack/acp/start/jellybeans.vim/.gitignore | 3 - pack/acp/start/jellybeans.vim/README.markdown | 109 - .../start/jellybeans.vim/ansi-term-colors.txt | 8 - .../jellybeans.vim/colors/jellybeans.vim | 668 ---- pack/acp/start/minimalist/LICENSE | 21 - pack/acp/start/minimalist/README.md | 85 - .../autoload/airline/themes/minimalist.vim | 46 - .../start/minimalist/colors/minimalist.vim | 227 -- pack/acp/start/rust.vim/.gitignore | 1 - pack/acp/start/rust.vim/.travis.yml | 7 - pack/acp/start/rust.vim/.vintrc.yml | 10 - pack/acp/start/rust.vim/ISSUE_TEMPLATE.md | 27 - pack/acp/start/rust.vim/LICENSE-APACHE | 201 -- pack/acp/start/rust.vim/LICENSE-MIT | 25 - pack/acp/start/rust.vim/README.md | 107 - pack/acp/start/rust.vim/after/syntax/rust.vim | 41 - pack/acp/start/rust.vim/autoload/cargo.vim | 115 - .../rust.vim/autoload/cargo/quickfix.vim | 26 - pack/acp/start/rust.vim/autoload/rust.vim | 546 --- .../rust.vim/autoload/rust/debugging.vim | 101 - .../rust.vim/autoload/rust/delimitmate.vim | 44 - pack/acp/start/rust.vim/autoload/rustfmt.vim | 257 -- pack/acp/start/rust.vim/compiler/cargo.vim | 49 - pack/acp/start/rust.vim/compiler/rustc.vim | 53 - pack/acp/start/rust.vim/ctags/rust.ctags | 11 - pack/acp/start/rust.vim/doc/rust.txt | 463 --- pack/acp/start/rust.vim/ftdetect/rust.vim | 12 - pack/acp/start/rust.vim/ftplugin/rust.vim | 201 -- .../start/rust.vim/ftplugin/rust/tagbar.vim | 40 - pack/acp/start/rust.vim/indent/rust.vim | 219 -- pack/acp/start/rust.vim/plugin/cargo.vim | 26 - pack/acp/start/rust.vim/plugin/rust.vim | 28 - pack/acp/start/rust.vim/syntax/rust.vim | 351 -- .../rust.vim/syntax_checkers/rust/cargo.vim | 93 - .../rust.vim/syntax_checkers/rust/rustc.vim | 54 - pack/acp/start/rust.vim/test/.gitignore | 0 pack/acp/start/rust.vim/test/Dockerfile | 34 - pack/acp/start/rust.vim/test/coverage.vader | 24 - pack/acp/start/rust.vim/test/run-tests | 105 - pack/acp/start/rust.vim/test/sample.rs | 0 pack/acp/start/rust.vim/test/vimrc | 30 - pack/acp/start/vim-orgmode/.gitignore | 6 - pack/acp/start/vim-orgmode/.pylintrc | 238 -- pack/acp/start/vim-orgmode/.travis.yml | 21 - pack/acp/start/vim-orgmode/CHANGELOG.org | 214 -- pack/acp/start/vim-orgmode/LICENSE | 60 - pack/acp/start/vim-orgmode/Makefile | 91 - pack/acp/start/vim-orgmode/README.org | 43 - pack/acp/start/vim-orgmode/build_vmb.vim | 4 - pack/acp/start/vim-orgmode/debian/changelog | 869 ----- pack/acp/start/vim-orgmode/debian/compat | 1 - pack/acp/start/vim-orgmode/debian/control | 14 - pack/acp/start/vim-orgmode/debian/copyright | 28 - pack/acp/start/vim-orgmode/debian/dirs | 1 - pack/acp/start/vim-orgmode/debian/docs | 2 - pack/acp/start/vim-orgmode/debian/examples | 1 - pack/acp/start/vim-orgmode/debian/rules | 11 - pack/acp/start/vim-orgmode/doc/orgguide.txt | 1553 --------- .../start/vim-orgmode/documentation/Makefile | 9 - .../vim-orgmode/documentation/diagram.txt | 75 - .../documentation/emacs_orgguide.org | 3087 ----------------- .../documentation/emacs_orgguide.texi | 2689 -------------- .../acp/start/vim-orgmode/examples/mylife.gif | Bin 101565 -> 0 bytes .../acp/start/vim-orgmode/examples/mylife.org | 26 - .../acp/start/vim-orgmode/examples/mylife.png | Bin 67333 -> 0 bytes .../examples/plugins/PluginExample.py | 53 - pack/acp/start/vim-orgmode/ftdetect/org.vim | 2 - pack/acp/start/vim-orgmode/ftplugin/org.cnf | 5 - pack/acp/start/vim-orgmode/ftplugin/org.vim | 169 - .../vim-orgmode/ftplugin/orgmode/__init__.py | 1 - .../vim-orgmode/ftplugin/orgmode/_vim.py | 411 --- .../ftplugin/orgmode/docs/Makefile | 230 -- .../vim-orgmode/ftplugin/orgmode/docs/conf.py | 387 --- .../ftplugin/orgmode/docs/index.rst | 22 - .../ftplugin/orgmode/docs/make.bat | 281 -- .../orgmode/docs/orgmode.liborgmode.rst | 78 - .../ftplugin/orgmode/docs/orgmode.plugins.rst | 110 - .../orgmode/docs/orgmode.py3compat.rst | 46 - .../ftplugin/orgmode/docs/orgmode.rst | 71 - .../ftplugin/orgmode/exceptions.py | 23 - .../ftplugin/orgmode/keybinding.py | 217 -- .../ftplugin/orgmode/liborgmode/__init__.py | 1 - .../ftplugin/orgmode/liborgmode/agenda.py | 63 - .../orgmode/liborgmode/agendafilter.py | 93 - .../ftplugin/orgmode/liborgmode/base.py | 190 - .../ftplugin/orgmode/liborgmode/checkboxes.py | 406 --- .../ftplugin/orgmode/liborgmode/documents.py | 315 -- .../ftplugin/orgmode/liborgmode/dom_obj.py | 505 --- .../ftplugin/orgmode/liborgmode/headings.py | 889 ----- .../ftplugin/orgmode/liborgmode/orgdate.py | 296 -- .../vim-orgmode/ftplugin/orgmode/menu.py | 173 - .../ftplugin/orgmode/plugins/Agenda.py | 314 -- .../ftplugin/orgmode/plugins/Date.py | 318 -- .../ftplugin/orgmode/plugins/EditCheckbox.py | 330 -- .../ftplugin/orgmode/plugins/EditStructure.py | 430 --- .../ftplugin/orgmode/plugins/Export.py | 183 - .../ftplugin/orgmode/plugins/Hyperlinks.py | 221 -- .../ftplugin/orgmode/plugins/LoggingWork.py | 42 - .../ftplugin/orgmode/plugins/Misc.py | 173 - .../ftplugin/orgmode/plugins/Navigator.py | 326 -- .../ftplugin/orgmode/plugins/ShowHide.py | 181 - .../orgmode/plugins/TagsProperties.py | 215 -- .../ftplugin/orgmode/plugins/Todo.py | 345 -- .../ftplugin/orgmode/plugins/__init__.py | 1 - .../ftplugin/orgmode/py3compat/__init__.py | 1 - .../orgmode/py3compat/encode_compatibility.py | 11 - .../orgmode/py3compat/py_py3_string.py | 7 - .../py3compat/unicode_compatibility.py | 4 - .../orgmode/py3compat/xrange_compatibility.py | 4 - .../vim-orgmode/ftplugin/orgmode/settings.py | 98 - .../vim-orgmode/ftplugin/orgmode/vimbuffer.py | 503 --- pack/acp/start/vim-orgmode/indent/org.vim | 133 - pack/acp/start/vim-orgmode/install_vba.vim | 3 - pack/acp/start/vim-orgmode/install_vmb.vim | 3 - pack/acp/start/vim-orgmode/org | 54 - pack/acp/start/vim-orgmode/syntax/org.vim | 383 -- .../start/vim-orgmode/syntax/orgagenda.vim | 79 - pack/acp/start/vim-orgmode/syntax/orgtodo.vim | 47 - .../vim-orgmode/tests/orgmode_testfile.org | 37 - pack/acp/start/vim-orgmode/tests/run_tests.py | 59 - .../vim-orgmode/tests/test_libagendafilter.py | 171 - .../start/vim-orgmode/tests/test_libbase.py | 34 - .../vim-orgmode/tests/test_libcheckbox.py | 132 - .../vim-orgmode/tests/test_libheading.py | 156 - .../vim-orgmode/tests/test_liborgdate.py | 53 - .../tests/test_liborgdate_parsing.py | 248 -- .../vim-orgmode/tests/test_liborgdate_utf8.py | 52 - .../vim-orgmode/tests/test_liborgdatetime.py | 50 - .../vim-orgmode/tests/test_liborgtimerange.py | 86 - .../vim-orgmode/tests/test_plugin_date.py | 174 - .../tests/test_plugin_edit_checkbox.py | 241 -- .../tests/test_plugin_edit_structure.py | 387 --- .../vim-orgmode/tests/test_plugin_mappings.py | 68 - .../vim-orgmode/tests/test_plugin_misc.py | 164 - .../tests/test_plugin_navigator.py | 633 ---- .../tests/test_plugin_show_hide.py | 385 -- .../tests/test_plugin_tags_properties.py | 177 - .../vim-orgmode/tests/test_plugin_todo.py | 424 --- .../start/vim-orgmode/tests/test_vimbuffer.py | 1257 ------- pack/acp/start/vim-orgmode/tests/vim.py | 88 - pack/acp/start/vimoutliner/.gitignore | 16 - pack/acp/start/vimoutliner/CHANGELOG | 1556 --------- pack/acp/start/vimoutliner/INSTALL | 137 - pack/acp/start/vimoutliner/LICENSE | 11 - pack/acp/start/vimoutliner/README | 81 - pack/acp/start/vimoutliner/README.detailed | 1 - pack/acp/start/vimoutliner/TODO.otl | 27 - .../start/vimoutliner/colors/votl_dark.vim | 81 - .../start/vimoutliner/colors/votl_light.vim | 81 - .../start/vimoutliner/colors/votl_test.vim | 81 - pack/acp/start/vimoutliner/doc/votl.txt | 1331 ------- .../start/vimoutliner/doc/votl_cheatsheet.txt | 85 - pack/acp/start/vimoutliner/ftdetect/votl.vim | 26 - pack/acp/start/vimoutliner/ftplugin/votl.vim | 679 ---- pack/acp/start/vimoutliner/install.sh | 173 - pack/acp/start/vimoutliner/syntax/votl.vim | 248 -- .../vimoutliner/images/Vimoutliner_logo.png | Bin 19060 -> 0 bytes .../images/Vimoutliner_logo_tiny.png | Bin 7036 -> 0 bytes .../vimoutliner/images/favicon.ico | Bin 318 -> 0 bytes .../vimoutliner/plugin/prev/votl_hoist.otl | 77 - .../vimoutliner/plugin/prev/votl_hoist.vim | 251 -- .../vimoutliner/plugin/votl_checkbox.otl | 310 -- .../vimoutliner/plugin/votl_checkbox.vim | 475 --- .../vimoutliner/plugin/votl_clock.vim | 139 - .../vimoutliner/plugin/votl_format.vim | 157 - .../vimoutliner/plugin/votl_gtd.vim | 219 -- .../vimoutliner/plugin/votl_math.otl | 56 - .../vimoutliner/plugin/votl_math.vim | 286 -- .../vimoutliner/plugin/votl_newhoist.vim | 456 --- .../vimoutliner/plugin/votl_smart_paste.vim | 117 - .../vimoutliner/plugin/votl_tags.vim | 246 -- .../vimoutliner/scripts/MediaWiki2otl | 17 - .../vimoutliner/scripts/MediaWiki2otl.desc | 37 - .../vimoutliner/scripts/Node/COPYING | 118 - .../vimoutliner/scripts/Node/COPYING.GPL | 340 -- .../scripts/Node/COPYING.LPDTL.1.0 | 118 - .../vimoutliner/scripts/Node/INSTALL | 23 - .../scripts/Node/LPDTL_discuss.txt | 26 - .../vimoutliner/scripts/Node/Node.pm | 475 --- .../vimoutliner/scripts/Node/README.otl | 177 - .../vimoutliner/scripts/Node/deletetest.otl | 18 - .../scripts/Node/example_attribs.pl | 162 - .../scripts/Node/example_bylevel.pl | 227 -- .../scripts/Node/example_delete.pl | 107 - .../vimoutliner/scripts/Node/example_hello.pl | 15 - .../scripts/Node/example_insert.pl | 550 --- .../scripts/Node/example_nodepath.pl | 135 - .../scripts/Node/example_otl2markup.pl | 123 - .../vimoutliner/scripts/Node/example_parse.pl | 114 - .../vimoutliner/scripts/Node/myapp.cfg | 4 - .../vimoutliner/vimoutliner/scripts/fs2otl | 7 - .../vimoutliner/scripts/otl2aft.awk | 284 -- .../vimoutliner/scripts/otl2aft.pdf | Bin 82163 -> 0 bytes .../vimoutliner/scripts/otl2docbook.pl | 270 -- .../vimoutliner/scripts/otl2html.py | 1111 ------ .../scripts/otl2html_autonumbered.css | 269 -- .../vimoutliner/scripts/otl2html_nnnnnn.css | 246 -- .../vimoutliner/scripts/otl2latex/.vimrc | 44 - .../vimoutliner/scripts/otl2latex/README | 23 - .../scripts/otl2latex/otl2latex.otl | 95 - .../scripts/otl2latex/otl2latex.pdf | Bin 102839 -> 0 bytes .../scripts/otl2latex/otl2latex.png | Bin 42112 -> 0 bytes .../scripts/otl2latex/otl2latex.py | 315 -- .../scripts/otl2latex/otl2latex.tex | 223 -- .../scripts/otl2latex/otl2latex.toc | 9 - .../vimoutliner/scripts/otl2lyx.awk | 149 - .../vimoutliner/scripts/otl2ooimpress.py | 263 -- .../vimoutliner/scripts/otl2ooimpress.sh | 34 - .../vimoutliner/scripts/otl2table.py | 199 -- .../vimoutliner/scripts/otl2tags.py | 713 ---- .../scripts/otl2tags_freemind.conf | 96 - .../scripts/otl2tags_graphviz.conf | 104 - .../scripts/otl_handler/Apache/OTL.pm | 324 -- .../vimoutliner/scripts/otl_handler/README | 155 - .../scripts/otl_handler/devel-mode | 5 - .../scripts/otl_handler/javascript/jquery.js | 12 - .../scripts/otl_handler/javascript/theme2.js | 38 - .../scripts/otl_handler/javascript/theme3.js | 22 - .../scripts/otl_handler/sample.otl | 39 - .../scripts/otl_handler/styles/theme1.css | 88 - .../scripts/otl_handler/styles/theme2.css | 152 - .../scripts/otl_handler/styles/theme3.css | 109 - .../vimoutliner/scripts/otlgrep.py | 212 -- .../vimoutliner/scripts/otlhead.sh | 12 - .../vimoutliner/scripts/otlsplit.py | 191 - .../vimoutliner/scripts/otltail.sh | 15 - .../scripts/outline_calendar/2005.otl | 1472 -------- .../scripts/outline_calendar/vimrc | 31 - .../outline_calendar/vo_calendar_ctags.conf | 9 - .../outline_calendar/vo_calendar_generator.rb | 110 - .../outline_calendar/vo_calendar_readme.otl | 195 -- .../outline_calendar/vo_calendar_shelf.otl | 6 - .../outline_calendar/vo_calendar_ui.sh | 39 - .../scripts/outline_freemind/freemind.py | 198 -- .../outline_freemind/freemind_outline.py | 48 - .../scripts/outline_freemind/otl.py | 26 - .../outline_freemind/outline_freemind.py | 114 - .../scripts/outline_freemind/test.otl | 27 - .../scripts/outline_freemind/test.sh | 10 - .../vimoutliner/scripts/vo2html.rb | 329 -- .../vimoutliner/vimoutliner/scripts/vo2odp.rb | 415 --- .../vimoutliner/vimoutliner/scripts/vo2xo.rb | 239 -- .../vimoutliner/scripts/votl_maketags.1 | 50 - .../vimoutliner/scripts/votl_maketags.pl | 338 -- pack/acp/start/vimoutliner/vimoutlinerrc | 67 - plugins.md | 5 - 246 files changed, 47778 deletions(-) delete mode 100644 pack/acp/start/jellybeans.vim/.gitignore delete mode 100644 pack/acp/start/jellybeans.vim/README.markdown delete mode 100644 pack/acp/start/jellybeans.vim/ansi-term-colors.txt delete mode 100644 pack/acp/start/jellybeans.vim/colors/jellybeans.vim delete mode 100644 pack/acp/start/minimalist/LICENSE delete mode 100644 pack/acp/start/minimalist/README.md delete mode 100644 pack/acp/start/minimalist/autoload/airline/themes/minimalist.vim delete mode 100644 pack/acp/start/minimalist/colors/minimalist.vim delete mode 100644 pack/acp/start/rust.vim/.gitignore delete mode 100644 pack/acp/start/rust.vim/.travis.yml delete mode 100644 pack/acp/start/rust.vim/.vintrc.yml delete mode 100644 pack/acp/start/rust.vim/ISSUE_TEMPLATE.md delete mode 100644 pack/acp/start/rust.vim/LICENSE-APACHE delete mode 100644 pack/acp/start/rust.vim/LICENSE-MIT delete mode 100644 pack/acp/start/rust.vim/README.md delete mode 100644 pack/acp/start/rust.vim/after/syntax/rust.vim delete mode 100644 pack/acp/start/rust.vim/autoload/cargo.vim delete mode 100644 pack/acp/start/rust.vim/autoload/cargo/quickfix.vim delete mode 100644 pack/acp/start/rust.vim/autoload/rust.vim delete mode 100644 pack/acp/start/rust.vim/autoload/rust/debugging.vim delete mode 100644 pack/acp/start/rust.vim/autoload/rust/delimitmate.vim delete mode 100644 pack/acp/start/rust.vim/autoload/rustfmt.vim delete mode 100644 pack/acp/start/rust.vim/compiler/cargo.vim delete mode 100644 pack/acp/start/rust.vim/compiler/rustc.vim delete mode 100644 pack/acp/start/rust.vim/ctags/rust.ctags delete mode 100644 pack/acp/start/rust.vim/doc/rust.txt delete mode 100644 pack/acp/start/rust.vim/ftdetect/rust.vim delete mode 100644 pack/acp/start/rust.vim/ftplugin/rust.vim delete mode 100644 pack/acp/start/rust.vim/ftplugin/rust/tagbar.vim delete mode 100644 pack/acp/start/rust.vim/indent/rust.vim delete mode 100644 pack/acp/start/rust.vim/plugin/cargo.vim delete mode 100644 pack/acp/start/rust.vim/plugin/rust.vim delete mode 100644 pack/acp/start/rust.vim/syntax/rust.vim delete mode 100644 pack/acp/start/rust.vim/syntax_checkers/rust/cargo.vim delete mode 100644 pack/acp/start/rust.vim/syntax_checkers/rust/rustc.vim delete mode 100644 pack/acp/start/rust.vim/test/.gitignore delete mode 100644 pack/acp/start/rust.vim/test/Dockerfile delete mode 100644 pack/acp/start/rust.vim/test/coverage.vader delete mode 100644 pack/acp/start/rust.vim/test/run-tests delete mode 100644 pack/acp/start/rust.vim/test/sample.rs delete mode 100644 pack/acp/start/rust.vim/test/vimrc delete mode 100644 pack/acp/start/vim-orgmode/.gitignore delete mode 100644 pack/acp/start/vim-orgmode/.pylintrc delete mode 100644 pack/acp/start/vim-orgmode/.travis.yml delete mode 100644 pack/acp/start/vim-orgmode/CHANGELOG.org delete mode 100644 pack/acp/start/vim-orgmode/LICENSE delete mode 100644 pack/acp/start/vim-orgmode/Makefile delete mode 100644 pack/acp/start/vim-orgmode/README.org delete mode 100644 pack/acp/start/vim-orgmode/build_vmb.vim delete mode 100644 pack/acp/start/vim-orgmode/debian/changelog delete mode 100644 pack/acp/start/vim-orgmode/debian/compat delete mode 100644 pack/acp/start/vim-orgmode/debian/control delete mode 100644 pack/acp/start/vim-orgmode/debian/copyright delete mode 100644 pack/acp/start/vim-orgmode/debian/dirs delete mode 100644 pack/acp/start/vim-orgmode/debian/docs delete mode 100644 pack/acp/start/vim-orgmode/debian/examples delete mode 100755 pack/acp/start/vim-orgmode/debian/rules delete mode 100644 pack/acp/start/vim-orgmode/doc/orgguide.txt delete mode 100644 pack/acp/start/vim-orgmode/documentation/Makefile delete mode 100644 pack/acp/start/vim-orgmode/documentation/diagram.txt delete mode 100644 pack/acp/start/vim-orgmode/documentation/emacs_orgguide.org delete mode 100644 pack/acp/start/vim-orgmode/documentation/emacs_orgguide.texi delete mode 100644 pack/acp/start/vim-orgmode/examples/mylife.gif delete mode 100644 pack/acp/start/vim-orgmode/examples/mylife.org delete mode 100644 pack/acp/start/vim-orgmode/examples/mylife.png delete mode 100644 pack/acp/start/vim-orgmode/examples/plugins/PluginExample.py delete mode 100644 pack/acp/start/vim-orgmode/ftdetect/org.vim delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/org.cnf delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/org.vim delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/__init__.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/_vim.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/Makefile delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/conf.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/index.rst delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/make.bat delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.liborgmode.rst delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.plugins.rst delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.py3compat.rst delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.rst delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/exceptions.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/keybinding.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/__init__.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/agenda.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/agendafilter.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/base.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/checkboxes.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/documents.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/dom_obj.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/headings.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/orgdate.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/menu.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Agenda.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Date.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/EditCheckbox.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/EditStructure.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Export.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Hyperlinks.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/LoggingWork.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Misc.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Navigator.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/ShowHide.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/TagsProperties.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Todo.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/__init__.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/__init__.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/encode_compatibility.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/py_py3_string.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/unicode_compatibility.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/xrange_compatibility.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/settings.py delete mode 100644 pack/acp/start/vim-orgmode/ftplugin/orgmode/vimbuffer.py delete mode 100644 pack/acp/start/vim-orgmode/indent/org.vim delete mode 100644 pack/acp/start/vim-orgmode/install_vba.vim delete mode 100644 pack/acp/start/vim-orgmode/install_vmb.vim delete mode 100755 pack/acp/start/vim-orgmode/org delete mode 100644 pack/acp/start/vim-orgmode/syntax/org.vim delete mode 100644 pack/acp/start/vim-orgmode/syntax/orgagenda.vim delete mode 100644 pack/acp/start/vim-orgmode/syntax/orgtodo.vim delete mode 100644 pack/acp/start/vim-orgmode/tests/orgmode_testfile.org delete mode 100755 pack/acp/start/vim-orgmode/tests/run_tests.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_libagendafilter.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_libbase.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_libcheckbox.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_libheading.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_liborgdate.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_liborgdate_parsing.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_liborgdate_utf8.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_liborgdatetime.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_liborgtimerange.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_plugin_date.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_plugin_edit_checkbox.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_plugin_edit_structure.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_plugin_mappings.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_plugin_misc.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_plugin_navigator.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_plugin_show_hide.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_plugin_tags_properties.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_plugin_todo.py delete mode 100644 pack/acp/start/vim-orgmode/tests/test_vimbuffer.py delete mode 100644 pack/acp/start/vim-orgmode/tests/vim.py delete mode 100644 pack/acp/start/vimoutliner/.gitignore delete mode 100644 pack/acp/start/vimoutliner/CHANGELOG delete mode 100644 pack/acp/start/vimoutliner/INSTALL delete mode 100644 pack/acp/start/vimoutliner/LICENSE delete mode 100644 pack/acp/start/vimoutliner/README delete mode 120000 pack/acp/start/vimoutliner/README.detailed delete mode 100644 pack/acp/start/vimoutliner/TODO.otl delete mode 100644 pack/acp/start/vimoutliner/colors/votl_dark.vim delete mode 100644 pack/acp/start/vimoutliner/colors/votl_light.vim delete mode 100644 pack/acp/start/vimoutliner/colors/votl_test.vim delete mode 100644 pack/acp/start/vimoutliner/doc/votl.txt delete mode 100644 pack/acp/start/vimoutliner/doc/votl_cheatsheet.txt delete mode 100644 pack/acp/start/vimoutliner/ftdetect/votl.vim delete mode 100644 pack/acp/start/vimoutliner/ftplugin/votl.vim delete mode 100755 pack/acp/start/vimoutliner/install.sh delete mode 100644 pack/acp/start/vimoutliner/syntax/votl.vim delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/images/Vimoutliner_logo.png delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/images/Vimoutliner_logo_tiny.png delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/images/favicon.ico delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/plugin/prev/votl_hoist.otl delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/plugin/prev/votl_hoist.vim delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/plugin/votl_checkbox.otl delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/plugin/votl_checkbox.vim delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/plugin/votl_clock.vim delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/plugin/votl_format.vim delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/plugin/votl_gtd.vim delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/plugin/votl_math.otl delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/plugin/votl_math.vim delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/plugin/votl_newhoist.vim delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/plugin/votl_smart_paste.vim delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/plugin/votl_tags.vim delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/MediaWiki2otl delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/MediaWiki2otl.desc delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/COPYING delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/COPYING.GPL delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/COPYING.LPDTL.1.0 delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/INSTALL delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/LPDTL_discuss.txt delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/Node.pm delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/README.otl delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/deletetest.otl delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_attribs.pl delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_bylevel.pl delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_delete.pl delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_hello.pl delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_insert.pl delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_nodepath.pl delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_otl2markup.pl delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_parse.pl delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/Node/myapp.cfg delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/fs2otl delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2aft.awk delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2aft.pdf delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2docbook.pl delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2html.py delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2html_autonumbered.css delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2html_nnnnnn.css delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/.vimrc delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/README delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.otl delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.pdf delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.png delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.py delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.tex delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.toc delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2lyx.awk delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2ooimpress.py delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2ooimpress.sh delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2table.py delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2tags.py delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2tags_freemind.conf delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl2tags_graphviz.conf delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/Apache/OTL.pm delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/README delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/devel-mode delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/javascript/jquery.js delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/javascript/theme2.js delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/javascript/theme3.js delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/sample.otl delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/styles/theme1.css delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/styles/theme2.css delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/styles/theme3.css delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/otlgrep.py delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/otlhead.sh delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/otlsplit.py delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/otltail.sh delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/2005.otl delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vimrc delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_ctags.conf delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_generator.rb delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_readme.otl delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_shelf.otl delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_ui.sh delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/freemind.py delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/freemind_outline.py delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/otl.py delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/outline_freemind.py delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/test.otl delete mode 100755 pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/test.sh delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/vo2html.rb delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/vo2odp.rb delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/vo2xo.rb delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/votl_maketags.1 delete mode 100644 pack/acp/start/vimoutliner/vimoutliner/scripts/votl_maketags.pl delete mode 100644 pack/acp/start/vimoutliner/vimoutlinerrc diff --git a/pack/acp/start/jellybeans.vim/.gitignore b/pack/acp/start/jellybeans.vim/.gitignore deleted file mode 100644 index 6befc68..0000000 --- a/pack/acp/start/jellybeans.vim/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.DS_Store -Thumbs.db -*.swp diff --git a/pack/acp/start/jellybeans.vim/README.markdown b/pack/acp/start/jellybeans.vim/README.markdown deleted file mode 100644 index da3fd7c..0000000 --- a/pack/acp/start/jellybeans.vim/README.markdown +++ /dev/null @@ -1,109 +0,0 @@ -jellybeans.vim -============== - -A colorful, dark color scheme, inspired by [ir_black][] and [twilight][]. - -Designed primarily for a graphical Vim, but includes support for 256, 88, 16, -and 8 color terminals. On a 16 or 8 color terminal, replace its colors with -those in `ansi-term-colors.txt` for best results. - -This script is [vimscript #2555][vimscript] at Vim.org. - -Scroll down for [screenshots][ss-anchor]! - -## Options - -### Custom Highlights - -If you prefer slightly different colors from what Jellybeans defines, -you can set `g:jellybeans_overrides` in your .vimrc to a dictionary of -custom highlighting parameters: - - let g:jellybeans_overrides = { - \ 'Todo': { 'guifg': '303030', 'guibg': 'f0f000', - \ 'ctermfg': 'Black', 'ctermbg': 'Yellow', - \ 'attr': 'bold' }, - \ 'Comment': { 'guifg': 'cccccc' }, - \} - -This removes the need to edit Jellybeans directly, simplifying -upgrades. In addition, RGB colors specified this way are run through -the same color approximation algorithm that the core theme uses, so -your colors work just as well in 256-color terminals. - -If you can pick better colors than the approximator, specify them -in the `256ctermfg` and `256ctermbg` parameters to override -its choices. - -#### Custom Background Colors - -To set a custom background color, override the special -`background` highlight group: - - let g:jellybeans_overrides = { - \ 'background': { 'guibg': '000000' }, - \} - -Jellybeans uses the background color in multiple highlight -groups. Using the special `background` group overrides them all -at once. - -This replaces `g:jellybeans_background_color` and -`g:jellybeans_background_color_256` from Jellybeans versions -before 1.6. - -#### Terminal Background - -If you would prefer to use your terminal's default background -(e.g. for transparent backgrounds, image backgrounds, or a -different color) instead of the background color that Jellybeans -applies, use this `background` override: - - let g:jellybeans_overrides = { - \ 'background': { 'ctermbg': 'none', '256ctermbg': 'none' }, - \} - -### Italics - -Jellybeans disables italics in terminal Vim by default, as some -terminals do other things with the text's colors instead of -actually italicizing the text. If your terminal does fully -support italics, add - - let g:jellybeans_use_term_italics = 1 - -to your .vimrc to enable italics in terminal Vim. - -If you don't want italics even in GUI Vim, add - - let g:jellybeans_use_gui_italics = 0 - -### Low-Color Black (16 and 8 color terminals) - -Since the background on a dark terminal is usually black already, -Jellybeans appropriates the black ANSI color as a dark grey and -uses no color when it really wants black. - -If you can’t or don’t want to change your terminal’s color -mappings, add - - let g:jellybeans_use_lowcolor_black = 0 - -to your .vimrc to render “black” text as Vim’s grey (ANSI white). - -Users of Apple’s pre-10.7 Terminal.app can use the TerminalColours -plugin ([Leopard][tc-leopard], [Snow Leopard][tc-snowleopard]) to -change the default colors. - -## Screenshots - -![][preview-ss] - - -[ir_black]: https://web.archive.org/web/20140211124943/http://toddwerth.com/2008/01/25/a-black-os-x-leopard-terminal-theme-that-is-actually-readable/ -[twilight]: http://www.vim.org/scripts/script.php?script_id=1677 -[vimscript]: http://www.vim.org/scripts/script.php?script_id=2555 -[tc-leopard]: http://ciaranwal.sh/2007/11/01/customising-colours-in-leopard-terminal -[tc-snowleopard]: https://github.com/timmfin/terminalcolours -[preview-ss]: https://nanotech.nanotechcorp.net/downloads/jellybeans-preview.png -[ss-anchor]: #screenshots diff --git a/pack/acp/start/jellybeans.vim/ansi-term-colors.txt b/pack/acp/start/jellybeans.vim/ansi-term-colors.txt deleted file mode 100644 index 60db9f5..0000000 --- a/pack/acp/start/jellybeans.vim/ansi-term-colors.txt +++ /dev/null @@ -1,8 +0,0 @@ -Black rgb(59,59,59) #3b3b3b -Red rgb(207,106,76) #cf6a4c -Green rgb(153,173,106) #99ad6a -Yellow rgb(216,173,76) #d8ad4c -Blue rgb(89,123,197) #597bc5 -Magenta rgb(160,55,176) #a037b0 -Cyan rgb(113,185,248) #71b9f8 -White rgb(173,173,173) #adadad diff --git a/pack/acp/start/jellybeans.vim/colors/jellybeans.vim b/pack/acp/start/jellybeans.vim/colors/jellybeans.vim deleted file mode 100644 index 651194d..0000000 --- a/pack/acp/start/jellybeans.vim/colors/jellybeans.vim +++ /dev/null @@ -1,668 +0,0 @@ -" Vim color file -" -" " __ _ _ _ " -" " \ \ ___| | |_ _| |__ ___ __ _ _ __ ___ " -" " \ \/ _ \ | | | | | _ \ / _ \/ _ | _ \/ __| " -" " /\_/ / __/ | | |_| | |_| | __/ |_| | | | \__ \ " -" " \___/ \___|_|_|\__ |____/ \___|\____|_| |_|___/ " -" " \___/ " -" -" "A colorful, dark color scheme for Vim." -" -" File: jellybeans.vim -" URL: github.com/nanotech/jellybeans.vim -" Scripts URL: vim.org/scripts/script.php?script_id=2555 -" Maintainer: NanoTech (nanotech.nanotechcorp.net) -" Version: 1.6 -" Last Change: October 18th, 2016 -" License: MIT -" Contributors: Andrew Wong (w0ng) -" Brian Marshall (bmars) -" Daniel Herbert (pocketninja) -" David Liang -" Henry So, Jr. -" Joe Doherty (docapotamus) -" Karl Litterfeldt (Litterfeldt) -" Keith Pitt (keithpitt) -" Philipp Rustemeier (12foo) -" Rafael Bicalho (rbika) -" Rich Healey (richo) -" Siwen Yu (yusiwen) -" Tim Willis (willist) -" -" Copyright (c) 2009-2016 NanoTech -" -" Permission is hereby granted, free of charge, to any per‐ -" son obtaining a copy of this software and associated doc‐ -" umentation files (the “Software”), to deal in the Soft‐ -" ware without restriction, including without limitation -" the rights to use, copy, modify, merge, publish, distrib‐ -" ute, sublicense, and/or sell copies of the Software, and -" to permit persons to whom the Software is furnished to do -" so, subject to the following conditions: -" -" The above copyright notice and this permission notice -" shall be included in all copies or substantial portions -" of the Software. -" -" THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY -" KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO -" THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICU‐ -" LAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CON‐ -" TRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON‐ -" NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -" THE SOFTWARE. - -set background=dark - -hi clear - -if exists("syntax_on") - syntax reset -endif - -let colors_name = "jellybeans" - -if has("gui_running") || &t_Co == 88 || &t_Co == 256 - let s:low_color = 0 -else - let s:low_color = 1 -endif - -" Configuration Variables: -" - g:jellybeans_overrides (default = {}) -" - g:jellybeans_use_lowcolor_black (default = 1) -" - g:jellybeans_use_gui_italics (default = 1) -" - g:jellybeans_use_term_italics (default = 0) - -let s:background_color = "151515" - -if exists("g:jellybeans_overrides") - let s:overrides = g:jellybeans_overrides -else - let s:overrides = {} -endif - -" Backwards compatibility -if exists("g:jellybeans_background_color") - \ || exists("g:jellybeans_background_color_256") - \ || exists("g:jellybeans_use_term_background_color") - - let s:overrides = deepcopy(s:overrides) - - if !has_key(s:overrides, "background") - let s:overrides["background"] = {} - endif - - if exists("g:jellybeans_background_color") - let s:overrides["background"]["guibg"] = g:jellybeans_background_color - endif - - if exists("g:jellybeans_background_color_256") - let s:overrides["background"]["256ctermbg"] = g:jellybeans_background_color_256 - endif - - if exists("g:jellybeans_use_term_background_color") - \ && g:jellybeans_use_term_background_color - let s:overrides["background"]["ctermbg"] = "NONE" - let s:overrides["background"]["256ctermbg"] = "NONE" - endif -endif - -if !exists("g:jellybeans_use_lowcolor_black") || g:jellybeans_use_lowcolor_black - let s:termBlack = "Black" -else - let s:termBlack = "Grey" -endif - -" Color approximation functions by Henry So, Jr. and David Liang {{{ -" Added to jellybeans.vim by Daniel Herbert - -" returns an approximate grey index for the given grey level -fun! s:grey_number(x) - if &t_Co == 88 - if a:x < 23 - return 0 - elseif a:x < 69 - return 1 - elseif a:x < 103 - return 2 - elseif a:x < 127 - return 3 - elseif a:x < 150 - return 4 - elseif a:x < 173 - return 5 - elseif a:x < 196 - return 6 - elseif a:x < 219 - return 7 - elseif a:x < 243 - return 8 - else - return 9 - endif - else - if a:x < 14 - return 0 - else - let l:n = (a:x - 8) / 10 - let l:m = (a:x - 8) % 10 - if l:m < 5 - return l:n - else - return l:n + 1 - endif - endif - endif -endfun - -" returns the actual grey level represented by the grey index -fun! s:grey_level(n) - if &t_Co == 88 - if a:n == 0 - return 0 - elseif a:n == 1 - return 46 - elseif a:n == 2 - return 92 - elseif a:n == 3 - return 115 - elseif a:n == 4 - return 139 - elseif a:n == 5 - return 162 - elseif a:n == 6 - return 185 - elseif a:n == 7 - return 208 - elseif a:n == 8 - return 231 - else - return 255 - endif - else - if a:n == 0 - return 0 - else - return 8 + (a:n * 10) - endif - endif -endfun - -" returns the palette index for the given grey index -fun! s:grey_color(n) - if &t_Co == 88 - if a:n == 0 - return 16 - elseif a:n == 9 - return 79 - else - return 79 + a:n - endif - else - if a:n == 0 - return 16 - elseif a:n == 25 - return 231 - else - return 231 + a:n - endif - endif -endfun - -" returns an approximate color index for the given color level -fun! s:rgb_number(x) - if &t_Co == 88 - if a:x < 69 - return 0 - elseif a:x < 172 - return 1 - elseif a:x < 230 - return 2 - else - return 3 - endif - else - if a:x < 75 - return 0 - else - let l:n = (a:x - 55) / 40 - let l:m = (a:x - 55) % 40 - if l:m < 20 - return l:n - else - return l:n + 1 - endif - endif - endif -endfun - -" returns the actual color level for the given color index -fun! s:rgb_level(n) - if &t_Co == 88 - if a:n == 0 - return 0 - elseif a:n == 1 - return 139 - elseif a:n == 2 - return 205 - else - return 255 - endif - else - if a:n == 0 - return 0 - else - return 55 + (a:n * 40) - endif - endif -endfun - -" returns the palette index for the given R/G/B color indices -fun! s:rgb_color(x, y, z) - if &t_Co == 88 - return 16 + (a:x * 16) + (a:y * 4) + a:z - else - return 16 + (a:x * 36) + (a:y * 6) + a:z - endif -endfun - -" returns the palette index to approximate the given R/G/B color levels -fun! s:color(r, g, b) - " map greys directly (see xterm's 256colres.pl) - if &t_Co == 256 && a:r == a:g && a:g == a:b && a:r > 3 && a:r < 243 - return float2nr(round(a:r - 8) / 10.0) + 232 - endif - - " get the closest grey - let l:gx = s:grey_number(a:r) - let l:gy = s:grey_number(a:g) - let l:gz = s:grey_number(a:b) - - " get the closest color - let l:x = s:rgb_number(a:r) - let l:y = s:rgb_number(a:g) - let l:z = s:rgb_number(a:b) - - if l:gx == l:gy && l:gy == l:gz - " there are two possibilities - let l:dgr = s:grey_level(l:gx) - a:r - let l:dgg = s:grey_level(l:gy) - a:g - let l:dgb = s:grey_level(l:gz) - a:b - let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb) - let l:dr = s:rgb_level(l:gx) - a:r - let l:dg = s:rgb_level(l:gy) - a:g - let l:db = s:rgb_level(l:gz) - a:b - let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db) - if l:dgrey < l:drgb - " use the grey - return s:grey_color(l:gx) - else - " use the color - return s:rgb_color(l:x, l:y, l:z) - endif - else - " only one possibility - return s:rgb_color(l:x, l:y, l:z) - endif -endfun - -fun! s:is_empty_or_none(str) - return empty(a:str) || a:str ==? "NONE" -endfun - -" returns the palette index to approximate the 'rrggbb' hex string -fun! s:rgb(rgb) - if s:is_empty_or_none(a:rgb) - return "NONE" - endif - let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0 - let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0 - let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0 - return s:color(l:r, l:g, l:b) -endfun - -fun! s:prefix_highlight_value_with(prefix, color) - if s:is_empty_or_none(a:color) - return "NONE" - else - return a:prefix . a:color - endif -endfun - -fun! s:remove_italic_attr(attr) - let l:attr = join(filter(split(a:attr, ","), "v:val !=? 'italic'"), ",") - if empty(l:attr) - let l:attr = "NONE" - endif - return l:attr -endfun - -" sets the highlighting for the given group -fun! s:X(group, fg, bg, attr, lcfg, lcbg) - if s:low_color - exec "hi ".a:group. - \ " ctermfg=".s:prefix_highlight_value_with("", a:lcfg). - \ " ctermbg=".s:prefix_highlight_value_with("", a:lcbg) - else - exec "hi ".a:group. - \ " guifg=".s:prefix_highlight_value_with("#", a:fg). - \ " guibg=".s:prefix_highlight_value_with("#", a:bg). - \ " ctermfg=".s:rgb(a:fg). - \ " ctermbg=".s:rgb(a:bg) - endif - - let l:attr = s:prefix_highlight_value_with("", a:attr) - - if exists("g:jellybeans_use_term_italics") && g:jellybeans_use_term_italics - let l:cterm_attr = l:attr - else - let l:cterm_attr = s:remove_italic_attr(l:attr) - endif - - if !exists("g:jellybeans_use_gui_italics") || g:jellybeans_use_gui_italics - let l:gui_attr = l:attr - else - let l:gui_attr = s:remove_italic_attr(l:attr) - endif - - exec "hi ".a:group." gui=".l:gui_attr." cterm=".l:cterm_attr -endfun -" }}} - -call s:X("Normal","e8e8d3",s:background_color,"","White","") -set background=dark - -if version >= 700 - call s:X("CursorLine","","1c1c1c","","",s:termBlack) - call s:X("CursorColumn","","1c1c1c","","",s:termBlack) - call s:X("MatchParen","ffffff","556779","bold","","DarkCyan") - - call s:X("TabLine","000000","b0b8c0","italic","",s:termBlack) - call s:X("TabLineFill","9098a0","","","",s:termBlack) - call s:X("TabLineSel","000000","f0f0f0","italic,bold",s:termBlack,"White") - - " Auto-completion - call s:X("Pmenu","ffffff","606060","","White",s:termBlack) - call s:X("PmenuSel","101010","eeeeee","",s:termBlack,"White") -endif - -call s:X("Visual","","404040","","",s:termBlack) -call s:X("Cursor",s:background_color,"b0d0f0","","","") - -call s:X("LineNr","605958",s:background_color,"NONE",s:termBlack,"") -call s:X("CursorLineNr","ccc5c4","","NONE","White","") -call s:X("Comment","888888","","italic","Grey","") -call s:X("Todo","c7c7c7","","bold","White",s:termBlack) - -call s:X("StatusLine","000000","dddddd","italic","","White") -call s:X("StatusLineNC","ffffff","403c41","italic","White","Black") -call s:X("VertSplit","777777","403c41","",s:termBlack,s:termBlack) -call s:X("WildMenu","f0a0c0","302028","","Magenta","") - -call s:X("Folded","a0a8b0","384048","italic",s:termBlack,"") -call s:X("FoldColumn","535D66","1f1f1f","","",s:termBlack) -call s:X("SignColumn","777777","333333","","",s:termBlack) -call s:X("ColorColumn","","000000","","",s:termBlack) - -call s:X("Title","70b950","","bold","Green","") - -call s:X("Constant","cf6a4c","","","Red","") -call s:X("Special","799d6a","","","Green","") -call s:X("Delimiter","668799","","","Grey","") - -call s:X("String","99ad6a","","","Green","") -call s:X("StringDelimiter","556633","","","DarkGreen","") - -call s:X("Identifier","c6b6ee","","","LightCyan","") -call s:X("Structure","8fbfdc","","","LightCyan","") -call s:X("Function","fad07a","","","Yellow","") -call s:X("Statement","8197bf","","","DarkBlue","") -call s:X("PreProc","8fbfdc","","","LightBlue","") - -hi! link Operator Structure -hi! link Conceal Operator - -call s:X("Type","ffb964","","","Yellow","") -call s:X("NonText","606060",s:background_color,"",s:termBlack,"") - -call s:X("SpecialKey","444444","1c1c1c","",s:termBlack,"") - -call s:X("Search","f0a0c0","302028","underline","Magenta","") - -call s:X("Directory","dad085","","","Yellow","") -call s:X("ErrorMsg","","902020","","","DarkRed") -hi! link Error ErrorMsg -hi! link MoreMsg Special -call s:X("Question","65C254","","","Green","") - - -" Spell Checking - -call s:X("SpellBad","","902020","underline","","DarkRed") -call s:X("SpellCap","","0000df","underline","","Blue") -call s:X("SpellRare","","540063","underline","","DarkMagenta") -call s:X("SpellLocal","","2D7067","underline","","Green") - -" Diff - -hi! link diffRemoved Constant -hi! link diffAdded String - -" VimDiff - -call s:X("DiffAdd","D2EBBE","437019","","White","DarkGreen") -call s:X("DiffDelete","40000A","700009","","DarkRed","DarkRed") -call s:X("DiffChange","","2B5B77","","White","DarkBlue") -call s:X("DiffText","8fbfdc","000000","reverse","Yellow","") - -" PHP - -hi! link phpFunctions Function -call s:X("StorageClass","c59f6f","","","Red","") -hi! link phpSuperglobal Identifier -hi! link phpQuoteSingle StringDelimiter -hi! link phpQuoteDouble StringDelimiter -hi! link phpBoolean Constant -hi! link phpNull Constant -hi! link phpArrayPair Operator -hi! link phpOperator Normal -hi! link phpRelation Normal -hi! link phpVarSelector Identifier - -" Python - -hi! link pythonOperator Statement - -" Ruby - -hi! link rubySharpBang Comment -call s:X("rubyClass","447799","","","DarkBlue","") -call s:X("rubyIdentifier","c6b6fe","","","Cyan","") -hi! link rubyConstant Type -hi! link rubyFunction Function - -call s:X("rubyInstanceVariable","c6b6fe","","","Cyan","") -call s:X("rubySymbol","7697d6","","","Blue","") -hi! link rubyGlobalVariable rubyInstanceVariable -hi! link rubyModule rubyClass -call s:X("rubyControl","7597c6","","","Blue","") - -hi! link rubyString String -hi! link rubyStringDelimiter StringDelimiter -hi! link rubyInterpolationDelimiter Identifier - -call s:X("rubyRegexpDelimiter","540063","","","Magenta","") -call s:X("rubyRegexp","dd0093","","","DarkMagenta","") -call s:X("rubyRegexpSpecial","a40073","","","Magenta","") - -call s:X("rubyPredefinedIdentifier","de5577","","","Red","") - -" Erlang - -hi! link erlangAtom rubySymbol -hi! link erlangBIF rubyPredefinedIdentifier -hi! link erlangFunction rubyPredefinedIdentifier -hi! link erlangDirective Statement -hi! link erlangNode Identifier - -" Elixir - -hi! link elixirAtom rubySymbol - - -" JavaScript - -hi! link javaScriptValue Constant -hi! link javaScriptRegexpString rubyRegexp -hi! link javaScriptTemplateVar StringDelim -hi! link javaScriptTemplateDelim Identifier -hi! link javaScriptTemplateString String - -" CoffeeScript - -hi! link coffeeRegExp javaScriptRegexpString - -" Lua - -hi! link luaOperator Conditional - -" C - -hi! link cFormat Identifier -hi! link cOperator Constant - -" Objective-C/Cocoa - -hi! link objcClass Type -hi! link cocoaClass objcClass -hi! link objcSubclass objcClass -hi! link objcSuperclass objcClass -hi! link objcDirective rubyClass -hi! link objcStatement Constant -hi! link cocoaFunction Function -hi! link objcMethodName Identifier -hi! link objcMethodArg Normal -hi! link objcMessageName Identifier - -" Vimscript - -hi! link vimOper Normal - -" HTML - -hi! link htmlTag Statement -hi! link htmlEndTag htmlTag -hi! link htmlTagName htmlTag - -" XML - -hi! link xmlTag Statement -hi! link xmlEndTag xmlTag -hi! link xmlTagName xmlTag -hi! link xmlEqual xmlTag -hi! link xmlEntity Special -hi! link xmlEntityPunct xmlEntity -hi! link xmlDocTypeDecl PreProc -hi! link xmlDocTypeKeyword PreProc -hi! link xmlProcessingDelim xmlAttrib - -" Debugger.vim - -call s:X("DbgCurrent","DEEBFE","345FA8","","White","DarkBlue") -call s:X("DbgBreakPt","","4F0037","","","DarkMagenta") - -" vim-indent-guides - -if !exists("g:indent_guides_auto_colors") - let g:indent_guides_auto_colors = 0 -endif -call s:X("IndentGuidesOdd","","232323","","","") -call s:X("IndentGuidesEven","","1b1b1b","","","") - -" Plugins, etc. - -hi! link TagListFileName Directory -call s:X("PreciseJumpTarget","B9ED67","405026","","White","Green") - -" Manual overrides for 256-color terminals. Dark colors auto-map badly. -if !s:low_color - hi StatusLineNC ctermbg=235 - hi Folded ctermbg=236 - hi DiffText ctermfg=81 - hi DbgBreakPt ctermbg=53 - hi IndentGuidesOdd ctermbg=235 - hi IndentGuidesEven ctermbg=234 -endif - -if !empty("s:overrides") - fun! s:current_attr(group) - let l:synid = synIDtrans(hlID(a:group)) - let l:attrs = [] - for l:attr in ["bold", "italic", "reverse", "standout", "underline", "undercurl"] - if synIDattr(l:synid, l:attr, "gui") == 1 - call add(l:attrs, l:attr) - endif - endfor - return join(l:attrs, ",") - endfun - fun! s:current_color(group, what, mode) - let l:color = synIDattr(synIDtrans(hlID(a:group)), a:what, a:mode) - if l:color == -1 - return "" - else - return substitute(l:color, "^#", "", "") - endif - endfun - fun! s:load_color_def(group, def) - call s:X(a:group, get(a:def, "guifg", s:current_color(a:group, "fg", "gui")), - \ get(a:def, "guibg", s:current_color(a:group, "bg", "gui")), - \ get(a:def, "attr", s:current_attr(a:group)), - \ get(a:def, "ctermfg", s:current_color(a:group, "fg", "cterm")), - \ get(a:def, "ctermbg", s:current_color(a:group, "bg", "cterm"))) - if !s:low_color - for l:prop in ["ctermfg", "ctermbg"] - let l:override_key = "256".l:prop - if has_key(a:def, l:override_key) - exec "hi ".a:group." ".l:prop."=".a:def[l:override_key] - endif - endfor - endif - endfun - fun! s:load_colors(defs) - for [l:group, l:def] in items(a:defs) - if l:group == "background" - call s:load_color_def("LineNr", l:def) - call s:load_color_def("NonText", l:def) - call s:load_color_def("Normal", l:def) - else - call s:load_color_def(l:group, l:def) - endif - unlet l:group - unlet l:def - endfor - endfun - call s:load_colors(s:overrides) - delf s:load_colors - delf s:load_color_def - delf s:current_color - delf s:current_attr -endif - -" delete functions {{{ -delf s:X -delf s:remove_italic_attr -delf s:prefix_highlight_value_with -delf s:rgb -delf s:is_empty_or_none -delf s:color -delf s:rgb_color -delf s:rgb_level -delf s:rgb_number -delf s:grey_color -delf s:grey_level -delf s:grey_number -" }}} diff --git a/pack/acp/start/minimalist/LICENSE b/pack/acp/start/minimalist/LICENSE deleted file mode 100644 index 2cb3f48..0000000 --- a/pack/acp/start/minimalist/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016-2018 Diki Ananta - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/pack/acp/start/minimalist/README.md b/pack/acp/start/minimalist/README.md deleted file mode 100644 index 8c850ef..0000000 --- a/pack/acp/start/minimalist/README.md +++ /dev/null @@ -1,85 +0,0 @@ -

- Minimalist on HTML -

- -# Minimalist -Minimalist is a Material Color Scheme Darker for Vim & inspired by -[Material Theme](https://github.com/equinusocio/material-theme). - -## Installation - -To install this color scheme, you can use one of the following ways: - -- Use [Vundle](https://github.com/VundleVim/Vundle.vim#quick-start) by adding -to your `.vimrc` Vundle plugin section: - - Plugin 'dikiaap/minimalist' - - Then run `:PluginInstall`. - -OR - -- Use [vim-plug](https://github.com/junegunn/vim-plug#installation) by adding -to your `.vimrc` vim-plug section: - - Plug 'dikiaap/minimalist' - - Then run `:PlugInstall`. - -OR - -- Use [Pathogen](https://github.com/tpope/vim-pathogen#installation): - - Run the following in a terminal: - - cd ~/.vim/bundle - git clone https://github.com/dikiaap/minimalist - -## Usage - -After finishing installation, put this code to your `.vimrc`: - -```viml -set t_Co=256 -syntax on -colorscheme minimalist -``` - -This color scheme also built-in with airline theme. If you wanna use: - -```viml -let g:airline_theme='minimalist' -let g:airline_powerline_fonts = 1 -let g:airline#extensions#tabline#enabled = 1 -``` - -## Support - -As you know, color scheme in vim by default supports many programming languages. -At this time `minimalist` is looks beautiful & focused on: - -* C++ -* CSS/CSS3 -* HTML/HTML5 -* JavaScript -* Markdown -* PHP -* Python -* Ruby -* Sass -* Shell -* XML - -If you need more syntax highlighting, you can use -[vim-polyglot](https://github.com/sheerun/vim-polyglot). - -## Links - -[GitHub](https://github.com/dikiaap/minimalist) · -[Vim.org](https://www.vim.org/scripts/script.php?script_id=5490) · -[Vim Awesome](https://vimawesome.com/plugin/minimalist-vim) · -[DotShare.it](http://dotshare.it/dots/1397/) - -## License - -MIT © [Diki Ananta](https://dikiaap.id) diff --git a/pack/acp/start/minimalist/autoload/airline/themes/minimalist.vim b/pack/acp/start/minimalist/autoload/airline/themes/minimalist.vim deleted file mode 100644 index 8e7aad3..0000000 --- a/pack/acp/start/minimalist/autoload/airline/themes/minimalist.vim +++ /dev/null @@ -1,46 +0,0 @@ -" Minimalist Airline - A Material Color Scheme Darker -" -" Author: Diki Ananta -" Repository: https://github.com/dikiaap/minimalist -" Version: 1.6 -" License: MIT - -" Normal Mode -let s:N1 = [ '#E4E4E4', '#3A3A3A', 254, 237 ] -let s:N2 = [ '#E4E4E4', '#4E4E4E', 254, 239 ] -let s:N3 = [ '#EEEEEE', '#262626', 255, 235 ] - -" Inactive Mode -let s:IA = [ '#666666', s:N3[1], 242, s:N3[3] ] - -" Warning Mode -let s:WI = [ '#1C1C1C', '#FFAF5F', 234, 215 ] - -" Error Mode -let s:ER = [ s:WI[0], '#D75F5F', s:WI[2], 167 ] - -" Terminal Mode -let s:TE = [ s:WI[0], s:N1[1], s:N1[2], s:N1[3] ] - -" Reverse Mode -let s:NR = [ s:N2[1], s:N2[0], s:N2[3], s:N2[2], 'bold' ] - -let g:airline#themes#minimalist#palette = {} - -" Generate -let g:airline#themes#minimalist#palette.normal = airline#themes#generate_color_map(s:N1, s:N2, s:N3) -let g:airline#themes#minimalist#palette.insert = g:airline#themes#minimalist#palette.normal -let g:airline#themes#minimalist#palette.visual = g:airline#themes#minimalist#palette.normal -let g:airline#themes#minimalist#palette.replace = g:airline#themes#minimalist#palette.normal -let g:airline#themes#minimalist#palette.inactive = airline#themes#generate_color_map(s:IA, s:IA, s:IA) -let g:airline#themes#minimalist#palette.normal.airline_warning = s:WI -let g:airline#themes#minimalist#palette.normal.airline_error = s:ER -let g:airline#themes#minimalist#palette.normal.airline_term = s:TE - -" Accents -let g:airline#themes#minimalist#palette.accents = { 'red': [ s:ER[1], '', s:ER[3], '' ] } - -" CtrlP -if get(g:, 'loaded_ctrlp', 0) - let g:airline#themes#minimalist#palette.ctrlp = airline#extensions#ctrlp#generate_color_map(s:N3, s:N2, s:NR) -endif diff --git a/pack/acp/start/minimalist/colors/minimalist.vim b/pack/acp/start/minimalist/colors/minimalist.vim deleted file mode 100644 index f7e25ee..0000000 --- a/pack/acp/start/minimalist/colors/minimalist.vim +++ /dev/null @@ -1,227 +0,0 @@ -" Minimalist - A Material Color Scheme Darker -" -" Author: Diki Ananta -" Repository: https://github.com/dikiaap/minimalist -" Version: 1.6 -" License: MIT - -set background=dark -if version > 580 - hi clear - if exists("syntax_on") - syntax reset - endif -endif -set t_Co=256 -let g:colors_name = "minimalist" - -""""""""""""""""""""""" -" General -""""""""""""""""""""""" -hi ColorColumn ctermfg=NONE ctermbg=233 cterm=NONE guifg=NONE guibg=#121212 gui=NONE -hi Cursor ctermfg=234 ctermbg=255 cterm=NONE guifg=#1C1C1C guibg=#EEEEEE gui=NONE -hi CursorColumn ctermfg=NONE ctermbg=233 cterm=NONE guifg=NONE guibg=#121212 gui=NONE -hi CursorLine ctermfg=NONE ctermbg=233 cterm=NONE guifg=NONE guibg=#121212 gui=NONE -hi CursorLineNr ctermfg=59 ctermbg=233 cterm=NONE guifg=#5F5F5F guibg=#121212 gui=NONE -hi DiffAdd ctermfg=255 ctermbg=64 cterm=bold guifg=#EEEEEE guibg=#5F8700 gui=bold -hi DiffChange ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE -hi DiffDelete ctermfg=167 ctermbg=NONE cterm=NONE guifg=#D75F5F guibg=NONE gui=NONE -hi DiffText ctermfg=255 ctermbg=24 cterm=bold guifg=#EEEEEE guibg=#005F87 gui=bold -hi Directory ctermfg=179 ctermbg=NONE cterm=NONE guifg=#D7AF5F guibg=NONE gui=NONE -hi ErrorMsg ctermfg=255 ctermbg=167 cterm=NONE guifg=#EEEEEE guibg=#D75F5F gui=NONE -hi FoldColumn ctermfg=117 ctermbg=239 cterm=NONE guifg=#87D7FF guibg=#4E4E4E gui=NONE -hi Folded ctermfg=242 ctermbg=234 cterm=NONE guifg=#666666 guibg=#1C1C1C gui=NONE -hi IncSearch ctermfg=234 ctermbg=75 cterm=NONE guifg=#1C1C1C guibg=#5FAFFF gui=NONE -hi LineNr ctermfg=59 ctermbg=234 cterm=NONE guifg=#5F5F5F guibg=#1C1C1C gui=NONE -hi MatchParen ctermfg=NONE ctermbg=NONE cterm=underline guifg=NONE guibg=NONE gui=underline -hi MoreMsg ctermfg=150 ctermbg=NONE cterm=NONE guifg=#AFD787 guibg=NONE gui=NONE -hi NonText ctermfg=234 ctermbg=234 cterm=NONE guifg=#1C1C1C guibg=#1C1C1C gui=NONE -hi Normal ctermfg=255 ctermbg=234 cterm=NONE guifg=#EEEEEE guibg=#1C1C1C gui=NONE -hi Pmenu ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE -hi PmenuSel ctermfg=NONE ctermbg=59 cterm=NONE guifg=NONE guibg=#5F5F5F gui=NONE -hi Question ctermfg=150 ctermbg=NONE cterm=NONE guifg=#AFD787 guibg=NONE gui=bold -hi Search ctermfg=NONE ctermbg=NONE cterm=underline guifg=NONE guibg=NONE gui=underline -hi SignColumn ctermfg=NONE ctermbg=237 cterm=NONE guifg=NONE guibg=#3A3A3A gui=NONE -hi StatusLine ctermfg=255 ctermbg=239 cterm=bold guifg=#EEEEEE guibg=#4E4E4E gui=bold -hi StatusLineNC ctermfg=255 ctermbg=239 cterm=NONE guifg=#EEEEEE guibg=#4E4E4E gui=NONE -hi Title ctermfg=255 ctermbg=NONE cterm=NONE guifg=#EEEEEE guibg=NONE gui=NONE -hi Underlined ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE -hi VertSplit ctermfg=239 ctermbg=239 cterm=NONE guifg=#4E4E4E guibg=#4E4E4E gui=NONE -hi Visual ctermfg=NONE ctermbg=236 cterm=NONE guifg=NONE guibg=#303030 gui=NONE -hi WarningMsg ctermfg=255 ctermbg=167 cterm=NONE guifg=#EEEEEE guibg=#D75F5F gui=NONE -hi WildMenu ctermfg=234 ctermbg=215 cterm=NONE guifg=#1C1C1C guibg=#FFAF5F gui=NONE -hi NERDTreeUp ctermfg=167 ctermbg=NONE cterm=NONE guifg=#D75F5F guibg=NONE gui=NONE -hi NERDTreeDir ctermfg=251 ctermbg=NONE cterm=bold guifg=#C6C6C6 guibg=NONE gui=bold -hi NERDTreeDirSlash ctermfg=251 ctermbg=NONE cterm=NONE guifg=#C6C6C6 guibg=NONE gui=NONE -hi NERDTreeFile ctermfg=241 ctermbg=NONE cterm=NONE guifg=#606060 guibg=NONE gui=NONE -hi NERDTreeCWD ctermfg=167 ctermbg=NONE cterm=NONE guifg=#D75F5F guibg=NONE gui=NONE -hi NERDTreeOpenable ctermfg=167 ctermbg=NONE cterm=NONE guifg=#D75F5F guibg=NONE gui=NONE -hi NERDTreeClosable ctermfg=167 ctermbg=NONE cterm=NONE guifg=#D75F5F guibg=NONE gui=NONE - -""""""""""""""""""""""" -" Syntax Highlighting -""""""""""""""""""""""" -hi Boolean ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi Character ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi Comment ctermfg=240 ctermbg=NONE cterm=NONE guifg=#585858 guibg=NONE gui=NONE -hi Conditional ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi Constant ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi Define ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi Error ctermfg=255 ctermbg=167 cterm=NONE guifg=#EEEEEE guibg=#D75F5F gui=NONE -hi Float ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi Function ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi Identifier ctermfg=255 ctermbg=NONE cterm=NONE guifg=#EEEEEE guibg=NONE gui=italic -hi Keyword ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi Label ctermfg=186 ctermbg=NONE cterm=NONE guifg=#D7D787 guibg=NONE gui=NONE -hi Number ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi Operator ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi PreCondit ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi PreProc ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi Repeat ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi Special ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi SpecialComment ctermfg=242 ctermbg=NONE cterm=NONE guifg=#666666 guibg=NONE gui=NONE -hi SpecialKey ctermfg=59 ctermbg=237 cterm=NONE guifg=#5F5F5F guibg=#3A3A3A gui=NONE -hi SpellBad ctermfg=255 ctermbg=167 cterm=NONE guifg=#EEEEEE guibg=#D75F5F gui=undercurl -hi SpellCap ctermfg=255 ctermbg=74 cterm=NONE guifg=#EEEEEE guibg=#5FAFD7 gui=undercurl -hi SpellRare ctermfg=255 ctermbg=140 cterm=NONE guifg=#EEEEEE guibg=#AF87D7 gui=undercurl -hi SpellLocal ctermfg=255 ctermbg=14 cterm=NONE guifg=#EEEEEE guibg=#5FB3B3 gui=undercurl -hi Statement ctermfg=167 ctermbg=NONE cterm=NONE guifg=#D75F5F guibg=NONE gui=NONE -hi StorageClass ctermfg=215 ctermbg=NONE cterm=NONE guifg=#FFAF5F guibg=NONE gui=italic -hi String ctermfg=150 ctermbg=NONE cterm=NONE guifg=#AFD787 guibg=NONE gui=NONE -hi Structure ctermfg=215 ctermbg=NONE cterm=NONE guifg=#FFAF5F guibg=NONE gui=NONE -hi Tag ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi Todo ctermfg=74 ctermbg=234 cterm=inverse guifg=#5FAFD7 guibg=#1C1C1C gui=inverse,bold -hi Type ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE - -""""""""""""""""""""""" -" Supports -""""""""""""""""""""""" -hi cInclude ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE " C++ -hi cOperator ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi cppStatement ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi cssAttr ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE " CSS/CSS3 -hi cssAttrComma ctermfg=231 ctermbg=NONE cterm=NONE guifg=#EEEEEE guibg=NONE gui=NONE -hi cssBoxProp ctermfg=152 ctermbg=NONE cterm=NONE guifg=#AFD7D7 guibg=NONE gui=NONE -hi cssBraces ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi cssClassName ctermfg=215 ctermbg=NONE cterm=NONE guifg=#FFAF5F guibg=NONE gui=NONE -hi cssColor ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi cssCommonAttr ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi cssFontAttr ctermfg=150 ctermbg=NONE cterm=NONE guifg=#AFD787 guibg=NONE gui=NONE -hi cssFunctionName ctermfg=75 ctermbg=NONE cterm=NONE guifg=#5FAFFF guibg=NONE gui=NONE -hi cssNoise ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi cssProp ctermfg=152 ctermbg=NONE cterm=NONE guifg=#AFD7D7 guibg=NONE gui=NONE -hi cssPseudoClass ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi cssPseudoClassId ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi cssTagName ctermfg=167 ctermbg=NONE cterm=NONE guifg=#D75F5F guibg=NONE gui=NONE -hi cssUIAttr ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi cssUnitDecorators ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi cssURL ctermfg=255 ctermbg=NONE cterm=NONE guifg=#EEEEEE guibg=NONE gui=italic -hi cssValueLength ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi cssValueNumber ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi cssVendor ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi htmlArg ctermfg=215 ctermbg=NONE cterm=NONE guifg=#FFAF5F guibg=NONE gui=NONE " HTML/HTML5 -hi htmlEndTag ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi htmlScriptTag ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi htmlSpecialChar ctermfg=215 ctermbg=NONE cterm=NONE guifg=#FFAF5F guibg=NONE gui=NONE -hi htmlSpecialTagName ctermfg=167 ctermbg=NONE cterm=NONE guifg=#D75F5F guibg=NONE gui=NONE -hi htmlTag ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi htmlTagName ctermfg=167 ctermbg=NONE cterm=NONE guifg=#D75F5F guibg=NONE gui=NONE -hi javaScriptBoolean ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE " JavaScript -hi javaScriptBraces ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi javaScriptConditional ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi javaScriptException ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi javaScriptFunction ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=italic -hi javaScriptGlobal ctermfg=255 ctermbg=NONE cterm=NONE guifg=#EEEEEE guibg=NONE gui=NONE -hi javaScriptIdentifier ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi javaScriptLabel ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi javaScriptMessage ctermfg=255 ctermbg=NONE cterm=NONE guifg=#EEEEEE guibg=NONE gui=NONE -hi javaScriptNull ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi javaScriptNumber ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi javaScriptOperator ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi javaScriptParens ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi javaScriptRegexpString ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi javaScriptRepeat ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi javaScriptSpecial ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi javaScriptStatement ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi markdownCode ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE " Markdown -hi markdownCodeBlock ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi markdownCodeDelimiter ctermfg=247 ctermbg=NONE cterm=NONE guifg=#9E9E9E guibg=NONE gui=NONE -hi markdownError ctermfg=167 ctermbg=NONE cterm=NONE guifg=#D75F5F guibg=NONE gui=NONE -hi markdownHeadingDelimiter ctermfg=150 ctermbg=NONE cterm=NONE guifg=#AFD787 guibg=NONE gui=NONE -hi markdownUrl ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi phpBoolean ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE " PHP -hi phpClass ctermfg=215 ctermbg=NONE cterm=NONE guifg=#FFAF5F guibg=NONE gui=NONE -hi phpClassDelimiter ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi phpClassExtends ctermfg=150 ctermbg=NONE cterm=NONE guifg=#AFD787 guibg=NONE gui=NONE -hi phpClassImplements ctermfg=150 ctermbg=NONE cterm=NONE guifg=#AFD787 guibg=NONE gui=NONE -hi phpCommentStar ctermfg=240 ctermbg=NONE cterm=NONE guifg=#585858 guibg=NONE gui=NONE -hi phpCommentTitle ctermfg=240 ctermbg=NONE cterm=NONE guifg=#585858 guibg=NONE gui=NONE -hi phpDocComment ctermfg=240 ctermbg=NONE cterm=NONE guifg=#585858 guibg=NONE gui=NONE -hi phpDocIdentifier ctermfg=240 ctermbg=NONE cterm=NONE guifg=#585858 guibg=NONE gui=NONE -hi phpDocParam ctermfg=240 ctermbg=NONE cterm=NONE guifg=#585858 guibg=NONE gui=NONE -hi phpDocTags ctermfg=242 ctermbg=NONE cterm=NONE guifg=#666666 guibg=NONE gui=NONE -hi phpFunction ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi phpFunctions ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi phpIdentifier ctermfg=255 ctermbg=NONE cterm=NONE guifg=#EEEEEE guibg=NONE gui=NONE -hi phpInclude ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi phpKeyword ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi phpMethod ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi phpNumber ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi phpOperator ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi phpParent ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi phpMemberSelector ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi phpMethodsVar ctermfg=255 ctermbg=NONE cterm=NONE guifg=#EEEEEE guibg=NONE gui=NONE -hi phpStaticClasses ctermfg=215 ctermbg=NONE cterm=NONE guifg=#FFAF5F guibg=NONE gui=NONE -hi phpStringDouble ctermfg=150 ctermbg=NONE cterm=NONE guifg=#AFD787 guibg=NONE gui=NONE -hi phpStringDelimiter ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi phpStringSingle ctermfg=150 ctermbg=NONE cterm=NONE guifg=#AFD787 guibg=NONE gui=NONE -hi phpSuperglobals ctermfg=255 ctermbg=NONE cterm=NONE guifg=#EEEEEE guibg=NONE gui=NONE -hi phpType ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi phpUseClass ctermfg=215 ctermbg=NONE cterm=NONE guifg=#FFAF5F guibg=NONE gui=NONE -hi phpVarSelector ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi pythonConditional ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE " Python -hi pythonDecorator ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi pythonException ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi pythonFunction ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi pythonInclude ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi pythonNumber ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi pythonOperator ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi pythonRepeat ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi pythonStatement ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi pythonTodo ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi rubyBlockParameter ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE " Ruby -hi rubyClass ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi rubyClassVariable ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi rubyConstant ctermfg=215 ctermbg=NONE cterm=NONE guifg=#FFAF5F guibg=NONE gui=italic -hi rubyControl ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi rubyException ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi rubyFunction ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi rubyInclude ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi rubyInstanceVariable ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi rubyInterpolationDelimiter ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi rubyOperator ctermfg=140 ctermbg=NONE cterm=NONE guifg=#AF87D7 guibg=NONE gui=NONE -hi rubyPseudoVariable ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi rubyRegexp ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi rubyRegexpDelimiter ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi rubyStringDelimiter ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi rubySymbol ctermfg=150 ctermbg=NONE cterm=NONE guifg=#AFD787 guibg=NONE gui=NONE -hi sassClass ctermfg=215 ctermbg=NONE cterm=NONE guifg=#FFAF5F guibg=NONE gui=NONE " Sass -hi sassClassChar ctermfg=215 ctermbg=NONE cterm=NONE guifg=#FFAF5F guibg=NONE gui=NONE -hi sassFunction ctermfg=255 ctermbg=NONE cterm=NONE guifg=#EEEEEE guibg=NONE gui=NONE -hi sassInclude ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi sassVariable ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi shFunction ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE " Shell -hi shOperator ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi shStatement ctermfg=74 ctermbg=NONE cterm=NONE guifg=#5FAFD7 guibg=NONE gui=NONE -hi shTestOpr ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi shVariable ctermfg=255 ctermbg=NONE cterm=NONE guifg=#EEEEEE guibg=NONE gui=NONE -hi xmlAttrib ctermfg=167 ctermbg=NONE cterm=NONE guifg=#D75F5F guibg=NONE gui=NONE " XML -hi xmlCdataStart ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi xmlCdataCdata ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi xmlEndTag ctermfg=167 ctermbg=NONE cterm=NONE guifg=#D75F5F guibg=NONE gui=NONE -hi xmlEntity ctermfg=173 ctermbg=NONE cterm=NONE guifg=#D7875F guibg=NONE gui=NONE -hi xmlEntityPunct ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi xmlEqual ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi xmlProcessingDelim ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi xmlTag ctermfg=117 ctermbg=NONE cterm=NONE guifg=#87D7FF guibg=NONE gui=NONE -hi xmlTagName ctermfg=167 ctermbg=NONE cterm=NONE guifg=#D75F5F guibg=NONE gui=NONE diff --git a/pack/acp/start/rust.vim/.gitignore b/pack/acp/start/rust.vim/.gitignore deleted file mode 100644 index 0a56e3f..0000000 --- a/pack/acp/start/rust.vim/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/doc/tags diff --git a/pack/acp/start/rust.vim/.travis.yml b/pack/acp/start/rust.vim/.travis.yml deleted file mode 100644 index fa69300..0000000 --- a/pack/acp/start/rust.vim/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -sudo: required -services: - - docker -language: generic -script: | - cd test && ./run-tests diff --git a/pack/acp/start/rust.vim/.vintrc.yml b/pack/acp/start/rust.vim/.vintrc.yml deleted file mode 100644 index 0914f1b..0000000 --- a/pack/acp/start/rust.vim/.vintrc.yml +++ /dev/null @@ -1,10 +0,0 @@ -cmdargs: - # Checking more strictly - severity: style_problem - -policies: - # Disable a violation - ProhibitUnnecessaryDoubleQuote: - enabled: false - ProhibitImplicitScopeVariable: - enabled: false diff --git a/pack/acp/start/rust.vim/ISSUE_TEMPLATE.md b/pack/acp/start/rust.vim/ISSUE_TEMPLATE.md deleted file mode 100644 index 10afd15..0000000 --- a/pack/acp/start/rust.vim/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,27 +0,0 @@ - - -* rust.vim version: - -Steps to reproduce: - - -_?_ - -Expected vs. actual behavior: - -_?_ - -Paste debugging info from the Rust Vim plugin via _one_ of the following -commands: `:RustInfo`, `:RustInfoToClipboard`, or `:RustInfoToFile `. - -_?_ diff --git a/pack/acp/start/rust.vim/LICENSE-APACHE b/pack/acp/start/rust.vim/LICENSE-APACHE deleted file mode 100644 index 16fe87b..0000000 --- a/pack/acp/start/rust.vim/LICENSE-APACHE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/pack/acp/start/rust.vim/LICENSE-MIT b/pack/acp/start/rust.vim/LICENSE-MIT deleted file mode 100644 index e69282e..0000000 --- a/pack/acp/start/rust.vim/LICENSE-MIT +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2015 The Rust Project Developers - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/pack/acp/start/rust.vim/README.md b/pack/acp/start/rust.vim/README.md deleted file mode 100644 index aaba3da..0000000 --- a/pack/acp/start/rust.vim/README.md +++ /dev/null @@ -1,107 +0,0 @@ -# rust.vim - -## Description - -This is a Vim plugin that provides [Rust][r] file detection, syntax highlighting, formatting, -[Syntastic][syn] integration, and more. It requires Vim 8 or higher for full functionality. -Some things may not work on earlier versions. - -## Installation - -Use one of the following package managers: - -* [Vim8 packages][vim8pack]: - * `git clone https://github.com/rust-lang/rust.vim ~/.vim/pack/plugins/start/rust.vim` -* [Vundle][v]: - * Add `Plugin 'rust-lang/rust.vim'` to `~/.vimrc` - * `:PluginInstall` or `$ vim +PluginInstall +qall` - * *Note:* Vundle will not automatically detect Rust files properly if `filetype -on` is executed before Vundle. Please check the [quickstart][vqs] for more -details. Errors such as `Not an editor command: RustFmt` may occur if Vundle -is misconfigured with this plugin. -* [Pathogen][p]: - * `git clone --depth=1 https://github.com/rust-lang/rust.vim.git ~/.vim/bundle/rust.vim` -* [vim-plug][vp]: - * Add `Plug 'rust-lang/rust.vim'` to `~/.vimrc` - * `:PlugInstall` or `$ vim +PlugInstall +qall` -* [dein.vim][d]: - * Add `call dein#add('rust-lang/rust.vim')` to `~/.vimrc` - * `:call dein#install()` -* [NeoBundle][nb]: - * Add `NeoBundle 'rust-lang/rust.vim'` to `~/.vimrc` - * Re-open vim or execute `:source ~/.vimrc` - -## Features - -### Error checking with [Syntastic][syn] - -`rust.vim` automatically registers `cargo` as a syntax checker with -[Syntastic][syn], if nothing else is specified. See `:help rust-syntastic` -for more details. - -### Source browsing with [Tagbar][tgbr] - -`rust.vim` has builtin `ctags/` definitions for [Tagbar][tgbr] which -are loaded if Tagbar is installed. - -### Formatting with [rustfmt][rfmt] - -The `:RustFmt` command will format your code with -[rustfmt][rfmt] if installed. - -Placing `let g:rustfmt_autosave = 1` in your `~/.vimrc` will -enable automatic running of `:RustFmt` when you save a buffer. - -Do `:help :RustFmt` for further formatting help and customization -options. - -### [Playpen][pp] integration - -*Note:* This feature requires [webapi-vim][wav] to be installed. - -The `:RustPlay` command will send the current selection, or if -nothing is selected the current buffer, to the [Rust playpen][pp]. - -If you set g:rust_clip_command RustPlay will copy the url to the clipboard. - -- Mac: - - let g:rust_clip_command = 'pbcopy' - -- Linux: - - let g:rust_clip_command = 'xclip -selection clipboard' - -### Running a test under cursor - -In cargo project, the `:RustTest` command will run a test under the cursor. -This is useful when your project is bigger and running all tests take longer time. - -## Help - -Further help can be found in the documentation with `:Helptags` then `:help rust`. - -Detailed help can be found in the documentation with `:help rust`. -Helptags (`:help helptags`) need to be generated for this plugin -in order to navigate the help. Most plugin managers will do this -automatically, but check their documentation if that is not the case. - -## License - -Like Rust, rust.vim is primarily distributed under the terms of both the MIT -license and the Apache License (Version 2.0). See LICENSE-APACHE and -LICENSE-MIT for details. - -[r]: https://www.rust-lang.org -[v]: https://github.com/gmarik/vundle -[vqs]: https://github.com/gmarik/vundle#quick-start -[p]: https://github.com/tpope/vim-pathogen -[nb]: https://github.com/Shougo/neobundle.vim -[vp]: https://github.com/junegunn/vim-plug -[d]: https://github.com/Shougo/dein.vim -[rfmt]: https://github.com/rust-lang-nursery/rustfmt -[syn]: https://github.com/scrooloose/syntastic -[tgbr]: https://github.com/majutsushi/tagbar -[wav]: https://github.com/mattn/webapi-vim -[pp]: https://play.rust-lang.org/ -[vim8pack]: http://vimhelp.appspot.com/repeat.txt.html#packages diff --git a/pack/acp/start/rust.vim/after/syntax/rust.vim b/pack/acp/start/rust.vim/after/syntax/rust.vim deleted file mode 100644 index 62bfc65..0000000 --- a/pack/acp/start/rust.vim/after/syntax/rust.vim +++ /dev/null @@ -1,41 +0,0 @@ -scriptencoding utf-8 - -if !get(g:, 'rust_conceal', 0) || !has('conceal') || &encoding !=# 'utf-8' - finish -endif - -" For those who don't want to see `::`... -if get(g:, 'rust_conceal_mod_path', 0) - syn match rustNiceOperator "::" conceal cchar=ㆍ -endif - -syn match rustRightArrowHead contained ">" conceal cchar=  -syn match rustRightArrowTail contained "-" conceal cchar=⟶ -syn match rustNiceOperator "->" contains=rustRightArrowHead,rustRightArrowTail - -syn match rustFatRightArrowHead contained ">" conceal cchar=  -syn match rustFatRightArrowTail contained "=" conceal cchar=⟹ -syn match rustNiceOperator "=>" contains=rustFatRightArrowHead,rustFatRightArrowTail - -syn match rustNiceOperator /\<\@!_\(_*\>\)\@=/ conceal cchar=′ - -" For those who don't want to see `pub`... -if get(g:, 'rust_conceal_pub', 0) - syn match rustPublicSigil contained "pu" conceal cchar=* - syn match rustPublicRest contained "b" conceal cchar=  - syn match rustNiceOperator "pub " contains=rustPublicSigil,rustPublicRest -endif - -hi link rustNiceOperator Operator - -if !get(g:, 'rust_conceal_mod_path', 0) - hi! link Conceal Operator - - augroup rust.vim.after - autocmd! - " And keep it after a colorscheme change - autocmd ColorScheme hi! link Conceal Operator - augroup END -endif - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/autoload/cargo.vim b/pack/acp/start/rust.vim/autoload/cargo.vim deleted file mode 100644 index b5d40e2..0000000 --- a/pack/acp/start/rust.vim/autoload/cargo.vim +++ /dev/null @@ -1,115 +0,0 @@ -function! cargo#Load() - " Utility call to get this script loaded, for debugging -endfunction - -function! cargo#cmd(args) - execute "! cargo" a:args -endfunction - -function! s:nearest_cargo(...) abort - " If the second argument is not specified, the first argument determines - " whether we will start from the current directory or the directory of the - " current buffer, otherwise, we start with the provided path on the - " second argument. - - let l:is_getcwd = get(a:, 1, 0) - if l:is_getcwd - let l:starting_path = get(a:, 2, getcwd()) - else - let l:starting_path = get(a:, 2, expand('%:p:h')) - endif - - return findfile('Cargo.toml', l:starting_path . ';') -endfunction - -function! cargo#nearestCargo(is_getcwd) abort - return s:nearest_cargo(a:is_getcwd) -endfunction - -function! cargo#nearestWorkspaceCargo(is_getcwd) abort - let l:nearest = s:nearest_cargo(a:is_getcwd) - while l:nearest !=# '' - for l:line in readfile(l:nearest, '', 0x100) - if l:line =~# '\V[workspace]' - return l:nearest - endif - endfor - let l:next = fnamemodify(l:nearest, ':p:h:h') - let l:nearest = s:nearest_cargo(0, l:next) - endwhile - return '' -endfunction - -function! cargo#nearestRootCargo(is_getcwd) abort - " Try to find a workspace Cargo.toml, and if not found, take the nearest - " regular Cargo.toml - let l:workspace_cargo = cargo#nearestWorkspaceCargo(a:is_getcwd) - if l:workspace_cargo !=# '' - return l:workspace_cargo - endif - return s:nearest_cargo(a:is_getcwd) -endfunction - - -function! cargo#build(args) - call cargo#cmd("build " . a:args) -endfunction - -function! cargo#clean(args) - call cargo#cmd("clean " . a:args) -endfunction - -function! cargo#doc(args) - call cargo#cmd("doc " . a:args) -endfunction - -function! cargo#new(args) - call cargo#cmd("new " . a:args) - cd `=a:args` -endfunction - -function! cargo#init(args) - call cargo#cmd("init " . a:args) -endfunction - -function! cargo#run(args) - call cargo#cmd("run " . a:args) -endfunction - -function! cargo#test(args) - call cargo#cmd("test " . a:args) -endfunction - -function! cargo#bench(args) - call cargo#cmd("bench " . a:args) -endfunction - -function! cargo#runtarget(args) - let l:filename = expand('%:p') - let l:read_manifest = system('cargo read-manifest') - let l:metadata = json_decode(l:read_manifest) - let l:targets = get(l:metadata, 'targets', []) - let l:did_run = 0 - for l:target in l:targets - let l:src_path = get(l:target, 'src_path', '') - let l:kinds = get(l:target, 'kind', []) - let l:name = get(l:target, 'name', '') - if l:src_path == l:filename - if index(l:kinds, 'example') != -1 - let l:did_run = 1 - call cargo#run("--example " . shellescape(l:name) . " " . a:args) - return - elseif index(l:kinds, 'bin') != -1 - let l:did_run = 1 - call cargo#run("--bin " . shellescape(l:name) . " " . a:args) - return - endif - endif - endfor - if l:did_run != 1 - call cargo#run(a:args) - return - endif -endfunction - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/autoload/cargo/quickfix.vim b/pack/acp/start/rust.vim/autoload/cargo/quickfix.vim deleted file mode 100644 index fb16fc7..0000000 --- a/pack/acp/start/rust.vim/autoload/cargo/quickfix.vim +++ /dev/null @@ -1,26 +0,0 @@ -function! cargo#quickfix#CmdPre() abort - if &filetype ==# 'rust' && get(b:, 'current_compiler', '') ==# 'cargo' - " Preserve the current directory, and 'lcd' to the nearest Cargo file. - let b:rust_compiler_cargo_qf_has_lcd = haslocaldir() - let b:rust_compiler_cargo_qf_prev_cd = getcwd() - let b:rust_compiler_cargo_qf_prev_cd_saved = 1 - let l:nearest = fnamemodify(cargo#nearestRootCargo(0), ':h') - execute 'lchdir! '.l:nearest - else - let b:rust_compiler_cargo_qf_prev_cd_saved = 0 - endif -endfunction - -function! cargo#quickfix#CmdPost() abort - if exists("b:rust_compiler_cargo_qf_prev_cd_saved") && b:rust_compiler_cargo_qf_prev_cd_saved - " Restore the current directory. - if b:rust_compiler_cargo_qf_has_lcd - execute 'lchdir! '.b:rust_compiler_cargo_qf_prev_cd - else - execute 'chdir! '.b:rust_compiler_cargo_qf_prev_cd - endif - let b:rust_compiler_cargo_qf_prev_cd_saved = 0 - endif -endfunction - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/autoload/rust.vim b/pack/acp/start/rust.vim/autoload/rust.vim deleted file mode 100644 index 4ec13dc..0000000 --- a/pack/acp/start/rust.vim/autoload/rust.vim +++ /dev/null @@ -1,546 +0,0 @@ -" Author: Kevin Ballard -" Description: Helper functions for Rust commands/mappings -" Last Modified: May 27, 2014 -" For bugs, patches and license go to https://github.com/rust-lang/rust.vim - -function! rust#Load() - " Utility call to get this script loaded, for debugging -endfunction - -function! rust#GetConfigVar(name, default) - " Local buffer variable with same name takes predeence over global - if has_key(b:, a:name) - return get(b:, a:name) - endif - if has_key(g:, a:name) - return get(g:, a:name) - endif - return a:default -endfunction - -" Include expression {{{1 - -function! rust#IncludeExpr(fname) abort - " Remove leading 'crate::' to deal with 2018 edition style 'use' - " statements - let l:fname = substitute(a:fname, '^crate::', '', '') - - " Remove trailing colons arising from lines like - " - " use foo::{Bar, Baz}; - let l:fname = substitute(l:fname, ':\+$', '', '') - - " Replace '::' with '/' - let l:fname = substitute(l:fname, '::', '/', 'g') - - " When we have - " - " use foo::bar::baz; - " - " we can't tell whether baz is a module or a function; and we can't tell - " which modules correspond to files. - " - " So we work our way up, trying - " - " foo/bar/baz.rs - " foo/bar.rs - " foo.rs - while l:fname !=# '.' - let l:path = findfile(l:fname) - if !empty(l:path) - return l:fname - endif - let l:fname = fnamemodify(l:fname, ':h') - endwhile - return l:fname -endfunction - -" Jump {{{1 - -function! rust#Jump(mode, function) range - let cnt = v:count1 - normal! m' - if a:mode ==# 'v' - norm! gv - endif - let foldenable = &foldenable - set nofoldenable - while cnt > 0 - execute "call Jump_" . a:function . "()" - let cnt = cnt - 1 - endwhile - let &foldenable = foldenable -endfunction - -function! s:Jump_Back() - call search('{', 'b') - keepjumps normal! w99[{ -endfunction - -function! s:Jump_Forward() - normal! j0 - call search('{', 'b') - keepjumps normal! w99[{% - call search('{') -endfunction - -" Run {{{1 - -function! rust#Run(bang, args) - let args = s:ShellTokenize(a:args) - if a:bang - let idx = index(l:args, '--') - if idx != -1 - let rustc_args = idx == 0 ? [] : l:args[:idx-1] - let args = l:args[idx+1:] - else - let rustc_args = l:args - let args = [] - endif - else - let rustc_args = [] - endif - - let b:rust_last_rustc_args = l:rustc_args - let b:rust_last_args = l:args - - call s:WithPath(function("s:Run"), rustc_args, args) -endfunction - -function! s:Run(dict, rustc_args, args) - let exepath = a:dict.tmpdir.'/'.fnamemodify(a:dict.path, ':t:r') - if has('win32') - let exepath .= '.exe' - endif - - let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path) - let rustc_args = [relpath, '-o', exepath] + a:rustc_args - - let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc" - - let pwd = a:dict.istemp ? a:dict.tmpdir : '' - let output = s:system(pwd, shellescape(rustc) . " " . join(map(rustc_args, 'shellescape(v:val)'))) - if output !=# '' - echohl WarningMsg - echo output - echohl None - endif - if !v:shell_error - exe '!' . shellescape(exepath) . " " . join(map(a:args, 'shellescape(v:val)')) - endif -endfunction - -" Expand {{{1 - -function! rust#Expand(bang, args) - let args = s:ShellTokenize(a:args) - if a:bang && !empty(l:args) - let pretty = remove(l:args, 0) - else - let pretty = "expanded" - endif - call s:WithPath(function("s:Expand"), pretty, args) -endfunction - -function! s:Expand(dict, pretty, args) - try - let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc" - - if a:pretty =~? '^\%(everybody_loops$\|flowgraph=\)' - let flag = '--xpretty' - else - let flag = '--pretty' - endif - let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path) - let args = [relpath, '-Z', 'unstable-options', l:flag, a:pretty] + a:args - let pwd = a:dict.istemp ? a:dict.tmpdir : '' - let output = s:system(pwd, shellescape(rustc) . " " . join(map(args, 'shellescape(v:val)'))) - if v:shell_error - echohl WarningMsg - echo output - echohl None - else - new - silent put =output - 1 - d - setl filetype=rust - setl buftype=nofile - setl bufhidden=hide - setl noswapfile - " give the buffer a nice name - let suffix = 1 - let basename = fnamemodify(a:dict.path, ':t:r') - while 1 - let bufname = basename - if suffix > 1 | let bufname .= ' ('.suffix.')' | endif - let bufname .= '.pretty.rs' - if bufexists(bufname) - let suffix += 1 - continue - endif - exe 'silent noautocmd keepalt file' fnameescape(bufname) - break - endwhile - endif - endtry -endfunction - -function! rust#CompleteExpand(lead, line, pos) - if a:line[: a:pos-1] =~# '^RustExpand!\s*\S*$' - " first argument and it has a ! - let list = ["normal", "expanded", "typed", "expanded,identified", "flowgraph=", "everybody_loops"] - if !empty(a:lead) - call filter(list, "v:val[:len(a:lead)-1] == a:lead") - endif - return list - endif - - return glob(escape(a:lead, "*?[") . '*', 0, 1) -endfunction - -" Emit {{{1 - -function! rust#Emit(type, args) - let args = s:ShellTokenize(a:args) - call s:WithPath(function("s:Emit"), a:type, args) -endfunction - -function! s:Emit(dict, type, args) - try - let output_path = a:dict.tmpdir.'/output' - - let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc" - - let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path) - let args = [relpath, '--emit', a:type, '-o', output_path] + a:args - let pwd = a:dict.istemp ? a:dict.tmpdir : '' - let output = s:system(pwd, shellescape(rustc) . " " . join(map(args, 'shellescape(v:val)'))) - if output !=# '' - echohl WarningMsg - echo output - echohl None - endif - if !v:shell_error - new - exe 'silent keepalt read' fnameescape(output_path) - 1 - d - if a:type ==# "llvm-ir" - setl filetype=llvm - let extension = 'll' - elseif a:type ==# "asm" - setl filetype=asm - let extension = 's' - endif - setl buftype=nofile - setl bufhidden=hide - setl noswapfile - if exists('l:extension') - " give the buffer a nice name - let suffix = 1 - let basename = fnamemodify(a:dict.path, ':t:r') - while 1 - let bufname = basename - if suffix > 1 | let bufname .= ' ('.suffix.')' | endif - let bufname .= '.'.extension - if bufexists(bufname) - let suffix += 1 - continue - endif - exe 'silent noautocmd keepalt file' fnameescape(bufname) - break - endwhile - endif - endif - endtry -endfunction - -" Utility functions {{{1 - -" Invokes func(dict, ...) -" Where {dict} is a dictionary with the following keys: -" 'path' - The path to the file -" 'tmpdir' - The path to a temporary directory that will be deleted when the -" function returns. -" 'istemp' - 1 if the path is a file inside of {dict.tmpdir} or 0 otherwise. -" If {istemp} is 1 then an additional key is provided: -" 'tmpdir_relpath' - The {path} relative to the {tmpdir}. -" -" {dict.path} may be a path to a file inside of {dict.tmpdir} or it may be the -" existing path of the current buffer. If the path is inside of {dict.tmpdir} -" then it is guaranteed to have a '.rs' extension. -function! s:WithPath(func, ...) - let buf = bufnr('') - let saved = {} - let dict = {} - try - let saved.write = &write - set write - let dict.path = expand('%') - let pathisempty = empty(dict.path) - - " Always create a tmpdir in case the wrapped command wants it - let dict.tmpdir = tempname() - call mkdir(dict.tmpdir) - - if pathisempty || !saved.write - let dict.istemp = 1 - " if we're doing this because of nowrite, preserve the filename - if !pathisempty - let filename = expand('%:t:r').".rs" - else - let filename = 'unnamed.rs' - endif - let dict.tmpdir_relpath = filename - let dict.path = dict.tmpdir.'/'.filename - - let saved.mod = &modified - set nomodified - - silent exe 'keepalt write! ' . fnameescape(dict.path) - if pathisempty - silent keepalt 0file - endif - else - let dict.istemp = 0 - update - endif - - call call(a:func, [dict] + a:000) - finally - if bufexists(buf) - for [opt, value] in items(saved) - silent call setbufvar(buf, '&'.opt, value) - unlet value " avoid variable type mismatches - endfor - endif - if has_key(dict, 'tmpdir') | silent call s:RmDir(dict.tmpdir) | endif - endtry -endfunction - -function! rust#AppendCmdLine(text) - call setcmdpos(getcmdpos()) - let cmd = getcmdline() . a:text - return cmd -endfunction - -" Tokenize the string according to sh parsing rules -function! s:ShellTokenize(text) - " states: - " 0: start of word - " 1: unquoted - " 2: unquoted backslash - " 3: double-quote - " 4: double-quoted backslash - " 5: single-quote - let l:state = 0 - let l:current = '' - let l:args = [] - for c in split(a:text, '\zs') - if l:state == 0 || l:state == 1 " unquoted - if l:c ==# ' ' - if l:state == 0 | continue | endif - call add(l:args, l:current) - let l:current = '' - let l:state = 0 - elseif l:c ==# '\' - let l:state = 2 - elseif l:c ==# '"' - let l:state = 3 - elseif l:c ==# "'" - let l:state = 5 - else - let l:current .= l:c - let l:state = 1 - endif - elseif l:state == 2 " unquoted backslash - if l:c !=# "\n" " can it even be \n? - let l:current .= l:c - endif - let l:state = 1 - elseif l:state == 3 " double-quote - if l:c ==# '\' - let l:state = 4 - elseif l:c ==# '"' - let l:state = 1 - else - let l:current .= l:c - endif - elseif l:state == 4 " double-quoted backslash - if stridx('$`"\', l:c) >= 0 - let l:current .= l:c - elseif l:c ==# "\n" " is this even possible? - " skip it - else - let l:current .= '\'.l:c - endif - let l:state = 3 - elseif l:state == 5 " single-quoted - if l:c ==# "'" - let l:state = 1 - else - let l:current .= l:c - endif - endif - endfor - if l:state != 0 - call add(l:args, l:current) - endif - return l:args -endfunction - -function! s:RmDir(path) - " sanity check; make sure it's not empty, /, or $HOME - if empty(a:path) - echoerr 'Attempted to delete empty path' - return 0 - elseif a:path ==# '/' || a:path ==# $HOME - echoerr 'Attempted to delete protected path: ' . a:path - return 0 - endif - return system("rm -rf " . shellescape(a:path)) -endfunction - -" Executes {cmd} with the cwd set to {pwd}, without changing Vim's cwd. -" If {pwd} is the empty string then it doesn't change the cwd. -function! s:system(pwd, cmd) - let cmd = a:cmd - if !empty(a:pwd) - let cmd = 'cd ' . shellescape(a:pwd) . ' && ' . cmd - endif - return system(cmd) -endfunction - -" Playpen Support {{{1 -" Parts of gist.vim by Yasuhiro Matsumoto reused -" gist.vim available under the BSD license, available at -" http://github.com/mattn/gist-vim -function! s:has_webapi() - if !exists("*webapi#http#post") - try - call webapi#http#post() - catch - endtry - endif - return exists("*webapi#http#post") -endfunction - -function! rust#Play(count, line1, line2, ...) abort - redraw - - let l:rust_playpen_url = get(g:, 'rust_playpen_url', 'https://play.rust-lang.org/') - let l:rust_shortener_url = get(g:, 'rust_shortener_url', 'https://is.gd/') - - if !s:has_webapi() - echohl ErrorMsg | echomsg ':RustPlay depends on webapi.vim (https://github.com/mattn/webapi-vim)' | echohl None - return - endif - - let bufname = bufname('%') - if a:count < 1 - let content = join(getline(a:line1, a:line2), "\n") - else - let save_regcont = @" - let save_regtype = getregtype('"') - silent! normal! gvy - let content = @" - call setreg('"', save_regcont, save_regtype) - endif - - let url = l:rust_playpen_url."?code=".webapi#http#encodeURI(content) - - if strlen(url) > 5000 - echohl ErrorMsg | echomsg 'Buffer too large, max 5000 encoded characters ('.strlen(url).')' | echohl None - return - endif - - let payload = "format=simple&url=".webapi#http#encodeURI(url) - let res = webapi#http#post(l:rust_shortener_url.'create.php', payload, {}) - if res.status[0] ==# '2' - let url = res.content - endif - - let footer = '' - if exists('g:rust_clip_command') - call system(g:rust_clip_command, url) - if !v:shell_error - let footer = ' (copied to clipboard)' - endif - endif - redraw | echomsg 'Done: '.url.footer -endfunction - -" Run a test under the cursor or all tests {{{1 - -" Finds a test function name under the cursor. Returns empty string when a -" test function is not found. -function! s:SearchTestFunctionNameUnderCursor() abort - let cursor_line = line('.') - - " Find #[test] attribute - if search('\m\C#\[test\]', 'bcW') is 0 - return '' - endif - - " Move to an opening brace of the test function - let test_func_line = search('\m\C^\s*fn\s\+\h\w*\s*(.\+{$', 'eW') - if test_func_line is 0 - return '' - endif - - " Search the end of test function (closing brace) to ensure that the - " cursor position is within function definition - normal! % - if line('.') < cursor_line - return '' - endif - - return matchstr(getline(test_func_line), '\m\C^\s*fn\s\+\zs\h\w*') -endfunction - -function! rust#Test(all, options) abort - let manifest = findfile('Cargo.toml', expand('%:p:h') . ';') - if manifest ==# '' - return rust#Run(1, '--test ' . a:options) - endif - - if exists(':terminal') - let cmd = 'terminal ' - else - let cmd = '!' - let manifest = shellescape(manifest) - endif - - if a:all - if a:options ==# '' - execute cmd . 'cargo test --manifest-path' manifest - else - execute cmd . 'cargo test --manifest-path' manifest a:options - endif - return - endif - - let saved = getpos('.') - try - let func_name = s:SearchTestFunctionNameUnderCursor() - if func_name ==# '' - echohl ErrorMsg - echo 'No test function was found under the cursor. Please add ! to command if you want to run all tests' - echohl None - return - endif - if a:options ==# '' - execute cmd . 'cargo test --manifest-path' manifest func_name - else - execute cmd . 'cargo test --manifest-path' manifest func_name a:options - endif - return - finally - call setpos('.', saved) - endtry -endfunction - -" }}}1 - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/autoload/rust/debugging.vim b/pack/acp/start/rust.vim/autoload/rust/debugging.vim deleted file mode 100644 index ae307a0..0000000 --- a/pack/acp/start/rust.vim/autoload/rust/debugging.vim +++ /dev/null @@ -1,101 +0,0 @@ -" For debugging, inspired by https://github.com/w0rp/rust/blob/master/autoload/rust/debugging.vim - -let s:global_variable_list = [ - \ 'ftplugin_rust_source_path', - \ 'loaded_syntastic_rust_cargo_checker', - \ 'loaded_syntastic_rust_filetype', - \ 'loaded_syntastic_rust_rustc_checker', - \ 'rust_bang_comment_leader', - \ 'rust_cargo_avoid_whole_workspace', - \ 'rust_clip_command', - \ 'rust_conceal', - \ 'rust_conceal_mod_path', - \ 'rust_conceal_pub', - \ 'rust_fold', - \ 'rust_last_args', - \ 'rust_last_rustc_args', - \ 'rust_original_delimitMate_excluded_regions', - \ 'rust_playpen_url', - \ 'rust_prev_delimitMate_quotes', - \ 'rust_recent_nearest_cargo_tol', - \ 'rust_recent_root_cargo_toml', - \ 'rust_recommended_style', - \ 'rust_set_conceallevel', - \ 'rust_set_conceallevel=1', - \ 'rust_set_foldmethod', - \ 'rust_set_foldmethod=1', - \ 'rust_shortener_url', - \ 'rustc_makeprg_no_percent', - \ 'rustc_path', - \ 'rustfmt_autosave', - \ 'rustfmt_autosave_because_of_config', - \ 'rustfmt_autosave_if_config_present', - \ 'rustfmt_command', - \ 'rustfmt_emit_files', - \ 'rustfmt_fail_silently', - \ 'rustfmt_options', - \ 'syntastic_extra_filetypes', - \ 'syntastic_rust_cargo_fname', - \] - -function! s:Echo(message) abort - execute 'echo a:message' -endfunction - -function! s:EchoGlobalVariables() abort - for l:key in s:global_variable_list - call s:Echo('let g:' . l:key . ' = ' . string(get(g:, l:key, v:null))) - - if has_key(b:, l:key) - call s:Echo('let b:' . l:key . ' = ' . string(b:[l:key])) - endif - endfor -endfunction - -function! rust#debugging#Info() abort - call cargo#Load() - call rust#Load() - call rustfmt#Load() - call s:Echo('rust.vim Global Variables:') - call s:Echo('') - call s:EchoGlobalVariables() - - silent let l:output = system(g:rustfmt_command . ' --version') - echo l:output - - let l:rustc = exists("g:rustc_path") ? g:rustc_path : "rustc" - silent let l:output = system(l:rustc . ' --version') - echo l:output - - silent let l:output = system('cargo --version') - echo l:output - - version - - if exists(":SyntasticInfo") - echo "----" - echo "Info from Syntastic:" - execute "SyntasticInfo" - endif -endfunction - -function! rust#debugging#InfoToClipboard() abort - redir @" - silent call rust#debugging#Info() - redir END - - call s:Echo('RustInfo copied to your clipboard') -endfunction - -function! rust#debugging#InfoToFile(filename) abort - let l:expanded_filename = expand(a:filename) - - redir => l:output - silent call rust#debugging#Info() - redir END - - call writefile(split(l:output, "\n"), l:expanded_filename) - call s:Echo('RustInfo written to ' . l:expanded_filename) -endfunction - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/autoload/rust/delimitmate.vim b/pack/acp/start/rust.vim/autoload/rust/delimitmate.vim deleted file mode 100644 index 7056d53..0000000 --- a/pack/acp/start/rust.vim/autoload/rust/delimitmate.vim +++ /dev/null @@ -1,44 +0,0 @@ -let s:delimitMate_extra_excluded_regions = ',rustLifetimeCandidate,rustGenericLifetimeCandidate' - -" For this buffer, when delimitMate issues the `User delimitMate_map` -" event in the autocommand system, add the above-defined extra excluded -" regions to delimitMate's state, if they have not already been added. -function! rust#delimitmate#onMap() abort - if &filetype !=# 'rust' - return - endif - - if get(b:, "delimitMate_quotes") - let b:rust_prev_delimitMate_quotes = b:delimitMate_quotes - endif - let b:delimitMate_quotes = "\" `" - - if match(delimitMate#Get("excluded_regions"), - \ s:delimitMate_extra_excluded_regions) == -1 - call delimitMate#Set("excluded_regions", - \delimitMate#Get("excluded_regions").s:delimitMate_extra_excluded_regions) - endif -endfunction - -" For this buffer, when delimitMate issues the `User delimitMate_unmap` -" event in the autocommand system, delete the above-defined extra excluded -" regions from delimitMate's state (the deletion being idempotent and -" having no effect if the extra excluded regions are not present in the -" targeted part of delimitMate's state). -function! rust#delimitmate#onUnmap() abort - if &filetype !=# 'rust' - return - endif - - if get(b:, "rust_prev_delimitMate_quotes") - let b:delimitMate_quotes = b:rust_prev_delimitMate_quotes - endif - - call delimitMate#Set("excluded_regions", substitute( - \ delimitMate#Get("excluded_regions"), - \ '\C\V' . s:delimitMate_extra_excluded_regions, - \ '', 'g')) -endfunction - -" vim: set et sw=4 sts=4 ts=8: - diff --git a/pack/acp/start/rust.vim/autoload/rustfmt.vim b/pack/acp/start/rust.vim/autoload/rustfmt.vim deleted file mode 100644 index 650f212..0000000 --- a/pack/acp/start/rust.vim/autoload/rustfmt.vim +++ /dev/null @@ -1,257 +0,0 @@ -" Author: Stephen Sugden -" -" Adapted from https://github.com/fatih/vim-go -" For bugs, patches and license go to https://github.com/rust-lang/rust.vim - -if !exists("g:rustfmt_autosave") - let g:rustfmt_autosave = 0 -endif - -if !exists("g:rustfmt_command") - let g:rustfmt_command = "rustfmt" -endif - -if !exists("g:rustfmt_options") - let g:rustfmt_options = "" -endif - -if !exists("g:rustfmt_fail_silently") - let g:rustfmt_fail_silently = 0 -endif - -function! rustfmt#DetectVersion() - " Save rustfmt '--help' for feature inspection - silent let s:rustfmt_help = system(g:rustfmt_command . " --help") - let s:rustfmt_unstable_features = s:rustfmt_help =~# "--unstable-features" - - " Build a comparable rustfmt version varible out of its `--version` output: - silent let l:rustfmt_version_full = system(g:rustfmt_command . " --version") - let l:rustfmt_version_list = matchlist(l:rustfmt_version_full, - \ '\vrustfmt ([0-9]+[.][0-9]+[.][0-9]+)') - if len(l:rustfmt_version_list) < 3 - let s:rustfmt_version = "0" - else - let s:rustfmt_version = l:rustfmt_version_list[1] - endif - return s:rustfmt_version -endfunction - -call rustfmt#DetectVersion() - -if !exists("g:rustfmt_emit_files") - let g:rustfmt_emit_files = s:rustfmt_version >= "0.8.2" -endif - -if !exists("g:rustfmt_file_lines") - let g:rustfmt_file_lines = s:rustfmt_help =~# "--file-lines JSON" -endif - -let s:got_fmt_error = 0 - -function! rustfmt#Load() - " Utility call to get this script loaded, for debugging -endfunction - -function! s:RustfmtWriteMode() - if g:rustfmt_emit_files - return "--emit=files" - else - return "--write-mode=overwrite" - endif -endfunction - -function! s:RustfmtConfig() - let l:rustfmt_toml = findfile('rustfmt.toml', expand('%:p:h') . ';') - if l:rustfmt_toml !=# '' - return '--config-path '.l:rustfmt_toml - endif - - let l:_rustfmt_toml = findfile('.rustfmt.toml', expand('%:p:h') . ';') - if l:_rustfmt_toml !=# '' - return '--config-path '.l:_rustfmt_toml - endif - - return '' -endfunction - -function! s:RustfmtCommandRange(filename, line1, line2) - if g:rustfmt_file_lines == 0 - echo "--file-lines is not supported in the installed `rustfmt` executable" - return - endif - - let l:arg = {"file": shellescape(a:filename), "range": [a:line1, a:line2]} - let l:write_mode = s:RustfmtWriteMode() - let l:rustfmt_config = s:RustfmtConfig() - - " FIXME: When --file-lines gets to be stable, add version range checking - " accordingly. - let l:unstable_features = s:rustfmt_unstable_features ? '--unstable-features' : '' - - let l:cmd = printf("%s %s %s %s %s --file-lines '[%s]' %s", g:rustfmt_command, - \ l:write_mode, g:rustfmt_options, - \ l:unstable_features, l:rustfmt_config, - \ json_encode(l:arg), shellescape(a:filename)) - return l:cmd -endfunction - -function! s:RustfmtCommand() - if g:rustfmt_emit_files - let l:write_mode = "--emit=stdout" - else - let l:write_mode = "--write-mode=display" - endif - " rustfmt will pick on the right config on its own due to the - " current directory change. - return g:rustfmt_command . " ". l:write_mode . " " . g:rustfmt_options -endfunction - -function! s:DeleteLines(start, end) abort - silent! execute a:start . ',' . a:end . 'delete _' -endfunction - -function! s:RunRustfmt(command, tmpname, fail_silently) - mkview! - - let l:stderr_tmpname = tempname() - call writefile([], l:stderr_tmpname) - - let l:command = a:command . ' 2> ' . l:stderr_tmpname - - if a:tmpname ==# '' - " Rustfmt in stdin/stdout mode - - " chdir to the directory of the file - let l:has_lcd = haslocaldir() - let l:prev_cd = getcwd() - execute 'lchdir! '.expand('%:h') - - let l:buffer = getline(1, '$') - if exists("*systemlist") - silent let out = systemlist(l:command, l:buffer) - else - silent let out = split(system(l:command, - \ join(l:buffer, "\n")), '\r\?\n') - endif - else - if exists("*systemlist") - silent let out = systemlist(l:command) - else - silent let out = split(system(l:command), '\r\?\n') - endif - endif - - let l:stderr = readfile(l:stderr_tmpname) - - call delete(l:stderr_tmpname) - - let l:open_lwindow = 0 - if v:shell_error == 0 - " remove undo point caused via BufWritePre - try | silent undojoin | catch | endtry - - if a:tmpname ==# '' - let l:content = l:out - else - " take the tmpfile's content, this is better than rename - " because it preserves file modes. - let l:content = readfile(a:tmpname) - endif - - call s:DeleteLines(len(l:content), line('$')) - call setline(1, l:content) - - " only clear location list if it was previously filled to prevent - " clobbering other additions - if s:got_fmt_error - let s:got_fmt_error = 0 - call setloclist(0, []) - let l:open_lwindow = 1 - endif - elseif g:rustfmt_fail_silently == 0 && a:fail_silently == 0 - " otherwise get the errors and put them in the location list - let l:errors = [] - - let l:prev_line = "" - for l:line in l:stderr - " error: expected one of `;` or `as`, found `extern` - " --> src/main.rs:2:1 - let tokens = matchlist(l:line, '^\s\+-->\s\(.\{-}\):\(\d\+\):\(\d\+\)$') - if !empty(tokens) - call add(l:errors, {"filename": @%, - \"lnum": tokens[2], - \"col": tokens[3], - \"text": l:prev_line}) - endif - let l:prev_line = l:line - endfor - - if !empty(l:errors) - call setloclist(0, l:errors, 'r') - echohl Error | echomsg "rustfmt returned error" | echohl None - else - echo "rust.vim: was not able to parse rustfmt messages. Here is the raw output:" - echo "\n" - for l:line in l:stderr - echo l:line - endfor - endif - - let s:got_fmt_error = 1 - let l:open_lwindow = 1 - endif - - " Restore the current directory if needed - if a:tmpname ==# '' - if l:has_lcd - execute 'lchdir! '.l:prev_cd - else - execute 'chdir! '.l:prev_cd - endif - endif - - " Open lwindow after we have changed back to the previous directory - if l:open_lwindow == 1 - lwindow - endif - - silent! loadview -endfunction - -function! rustfmt#FormatRange(line1, line2) - let l:tmpname = tempname() - call writefile(getline(1, '$'), l:tmpname) - let command = s:RustfmtCommandRange(l:tmpname, a:line1, a:line2) - call s:RunRustfmt(command, l:tmpname, 0) - call delete(l:tmpname) -endfunction - -function! rustfmt#Format() - call s:RunRustfmt(s:RustfmtCommand(), '', 0) -endfunction - -function! rustfmt#Cmd() - " Mainly for debugging - return s:RustfmtCommand() -endfunction - -function! rustfmt#PreWrite() - if !filereadable(expand("%@")) - return - endif - if rust#GetConfigVar('rustfmt_autosave_if_config_present', 0) - if findfile('rustfmt.toml', '.;') !=# '' || findfile('.rustfmt.toml', '.;') !=# '' - let b:rustfmt_autosave = 1 - let b:rustfmt_autosave_because_of_config = 1 - endif - endif - - if !rust#GetConfigVar("rustfmt_autosave", 0) - return - endif - - call s:RunRustfmt(s:RustfmtCommand(), '', 1) -endfunction - - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/compiler/cargo.vim b/pack/acp/start/rust.vim/compiler/cargo.vim deleted file mode 100644 index 87de609..0000000 --- a/pack/acp/start/rust.vim/compiler/cargo.vim +++ /dev/null @@ -1,49 +0,0 @@ -" Vim compiler file -" Compiler: Cargo Compiler -" Maintainer: Damien Radtke -" Latest Revision: 2014 Sep 24 -" For bugs, patches and license go to https://github.com/rust-lang/rust.vim - -if exists('current_compiler') - finish -endif -runtime compiler/rustc.vim -let current_compiler = "cargo" - -" vint: -ProhibitAbbreviationOption -let s:save_cpo = &cpo -set cpo&vim -" vint: +ProhibitAbbreviationOption - -if exists(':CompilerSet') != 2 - command -nargs=* CompilerSet setlocal -endif - -if exists('g:cargo_makeprg_params') - execute 'CompilerSet makeprg=cargo\ '.escape(g:cargo_makeprg_params, ' \|"').'\ $*' -else - CompilerSet makeprg=cargo\ $* -endif - -augroup RustCargoQuickFixHooks - autocmd! - autocmd QuickFixCmdPre make call cargo#quickfix#CmdPre() - autocmd QuickFixCmdPost make call cargo#quickfix#CmdPost() -augroup END - -" Ignore general cargo progress messages -CompilerSet errorformat+= - \%-G%\\s%#Downloading%.%#, - \%-G%\\s%#Compiling%.%#, - \%-G%\\s%#Finished%.%#, - \%-G%\\s%#error:\ Could\ not\ compile\ %.%#, - \%-G%\\s%#To\ learn\ more\\,%.%#, - \%-Gnote:\ Run\ with\ \`RUST_BACKTRACE=%.%#, - \%.%#panicked\ at\ \\'%m\\'\\,\ %f:%l:%c - -" vint: -ProhibitAbbreviationOption -let &cpo = s:save_cpo -unlet s:save_cpo -" vint: +ProhibitAbbreviationOption - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/compiler/rustc.vim b/pack/acp/start/rust.vim/compiler/rustc.vim deleted file mode 100644 index 6114b74..0000000 --- a/pack/acp/start/rust.vim/compiler/rustc.vim +++ /dev/null @@ -1,53 +0,0 @@ -" Vim compiler file -" Compiler: Rust Compiler -" Maintainer: Chris Morgan -" Latest Revision: 2013 Jul 12 -" For bugs, patches and license go to https://github.com/rust-lang/rust.vim - -if exists("current_compiler") - finish -endif -let current_compiler = "rustc" - -" vint: -ProhibitAbbreviationOption -let s:save_cpo = &cpo -set cpo&vim -" vint: +ProhibitAbbreviationOption - -if exists(":CompilerSet") != 2 - command -nargs=* CompilerSet setlocal -endif - -if get(g:, 'rustc_makeprg_no_percent', 0) - CompilerSet makeprg=rustc -else - CompilerSet makeprg=rustc\ \% -endif - -" New errorformat (after nightly 2016/08/10) -CompilerSet errorformat= - \%-G, - \%-Gerror:\ aborting\ %.%#, - \%-Gerror:\ Could\ not\ compile\ %.%#, - \%Eerror:\ %m, - \%Eerror[E%n]:\ %m, - \%Wwarning:\ %m, - \%Inote:\ %m, - \%C\ %#-->\ %f:%l:%c, - \%E\ \ left:%m,%C\ right:%m\ %f:%l:%c,%Z - -" Old errorformat (before nightly 2016/08/10) -CompilerSet errorformat+= - \%f:%l:%c:\ %t%*[^:]:\ %m, - \%f:%l:%c:\ %*\\d:%*\\d\ %t%*[^:]:\ %m, - \%-G%f:%l\ %s, - \%-G%*[\ ]^, - \%-G%*[\ ]^%*[~], - \%-G%*[\ ]... - -" vint: -ProhibitAbbreviationOption -let &cpo = s:save_cpo -unlet s:save_cpo -" vint: +ProhibitAbbreviationOption - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/ctags/rust.ctags b/pack/acp/start/rust.vim/ctags/rust.ctags deleted file mode 100644 index d4f474e..0000000 --- a/pack/acp/start/rust.vim/ctags/rust.ctags +++ /dev/null @@ -1,11 +0,0 @@ ---langdef=Rust ---langmap=Rust:.rs ---regex-Rust=/^[ \t]*(#\[[^\]]\][ \t]*)*(pub[ \t]+)?(extern[ \t]+)?("[^"]+"[ \t]+)?(unsafe[ \t]+)?fn[ \t]+([a-zA-Z0-9_]+)/\6/f,functions,function definitions/ ---regex-Rust=/^[ \t]*(pub[ \t]+)?type[ \t]+([a-zA-Z0-9_]+)/\2/T,types,type definitions/ ---regex-Rust=/^[ \t]*(pub[ \t]+)?enum[ \t]+([a-zA-Z0-9_]+)/\2/g,enum,enumeration names/ ---regex-Rust=/^[ \t]*(pub[ \t]+)?struct[ \t]+([a-zA-Z0-9_]+)/\2/s,structure names/ ---regex-Rust=/^[ \t]*(pub[ \t]+)?mod[ \t]+([a-zA-Z0-9_]+)/\2/m,modules,module names/ ---regex-Rust=/^[ \t]*(pub[ \t]+)?(static|const)[ \t]+([a-zA-Z0-9_]+)/\3/c,consts,static constants/ ---regex-Rust=/^[ \t]*(pub[ \t]+)?trait[ \t]+([a-zA-Z0-9_]+)/\2/t,traits,traits/ ---regex-Rust=/^[ \t]*(pub[ \t]+)?impl([ \t\n]*<[^>]*>)?[ \t]+(([a-zA-Z0-9_:]+)[ \t]*(<[^>]*>)?[ \t]+(for)[ \t]+)?([a-zA-Z0-9_]+)/\4 \6 \7/i,impls,trait implementations/ ---regex-Rust=/^[ \t]*macro_rules![ \t]+([a-zA-Z0-9_]+)/\1/d,macros,macro definitions/ diff --git a/pack/acp/start/rust.vim/doc/rust.txt b/pack/acp/start/rust.vim/doc/rust.txt deleted file mode 100644 index b11d418..0000000 --- a/pack/acp/start/rust.vim/doc/rust.txt +++ /dev/null @@ -1,463 +0,0 @@ -*ft_rust.txt* Filetype plugin for Rust - -============================================================================== -CONTENTS *rust* - -1. Introduction |rust-intro| -2. Settings |rust-settings| -3. Commands |rust-commands| -4. Mappings |rust-mappings| - -============================================================================== -INTRODUCTION *rust-intro* - -This plugin provides syntax and supporting functionality for the Rust -filetype. It requires Vim 8 or higher for full functionality. Some commands -will not work on earlier versions. - -============================================================================== -SETTINGS *rust-settings* - -This plugin has a few variables you can define in your vimrc that change the -behavior of the plugin. - -Some variables can be set buffer local (`:b` prefix), and the buffer local -will take precedence over the global `g:` counterpart. - - *g:rustc_path* -g:rustc_path~ - Set this option to the path to rustc for use in the |:RustRun| and - |:RustExpand| commands. If unset, "rustc" will be located in $PATH: > - let g:rustc_path = $HOME."/bin/rustc" -< - - *g:rustc_makeprg_no_percent* -g:rustc_makeprg_no_percent~ - Set this option to 1 to have 'makeprg' default to "rustc" instead of - "rustc %": > - let g:rustc_makeprg_no_percent = 1 -< - - *g:rust_conceal* -g:rust_conceal~ - Set this option to turn on the basic |conceal| support: > - let g:rust_conceal = 1 -< - - *g:rust_conceal_mod_path* -g:rust_conceal_mod_path~ - Set this option to turn on |conceal| for the path connecting token - "::": > - let g:rust_conceal_mod_path = 1 -< - - *g:rust_conceal_pub* -g:rust_conceal_pub~ - Set this option to turn on |conceal| for the "pub" token: > - let g:rust_conceal_pub = 1 -< - - *g:rust_recommended_style* -g:rust_recommended_style~ - Set this option to enable vim indentation and textwidth settings to - conform to style conventions of the rust standard library (i.e. use 4 - spaces for indents and sets 'textwidth' to 99). This option is enabled - by default. To disable it: > - let g:rust_recommended_style = 0 -< - - *g:rust_fold* -g:rust_fold~ - Set this option to turn on |folding|: > - let g:rust_fold = 1 -< - Value Effect ~ - 0 No folding - 1 Braced blocks are folded. All folds are open by - default. - 2 Braced blocks are folded. 'foldlevel' is left at the - global value (all folds are closed by default). - - *g:rust_bang_comment_leader* -g:rust_bang_comment_leader~ - Set this option to 1 to preserve the leader on multi-line doc comments - using the /*! syntax: > - let g:rust_bang_comment_leader = 1 -< - - *g:rust_use_custom_ctags_defs* -g:rust_use_custom_ctags_defs~ - Set this option to 1 if you have customized ctags definitions for Rust - and do not wish for those included with rust.vim to be used: > - let g:rust_use_custom_ctags_defs = 1 -< - Note that rust.vim's built-in definitions are only used for the Tagbar - Vim plugin, if you have it installed--it is not automatically used - when generating |tags| files that Vim can use to navigate to - definitions across different source files. Feel free to copy - `rust.vim/ctags/rust.ctags` into your own `~/.ctags` if you wish to - generate |tags| files. - - - *g:ftplugin_rust_source_path* -g:ftplugin_rust_source_path~ - Set this option to a path that should be prepended to 'path' for Rust - source files: > - let g:ftplugin_rust_source_path = $HOME.'/dev/rust' -< - - *g:rustfmt_command* -g:rustfmt_command~ - Set this option to the name of the 'rustfmt' executable in your $PATH. If - not specified it defaults to 'rustfmt' : > - let g:rustfmt_command = 'rustfmt' -< - *g:rustfmt_autosave* -g:rustfmt_autosave~ - Set this option to 1 to run |:RustFmt| automatically when saving a - buffer. If not specified it defaults to 0 : > - let g:rustfmt_autosave = 0 -< - There is also a buffer-local b:rustfmt_autosave that can be set for - the same purpose, and can override the global setting. - - *g:rustfmt_autosave_if_config_present* -g:rustfmt_autosave_if_config_present~ - Set this option to 1 to to have *b:rustfmt_autosave* be set automatically - if a `rustfmt.toml` file is present in any parent directly leading to - the file being edited. If not set, default to 0: > - - let g:rustfmt_autosave_if_config_present = 0 -< - This is useful to have `rustfmt` only execute on save, on projects - that have `rustfmt.toml` configuration. - - There is also a buffer-local b:rustfmt_autosave_if_config_present - that can be set for the same purpose, which can overrides the global - setting. - *g:rustfmt_fail_silently* -g:rustfmt_fail_silently~ - Set this option to 1 to prevent 'rustfmt' from populating the - |location-list| with errors. If not specified it defaults to 0: > - let g:rustfmt_fail_silently = 0 -< - *g:rustfmt_options* -g:rustfmt_options~ - Set this option to a string of options to pass to 'rustfmt'. The - write-mode is already set to 'overwrite'. If not specified it - defaults to '' : > - let g:rustfmt_options = '' -< - *g:rustfmt_emit_files* -g:rustfmt_emit_files~ - If not specified rust.vim tries to detect the right parameter to - pass to rustfmt based on its reported version. Otherwise, it - determines whether to run rustfmt with '--emit=files' (when 1 is - provided) instead of '--write-mode=overwrite'. > - let g:rustfmt_emit_files = 0 - - *g:rust_playpen_url* -g:rust_playpen_url~ - Set this option to override the url for the playpen to use: > - let g:rust_playpen_url = 'https://play.rust-lang.org/' -< - - *g:rust_shortener_url* -g:rust_shortener_url~ - Set this option to override the url for the url shortener: > - let g:rust_shortener_url = 'https://is.gd/' -< - - *g:rust_clip_command* -g:rust_clip_command~ - Set this option to the command used in your OS to copy the Rust Play - url to the clipboard: > - let g:rust_clip_command = 'xclip -selection clipboard' -< - - *g:cargo_makeprg_params* -g:cargo_makeprg_params~ - Set this option to the string of parameters to pass to cargo. If not - specified it defaults to '$*' : > - let g:cargo_makeprg_params = 'build' -< - - -Integration with Syntastic *rust-syntastic* --------------------------- - -This plugin automatically integrates with the Syntastic checker. There are two -checkers provided: 'rustc', and 'cargo'. The later invokes 'Cargo' in order to -build code, and the former delivers a single edited '.rs' file as a compilation -target directly to the Rust compiler, `rustc`. - -Because Cargo is almost exclusively being used for building Rust code these -days, 'cargo' is the default checker. > - - let g:syntastic_rust_checkers = ['cargo'] -< -If you would like to change it, you can set `g:syntastic_rust_checkers` to a -different value. - *g:rust_cargo_avoid_whole_workspace* - *b:rust_cargo_avoid_whole_workspace* -g:rust_cargo_avoid_whole_workspace~ - When editing a crate that is part of a Cargo workspace, and this - option is set to 1 (the default), then 'cargo' will be executed - directly in that crate directory instead of in the workspace - directory. Setting 0 prevents this behavior - however be aware that if - you are working in large workspace, Cargo commands may take more time, - plus the Syntastic error list may include all the crates in the - workspace. > - let g:rust_cargo_avoid_whole_workspace = 0 -< - *g:rust_cargo_check_all_targets* - *b:rust_cargo_check_all_targets* -g:rust_cargo_check_all_targets~ - When set to 1, the `--all-targets` option will be passed to cargo when - Syntastic executes it, allowing the linting of all targets under the - package. - The default is 0. - - *g:rust_cargo_check_all_features* - *b:rust_cargo_check_all_features* -g:rust_cargo_check_all_features~ - When set to 1, the `--all-features` option will be passed to cargo when - Syntastic executes it, allowing the linting of all features of the - package. - The default is 0. - - *g:rust_cargo_check_examples* - *b:rust_cargo_check_examples* -g:rust_cargo_check_examples~ - When set to 1, the `--examples` option will be passed to cargo when - Syntastic executes it, to prevent the exclusion of examples from - linting. The examples are normally under the `examples/` directory of - the crate. - The default is 0. - - *g:rust_cargo_check_tests* - *b:rust_cargo_check_tests* -g:rust_cargo_check_tests~ - When set to 1, the `--tests` option will be passed to cargo when - Syntastic executes it, to prevent the exclusion of tests from linting. - The tests are normally under the `tests/` directory of the crate. - The default is 0. - - *g:rust_cargo_check_benches* - *b:rust_cargo_check_benches* -g:rust_cargo_check_benches~ - When set to 1, the `--benches` option will be passed to cargo when - Syntastic executes it. The benches are normally under the `benches/` - directory of the crate. - The default is 0. - -Integration with auto-pairs *rust-auto-pairs* ---------------------------- - -This plugin automatically configures the auto-pairs plugin not to duplicate -single quotes, which are used more often for lifetime annotations than for -single character literals. - - *g:rust_keep_autopairs_default* -g:rust_keep_autopairs_default~ - - Don't override auto-pairs default for the Rust filetype. The default - is 0. - -============================================================================== -COMMANDS *rust-commands* - -Invoking Cargo --------------- - -This plug defines very simple shortcuts for invoking Cargo from with Vim. - -:Cargo *:Cargo* - Runs 'cargo' with the provided arguments. - -:Cbuild *:Cbuild* - Shortcut for 'cargo build`. - -:Cclean *:Cclean* - Shortcut for 'cargo clean`. - -:Cdoc *:Cdoc* - Shortcut for 'cargo doc`. - -:Cinit *:Cinit* - Shortcut for 'cargo init`. - -:Crun *:Crun* - Shortcut for 'cargo run`. - -:Ctest *:Ctest* - Shortcut for 'cargo test`. - -:Cupdate *:Cupdate* - Shortcut for 'cargo update`. - -:Cbench *:Cbench* - Shortcut for 'cargo bench`. - -:Csearch *:Csearch* - Shortcut for 'cargo search`. - -:Cpublish *:Cpublish* - Shortcut for 'cargo publish`. - -:Cinstall *:Cinstall* - Shortcut for 'cargo install`. - -:Cruntarget *:Cruntarget* - Shortcut for 'cargo run --bin' or 'cargo run --example', - depending on the currently open buffer. - -Formatting ----------- - -:RustFmt *:RustFmt* - Runs |g:rustfmt_command| on the current buffer. If - |g:rustfmt_options| is set then those will be passed to the - executable. - - If |g:rustfmt_fail_silently| is 0 (the default) then it - will populate the |location-list| with the errors from - |g:rustfmt_command|. If |g:rustfmt_fail_silently| is set to 1 - then it will not populate the |location-list|. - -:RustFmtRange *:RustFmtRange* - Runs |g:rustfmt_command| with selected range. See - |:RustFmt| for any other information. - - -Playpen integration -------------------- - -:RustPlay *:RustPlay* - This command will only work if you have web-api.vim installed - (available at https://github.com/mattn/webapi-vim). It sends the - current selection, or if nothing is selected, the entirety of the - current buffer to the Rust playpen, and emits a message with the - shortened URL to the playpen. - - |g:rust_playpen_url| is the base URL to the playpen, by default - "https://play.rust-lang.org/". - - |g:rust_shortener_url| is the base url for the shorterner, by - default "https://is.gd/" - - |g:rust_clip_command| is the command to run to copy the - playpen url to the clipboard of your system. - -Evaulation of a single Rust file --------------------------------- - -NOTE: These commands are useful only when working with standalone Rust files, -which is usually not the case for common Rust development. If you wish to -building Rust crates from with Vim can should use Vim's make, Syntastic, or -functionality from other plugins. - - -:RustRun [args] *:RustRun* -:RustRun! [rustc-args] [--] [args] - Compiles and runs the current file. If it has unsaved changes, - it will be saved first using |:update|. If the current file is - an unnamed buffer, it will be written to a temporary file - first. The compiled binary is always placed in a temporary - directory, but is run from the current directory. - - The arguments given to |:RustRun| will be passed to the - compiled binary. - - If ! is specified, the arguments are passed to rustc instead. - A "--" argument will separate the rustc arguments from the - arguments passed to the binary. - - If |g:rustc_path| is defined, it is used as the path to rustc. - Otherwise it is assumed rustc can be found in $PATH. - -:RustExpand [args] *:RustExpand* -:RustExpand! [TYPE] [args] - Expands the current file using --pretty and displays the - results in a new split. If the current file has unsaved - changes, it will be saved first using |:update|. If the - current file is an unnamed buffer, it will be written to a - temporary file first. - - The arguments given to |:RustExpand| will be passed to rustc. - This is largely intended for specifying various --cfg - configurations. - - If ! is specified, the first argument is the expansion type to - pass to rustc --pretty. Otherwise it will default to - "expanded". - - If |g:rustc_path| is defined, it is used as the path to rustc. - Otherwise it is assumed rustc can be found in $PATH. - -:RustEmitIr [args] *:RustEmitIr* - Compiles the current file to LLVM IR and displays the results - in a new split. If the current file has unsaved changes, it - will be saved first using |:update|. If the current file is an - unnamed buffer, it will be written to a temporary file first. - - The arguments given to |:RustEmitIr| will be passed to rustc. - - If |g:rustc_path| is defined, it is used as the path to rustc. - Otherwise it is assumed rustc can be found in $PATH. - -:RustEmitAsm [args] *:RustEmitAsm* - Compiles the current file to assembly and displays the results - in a new split. If the current file has unsaved changes, it - will be saved first using |:update|. If the current file is an - unnamed buffer, it will be written to a temporary file first. - - The arguments given to |:RustEmitAsm| will be passed to rustc. - - If |g:rustc_path| is defined, it is used as the path to rustc. - Otherwise it is assumed rustc can be found in $PATH. - - -Running test(s) ---------------- - -:RustTest[!] [options] *:RustTest* - Runs a test under the cursor when the current buffer is in a - cargo project with "cargo test" command. If the command did - not find any test function under the cursor, it stops with an - error message. - - When ! is given, runs all tests regardless of current cursor - position. - - When [options] is given, it is passed to "cargo" command - arguments. - - When the current buffer is outside cargo project, the command - runs "rustc --test" command instead of "cargo test" as - fallback. All tests are run regardless of adding ! since there - is no way to run specific test function with rustc. [options] - is passed to "rustc" command arguments in the case. - - -rust.vim Debugging ------------------- - -:RustInfo *:RustInfo* - Emits debugging info of the Vim Rust plugin. - -:RustInfoToClipboard *:RustInfoClipboard* - Saves debugging info of the Vim Rust plugin to the default - register. - -:RustInfoToFile [filename] *:RustInfoToFile* - Saves debugging info of the Vim Rust plugin to the the given - file, overwritting it. - -============================================================================== -MAPPINGS *rust-mappings* - -This plugin defines mappings for |[[| and |]]| to support hanging indents. - -============================================================================== - vim:tw=78:sw=4:noet:ts=8:ft=help:norl: diff --git a/pack/acp/start/rust.vim/ftdetect/rust.vim b/pack/acp/start/rust.vim/ftdetect/rust.vim deleted file mode 100644 index d552b96..0000000 --- a/pack/acp/start/rust.vim/ftdetect/rust.vim +++ /dev/null @@ -1,12 +0,0 @@ -" vint: -ProhibitAutocmdWithNoGroup - -autocmd BufRead,BufNewFile *.rs call s:set_rust_filetype() -autocmd BufRead,BufNewFile Cargo.toml setf FALLBACK cfg - -function! s:set_rust_filetype() abort - if &filetype !=# 'rust' - set filetype=rust - endif -endfunction - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/ftplugin/rust.vim b/pack/acp/start/rust.vim/ftplugin/rust.vim deleted file mode 100644 index adf2d4b..0000000 --- a/pack/acp/start/rust.vim/ftplugin/rust.vim +++ /dev/null @@ -1,201 +0,0 @@ -" Language: Rust -" Description: Vim ftplugin for Rust -" Maintainer: Chris Morgan -" Maintainer: Kevin Ballard -" Last Change: June 08, 2016 -" For bugs, patches and license go to https://github.com/rust-lang/rust.vim - -if exists("b:did_ftplugin") - finish -endif -let b:did_ftplugin = 1 - -" vint: -ProhibitAbbreviationOption -let s:save_cpo = &cpo -set cpo&vim -" vint: +ProhibitAbbreviationOption - -if get(b:, 'current_compiler', '') ==# '' - if strlen(findfile('Cargo.toml', '.;')) > 0 - compiler cargo - else - compiler rustc - endif -endif - -" Variables {{{1 - -" The rust source code at present seems to typically omit a leader on /*! -" comments, so we'll use that as our default, but make it easy to switch. -" This does not affect indentation at all (I tested it with and without -" leader), merely whether a leader is inserted by default or not. -if get(g:, 'rust_bang_comment_leader', 0) - " Why is the `,s0:/*,mb:\ ,ex:*/` there, you ask? I don't understand why, - " but without it, */ gets indented one space even if there were no - " leaders. I'm fairly sure that's a Vim bug. - setlocal comments=s1:/*,mb:*,ex:*/,s0:/*,mb:\ ,ex:*/,:///,://!,:// -else - setlocal comments=s0:/*!,m:\ ,ex:*/,s1:/*,mb:*,ex:*/,:///,://!,:// -endif -setlocal commentstring=//%s -setlocal formatoptions-=t formatoptions+=croqnl -" j was only added in 7.3.541, so stop complaints about its nonexistence -silent! setlocal formatoptions+=j - -" smartindent will be overridden by indentexpr if filetype indent is on, but -" otherwise it's better than nothing. -setlocal smartindent nocindent - -if get(g:, 'rust_recommended_style', 1) - let b:rust_set_style = 1 - setlocal tabstop=8 shiftwidth=4 softtabstop=4 expandtab - setlocal textwidth=99 -endif - -setlocal include=\\v^\\s*(pub\\s+)?use\\s+\\zs(\\f\|:)+ -setlocal includeexpr=rust#IncludeExpr(v:fname) - -setlocal suffixesadd=.rs - -if exists("g:ftplugin_rust_source_path") - let &l:path=g:ftplugin_rust_source_path . ',' . &l:path -endif - -if exists("g:loaded_delimitMate") - if exists("b:delimitMate_excluded_regions") - let b:rust_original_delimitMate_excluded_regions = b:delimitMate_excluded_regions - endif - - augroup rust.vim.DelimitMate - autocmd! - - autocmd User delimitMate_map :call rust#delimitmate#onMap() - autocmd User delimitMate_unmap :call rust#delimitmate#onUnmap() - augroup END -endif - -" Integration with auto-pairs (https://github.com/jiangmiao/auto-pairs) -if exists("g:AutoPairsLoaded") && !get(g:, 'rust_keep_autopairs_default', 0) - let b:AutoPairs = {'(':')', '[':']', '{':'}','"':'"', '`':'`'} -endif - -if has("folding") && get(g:, 'rust_fold', 0) - let b:rust_set_foldmethod=1 - setlocal foldmethod=syntax - if g:rust_fold == 2 - setlocal foldlevel< - else - setlocal foldlevel=99 - endif -endif - -if has('conceal') && get(g:, 'rust_conceal', 0) - let b:rust_set_conceallevel=1 - setlocal conceallevel=2 -endif - -" Motion Commands {{{1 - -" Bind motion commands to support hanging indents -nnoremap [[ :call rust#Jump('n', 'Back') -nnoremap ]] :call rust#Jump('n', 'Forward') -xnoremap [[ :call rust#Jump('v', 'Back') -xnoremap ]] :call rust#Jump('v', 'Forward') -onoremap [[ :call rust#Jump('o', 'Back') -onoremap ]] :call rust#Jump('o', 'Forward') - -" Commands {{{1 - -" See |:RustRun| for docs -command! -nargs=* -complete=file -bang -buffer RustRun call rust#Run(0, ) - -" See |:RustExpand| for docs -command! -nargs=* -complete=customlist,rust#CompleteExpand -bang -buffer RustExpand call rust#Expand(0, ) - -" See |:RustEmitIr| for docs -command! -nargs=* -buffer RustEmitIr call rust#Emit("llvm-ir", ) - -" See |:RustEmitAsm| for docs -command! -nargs=* -buffer RustEmitAsm call rust#Emit("asm", ) - -" See |:RustPlay| for docs -command! -range=% RustPlay :call rust#Play(, , , ) - -" See |:RustFmt| for docs -command! -buffer RustFmt call rustfmt#Format() - -" See |:RustFmtRange| for docs -command! -range -buffer RustFmtRange call rustfmt#FormatRange(, ) - -" See |:RustInfo| for docs -command! -bar RustInfo call rust#debugging#Info() - -" See |:RustInfoToClipboard| for docs -command! -bar RustInfoToClipboard call rust#debugging#InfoToClipboard() - -" See |:RustInfoToFile| for docs -command! -bar -nargs=1 RustInfoToFile call rust#debugging#InfoToFile() - -" See |:RustTest| for docs -command! -buffer -nargs=* -bang RustTest call rust#Test(0, ) - -if !exists("b:rust_last_rustc_args") || !exists("b:rust_last_args") - let b:rust_last_rustc_args = [] - let b:rust_last_args = [] -endif - -" Cleanup {{{1 - -let b:undo_ftplugin = " - \ setlocal formatoptions< comments< commentstring< include< includeexpr< suffixesadd< - \|if exists('b:rust_set_style') - \|setlocal tabstop< shiftwidth< softtabstop< expandtab< textwidth< - \|endif - \|if exists('b:rust_original_delimitMate_excluded_regions') - \|let b:delimitMate_excluded_regions = b:rust_original_delimitMate_excluded_regions - \|unlet b:rust_original_delimitMate_excluded_regions - \|else - \|unlet! b:delimitMate_excluded_regions - \|endif - \|if exists('b:rust_set_foldmethod') - \|setlocal foldmethod< foldlevel< - \|unlet b:rust_set_foldmethod - \|endif - \|if exists('b:rust_set_conceallevel') - \|setlocal conceallevel< - \|unlet b:rust_set_conceallevel - \|endif - \|unlet! b:rust_last_rustc_args b:rust_last_args - \|delcommand RustRun - \|delcommand RustExpand - \|delcommand RustEmitIr - \|delcommand RustEmitAsm - \|delcommand RustPlay - \|nunmap [[ - \|nunmap ]] - \|xunmap [[ - \|xunmap ]] - \|ounmap [[ - \|ounmap ]] - \|setlocal matchpairs-=<:> - \|unlet b:match_skip - \" - -" }}}1 - -" Code formatting on save -augroup rust.vim.PreWrite - autocmd! - autocmd BufWritePre *.rs silent! call rustfmt#PreWrite() -augroup END - -setlocal matchpairs+=<:> -" For matchit.vim (rustArrow stops `Fn() -> X` messing things up) -let b:match_skip = 's:comment\|string\|rustArrow' - -" vint: -ProhibitAbbreviationOption -let &cpo = s:save_cpo -unlet s:save_cpo -" vint: +ProhibitAbbreviationOption - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/ftplugin/rust/tagbar.vim b/pack/acp/start/rust.vim/ftplugin/rust/tagbar.vim deleted file mode 100644 index 9cb1b48..0000000 --- a/pack/acp/start/rust.vim/ftplugin/rust/tagbar.vim +++ /dev/null @@ -1,40 +0,0 @@ -" -" Support for Tagbar -- https://github.com/majutsushi/tagbar -" -if !exists(':Tagbar') - finish -endif - -" vint: -ProhibitAbbreviationOption -let s:save_cpo = &cpo -set cpo&vim -" vint: +ProhibitAbbreviationOption - -if !exists('g:tagbar_type_rust') - let g:tagbar_type_rust = { - \ 'ctagstype' : 'rust', - \ 'kinds' : [ - \'T:types', - \'f:functions', - \'g:enumerations', - \'s:structures', - \'m:modules', - \'c:constants', - \'t:traits', - \'i:trait implementations', - \ ] - \ } -endif - -" In case you've updated/customized your ~/.ctags and prefer to use it. -if !get(g:, 'rust_use_custom_ctags_defs', 0) - let g:tagbar_type_rust.deffile = expand(':p:h:h:h') . '/ctags/rust.ctags' -endif - -" vint: -ProhibitAbbreviationOption -let &cpo = s:save_cpo -unlet s:save_cpo -" vint: +ProhibitAbbreviationOption - - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/indent/rust.vim b/pack/acp/start/rust.vim/indent/rust.vim deleted file mode 100644 index 91192c3..0000000 --- a/pack/acp/start/rust.vim/indent/rust.vim +++ /dev/null @@ -1,219 +0,0 @@ -" Vim indent file -" Language: Rust -" Author: Chris Morgan -" Last Change: 2018 Jan 10 -" For bugs, patches and license go to https://github.com/rust-lang/rust.vim - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal cindent -setlocal cinoptions=L0,(0,Ws,J1,j1,m1 -setlocal cinkeys=0{,0},!^F,o,O,0[,0] -" Don't think cinwords will actually do anything at all... never mind -setlocal cinwords=for,if,else,while,loop,impl,mod,unsafe,trait,struct,enum,fn,extern,macro - -" Some preliminary settings -setlocal nolisp " Make sure lisp indenting doesn't supersede us -setlocal autoindent " indentexpr isn't much help otherwise -" Also do indentkeys, otherwise # gets shoved to column 0 :-/ -setlocal indentkeys=0{,0},!^F,o,O,0[,0] - -setlocal indentexpr=GetRustIndent(v:lnum) - -" Only define the function once. -if exists("*GetRustIndent") - finish -endif - -" vint: -ProhibitAbbreviationOption -let s:save_cpo = &cpo -set cpo&vim -" vint: +ProhibitAbbreviationOption - -" Come here when loading the script the first time. - -function! s:get_line_trimmed(lnum) - " Get the line and remove a trailing comment. - " Use syntax highlighting attributes when possible. - " NOTE: this is not accurate; /* */ or a line continuation could trick it - let line = getline(a:lnum) - let line_len = strlen(line) - if has('syntax_items') - " If the last character in the line is a comment, do a binary search for - " the start of the comment. synID() is slow, a linear search would take - " too long on a long line. - if synIDattr(synID(a:lnum, line_len, 1), "name") =~? 'Comment\|Todo' - let min = 1 - let max = line_len - while min < max - let col = (min + max) / 2 - if synIDattr(synID(a:lnum, col, 1), "name") =~? 'Comment\|Todo' - let max = col - else - let min = col + 1 - endif - endwhile - let line = strpart(line, 0, min - 1) - endif - return substitute(line, "\s*$", "", "") - else - " Sorry, this is not complete, nor fully correct (e.g. string "//"). - " Such is life. - return substitute(line, "\s*//.*$", "", "") - endif -endfunction - -function! s:is_string_comment(lnum, col) - if has('syntax_items') - for id in synstack(a:lnum, a:col) - let synname = synIDattr(id, "name") - if synname ==# "rustString" || synname =~# "^rustComment" - return 1 - endif - endfor - else - " without syntax, let's not even try - return 0 - endif -endfunction - -function GetRustIndent(lnum) - - " Starting assumption: cindent (called at the end) will do it right - " normally. We just want to fix up a few cases. - - let line = getline(a:lnum) - - if has('syntax_items') - let synname = synIDattr(synID(a:lnum, 1, 1), "name") - if synname ==# "rustString" - " If the start of the line is in a string, don't change the indent - return -1 - elseif synname =~? '\(Comment\|Todo\)' - \ && line !~# '^\s*/\*' " not /* opening line - if synname =~? "CommentML" " multi-line - if line !~# '^\s*\*' && getline(a:lnum - 1) =~# '^\s*/\*' - " This is (hopefully) the line after a /*, and it has no - " leader, so the correct indentation is that of the - " previous line. - return GetRustIndent(a:lnum - 1) - endif - endif - " If it's in a comment, let cindent take care of it now. This is - " for cases like "/*" where the next line should start " * ", not - " "* " as the code below would otherwise cause for module scope - " Fun fact: " /*\n*\n*/" takes two calls to get right! - return cindent(a:lnum) - endif - endif - - " cindent gets second and subsequent match patterns/struct members wrong, - " as it treats the comma as indicating an unfinished statement:: - " - " match a { - " b => c, - " d => e, - " f => g, - " }; - - " Search backwards for the previous non-empty line. - let prevlinenum = prevnonblank(a:lnum - 1) - let prevline = s:get_line_trimmed(prevlinenum) - while prevlinenum > 1 && prevline !~# '[^[:blank:]]' - let prevlinenum = prevnonblank(prevlinenum - 1) - let prevline = s:get_line_trimmed(prevlinenum) - endwhile - - " Handle where clauses nicely: subsequent values should line up nicely. - if prevline[len(prevline) - 1] ==# "," - \ && prevline =~# '^\s*where\s' - return indent(prevlinenum) + 6 - endif - - if prevline[len(prevline) - 1] ==# "," - \ && s:get_line_trimmed(a:lnum) !~# '^\s*[\[\]{}]' - \ && prevline !~# '^\s*fn\s' - \ && prevline !~# '([^()]\+,$' - \ && s:get_line_trimmed(a:lnum) !~# '^\s*\S\+\s*=>' - " Oh ho! The previous line ended in a comma! I bet cindent will try to - " take this too far... For now, let's normally use the previous line's - " indent. - - " One case where this doesn't work out is where *this* line contains - " square or curly brackets; then we normally *do* want to be indenting - " further. - " - " Another case where we don't want to is one like a function - " definition with arguments spread over multiple lines: - " - " fn foo(baz: Baz, - " baz: Baz) // <-- cindent gets this right by itself - " - " Another case is similar to the previous, except calling a function - " instead of defining it, or any conditional expression that leaves - " an open paren: - " - " foo(baz, - " baz); - " - " if baz && (foo || - " bar) { - " - " Another case is when the current line is a new match arm. - " - " There are probably other cases where we don't want to do this as - " well. Add them as needed. - return indent(prevlinenum) - endif - - if !has("patch-7.4.355") - " cindent before 7.4.355 doesn't do the module scope well at all; e.g.:: - " - " static FOO : &'static [bool] = [ - " true, - " false, - " false, - " true, - " ]; - " - " uh oh, next statement is indented further! - - " Note that this does *not* apply the line continuation pattern properly; - " that's too hard to do correctly for my liking at present, so I'll just - " start with these two main cases (square brackets and not returning to - " column zero) - - call cursor(a:lnum, 1) - if searchpair('{\|(', '', '}\|)', 'nbW', - \ 's:is_string_comment(line("."), col("."))') == 0 - if searchpair('\[', '', '\]', 'nbW', - \ 's:is_string_comment(line("."), col("."))') == 0 - " Global scope, should be zero - return 0 - else - " At the module scope, inside square brackets only - "if getline(a:lnum)[0] == ']' || search('\[', '', '\]', 'nW') == a:lnum - if line =~# "^\\s*]" - " It's the closing line, dedent it - return 0 - else - return &shiftwidth - endif - endif - endif - endif - - " Fall back on cindent, which does it mostly right - return cindent(a:lnum) -endfunction - -" vint: -ProhibitAbbreviationOption -let &cpo = s:save_cpo -unlet s:save_cpo -" vint: +ProhibitAbbreviationOption - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/plugin/cargo.vim b/pack/acp/start/rust.vim/plugin/cargo.vim deleted file mode 100644 index 5cd413c..0000000 --- a/pack/acp/start/rust.vim/plugin/cargo.vim +++ /dev/null @@ -1,26 +0,0 @@ -if exists('g:loaded_rust_vim_plugin_cargo') - finish -endif -let g:loaded_rust_vim_plugin_cargo = 1 -let s:save_cpo = &cpoptions -set cpoptions&vim - -command! -nargs=+ Cargo call cargo#cmd() -command! -nargs=* Cbuild call cargo#build() -command! -nargs=* Cclean call cargo#clean() -command! -nargs=* Cdoc call cargo#doc() -command! -nargs=+ Cnew call cargo#new() -command! -nargs=* Cinit call cargo#init() -command! -nargs=* Crun call cargo#run() -command! -nargs=* Ctest call cargo#test() -command! -nargs=* Cbench call cargo#bench() -command! -nargs=* Cupdate call cargo#update() -command! -nargs=* Csearch call cargo#search() -command! -nargs=* Cpublish call cargo#publish() -command! -nargs=* Cinstall call cargo#install() -command! -nargs=* Cruntarget call cargo#runtarget() - -let &cpoptions = s:save_cpo -unlet s:save_cpo - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/plugin/rust.vim b/pack/acp/start/rust.vim/plugin/rust.vim deleted file mode 100644 index 5fe77cc..0000000 --- a/pack/acp/start/rust.vim/plugin/rust.vim +++ /dev/null @@ -1,28 +0,0 @@ -" Vim syntastic plugin helper -" Language: Rust -" Maintainer: Andrew Gallant - -if exists('g:loaded_rust_vim') - finish -endif -let g:loaded_rust_vim = 1 -let s:save_cpo = &cpoptions -set cpoptions&vim - -" This is to let Syntastic know about the Rust filetype. -" It enables tab completion for the 'SyntasticInfo' command. -" (This does not actually register the syntax checker.) -if exists('g:syntastic_extra_filetypes') - call add(g:syntastic_extra_filetypes, 'rust') -else - let g:syntastic_extra_filetypes = ['rust'] -endif - -if !exists('g:syntastic_rust_checkers') - let g:syntastic_rust_checkers = ['cargo'] -endif - -let &cpoptions = s:save_cpo -unlet s:save_cpo - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/syntax/rust.vim b/pack/acp/start/rust.vim/syntax/rust.vim deleted file mode 100644 index 4a419f4..0000000 --- a/pack/acp/start/rust.vim/syntax/rust.vim +++ /dev/null @@ -1,351 +0,0 @@ -" Vim syntax file -" Language: Rust -" Maintainer: Patrick Walton -" Maintainer: Ben Blum -" Maintainer: Chris Morgan -" Last Change: Feb 24, 2016 -" For bugs, patches and license go to https://github.com/rust-lang/rust.vim - -if version < 600 - syntax clear -elseif exists("b:current_syntax") - finish -endif - -" Syntax definitions {{{1 -" Basic keywords {{{2 -syn keyword rustConditional match if else -syn keyword rustRepeat for loop while -syn keyword rustTypedef type nextgroup=rustIdentifier skipwhite skipempty -syn keyword rustStructure struct enum nextgroup=rustIdentifier skipwhite skipempty -syn keyword rustUnion union nextgroup=rustIdentifier skipwhite skipempty contained -syn match rustUnionContextual /\/ - -syn keyword rustPubScopeCrate crate contained -syn match rustPubScopeDelim /[()]/ contained -syn match rustPubScope /([^()]*)/ contained contains=rustPubScopeDelim,rustPubScopeCrate,rustSuper,rustModPath,rustModPathSep,rustSelf transparent - -syn keyword rustExternCrate crate contained nextgroup=rustIdentifier,rustExternCrateString skipwhite skipempty -" This is to get the `bar` part of `extern crate "foo" as bar;` highlighting. -syn match rustExternCrateString /".*"\_s*as/ contained nextgroup=rustIdentifier skipwhite transparent skipempty contains=rustString,rustOperator -syn keyword rustObsoleteExternMod mod contained nextgroup=rustIdentifier skipwhite skipempty - -syn match rustIdentifier contains=rustIdentifierPrime "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained -syn match rustFuncName "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained - -syn region rustBoxPlacement matchgroup=rustBoxPlacementParens start="(" end=")" contains=TOP contained -" Ideally we'd have syntax rules set up to match arbitrary expressions. Since -" we don't, we'll just define temporary contained rules to handle balancing -" delimiters. -syn region rustBoxPlacementBalance start="(" end=")" containedin=rustBoxPlacement transparent -syn region rustBoxPlacementBalance start="\[" end="\]" containedin=rustBoxPlacement transparent -" {} are handled by rustFoldBraces - -syn region rustMacroRepeat matchgroup=rustMacroRepeatDelimiters start="$(" end=")" contains=TOP nextgroup=rustMacroRepeatCount -syn match rustMacroRepeatCount ".\?[*+]" contained -syn match rustMacroVariable "$\w\+" - -" Reserved (but not yet used) keywords {{{2 -syn keyword rustReservedKeyword alignof become do offsetof priv pure sizeof typeof unsized abstract virtual final override - -" Built-in types {{{2 -syn keyword rustType isize usize char bool u8 u16 u32 u64 u128 f32 -syn keyword rustType f64 i8 i16 i32 i64 i128 str Self - -" Things from the libstd v1 prelude (src/libstd/prelude/v1.rs) {{{2 -" This section is just straight transformation of the contents of the prelude, -" to make it easy to update. - -" Reexported core operators {{{3 -syn keyword rustTrait Copy Send Sized Sync -syn keyword rustTrait Drop Fn FnMut FnOnce - -" Reexported functions {{{3 -" There’s no point in highlighting these; when one writes drop( or drop::< it -" gets the same highlighting anyway, and if someone writes `let drop = …;` we -" don’t really want *that* drop to be highlighted. -"syn keyword rustFunction drop - -" Reexported types and traits {{{3 -syn keyword rustTrait Box -syn keyword rustTrait ToOwned -syn keyword rustTrait Clone -syn keyword rustTrait PartialEq PartialOrd Eq Ord -syn keyword rustTrait AsRef AsMut Into From -syn keyword rustTrait Default -syn keyword rustTrait Iterator Extend IntoIterator -syn keyword rustTrait DoubleEndedIterator ExactSizeIterator -syn keyword rustEnum Option -syn keyword rustEnumVariant Some None -syn keyword rustEnum Result -syn keyword rustEnumVariant Ok Err -syn keyword rustTrait SliceConcatExt -syn keyword rustTrait String ToString -syn keyword rustTrait Vec - -" Other syntax {{{2 -syn keyword rustSelf self -syn keyword rustBoolean true false - -" If foo::bar changes to foo.bar, change this ("::" to "\."). -" If foo::bar changes to Foo::bar, change this (first "\w" to "\u"). -syn match rustModPath "\w\(\w\)*::[^<]"he=e-3,me=e-3 -syn match rustModPathSep "::" - -syn match rustFuncCall "\w\(\w\)*("he=e-1,me=e-1 -syn match rustFuncCall "\w\(\w\)*::<"he=e-3,me=e-3 " foo::(); - -" This is merely a convention; note also the use of [A-Z], restricting it to -" latin identifiers rather than the full Unicode uppercase. I have not used -" [:upper:] as it depends upon 'noignorecase' -"syn match rustCapsIdent display "[A-Z]\w\(\w\)*" - -syn match rustOperator display "\%(+\|-\|/\|*\|=\|\^\|&\||\|!\|>\|<\|%\)=\?" -" This one isn't *quite* right, as we could have binary-& with a reference -syn match rustSigil display /&\s\+[&~@*][^)= \t\r\n]/he=e-1,me=e-1 -syn match rustSigil display /[&~@*][^)= \t\r\n]/he=e-1,me=e-1 -" This isn't actually correct; a closure with no arguments can be `|| { }`. -" Last, because the & in && isn't a sigil -syn match rustOperator display "&&\|||" -" This is rustArrowCharacter rather than rustArrow for the sake of matchparen, -" so it skips the ->; see http://stackoverflow.com/a/30309949 for details. -syn match rustArrowCharacter display "->" -syn match rustQuestionMark display "?\([a-zA-Z]\+\)\@!" - -syn match rustMacro '\w\(\w\)*!' contains=rustAssert,rustPanic -syn match rustMacro '#\w\(\w\)*' contains=rustAssert,rustPanic - -syn match rustEscapeError display contained /\\./ -syn match rustEscape display contained /\\\([nrt0\\'"]\|x\x\{2}\)/ -syn match rustEscapeUnicode display contained /\\u{\%(\x_*\)\{1,6}}/ -syn match rustStringContinuation display contained /\\\n\s*/ -syn region rustString start=+b"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeError,rustStringContinuation -syn region rustString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustStringContinuation,@Spell -syn region rustString start='b\?r\z(#*\)"' end='"\z1' contains=@Spell - -syn region rustAttribute start="#!\?\[" end="\]" contains=rustString,rustDerive,rustCommentLine,rustCommentBlock,rustCommentLineDocError,rustCommentBlockDocError -syn region rustDerive start="derive(" end=")" contained contains=rustDeriveTrait -" This list comes from src/libsyntax/ext/deriving/mod.rs -" Some are deprecated (Encodable, Decodable) or to be removed after a new snapshot (Show). -syn keyword rustDeriveTrait contained Clone Hash RustcEncodable RustcDecodable Encodable Decodable PartialEq Eq PartialOrd Ord Rand Show Debug Default FromPrimitive Send Sync Copy - -" dyn keyword: It's only a keyword when used inside a type expression, so -" we make effort here to highlight it only when Rust identifiers follow it -" (not minding the case of pre-2018 Rust where a path starting with :: can -" follow). -" -" This is so that uses of dyn variable names such as in 'let &dyn = &2' -" and 'let dyn = 2' will not get highlighted as a keyword. -syn match rustKeyword "\/ contains=rustGenericLifetimeCandidate -syn region rustGenericLifetimeCandidate display start=/\%(<\|,\s*\)\@<='/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime - -"rustLifetime must appear before rustCharacter, or chars will get the lifetime highlighting -syn match rustLifetime display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" -syn match rustLabel display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*:" -syn match rustCharacterInvalid display contained /b\?'\zs[\n\r\t']\ze'/ -" The groups negated here add up to 0-255 but nothing else (they do not seem to go beyond ASCII). -syn match rustCharacterInvalidUnicode display contained /b'\zs[^[:cntrl:][:graph:][:alnum:][:space:]]\ze'/ -syn match rustCharacter /b'\([^\\]\|\\\(.\|x\x\{2}\)\)'/ contains=rustEscape,rustEscapeError,rustCharacterInvalid,rustCharacterInvalidUnicode -syn match rustCharacter /'\([^\\]\|\\\(.\|x\x\{2}\|u{\%(\x_*\)\{1,6}}\)\)'/ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustCharacterInvalid - -syn match rustShebang /\%^#![^[].*/ -syn region rustCommentLine start="//" end="$" contains=rustTodo,@Spell -syn region rustCommentLineDoc start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell -syn region rustCommentLineDocError start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell contained -syn region rustCommentBlock matchgroup=rustCommentBlock start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell -syn region rustCommentBlockDoc matchgroup=rustCommentBlockDoc start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNest,rustCommentBlockDocRustCode,@Spell -syn region rustCommentBlockDocError matchgroup=rustCommentBlockDocError start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNestError,@Spell contained -syn region rustCommentBlockNest matchgroup=rustCommentBlock start="/\*" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell contained transparent -syn region rustCommentBlockDocNest matchgroup=rustCommentBlockDoc start="/\*" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell contained transparent -syn region rustCommentBlockDocNestError matchgroup=rustCommentBlockDocError start="/\*" end="\*/" contains=rustTodo,rustCommentBlockDocNestError,@Spell contained transparent - -" FIXME: this is a really ugly and not fully correct implementation. Most -" importantly, a case like ``/* */*`` should have the final ``*`` not being in -" a comment, but in practice at present it leaves comments open two levels -" deep. But as long as you stay away from that particular case, I *believe* -" the highlighting is correct. Due to the way Vim's syntax engine works -" (greedy for start matches, unlike Rust's tokeniser which is searching for -" the earliest-starting match, start or end), I believe this cannot be solved. -" Oh you who would fix it, don't bother with things like duplicating the Block -" rules and putting ``\*\@:p:h/rust.vim - unlet b:current_syntax_embed - - " Currently regions marked as ``` will not get - " highlighted at all. In the future, we can do as vim-markdown does and - " highlight with the other syntax. But for now, let's make sure we find - " the closing block marker, because the rules below won't catch it. - syn region rustCommentLinesDocNonRustCode matchgroup=rustCommentDocCodeFence start='^\z(\s*//[!/]\s*```\).\+$' end='^\z1$' keepend contains=rustCommentLineDoc - - " We borrow the rules from rust’s src/librustdoc/html/markdown.rs, so that - " we only highlight as Rust what it would perceive as Rust (almost; it’s - " possible to trick it if you try hard, and indented code blocks aren’t - " supported because Markdown is a menace to parse and only mad dogs and - " Englishmen would try to handle that case correctly in this syntax file). - syn region rustCommentLinesDocRustCode matchgroup=rustCommentDocCodeFence start='^\z(\s*//[!/]\s*```\)[^A-Za-z0-9_-]*\%(\%(should_panic\|no_run\|ignore\|allow_fail\|rust\|test_harness\|compile_fail\|E\d\{4}\|edition201[58]\)\%([^A-Za-z0-9_-]\+\|$\)\)*$' end='^\z1$' keepend contains=@RustCodeInComment,rustCommentLineDocLeader - syn region rustCommentBlockDocRustCode matchgroup=rustCommentDocCodeFence start='^\z(\%(\s*\*\)\?\s*```\)[^A-Za-z0-9_-]*\%(\%(should_panic\|no_run\|ignore\|allow_fail\|rust\|test_harness\|compile_fail\|E\d\{4}\|edition201[58]\)\%([^A-Za-z0-9_-]\+\|$\)\)*$' end='^\z1$' keepend contains=@RustCodeInComment,rustCommentBlockDocStar - " Strictly, this may or may not be correct; this code, for example, would - " mishighlight: - " - " /** - " ```rust - " println!("{}", 1 - " * 1); - " ``` - " */ - " - " … but I don’t care. Balance of probability, and all that. - syn match rustCommentBlockDocStar /^\s*\*\s\?/ contained - syn match rustCommentLineDocLeader "^\s*//\%(//\@!\|!\)" contained -endif - -" Default highlighting {{{1 -hi def link rustDecNumber rustNumber -hi def link rustHexNumber rustNumber -hi def link rustOctNumber rustNumber -hi def link rustBinNumber rustNumber -hi def link rustIdentifierPrime rustIdentifier -hi def link rustTrait rustType -hi def link rustDeriveTrait rustTrait - -hi def link rustMacroRepeatCount rustMacroRepeatDelimiters -hi def link rustMacroRepeatDelimiters Macro -hi def link rustMacroVariable Define -hi def link rustSigil StorageClass -hi def link rustEscape Special -hi def link rustEscapeUnicode rustEscape -hi def link rustEscapeError Error -hi def link rustStringContinuation Special -hi def link rustString String -hi def link rustCharacterInvalid Error -hi def link rustCharacterInvalidUnicode rustCharacterInvalid -hi def link rustCharacter Character -hi def link rustNumber Number -hi def link rustBoolean Boolean -hi def link rustEnum rustType -hi def link rustEnumVariant rustConstant -hi def link rustConstant Constant -hi def link rustSelf Constant -hi def link rustFloat Float -hi def link rustArrowCharacter rustOperator -hi def link rustOperator Operator -hi def link rustKeyword Keyword -hi def link rustDynKeyword rustKeyword -hi def link rustTypedef Keyword " More precise is Typedef, but it doesn't feel right for Rust -hi def link rustStructure Keyword " More precise is Structure -hi def link rustUnion rustStructure -hi def link rustExistential rustKeyword -hi def link rustPubScopeDelim Delimiter -hi def link rustPubScopeCrate rustKeyword -hi def link rustSuper rustKeyword -hi def link rustUnsafeKeyword Exception -hi def link rustReservedKeyword Error -hi def link rustRepeat Conditional -hi def link rustConditional Conditional -hi def link rustIdentifier Identifier -hi def link rustCapsIdent rustIdentifier -hi def link rustModPath Include -hi def link rustModPathSep Delimiter -hi def link rustFunction Function -hi def link rustFuncName Function -hi def link rustFuncCall Function -hi def link rustShebang Comment -hi def link rustCommentLine Comment -hi def link rustCommentLineDoc SpecialComment -hi def link rustCommentLineDocLeader rustCommentLineDoc -hi def link rustCommentLineDocError Error -hi def link rustCommentBlock rustCommentLine -hi def link rustCommentBlockDoc rustCommentLineDoc -hi def link rustCommentBlockDocStar rustCommentBlockDoc -hi def link rustCommentBlockDocError Error -hi def link rustCommentDocCodeFence rustCommentLineDoc -hi def link rustAssert PreCondit -hi def link rustPanic PreCondit -hi def link rustMacro Macro -hi def link rustType Type -hi def link rustTodo Todo -hi def link rustAttribute PreProc -hi def link rustDerive PreProc -hi def link rustDefault StorageClass -hi def link rustStorage StorageClass -hi def link rustObsoleteStorage Error -hi def link rustLifetime Special -hi def link rustLabel Label -hi def link rustExternCrate rustKeyword -hi def link rustObsoleteExternMod Error -hi def link rustBoxPlacementParens Delimiter -hi def link rustQuestionMark Special - -" Other Suggestions: -" hi rustAttribute ctermfg=cyan -" hi rustDerive ctermfg=cyan -" hi rustAssert ctermfg=yellow -" hi rustPanic ctermfg=red -" hi rustMacro ctermfg=magenta - -syn sync minlines=200 -syn sync maxlines=500 - -let b:current_syntax = "rust" - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/syntax_checkers/rust/cargo.vim b/pack/acp/start/rust.vim/syntax_checkers/rust/cargo.vim deleted file mode 100644 index f7b6953..0000000 --- a/pack/acp/start/rust.vim/syntax_checkers/rust/cargo.vim +++ /dev/null @@ -1,93 +0,0 @@ -" Vim syntastic plugin -" Language: Rust -" Maintainer: Julien Levesy -" -" See for details on how to add an external Syntastic checker: -" https://github.com/scrooloose/syntastic/wiki/Syntax-Checker-Guide#external - -if exists("g:loaded_syntastic_rust_cargo_checker") - finish -endif - -let g:loaded_syntastic_rust_cargo_checker = 1 - -" Force syntastic to call cargo without a specific file name -let g:syntastic_rust_cargo_fname = "" - -let s:save_cpo = &cpo -set cpo&vim - -function! SyntaxCheckers_rust_cargo_IsAvailable() dict - if exists("*syntastic#util#getVersion") - echom "rust.vim: version of Syntastic is too old. Needs to be at least 3.7.0." - return v:false - endif - - return executable(self.getExec()) && - \ syntastic#util#versionIsAtLeast(self.getVersion(), [0, 16, 0]) -endfunction - -function! SyntaxCheckers_rust_cargo_GetLocList() dict - let makeprg = self.makeprgBuild({ "args": "check" }) - let l:root_cargo_toml = cargo#nearestRootCargo(0) - let l:nearest_cargo_toml = cargo#nearestCargo(0) - let b:rust_recent_root_cargo_toml = l:root_cargo_toml - let b:rust_recent_nearest_cargo_toml = l:nearest_cargo_toml - - " All pathname prints are relative to the Cargo.toml of the workspace, if - " there is a workspace, otherwise they are relative to the Cargo.toml of - " the single crate. Where to actually execute under these varying - " circumtances 'cargo' is determined here, and controlled by - " configuration. - - if rust#GetConfigVar('rust_cargo_avoid_whole_workspace', 1) - if l:root_cargo_toml !=# l:nearest_cargo_toml - let makeprg = "cd " . fnamemodify(l:nearest_cargo_toml, ":p:h") - \ . " && " . makeprg - endif - else - let makeprg = "cd " . fnamemodify(l:root_cargo_toml, ":p:h") - \ . " && " . makeprg - endif - - let l:check_all_targets = rust#GetConfigVar('rust_cargo_check_all_targets', 0) - let l:check_all_features = rust#GetConfigVar('rust_cargo_check_all_features', 0) - let l:check_examples = rust#GetConfigVar('rust_cargo_check_examples', 0) - let l:check_tests = rust#GetConfigVar('rust_cargo_check_tests', 0) - let l:check_benches = rust#GetConfigVar('rust_cargo_check_benches', 0) - - let makeprg = makeprg. ' ' - \ . (l:check_all_targets ? ' --all-targets' : '') - \ . (l:check_all_features ? ' --all-features' : '') - \ . (l:check_benches ? ' --benches' : '') - \ . (l:check_examples ? ' --examples' : '') - \ . (l:check_tests ? ' --tests' : '') - - " Ignored patterns, and blank lines - let errorformat = - \ '%-G,' . - \ '%-Gerror: aborting %.%#,' . - \ '%-Gerror: Could not compile %.%#,' - - " Meaningful lines (errors, notes, warnings, contextual information) - let errorformat .= - \ '%Eerror: %m,' . - \ '%Eerror[E%n]: %m,' . - \ '%Wwarning: %m,' . - \ '%Inote: %m,' . - \ '%C %#--> %f:%l:%c' - - return SyntasticMake({ - \ 'makeprg': makeprg, - \ 'cwd': fnamemodify(l:root_cargo_toml, ":p:h:."), - \ 'errorformat': errorformat }) -endfunction - -call g:SyntasticRegistry.CreateAndRegisterChecker({ - \ 'filetype': 'rust', - \ 'name': 'cargo'}) - -let &cpo = s:save_cpo -unlet s:save_cpo - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/syntax_checkers/rust/rustc.vim b/pack/acp/start/rust.vim/syntax_checkers/rust/rustc.vim deleted file mode 100644 index d60a3d3..0000000 --- a/pack/acp/start/rust.vim/syntax_checkers/rust/rustc.vim +++ /dev/null @@ -1,54 +0,0 @@ -" Vim syntastic plugin -" Language: Rust -" Maintainer: Andrew Gallant -" -" See for details on how to add an external Syntastic checker: -" https://github.com/scrooloose/syntastic/wiki/Syntax-Checker-Guide#external - -if exists("g:loaded_syntastic_rust_rustc_checker") - finish -endif -let g:loaded_syntastic_rust_rustc_checker = 1 - -" vint: -ProhibitAbbreviationOption -let s:save_cpo = &cpo -set cpo&vim -" vint: +ProhibitAbbreviationOption - -function! SyntaxCheckers_rust_rustc_GetLocList() dict - let makeprg = self.makeprgBuild({}) - - " Old errorformat (before nightly 2016/08/10) - let errorformat = - \ '%E%f:%l:%c: %\d%#:%\d%# %.%\{-}error:%.%\{-} %m,' . - \ '%W%f:%l:%c: %\d%#:%\d%# %.%\{-}warning:%.%\{-} %m,' . - \ '%C%f:%l %m' - - " New errorformat (after nightly 2016/08/10) - let errorformat .= - \ ',' . - \ '%-G,' . - \ '%-Gerror: aborting %.%#,' . - \ '%-Gerror: Could not compile %.%#,' . - \ '%Eerror: %m,' . - \ '%Eerror[E%n]: %m,' . - \ '%-Gwarning: the option `Z` is unstable %.%#,' . - \ '%Wwarning: %m,' . - \ '%Inote: %m,' . - \ '%C %#--> %f:%l:%c' - - return SyntasticMake({ - \ 'makeprg': makeprg, - \ 'errorformat': errorformat }) -endfunction - -call g:SyntasticRegistry.CreateAndRegisterChecker({ - \ 'filetype': 'rust', - \ 'name': 'rustc'}) - -" vint: -ProhibitAbbreviationOption -let &cpo = s:save_cpo -unlet s:save_cpo -" vint: +ProhibitAbbreviationOption - -" vim: set et sw=4 sts=4 ts=8: diff --git a/pack/acp/start/rust.vim/test/.gitignore b/pack/acp/start/rust.vim/test/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/pack/acp/start/rust.vim/test/Dockerfile b/pack/acp/start/rust.vim/test/Dockerfile deleted file mode 100644 index c84c49e..0000000 --- a/pack/acp/start/rust.vim/test/Dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -# This is brought as reference, to be able to reproduce a new image - -FROM alonid/vim-testbed:10 - -RUN install_vim -tag v7.4.052 -name vim74-trusty -build \ - -tag v8.0.1850 -name vim80 -build \ - -tag v8.1.0105 -name vim81 -build \ - -tag neovim:v0.1.7 -build \ - -tag neovim:v0.2.2 -build - -ENV PACKAGES="\ - bash \ - git \ - python \ - python2-pip \ - curl \ -" - -RUN dnf install -y $PACKAGES - -RUN pip install vim-vint==0.3.19 - -RUN export HOME=/rust ; mkdir $HOME ; curl https://sh.rustup.rs -sSf | sh -s -- -y - -RUN chown vimtest.vimtest -R /rust - -RUN (dnf remove -y gcc \*-devel ; \ - dnf install -y gpm msgpack libvterm libtermkey unibilium ) || true -RUN dnf clean all - -RUN echo "export PATH=~/.cargo/bin:$PATH" >> ~/.bashrc - -RUN git clone https://github.com/da-x/vader.vim vader && \ - cd vader && git checkout v2017-12-26 diff --git a/pack/acp/start/rust.vim/test/coverage.vader b/pack/acp/start/rust.vim/test/coverage.vader deleted file mode 100644 index 84734e7..0000000 --- a/pack/acp/start/rust.vim/test/coverage.vader +++ /dev/null @@ -1,24 +0,0 @@ -Given rust (Some Rust code): - fn main() { - println!("Hello World\n") - } - -Execute (RustInfo - call it to see that it works): - redir => m - silent RustInfo - redir END - Log m - -Execute (RustEmitAsm - see that we actually get assembly output): - silent! w test.rs - silent! e! test.rs - redir => m - silent! RustEmitAsm - redir END - AssertEqual 'asm', &filetype - normal! ggVGy:q - AssertEqual 1,(@" =~# '\V.section') - bd - call delete('test.rs') - -# TODO: a lot more tests diff --git a/pack/acp/start/rust.vim/test/run-tests b/pack/acp/start/rust.vim/test/run-tests deleted file mode 100644 index a8c63b6..0000000 --- a/pack/acp/start/rust.vim/test/run-tests +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env python - -import os -import sys - -REPO = "alonid/vim-testbed" -TAG = "10-rust.vim" -IMAGE = "%s:%s" % (REPO, TAG) - -class Error(Exception): - pass - -def system(cmd, capture=False, ok_fail=False): - if capture: - f = os.popen(cmd) - d = f.read() - return d - - res = os.system(cmd) - if res != 0: - if ok_fail: - return res - - raise Error("Error executing: %s" % (cmd, )) - return 0 - -def root(): - return os.path.dirname(os.path.dirname(os.path.realpath(__file__))) - -def prep(): - d = os.path.join(root(), "test") - for i in [".cargo", ".rustup", ".multirust"]: - l = os.path.join(d, i) - if not os.path.lexists(l): - os.symlink("/rust/" + i, l) - - l = os.path.join(root(), "test/.vimrc") - if not os.path.lexists(l): - os.symlink("vimrc", l) - - if not os.path.exists(os.path.join(d, ".profile")): - f = open(os.path.join(d, ".profile"), "w") - f.write('export PATH="$HOME/.cargo/bin:$PATH"\n') - f.close() - -def docker_run(cmd, interactive=False, ok_fail=False): - prep() - d = root() - params = "-v %s:/testplugin -v %s/test:/home/vimtest" % (d, d) - params += " -e HOME=/home/vimtest" - if not interactive: - params += " -a stderr" - params += " -e VADER_OUTPUT_FILE=/dev/stderr" - params += " -u %s" % (os.getuid(), ) - params += " -w /testplugin" - if interactive: - interactive_str = "-it" - else: - interactive_str = "" - return system("docker run %s --rm %s %s %s" % (interactive_str, params, IMAGE, cmd), - ok_fail=ok_fail) - -def image_exists(): - r = system("docker images -q %s" % (IMAGE, ), capture=True) - return len(r.strip().splitlines()) >= 1 - -def tests_on_docker(): - res = docker_run("bash -lc 'python /home/vimtest/run-tests inside-docker'", ok_fail=True) - if res == 0: - print "Tests OK" - else: - print "Tests Failed" - sys.exit(1) - -def inside_docker(): - res = system("/vim-build/bin/vim80 --not-a-term '+Vader! test/*.vader'", ok_fail=True) - if res != 0: - sys.exit(1) - -def run_with_vimrc(vimrc): - res = system("vim -u %s --not-a-term '+Vader! test/*.vader'" % (vimrc, ), ok_fail=True) - if res != 0: - sys.exit(1) - -def main(): - if sys.argv[1:] == ["inside-docker"]: - inside_docker() - return - - if sys.argv[1:2] == ["run-with-vimrc"]: - run_with_vimrc(sys.argv[2]) - return - - if not image_exists(): - print "Need to take image from remote" - system("docker pull %s" % (IMAGE, )) - - if "-i" in sys.argv[1:]: - docker_run("bash -l", interactive=True) - return - - tests_on_docker() - -if __name__ == "__main__": - main() diff --git a/pack/acp/start/rust.vim/test/sample.rs b/pack/acp/start/rust.vim/test/sample.rs deleted file mode 100644 index e69de29..0000000 diff --git a/pack/acp/start/rust.vim/test/vimrc b/pack/acp/start/rust.vim/test/vimrc deleted file mode 100644 index f7f1533..0000000 --- a/pack/acp/start/rust.vim/test/vimrc +++ /dev/null @@ -1,30 +0,0 @@ -" vint: -ProhibitSetNoCompatible -" - -set nocompatible -filetype off - -" This script is currently designed to be run from within Docker, the -" following paths are intrinsic to the container: -source /rtp.vim - -" Paths need prepending (instead of what is originally done -" in vim-testbed) in order to supersede the rust.vim that is -" supplied with Vim. -exec 'set runtimepath=/vader,/testplugin,' . &runtimepath -cd /testplugin - -filetype plugin indent on -syntax on - -set nocompatible -set tabstop=8 -set softtabstop=4 -set shiftwidth=4 -set expandtab -set backspace=2 -set nofoldenable -set foldmethod=syntax -set foldlevelstart=10 -set foldnestmax=10 -set ttimeoutlen=0 diff --git a/pack/acp/start/vim-orgmode/.gitignore b/pack/acp/start/vim-orgmode/.gitignore deleted file mode 100644 index acf3441..0000000 --- a/pack/acp/start/vim-orgmode/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -*.pyc -*.swp -tags -.ropeproject -.cover* -cover* diff --git a/pack/acp/start/vim-orgmode/.pylintrc b/pack/acp/start/vim-orgmode/.pylintrc deleted file mode 100644 index 19ff0f7..0000000 --- a/pack/acp/start/vim-orgmode/.pylintrc +++ /dev/null @@ -1,238 +0,0 @@ -[MASTER] - -# Specify a configuration file. -#rcfile= - -# Python code to execute, usually for sys.path manipulation such as -# pygtk.require(). -init-hook=sys.path.append(os.path.abspath('ftplugin')) - -# Profiled execution. -profile=no - -# Add files or directories to the blacklist. They should be base names, not -# paths. -ignore=.git - -# Pickle collected data for later comparisons. -persistent=yes - -# List of plugins (as comma separated values of python modules names) to load, -# usually to register additional checkers. -load-plugins= - - -[MESSAGES CONTROL] - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time. -#enable= - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifier separated by comma (,) or put this option -# multiple time (only on the command line, not in the configuration file where -# it should appear only once). -#disable= - -[REPORTS] - -# Set the output format. Available formats are text, parseable, colorized, msvs -# (visual studio) and html -output-format=parseable - -# Include message's id in output -include-ids=no - -# Put messages in a separate file for each module / package specified on the -# command line instead of printing them on stdout. Reports (if any) will be -# written in a file name "pylint_global.[txt|html]". -files-output=no - -# Tells whether to display a full report or only the messages -reports=yes - -# Python expression which should return a note less than 10 (10 is the highest -# note). You have access to the variables errors warning, statement which -# respectively contain the number of errors / warnings messages and the total -# number of statements analyzed. This is used by the global evaluation report -# (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Add a comment according to your evaluation note. This is used by the global -# evaluation report (RP0004). -comment=no - - -[TYPECHECK] - -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - -# List of classes names for which member attributes should not be checked -# (useful for classes with attributes dynamically set). -ignored-classes=SQLObject - -# When zope mode is activated, add a predefined set of Zope acquired attributes -# to generated-members. -zope=no - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E0201 when accessed. Python regular -# expressions are accepted. -generated-members=REQUEST,acl_users,aq_parent - - -[BASIC] - -# Required attributes for module, separated by a comma -required-attributes= - -# List of builtins function names that should not be used, separated by a comma -bad-functions=map,filter,apply,input - -# Regular expression which should only match correct module names -module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ - -# Regular expression which should only match correct module level names -const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__))$ - -# Regular expression which should only match correct class names -class-rgx=[A-Z_][a-zA-Z0-9]+$ - -# Regular expression which should only match correct function names -function-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression which should only match correct method names -method-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression which should only match correct instance attribute names -attr-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression which should only match correct argument names -argument-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression which should only match correct variable names -variable-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression which should only match correct list comprehension / -# generator expression variable names -inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ - -# Good variable names which should always be accepted, separated by a comma -good-names=i,j,k,ex,Run,_ - -# Bad variable names which should always be refused, separated by a comma -bad-names=foo,bar,baz,toto,tutu,tata - -# Regular expression which should only match functions or classes name which do -# not require a docstring -no-docstring-rgx=__.*__ - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -notes=FIXME,XXX,TODO - - -[VARIABLES] - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# A regular expression matching the beginning of the name of dummy variables -# (i.e. not used). -dummy-variables-rgx=_|dummy - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid to define new builtins when possible. -additional-builtins= - - -[SIMILARITIES] - -# Minimum lines number of a similarity. -min-similarity-lines=4 - -# Ignore comments when computing similarities. -ignore-comments=yes - -# Ignore docstrings when computing similarities. -ignore-docstrings=yes - - -[FORMAT] - -# Maximum number of characters on a single line. -max-line-length=800 - -# Maximum number of lines in a module -max-module-lines=1000 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=\t - - -[CLASSES] - -# List of interface methods to ignore, separated by a comma. This is used for -# instance to not check methods defines in Zope's Interface base class. -ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__,__new__,setUp - - -[IMPORTS] - -# Deprecated modules which should not be used, separated by a comma -deprecated-modules=regsub,string,TERMIOS,Bastion,rexec - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled) -import-graph= - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled) -ext-import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled) -int-import-graph= - - -[DESIGN] - -# Maximum number of arguments for function / method -max-args=5 - -# Argument names that match this expression will be ignored. Default to name -# with leading underscore -ignored-argument-names=_.* - -# Maximum number of locals for function / method body -max-locals=15 - -# Maximum number of return / yield for function / method body -max-returns=6 - -# Maximum number of branch for function / method body -max-branchs=12 - -# Maximum number of statements in function / method body -max-statements=50 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of attributes for a class (see R0902). -max-attributes=7 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=2 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=20 diff --git a/pack/acp/start/vim-orgmode/.travis.yml b/pack/acp/start/vim-orgmode/.travis.yml deleted file mode 100644 index 27d8df9..0000000 --- a/pack/acp/start/vim-orgmode/.travis.yml +++ /dev/null @@ -1,21 +0,0 @@ -language: python - -before_install: - - sudo apt-get update && sudo apt-get --reinstall install -qq language-pack-pt - -python: - - "2.7" - - "3.4" - - "3.5" - - "3.6" - -install: - - pip install coverage - - pip install codecov - -script: - - cd tests - - nosetests --with-coverage . - -after_success: - - codecov diff --git a/pack/acp/start/vim-orgmode/CHANGELOG.org b/pack/acp/start/vim-orgmode/CHANGELOG.org deleted file mode 100644 index 9929046..0000000 --- a/pack/acp/start/vim-orgmode/CHANGELOG.org +++ /dev/null @@ -1,214 +0,0 @@ -* Changelog - All notable changes to this project will be documented in this file. - - This log is kept according to the [[http://keepachangelog.com/][Keep a CHANGELOG]] manifesto -** 0.7.0 :unreleased: -*** Added - - Subtracting when entering dates (PR #276) -*** Fixed - - =ir= text object now works with most operations (PR #284, closes #273) -** 0.6.0 <2017-11-06 Mon> :released: -*** Added - - Introduced sphinx documentation to Python modules. (PR #237) - - Add =Python3= support. (PR #231, closes #226) - - Implementing agenda overview for current buffer. (PR #229) - - =g:org_aggressive_conceal=, if value =1=, will conceal all simple format - identifying characters, default =0=. (PR #188) - - (testing on `g:org_aggressive_conceal=1' mode) Add possibility to escape - format indicating characters from leading inline markup, by escaping with - "\". - - Add alternative behavior: refrain from entering insert mode after - heading/checkbox creation through keybindings. Activate by setting - =g:org_prefer_insert_mode= to 0. (closes #211) - - Add export as LaTeX beamer slides (PR #206) - - Keybinding to create plainlist item directly. (closes #190) - - Make % jump between < and >. (PR #251, closes #250) -*** Changed - - Changed default value for =g:org_indent= from =1= to =0=. (closes #243) - - Revamped TODO keyword cycling rules. (PR #237) - - In [[syntax/org.vim][syntax/org.vim]], changed `\@<=' with computational faster `\zs' - - Using =c[n/N]= to create new plainlist item following - current plainlist item. Now these keybindings will unconditionally - create empty checkbox. (closes #190) -*** Deprecated - - Nothing -*** Removed - - Removed the requirement for TODO state keywords to be upper-case. - (PR #235) -*** Fixed - - Avoid duplicate =InsertLeave= handlers (PR #222, closes #223) - - Fix python3 compatibility issue with regexes - (PR #266, closes #263, #265) - - Fixed python3 compatible issue within =CalendarAction=. - (PR #242, closes #241) - - Tree promoting/demoting no longer destroy list and checkbox structure. - (closes #217) - - Fixed bug when promote/demote headings when it contain lists. - (PR #239, partly fixes #217) - - Silenced =W18= warning when non-ASCII coded TODO keywords are used. - (PR #236) - - Fix non-English locale support issue in OrgDate and Agenda. (PR #234, - closes #230) - - Fix =concealcursor= mis-setting. (from ="nc"= to =nc=) - - Fix duplicate =InsertLeave= autocmd for =tag_complete=. (closes #223) - - Fix utl error when =\= or white space is in the link by auto-escaping. - (closes #220) - - Fix typo vbm -> vmb (PR #219) - - Fix toggling checkboxes with plain embedded lists (PR #212, closes #209) - - Return to right window before setting todo (closes #202) - - Fix link to calendar-vim (closes #197) - - Fix =out of bound= issue when creating heading/checkbox after last - instance in document on NeoVim. (closes #213) -** 0.5.0 <2015-10-10 Sat> :released: -*** Added - - show link description in headings when folded, instead of the whole - link - - add simplified mappings to create new headings with - [|] - - improve incrementing and decrementing of list items - - moved changelog information to its own file - - add tests for the tags plugin - - copy type and indentation when creating new list items - - increase/decrease ordered list when adding new items - - add support for alphanumeric ordered lists - - add test cases for overlapping mappings - - add three dots after folded text, like in orgmode - - improve highlighting of org-mode properties (closes issue #130) - - implement global visibility as it works in Emacs org-mode (closes issue - #119) - - improve detection of speeddating plugin (closes issue #121) - - add support for high speed searching of headings that use certain tags - (closes issue #58) - - make echo, echom and echoe split messages a line ends and execute a - single vim command for each line - - add export commands OrgExportToPDF and OrgExportToHTML (closes issue - #107) - - add variables for customizing the export via Emacs: g:org_export_emacs, - g:org_export_verbose, g:org_export_init_script (closes issue #107) - - switch to subprocess.Popen for Emcas export (closes issue #107) - - add defaults and examples for all variables - - add support for inserting new checkboxes with the same keybinging as - inserting new headings (thanks to Powen Tan) - - implemented support for markdown export (issue #185) -*** Deprecated - - Nothing -*** Removed - - Nothing -*** Fixed - - allow checkbox status to be toggled when there is no indicator present - ([]) - - improve installation instructions (related to issues #111 and #176) - - optimize checkbox regex to match also just the type without status and - title - - fix broken unordered lists - - set org_tag_column to textwidth - - change commentstring to "# %s" - - fix syntax highlighting of list items - - fix indentation of first checkbox of a heading - - fix indentation of first checkbox of a heading - - disable highlighting of non-printable characters in todo state - selection window - - fix highlighting of todo keywords that are followed by additional - characters, i.e. TODOs - - omit status when entering new checkbox item if current checkbox doesn't - have one - - fix broken indentation of checkboxes (closes issue #146) - - fix CalendarAction is undefined (closes issue #142) - - correct overlapping mappings in PluginDate - - fix cache problems when inserting a new heading, together with multi - line text (closes issue #116) - - rename plug to OrgTodoToggleNonInteractive (closes issue #114) - - fix jumping to the first character within the body of a heading - - use Ignore highlighting instead of NonText for shaded stars (closes - issues #173) - - fix broken buffer number (closes issue #177) - - make exports work with emacs 24.4 (closes issue #178) - - improve comments - - fix syntax for #+BEGIN_* blocks (issue #186) -** 0.4.0-0 <2011-10-16 Sun> :released: - - fix broken repeat settings for moving a heading - - improve performance when moving a heading upward or downward (closes - issue #108) - - improve performance when changing the level of a heading (related to - issue #108) - - extend liborgmode.headings.HeadingList to allow headings to not be - tainted when moving them around - - change heading tree text object to ir/ar... because of vim's it/at text - object (closes issue #106) - - improve performance when inserting a new heading below (closes issue - #105) - - remove duplicate tags (closes issue #104) - - improve performance in insert mode (closes issue #103) - - improve performance when opening larger org files (closes issue #103) - - replace org.txt by orgguide.txt (closes issue #77) - - replace g:org_leader by (closes issue #101) - To restore the previous behavior add the following line to your vimrc: - > - let maplocalleader = ',' - < - - change normal command execution to not remap any key (related to issue - #85) - - fix regression timeout when opening folds (closes issue #100) - - vim-orgmode multistate documentation (closes issue #77) - - add support for @-signs in tags (closes issue #98) - - enable file completion for hyperlinks by default (closes issue #97) - - fix traceback when pressing while editing a link (closes issue - #96) - - implement reverse visibility cycling using (closes issue #95) - - change ,, and ,. to remap zr and zm. (closes issue #73) - - add .cnf files to the vimball archive (closes #93) - - integrate pylint code checker (closes issue #87) - - solve encoding issues in the agenda plugin (closes issue #86) - - add description for writing test cases - - add coverage report target (closes issue #74) - - add support for plain lists, thanks to Aleksandar Dimitrov (closes issue - #81) - - add agenda view, many thanks to Stefan Otte (closes issue #34) - - move cursor to the current todo state when selecting the todo state - interactively (closes issue #61) - - add parameter scope to method settings.get - - add method settings.unset - - fix cursor positioning when selecting todo states - - improve date plugin - - update vba targets to its new name vmb - - demoting a newly created second level heading doesn't cause all children - to - be deleted anymore (closes issue #65) - - add error message for missing dependencies (closes issue #59) - - rename tests directory - - change licensing of the documentation to GNU Free Documentation License - - integrate orgguide (closes issue #57) - - replace DIRECTION_* with an enum (closes issue #56 and issue #49) -** 0.3.1-0 <2011-08-14 Sun> :released: - - demoting a newly created second level heading doesn't cause all children - to be deleted anymore (closes issue #65) - - add error message for missing dependencies (closes issue #59) -** 0.3.0-0 <2011-08-09 Tue> :released: - - fix completion menu popup that disappeared because of the usage of - vim.command (closes issue #48) - - implement interactive todo state selection (closes issue #5) - - add orgmode group to au commands in TagProperties plugin (closes issue - #53) - - allow demotion of first level headings (closes issue #27) - - fix encoding issues in Date plugin - - add general support for multiple todo sequences (closes Issue #46) - - fix folded text for headings containing backslashes or double quotes - (closes issue #26) - - add Document.get_todo_states() and Document.get_all_todo_states() - - don't confuse upper case words at the beginning of a heading with a todo - state (closes issue #28) - - fix error in setting tags (issue #25) - - improve split of heading (issue #24) - - add variable g:org_improve_split_heading to enable/disable improve the - split of headings (issue #24) - - implement shortcut for moving to the partent's next sibling (g}) (issue - #22) - - fix duplication of children when inserting a new heading (issue #20) - - always start insert mode when adding a new heading (issue #21) -** 0.2.1-0 <2011-06-26 Sun> :released: - - fix encoding of todo states set by the Todo plugin (thanks to Daniel - Carl and kien for pointing out the issue) - - add documentation for remapping shortcuts - - add documentation for customizing syntax highlighting -** 0.2.0-0 <2011-06-25 Sat> :released: - - initial release diff --git a/pack/acp/start/vim-orgmode/LICENSE b/pack/acp/start/vim-orgmode/LICENSE deleted file mode 100644 index e37682c..0000000 --- a/pack/acp/start/vim-orgmode/LICENSE +++ /dev/null @@ -1,60 +0,0 @@ ---------------------------------------------------------------------- -All source code is licensed under the terms of the following license: ---------------------------------------------------------------------- - -Copyright (C) 2010,2011 Jan Christoph Ebersbach - -http://www.e-jc.de/ - -All rights reserved. - -The source code of this program is made available under the terms of the -GNU Affero General Public License version 3 (GNU AGPL V3) as published -by the Free Software Foundation. - -Binary versions of this program provided by Univention to you as well as -other copyrighted, protected or trademarked materials like Logos, -graphics, fonts, specific documentations and configurations, -cryptographic keys etc. are subject to a license agreement between you -and Univention and not subject to the GNU AGPL V3. - -In the case you use this program under the terms of the GNU AGPL V3, the -program is provided in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public -License for more details. - -You should have received a copy of the GNU Affero General Public License -with the Debian GNU/Linux or Univention distribution in file -/usr/share/common-licenses/AGPL-3; if not, see -. - - --------------------------------------------------------------------- -All documentation found in the directories doc and documentation are -licensed under the terms of the following license: --------------------------------------------------------------------- - -doc/org.txt -Copyright (C) 2010,2011 Jan Christoph Ebersbach - -doc/orgguide.txt -documentation/emacs_orgguide.org -documentation/emacs_orgguide.texi -Copyright (C) 2010 Free Software Foundation - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.3 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being “A GNU Manual,” and -with the Back-Cover Texts as in (a) below. A copy of the license is -included in the section entitled “GNU Free Documentation License.” - -(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and -modify this GNU manual. Buying copies from the FSF supports it in -developing GNU and promoting software freedom.” - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. diff --git a/pack/acp/start/vim-orgmode/Makefile b/pack/acp/start/vim-orgmode/Makefile deleted file mode 100644 index 219a57e..0000000 --- a/pack/acp/start/vim-orgmode/Makefile +++ /dev/null @@ -1,91 +0,0 @@ -PLUGIN = orgmode -PREFIX = /usr/local -VIMDIR = $(PREFIX)/share/vim - -all: build - -build: - -# install plugin at destination -install: doc indent ftdetect ftplugin syntax - for i in doc indent ftdetect ftplugin syntax; do \ - find $$i -type f -name \*.txt -o -type f -name \*.cnf -o -type f -name \*.py -o -type f -name \*.vim | while read f; do \ - install -m 0755 -d $(DESTDIR)$(VIMDIR)/$$(dirname "$$f"); \ - install -m 0644 $$f $(DESTDIR)$(VIMDIR)/$$f; \ - done; \ - done - -# cleanup -clean: documentation - @find . -name \*.pyc -o -name \*.py,cover -exec rm {} \; - @rm -rf ${PLUGIN}.vmb ${PLUGIN}.vmb.gz tmp files - cd $< && $(MAKE) $@ - -# generate the vim ball package -${PLUGIN}.vmb: check build_vmb.vim clean - $(MAKE) DESTDIR=$(PWD)/tmp VIMDIR= install - find tmp -type f | sed -e 's/^tmp\///' > files - cp build_vmb.vim tmp - cd tmp && vim --cmd 'let g:plugin_name="${PLUGIN}"' -s build_vmb.vim - [ -e tmp/${PLUGIN}.vba ] && mv tmp/${PLUGIN}.vba tmp/$@ || true - mv tmp/$@ . - -${PLUGIN}.vmb.gz: ${PLUGIN}.vmb - @rm -f ${PLUGIN}.vmb.gz - gzip $< - -vmb: ${PLUGIN}.vmb - -vmb.gz: ${PLUGIN}.vmb.gz - -${PLUGIN}.vba: ${PLUGIN}.vmb - mv $< $@ - -${PLUGIN}.vba.gz: ${PLUGIN}.vba - @rm -f ${PLUGIN}.vba.gz - gzip $< - -vba: ${PLUGIN}.vba - -vba.gz: ${PLUGIN}.vba.gz - -# run unit tests -test: check - -check: tests/run_tests.py - cd tests && python2 run_tests.py - -# generate documentation -docs: documentation - cd $< && $(MAKE) - -# generate a test coverage report for all python files -coverage: - @echo ">>> Coverage depends on the package python-nose and python-coverage, make sure they are installed!" - cd tests && nosetests2 --with-coverage --cover-html . - -# run a static code checker -lint: - @echo ">>> Lint depends on the package pylint make sure it's installed!" - pylint --rcfile .pylintrc --disable=C0301,C0103,C0111,C0322,C0323,C0324,W0703,W0612,W0603 orgmode - -lintall: - @echo ">>> Lint depends on the package pylint make sure it's installed!" - pylint --rcfile .pylintrc orgmode - -# install vim-orgmode in the .vim/bundle directory for test purposes -VIMPLUGINDIR = $(HOME)/.vim/bundle/orgmode - -installvmb: ${PLUGIN}.vmb install_vmb.vim - rm -rvf ${VIMPLUGINDIR} - mkdir -p "${VIMPLUGINDIR}" - vim --cmd "let g:installdir='${VIMPLUGINDIR}'" -s install_vmb.vim $< - @echo "Plugin was installed in ${VIMPLUGINDIR}. Make sure you are using a plugin loader like pathegon, otherwise the ${PLUGIN} might not work properly." - -installvba: ${PLUGIN}.vba install_vba.vim - rm -rvf ${VIMPLUGINDIR} - mkdir -p "${VIMPLUGINDIR}" - vim --cmd "let g:installdir='${VIMPLUGINDIR}'" -s install_vba.vim $< - @echo "Plugin was installed in ${VIMPLUGINDIR}. Make sure you are using a plugin loader like pathegon, otherwise the ${PLUGIN} might not work properly." - -.PHONY: all build test check install clean vmb vmb.gz docs installvmb diff --git a/pack/acp/start/vim-orgmode/README.org b/pack/acp/start/vim-orgmode/README.org deleted file mode 100644 index c109056..0000000 --- a/pack/acp/start/vim-orgmode/README.org +++ /dev/null @@ -1,43 +0,0 @@ -* Vim-OrgMode - - #+ATTR_HTML: title="Join the chat at https://gitter.im/jceb/vim-orgmode" - [[https://gitter.im/jceb/vim-orgmode?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge][file:https://badges.gitter.im/jceb/vim-orgmode.svg]] - [[https://travis-ci.org/jceb/vim-orgmode][file:https://travis-ci.org/jceb/vim-orgmode.svg]] - [[https://codecov.io/gh/jceb/vim-orgmode][file:https://codecov.io/gh/jceb/vim-orgmode/branch/master/graph/badge.svg]] - - Text outlining and task management for Vim based on [[http://orgmode.org/][Emacs' Org-Mode]]. - - The idea for this plugin was born by listening to the - [[http://twit.tv/floss136][Floss Weekly podcast]] introducing Emacs Org-Mode. - Org-Mode has a lot of strong features like folding, views (sparse tree) and - scheduling of tasks. These are completed by hyperlinks, tags, todo states, - priorities aso. - - vim-orgmode aims at providing the same functionality for Vim. - - [[https://github.com/jceb/vim-orgmode/blob/master/examples/mylife.org][file:examples/mylife.gif]] - -** Features - Currently vim-orgmode does not support all orgmode features but is quite - usable. Short list of the already supported features: - - - Syntax highlighting - - Cycle visibility of headings (folding) - - Navigate between headings - - Edit the structure of the document: add, move, promote, denote headings - and more - - Hyperlinks within vim-orgmode and outside (files, webpages, etc.) - - TODO list management - - Tags for headings - - Lists in alphanumeric and bullet item notation and checkbox support - - Basic date handling - - Export to other formats (via Emacs' Org-Mode) - -* Installation and Usage - Installation and usage instructions are found in the file [[doc/orgguide.txt][doc/orgguide.txt]]. - -* License - Information about the license is found in file [[LICENSE]]. - -* Changelog - All changes are found in file [[https://github.com/jceb/vim-orgmode/blob/master/CHANGELOG.org][CHANGELOG.org]] diff --git a/pack/acp/start/vim-orgmode/build_vmb.vim b/pack/acp/start/vim-orgmode/build_vmb.vim deleted file mode 100644 index fd5fe05..0000000 --- a/pack/acp/start/vim-orgmode/build_vmb.vim +++ /dev/null @@ -1,4 +0,0 @@ -:let g:vimball_home = "." -:e ../files -:execute '%MkVimball!' . g:plugin_name -:q! diff --git a/pack/acp/start/vim-orgmode/debian/changelog b/pack/acp/start/vim-orgmode/debian/changelog deleted file mode 100644 index c673ddc..0000000 --- a/pack/acp/start/vim-orgmode/debian/changelog +++ /dev/null @@ -1,869 +0,0 @@ -vim-orgmode (0.3.0-2) unstable; urgency=low - - * update documentation - - -- Jan Christoph Ebersbach Tue, 09 Aug 2011 21:13:40 +0200 - -vim-orgmode (0.3.0-1) unstable; urgency=low - - * update documentation - - -- Jan Christoph Ebersbach Tue, 09 Aug 2011 08:37:25 +0200 - -vim-orgmode (0.3.0-0) unstable; urgency=low - - * fix completion menu popup that disappeared because of the usage of - vim.command - * closes issue #48 - - -- Jan Christoph Ebersbach Tue, 09 Aug 2011 08:25:03 +0200 - -vim-orgmode (0.2.1-25) unstable; urgency=low - - * playing around with ftdetect vs. setfiletype - - -- Jan Christoph Ebersbach Mon, 08 Aug 2011 08:11:23 +0200 - -vim-orgmode (0.2.1-24) unstable; urgency=low - - * improve implementation of todo state selection (issue #5) - - -- Jan Christoph Ebersbach Sun, 07 Aug 2011 19:55:06 +0200 - -vim-orgmode (0.2.1-23) unstable; urgency=low - - * more precise regex for dates - pull request by sotte - * closes issue #52 - - -- Roman Asendorf Wed, 03 Aug 2011 22:40:48 +0200 - -vim-orgmode (0.2.1-22) unstable; urgency=low - - * implement interactive todo state selection - * closes issue #5 - - -- Jan Christoph Ebersbach Wed, 03 Aug 2011 22:23:14 +0200 - -vim-orgmode (0.2.1-21) unstable; urgency=low - - * added emacs as suggested package - pull request by sotte - * closes issue #54 - - -- Roman Asendorf Wed, 03 Aug 2011 21:52:15 +0200 - -vim-orgmode (0.2.1-20) unstable; urgency=low - - * simple export via emacs for pdf and html - pull request by sotte - * closes issue #54 - - -- Roman Asendorf Wed, 03 Aug 2011 21:43:15 +0200 - -vim-orgmode (0.2.1-19) unstable; urgency=low - - * add orgmode group to au commands in TagProperties plugin - * closes issue #53 - - -- Jan Christoph Ebersbach Wed, 03 Aug 2011 20:02:08 +0200 - -vim-orgmode (0.2.1-18) unstable; urgency=low - - * allow demotion of first level headings - * closes issue #27 - - -- Jan Christoph Ebersbach Mon, 01 Aug 2011 21:59:32 +0200 - -vim-orgmode (0.2.1-17) unstable; urgency=low - - * fix encoding issues in Date plugin - - -- Jan Christoph Ebersbach Tue, 12 Jul 2011 17:59:41 +0200 - -vim-orgmode (0.2.1-16) unstable; urgency=low - - * update installvba target to also work with older vim version - - -- Jan Christoph Ebersbach Mon, 11 Jul 2011 08:23:18 +0200 - -vim-orgmode (0.2.1-15) unstable; urgency=low - - * make switching to the next todo sequence more convenient - * fix issue in offset calculation when old and new state are None - - -- Jan Christoph Ebersbach Sat, 09 Jul 2011 17:54:46 +0200 - -vim-orgmode (0.2.1-14) unstable; urgency=low - - * make switching to the next todo sequence more consistent - - -- Jan Christoph Ebersbach Sat, 09 Jul 2011 17:38:18 +0200 - -vim-orgmode (0.2.1-13) unstable; urgency=low - - * fix minor issues related to switching to the next todo sequence - - -- Jan Christoph Ebersbach Sat, 09 Jul 2011 17:33:56 +0200 - -vim-orgmode (0.2.1-12) unstable; urgency=low - - * add general support for multiple todo sequences - * closes issue #46 - - -- Jan Christoph Ebersbach Sat, 09 Jul 2011 16:39:49 +0200 - -vim-orgmode (0.2.1-11) unstable; urgency=low - - * update documentation - * update clean target - - -- Jan Christoph Ebersbach Sat, 09 Jul 2011 11:29:57 +0200 - -vim-orgmode (0.2.1-10) unstable; urgency=low - - * fix todo tests broken by version 0.2.1-8 - * fix DONE result of VimBuffer.get_todo_states.parse_states - - -- Jan Christoph Ebersbach Sat, 09 Jul 2011 09:49:07 +0200 - -vim-orgmode (0.2.1-9) unstable; urgency=low - - * fix folded text for headings containing backslashes or double quotes - * closes issue #26 - - -- Jan Christoph Ebersbach Fri, 08 Jul 2011 23:21:07 +0200 - -vim-orgmode (0.2.1-8) unstable; urgency=low - - * add Document.get_todo_states() and Document.get_all_todo_states() - * don't confuse upper case words at the beginning of a heading with a todo - state - * closes issue #28 - - -- Jan Christoph Ebersbach Fri, 08 Jul 2011 22:30:29 +0200 - -vim-orgmode (0.2.1-7) unstable; urgency=low - - * fix error in setting tags - * closes issue #25 - - -- Jan Christoph Ebersbach Mon, 04 Jul 2011 12:56:27 +0200 - -vim-orgmode (0.2.1-6) unstable; urgency=low - - * improve split of heading - * add variable g:org_improve_split_heading to enable/disable improve - the split of headings - * closes issue #24 - * change Makefile to be more generic - - -- Jan Christoph Ebersbach Mon, 04 Jul 2011 07:54:17 +0200 - -vim-orgmode (0.2.1-5) unstable; urgency=low - - * implement shortcut for moving to the partent's next sibling - * closes issue #22 - - -- Jan Christoph Ebersbach Sun, 03 Jul 2011 13:21:04 +0200 - -vim-orgmode (0.2.1-4) unstable; urgency=low - - * fix duplication of children when inserting a new heading - * closes issue #20 - - -- Jan Christoph Ebersbach Sun, 03 Jul 2011 12:43:32 +0200 - -vim-orgmode (0.2.1-3) unstable; urgency=low - - * add support for new vimball file extension .vmb - - -- Jan Christoph Ebersbach Sun, 03 Jul 2011 12:27:07 +0200 - -vim-orgmode (0.2.1-2) unstable; urgency=low - - * always start insert mode when adding a new heading - * closes issue #21 - - -- Jan Christoph Ebersbach Sun, 03 Jul 2011 12:25:20 +0200 - -vim-orgmode (0.2.1-1) unstable; urgency=low - - * make target installvba create the VIMPLUGINDIR before attempting the - installation - - -- Jan Christoph Ebersbach Sun, 26 Jun 2011 21:07:54 +0200 - -vim-orgmode (0.2.1-0) unstable; urgency=low - - * add documentation for customizing syntax highlighting - - -- Jan Christoph Ebersbach Sun, 26 Jun 2011 19:08:59 +0200 - -vim-orgmode (0.2.0-6) unstable; urgency=low - - * add dependency to clean target to orgmode.vba - - -- Jan Christoph Ebersbach Sun, 26 Jun 2011 14:03:18 +0200 - -vim-orgmode (0.2.0-5) unstable; urgency=low - - * add documentation for remapping shortcuts - - -- Jan Christoph Ebersbach Sun, 26 Jun 2011 13:47:30 +0200 - -vim-orgmode (0.2.0-4) unstable; urgency=low - - * fix names for Todo plugin - - -- Jan Christoph Ebersbach Sun, 26 Jun 2011 13:24:07 +0200 - -vim-orgmode (0.2.0-3) unstable; urgency=low - - * fix encoding of todo states set by the Todo plugin (thanks to Daniel Carl - for pointing out the issue) - * add target installvba to locally install orgmode.vba - * cleanup Makefile - - -- Jan Christoph Ebersbach Sun, 26 Jun 2011 13:15:34 +0200 - -vim-orgmode (0.2.0-2) unstable; urgency=low - - * add hint for updateing vim-orgmode from a previous version - * move all documentation related to installation and usage to doc/org.txt - - -- Jan Christoph Ebersbach Sun, 26 Jun 2011 12:46:55 +0200 - -vim-orgmode (0.2.0-1) unstable; urgency=low - - * minor changes to the build files - - -- Jan Christoph Ebersbach Sat, 25 Jun 2011 17:43:48 +0200 - -vim-orgmode (0.2.0-0) unstable; urgency=low - - * remove unused echo command in Makefile - * add vim help file doc/org.txt - * first release - - -- Jan Christoph Ebersbach Sat, 25 Jun 2011 17:35:31 +0200 - -vim-orgmode (0.1.0-89) unstable; urgency=low - - * add separate target to generate the vba.gz archive - - -- Jan Christoph Ebersbach Sat, 25 Jun 2011 16:47:23 +0200 - -vim-orgmode (0.1.0-88) unstable; urgency=low - - * improve error message in case ditaa is not available - - -- Jan Christoph Ebersbach Sat, 25 Jun 2011 16:42:36 +0200 - -vim-orgmode (0.1.0-87) unstable; urgency=low - - * update README and diagram - - -- Jan Christoph Ebersbach Sat, 25 Jun 2011 16:38:31 +0200 - -vim-orgmode (0.1.0-86) unstable; urgency=low - - * fix issue in EditStructure._move_heading that caused the current heading - not to be removed from the list of heading - * improve error messages for non-allowed characters in tags or todo states - * allow \t and space in tags because of an automatic replacement by _ later - on - * fix issue when creating the debian package an not all path components - exist - - -- Jan Christoph Ebersbach Sat, 25 Jun 2011 16:36:39 +0200 - -vim-orgmode (0.1.0-85) unstable; urgency=low - - * add support and tests for splitting a headings title in insert mode - - -- Jan Christoph Ebersbach Sat, 25 Jun 2011 15:55:16 +0200 - -vim-orgmode (0.1.0-84) unstable; urgency=low - - * correct test cases for Navigator plugin - - -- Jan Christoph Ebersbach Sat, 25 Jun 2011 14:05:17 +0200 - -vim-orgmode (0.1.0-83) unstable; urgency=low - - * remove LoggingWork from loaded plugins - * fix a problem when positioning the cursor on a newly created heading - * fix a problem when positioning the cursor on the first character of a - non-heading line - * fix a problem when indenting non-heading lines in insert mode - - -- Jan Christoph Ebersbach Sat, 25 Jun 2011 13:13:41 +0200 - -vim-orgmode (0.1.0-82) unstable; urgency=low - - * change global function insert_at_cursor to append text after cursor - * add support for insert mode to insert_at_cursor - * fix traceback in Date plugin caused by conversion to unicode - * change insert date mappings to ,si and ,sa - * add submenu Change Date to Date plugin - - -- Jan Christoph Ebersbach Sat, 25 Jun 2011 13:00:54 +0200 - -vim-orgmode (0.1.0-81) unstable; urgency=low - - * fix error in TagsProperties.set_tags when None type object is returned - * change TagsProperties.realign_tags to use VimBuffer.write_heading instead - of VimBuffer.write method - * add convenience function VimBuffer.find_current_heading - * remove trailing spaces when a heading contains a single uppercase word - (pseudo TODO state) - * change Heading.copy to create a completely detached heading even without a - connection to a document - * change Heading.start to reture Heading._orig_start when the heading has no - connection to a document - * add parameter connect_with_document to Document.find_heading - * convert plugins and global functions to use VimBuffer.find_current_heading - - -- Jan Christoph Ebersbach Tue, 21 Jun 2011 23:26:25 +0200 - -vim-orgmode (0.1.0-80) unstable; urgency=low - - * update README - - -- Jan Christoph Ebersbach Tue, 21 Jun 2011 07:46:04 +0200 - -vim-orgmode (0.1.0-79) unstable; urgency=low - - * implement VimBuffer.write_heading to just update a single heading - - -- Jan Christoph Ebersbach Sun, 19 Jun 2011 22:19:00 +0200 - -vim-orgmode (0.1.0-78) unstable; urgency=low - - * fix assignment to vim.current.buffer in test cases - - -- Jan Christoph Ebersbach Sun, 19 Jun 2011 15:21:39 +0200 - -vim-orgmode (0.1.0-77) unstable; urgency=low - - * improve memory usage by removing unused document objects - - -- Jan Christoph Ebersbach Sun, 19 Jun 2011 14:33:10 +0200 - -vim-orgmode (0.1.0-76) unstable; urgency=low - - * improve speed by implementing a better reuse of document objects - - -- Jan Christoph Ebersbach Sun, 19 Jun 2011 14:18:26 +0200 - -vim-orgmode (0.1.0-75) unstable; urgency=low - - * fix issue with tag recognition in headings that contain zero or just one - word - - -- Jan Christoph Ebersbach Sun, 19 Jun 2011 14:07:29 +0200 - -vim-orgmode (0.1.0-74) unstable; urgency=low - - * change EditStructure mappings back to using the shift key - - -- Jan Christoph Ebersbach Sun, 19 Jun 2011 13:29:50 +0200 - -vim-orgmode (0.1.0-73) unstable; urgency=low - - * fix regression introduced in version 0.1.0-71 - - -- Jan Christoph Ebersbach Sun, 19 Jun 2011 13:28:43 +0200 - -vim-orgmode (0.1.0-72) unstable; urgency=low - - * change default value of g:org_tag_completion_ignorecase to &ignorecase - - -- Jan Christoph Ebersbach Sun, 19 Jun 2011 13:20:55 +0200 - -vim-orgmode (0.1.0-71) unstable; urgency=low - - * convert vim.eval return values to unicode - - -- Jan Christoph Ebersbach Sun, 19 Jun 2011 13:15:51 +0200 - -vim-orgmode (0.1.0-70) unstable; urgency=low - - * update README - - -- Jan Christoph Ebersbach Sat, 18 Jun 2011 19:21:04 +0200 - -vim-orgmode (0.1.0-69) unstable; urgency=low - - * add support for tagbar plugin - * move ctags support to file ftplugin/org.cnf - - -- Jan Christoph Ebersbach Sat, 18 Jun 2011 19:15:13 +0200 - -vim-orgmode (0.1.0-68) unstable; urgency=low - - * fix encoding error for plugins that directly access vim.current.buffer - - -- Jan Christoph Ebersbach Thu, 16 Jun 2011 12:44:06 +0200 - -vim-orgmode (0.1.0-67) unstable; urgency=low - - * change regex strings to raw strings - - -- Jan Christoph Ebersbach Fri, 17 Jun 2011 08:09:23 +0200 - -vim-orgmode (0.1.0-66) unstable; urgency=low - - * remove highlighting group Question from title colors - * fix utf-8 encoding for vim.command calls - - -- Jan Christoph Ebersbach Thu, 16 Jun 2011 12:39:46 +0200 - -vim-orgmode (0.1.0-65) unstable; urgency=low - - * fix error when aktivating lazyredraw and hidden for the current buffer - * set commentstring to "# %s" - * fix error when switching buffers to get current changetick - * fix error when running get_document with bufnr 0 that opened to the first - document that was queried instead of return the current document - - -- Jan Christoph Ebersbach Wed, 15 Jun 2011 12:42:03 +0200 - -vim-orgmode (0.1.0-64) unstable; urgency=low - - * remove parameter mode from function change_visual_selection - * add more test cases for Navigator plugin, current this plugin is somehow - broken - - -- Jan Christoph Ebersbach Tue, 14 Jun 2011 20:30:45 +0200 - -vim-orgmode (0.1.0-63) unstable; urgency=low - - * convert LoggingWork plugin to unicode - - -- Jan Christoph Ebersbach Tue, 14 Jun 2011 18:47:52 +0200 - -vim-orgmode (0.1.0-62) unstable; urgency=low - - * move initialization of speeddating commands to __init__ method - - -- Jan Christoph Ebersbach Tue, 14 Jun 2011 18:45:16 +0200 - -vim-orgmode (0.1.0-61) unstable; urgency=low - - * convert Date plugin to unicode - * correct a typo in mapping for May - - -- Jan Christoph Ebersbach Tue, 14 Jun 2011 18:36:18 +0200 - -vim-orgmode (0.1.0-60) unstable; urgency=low - - * add missing counter to test_edit_structure.py - - -- Jan Christoph Ebersbach Tue, 14 Jun 2011 18:34:51 +0200 - -vim-orgmode (0.1.0-59) unstable; urgency=low - - * convert Todo plugin to unicode - - -- Jan Christoph Ebersbach Tue, 14 Jun 2011 18:32:01 +0200 - -vim-orgmode (0.1.0-58) unstable; urgency=low - - * fix indentation of docstring in VimBuffer - - -- Jan Christoph Ebersbach Mon, 13 Jun 2011 21:51:16 +0200 - -vim-orgmode (0.1.0-57) unstable; urgency=low - - * convert TagsProperties to liborgmode - - -- Jan Christoph Ebersbach Mon, 13 Jun 2011 21:48:07 +0200 - -vim-orgmode (0.1.0-56) unstable; urgency=low - - * add missing % when doing string formatting in EditStructure plugin - - -- Jan Christoph Ebersbach Mon, 13 Jun 2011 19:27:38 +0200 - -vim-orgmode (0.1.0-55) unstable; urgency=low - - * fix encoding error in keybinding.py when evaluation self.overwrite_exisiting - * convert Hyperlink plugin to unicode - * add hint to current plugin when a traceback occures during initialization - - -- Jan Christoph Ebersbach Mon, 13 Jun 2011 19:23:13 +0200 - -vim-orgmode (0.1.0-54) unstable; urgency=low - - * add copy method to Heading class to make a copy of the object - * track orig_start in Document.write method instead of the heading objects - * convert EditStructure plugin to liborgmode - * swap promote/demote meaning - - -- Jan Christoph Ebersbach Mon, 13 Jun 2011 18:59:21 +0200 - -vim-orgmode (0.1.0-53) unstable; urgency=low - - * fix performance issue when identing/folding text - * rename method load to init_dom - - -- Jan Christoph Ebersbach Sat, 28 May 2011 15:21:58 +0200 - -vim-orgmode (0.1.0-52) unstable; urgency=low - - * fix performance issue by introducing static computation of start value - - -- Jan Christoph Ebersbach Sat, 28 May 2011 14:51:38 +0200 - -vim-orgmode (0.1.0-51) unstable; urgency=low - - * add support for multiple color definitions for :foreground and :background - - -- Jan Christoph Ebersbach Fri, 20 May 2011 08:29:59 +0200 - -vim-orgmode (0.1.0-50) unstable; urgency=low - - * add support for org-todo-keyword-faces - * add support for nested org-todo-keyword lists - * add descriptions and examples for variables - - -- Jan Christoph Ebersbach Sun, 15 May 2011 12:00:41 +0200 - -vim-orgmode (0.1.0-49) unstable; urgency=low - - * general cleanup in syntax file - * add keyword default to all highlighting statements - * add syntax support for comments - * clear highlighting for org_shade_stars group if - g:org_heading_shade_leading_stars is not set - - -- Jan Christoph Ebersbach Sat, 14 May 2011 23:33:50 +0200 - -vim-orgmode (0.1.0-48) unstable; urgency=low - - * add syntax support for tables - - -- Jan Christoph Ebersbach Sat, 14 May 2011 23:04:46 +0200 - -vim-orgmode (0.1.0-47) unstable; urgency=low - - * add syntax support for DEADLINE and SCHEDULED - - -- Jan Christoph Ebersbach Sat, 14 May 2011 21:27:07 +0200 - -vim-orgmode (0.1.0-46) unstable; urgency=low - - * add syntax support for timestamps - - -- Jan Christoph Ebersbach Sat, 14 May 2011 21:11:13 +0200 - -vim-orgmode (0.1.0-45) unstable; urgency=low - - * add syntax support for properties - - -- Jan Christoph Ebersbach Sat, 14 May 2011 20:52:29 +0200 - -vim-orgmode (0.1.0-44) unstable; urgency=low - - * convert tests to unicode - - -- Jan Christoph Ebersbach Fri, 13 May 2011 23:39:38 +0200 - -vim-orgmode (0.1.0-43) unstable; urgency=low - - * change comparison of None to "is" instead of "==" - * add function flatten_list to prevent sublists - * add convenience methods get_index_in_parent_list and get_parent_list to Heading class - * add __unicode__ and __str__ methods to Document - * started porting of EditStructure plugin - - -- Jan Christoph Ebersbach Fri, 13 May 2011 22:59:41 +0200 - -vim-orgmode (0.1.0-42) unstable; urgency=low - - * fix syntax error in syntax/org.vim - - -- Jan Christoph Ebersbach Fri, 13 May 2011 19:30:44 +0200 - -vim-orgmode (0.1.0-41) unstable; urgency=low - - * replace hbsitz's org syntax file - * change highlighting to integrate much better with colorschemes - * change license to AGPL 3 - - -- Jan Christoph Ebersbach Thu, 12 May 2011 18:46:13 +0200 - -vim-orgmode (0.1.0-40) unstable; urgency=low - - * add tag_column and tabstop implementation to VimBuffer - * rename setting org_tags_column to org_tag_column - * rename setting org_tags_completion_ignorecase to - org_tag_completion_ignorecase - * fix unicode settings in test cases - - -- Jan Christoph Ebersbach Tue, 10 May 2011 13:16:35 +0900 - -vim-orgmode (0.1.0-39) unstable; urgency=low - - * fix bug in echo function - use echo command - - -- Jan Christoph Ebersbach Mon, 09 May 2011 21:17:50 +0900 - -vim-orgmode (0.1.0-38) unstable; urgency=low - - * convert Navigator plugin to unicode and liborgmode - - -- Jan Christoph Ebersbach Mon, 09 May 2011 21:17:17 +0900 - -vim-orgmode (0.1.0-37) unstable; urgency=low - - * change echo function to use vim echo function - * add missing unicode parameter to string in ShowHide keybinding - * enable Misc plugin - - -- Jan Christoph Ebersbach Mon, 09 May 2011 20:32:22 +0900 - -vim-orgmode (0.1.0-36) unstable; urgency=low - - * convert Misc plugin to unicode and liborgmode - - -- Jan Christoph Ebersbach Mon, 09 May 2011 20:14:04 +0900 - -vim-orgmode (0.1.0-35) unstable; urgency=low - - * fix a bug in ShowHide.toggle_folding when folding the first heading in - document when it doesn't have a child heading - - -- Jan Christoph Ebersbach Mon, 09 May 2011 19:55:52 +0900 - -vim-orgmode (0.1.0-34) unstable; urgency=low - - * enable tests for ShowHide plugin - - -- Jan Christoph Ebersbach Mon, 09 May 2011 18:40:11 +0900 - -vim-orgmode (0.1.0-33) unstable; urgency=low - - * optimize update_changedtick to not run through all but just the wanted - buffer - - -- Jan Christoph Ebersbach Mon, 09 May 2011 18:33:14 +0900 - -vim-orgmode (0.1.0-32) unstable; urgency=low - - * remove debug infomation from liborgmode.py - * add __str__ method for for Heading class - * port base functionality of orgmode to unicode - * echo a message instead of an error when no plugins are definied - * add heading parameter to VimBuffer methods - * add functionality to reuse VimBuffer objects and recognise user changes - * add BufNotInSync exception - * disable all but ShowHide plugin - * port ShowHide plugin to unicode and liborgmode - * port PluginExample to unicode and liborgmode - - -- Jan Christoph Ebersbach Mon, 09 May 2011 18:20:59 +0900 - -vim-orgmode (0.1.0-31) unstable; urgency=low - - * add vim swap files to gitignore list - - -- Jan Christoph Ebersbach Mon, 09 May 2011 14:29:41 +0900 - -vim-orgmode (0.1.0-30) unstable; urgency=low - - * add support for unicode - - -- Jan Christoph Ebersbach Mon, 09 May 2011 14:27:37 +0900 - -vim-orgmode (0.1.0-29) unstable; urgency=low - - * remove unsued import from liborgmode - * add heading parameter to VimBuffer.loag function - * update tests to use renamed liborgmode/document files - - -- Jan Christoph Ebersbach Mon, 09 May 2011 11:49:25 +0900 - -vim-orgmode (0.1.0-28) unstable; urgency=low - - * rename ftplugin/orgmode/liborgmode.py to ftplugin/liborgmode.py - * rename ftplugin/orgmode/vimbuffer.py to ftplugin/orgmode/document.py - - -- Jan Christoph Ebersbach Mon, 09 May 2011 11:46:39 +0900 - -vim-orgmode (0.1.0-27) unstable; urgency=low - - * update README - - -- Jan Christoph Ebersbach Fri, 06 May 2011 21:40:48 +0900 - -vim-orgmode (0.1.0-26) unstable; urgency=low - - * add load method to documents for initializing the DOM - - -- Jan Christoph Ebersbach Fri, 06 May 2011 21:21:39 +0900 - -vim-orgmode (0.1.0-25) unstable; urgency=low - - * fix heading initialization (Heading.parse_heading_from_data) when orig_start == 0 - * fix comparing of deleted headings - * fix overwriting a single item in a heading - - -- Jan Christoph Ebersbach Fri, 06 May 2011 21:12:49 +0900 - -vim-orgmode (0.1.0-24) unstable; urgency=low - - * add support for tags and todo - * externalize heading create to a separate classmethod - * add all relevant parameters to the heading constructor - - -- Jan Christoph Ebersbach Fri, 06 May 2011 20:20:37 +0900 - -vim-orgmode (0.1.0-23) unstable; urgency=low - - * make Document.is_dirty function test all headings not just the first two - levels - * add more tests for replacing headings - - -- Jan Christoph Ebersbach Thu, 05 May 2011 21:37:27 +0900 - -vim-orgmode (0.1.0-22) unstable; urgency=low - - * distinguish between heading and body changes - * make writing the VimBuffer more efficient - - -- Jan Christoph Ebersbach Thu, 05 May 2011 21:03:28 +0900 - -vim-orgmode (0.1.0-21) unstable; urgency=low - - * use functionality of UserList in MultiPurposeList - - -- Jan Christoph Ebersbach Thu, 05 May 2011 20:13:26 +0900 - -vim-orgmode (0.1.0-20) unstable; urgency=low - - * update README - - -- Jan Christoph Ebersbach Thu, 05 May 2011 10:51:12 +0900 - -vim-orgmode (0.1.0-19) unstable; urgency=low - - * major refactoring of liborgmode - * tests and plugins are currently broken - - -- Jan Christoph Ebersbach Thu, 05 May 2011 10:48:44 +0900 - -vim-orgmode (0.1.0-18) unstable; urgency=low - - * install -D doesn't work on BSD based systems; migrate commands to install -d - - -- Jan Christoph Ebersbach Mon, 02 May 2011 15:41:17 +0900 - -vim-orgmode (0.1.0-17) unstable; urgency=low - - * merge date-plugin from sotte - - -- Jan Christoph Ebersbach Mon, 02 May 2011 15:40:40 +0900 - -vim-orgmode (0.1.0-16) unstable; urgency=low - - * rename heading.py to liborgmode.py - - -- Jan Christoph Ebersbach Tue, 26 Apr 2011 21:55:17 +0900 - -vim-orgmode (0.1.0-15) unstable; urgency=low - - * add variable g:org_syntax_highlight_leading_stars to customize - highlighting of leading stars - - -- Jan Christoph Ebersbach Tue, 26 Apr 2011 21:30:31 +0900 - -vim-orgmode (0.1.0-14) unstable; urgency=low - - * merge todo_refactoring from sotte - - -- Jan Christoph Ebersbach Tue, 26 Apr 2011 21:16:19 +0900 - -vim-orgmode (0.1.0-13) unstable; urgency=low - - * add documentation in form of a diagram describing the functionality of - vim-orgmode, liborgmode and orgcmd - - -- Jan Christoph Ebersbach Tue, 26 Apr 2011 20:41:20 +0900 - -vim-orgmode (0.1.0-12) unstable; urgency=low - - * update todos - - -- Jan Christoph Ebersbach Mon, 28 Mar 2011 00:07:37 +0200 - -vim-orgmode (0.1.0-11) unstable; urgency=low - - * move initialization to start method - - -- Jan Christoph Ebersbach Thu, 24 Mar 2011 20:39:49 +0100 - -vim-orgmode (0.1.0-10) unstable; urgency=low - - * fix problem with the order of decorators (@classmethod must be first) - * remove silence from - - -- Jan Christoph Ebersbach Thu, 24 Mar 2011 17:36:55 +0100 - -vim-orgmode (0.1.0-9) unstable; urgency=low - - * rename update_tag_alignment - - -- Jan Christoph Ebersbach Wed, 23 Mar 2011 19:40:44 +0100 - -vim-orgmode (0.1.0-8) unstable; urgency=low - - * make edit tasks update tags alignment - - -- Jan Christoph Ebersbach Tue, 22 Mar 2011 22:28:59 +0100 - -vim-orgmode (0.1.0-7) unstable; urgency=low - - * clean up of unused imports - * change a bunch of methods into classmethods - - -- Jan Christoph Ebersbach Tue, 22 Mar 2011 22:17:44 +0100 - -vim-orgmode (0.1.0-6) unstable; urgency=low - - * add vim as build dependency - * update Installation and Building information in README - * update todos - - -- Jan Christoph Ebersbach Tue, 22 Mar 2011 21:35:02 +0100 - -vim-orgmode (0.1.0-5) unstable; urgency=low - - * fix passing of function arguments - * fix empty links creation - * update todos for Hyperlinks plugin - - -- Jan Christoph Ebersbach Mon, 21 Mar 2011 12:35:14 +0100 - -vim-orgmode (0.1.0-4) unstable; urgency=low - - * implement Hyperlinks plugin (closes: #11) - - -- Jan Christoph Ebersbach Sun, 20 Mar 2011 00:07:04 +0100 - -vim-orgmode (0.1.0-3) unstable; urgency=low - - * fix syntax issue in PluginExample.py - - -- Jan Christoph Ebersbach Fri, 11 Mar 2011 08:47:34 +0100 - -vim-orgmode (0.1.0-2) unstable; urgency=low - - * correct filename of PluginExample.py (closes: #3) - - -- Jan Christoph Ebersbach Wed, 09 Mar 2011 22:02:49 +0100 - -vim-orgmode (0.1.0-1) unstable; urgency=low - - * Initial release. - - -- Jan Christoph Ebersbach Tue, 22 Feb 2011 22:14:01 +0100 diff --git a/pack/acp/start/vim-orgmode/debian/compat b/pack/acp/start/vim-orgmode/debian/compat deleted file mode 100644 index 7ed6ff8..0000000 --- a/pack/acp/start/vim-orgmode/debian/compat +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/pack/acp/start/vim-orgmode/debian/control b/pack/acp/start/vim-orgmode/debian/control deleted file mode 100644 index c490273..0000000 --- a/pack/acp/start/vim-orgmode/debian/control +++ /dev/null @@ -1,14 +0,0 @@ -Source: vim-orgmode -Priority: extra -Section: editors -Maintainer: Jan Christoph Ebersbach -Build-Depends: debhelper (>= 7), vim -Standards-Version: 3.7.3 -Homepage: http://www.e-jc.de/ - -Package: vim-orgmode -Architecture: all -Depends: python, vim-common, vim -Suggests: emacs -Description: Clone of Org-mode for Vim - Clone of Org-mode for Vim diff --git a/pack/acp/start/vim-orgmode/debian/copyright b/pack/acp/start/vim-orgmode/debian/copyright deleted file mode 100644 index 7825a05..0000000 --- a/pack/acp/start/vim-orgmode/debian/copyright +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (C) 2010,2011 Jan Christoph Ebersbach - -http://www.e-jc.de/ - -All rights reserved. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License version 3 as -published by the Free Software Foundation. - -Binary versions of this file provided by Univention to you as -well as other copyrighted, protected or trademarked materials like -Logos, graphics, fonts, specific documentations and configurations, -cryptographic keys etc. are subject to a license agreement between -you and Univention. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 -USA - -Except file syntax/org.vim which was copied from Herbert Sitz and -changed later on by Jan Christoph Ebersbach. diff --git a/pack/acp/start/vim-orgmode/debian/dirs b/pack/acp/start/vim-orgmode/debian/dirs deleted file mode 100644 index 68f4190..0000000 --- a/pack/acp/start/vim-orgmode/debian/dirs +++ /dev/null @@ -1 +0,0 @@ -usr/share/vim/addons diff --git a/pack/acp/start/vim-orgmode/debian/docs b/pack/acp/start/vim-orgmode/debian/docs deleted file mode 100644 index e9f1307..0000000 --- a/pack/acp/start/vim-orgmode/debian/docs +++ /dev/null @@ -1,2 +0,0 @@ -README.org -LICENSE diff --git a/pack/acp/start/vim-orgmode/debian/examples b/pack/acp/start/vim-orgmode/debian/examples deleted file mode 100644 index 401fb6c..0000000 --- a/pack/acp/start/vim-orgmode/debian/examples +++ /dev/null @@ -1 +0,0 @@ -examples/plugins/PluginExample.py diff --git a/pack/acp/start/vim-orgmode/debian/rules b/pack/acp/start/vim-orgmode/debian/rules deleted file mode 100755 index 4142a9d..0000000 --- a/pack/acp/start/vim-orgmode/debian/rules +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- - -DESTDIR=$(CURDIR)/debian/vim-orgmode -ADDONSDIR=/usr/share/vim/addons - -override_dh_auto_install: - dh_auto_install -- DESTDIR=$(DESTDIR) VIMDIR=$(ADDONSDIR) - -%: - dh $@ diff --git a/pack/acp/start/vim-orgmode/doc/orgguide.txt b/pack/acp/start/vim-orgmode/doc/orgguide.txt deleted file mode 100644 index e8fe382..0000000 --- a/pack/acp/start/vim-orgmode/doc/orgguide.txt +++ /dev/null @@ -1,1553 +0,0 @@ -*orgguide.txt* For Vim version 7.3 Last change: 2014 December 26 - - _ _ ____ __ __ _____ ____ ___ __ __ _____ ____ ____ - ( \/ )(_ _)( \/ ) ( _ )( _ \ / __)( \/ )( _ )( _ \( ___) - \ / _)(_ ) ( )(_)( ) /( (_-. ) ( )(_)( )(_) ))__) - \/ (____)(_/\/\_) (_____)(_)\_) \___/(_/\/\_)(_____)(____/(____) - - -============================================================================== -TABLE OF CONTENTS *org* *org-toc* *orgguide* *orgguide-toc* - - 1. About vim-orgmode guide |orgguide-about| - 2. Introduction |orgguide-introduction| - 3. Installation |orgguide-installation| - 4. Document structure |orgguide-docstructure| - 5. Tables |orgguide-tables| - 6. Hyperlinks |orgguide-hyperlinks| - 7. Todo items |orgguide-todo| - 8. Tags |orgguide-tags| - 9. Properties |orgguide-properties| - 10. Dates and Times |orgguide-dates| - 11. Capture - Refile - Archive |orgguide-capture| - 12. Agenda views |orgguide-agenda| - 13. Export/Markup for rich export |orgguide-export| - 14. Publishing |orgguide-publishing| - 15. Working with source code |orgguide-source| - 16. Miscellaneous |orgguide-misc| - 17. MobileOrg |orgguide-mobileorg| - 18. Customization |orgguide-customization| - 19. Development |orgguide-development| - 20. License vim-orgmode |orgguide-license| - 21. Contributors |orgguide-contributors| - 22. Changelog |orgguide-changelog| - 23. Links |orgguide-links| - 24. Development |orgguide-development| - -============================================================================== -ORG MODE GUIDE *orgguide-about* - -Copyright © 2010 Free Software Foundation - - Permission is granted to copy, distribute and/or modify this document under - the terms of the GNU Free Documentation License, Version 1.3 or any later - version published by the Free Software Foundation; with no Invariant - Sections, with the Front-Cover texts being “A GNU Manual,” and with the - Back-Cover Texts as in (a) below. A copy of the license is included in the - section entitled “GNU Free Documentation License.” - - (a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify - this GNU manual. Buying copies from the FSF supports it in developing GNU - and promoting software freedom.” - - This document is part of a collection distributed under the GNU Free - Documentation License. If you want to distribute this document separately - from the collection, you can do so by adding a copy of the license to the - document, as described in section 6 of the license. - -============================================================================== -INTRODUCTION *vim-orgmode* *orgguide-introduction* - -Vim-orgmode: Text outlining and task management for Vim based on Emacs' -Org-Mode. - -The idea for this plugin was born by listening to the Floss Weekly podcast -introducing Emacs' Org-Mode (http://twit.tv/floss136). Org-Mode has a lot of -strong features like folding, views (sparse tree) and scheduling of tasks. -These are completed by hyperlinks, tags, todo states, priorities aso. - -Vim-orgmode aims at providing the same functionality for Vim and for command -line tools*. - -* WAITING for command line tools and other programs a library liborgmode is - provided. It encapsulates all functionality for parsing and modifying org - files. - ------------------------------------------------------------------------------- -Preface~ - vim-orgmode is a file type plugin for keeping notes, maintaining TODO - lists, and doing project planning with a fast and effective plain-text - system. It is also an authoring and publishing system. - - This document is a copy of the orgmode-guide for emacs - (http://orgmode.org/) with modifications for vim. It contains all basic - features and commands, along with important hints for customization. - - To start create a new file with the extension ".org". - ------------------------------------------------------------------------------- -Features~ - Currently vim-orgmode does not support all orgmode features but is quite - usable. Short list of the already supported features: - - - Syntax highlighting - - Cycle visibility of headings (folding) - - Navigate between headings - - Edit the structure of the document: add, move, promote, denote headings - and more - - Hyperlinks within vim-orgmode and outside (files, webpages, etc.) - - TODO list management - - Tags for headings - - Lists in alphanumeric and bullet item notation and checkbox support - - Basic date handling - - Export to other formats (via emacs) - ------------------------------------------------------------------------------- -Default mappings~ - *org-mappings* -Here is a short overview of the default mappings. They also can be invoked -via the 'Org' menu. Most are only usable in command mode. - - Show/Hide:~ - - Cycle Visibility - - Editing Structure:~ - In GVIM:~ - - insert heading above - - insert heading below, taking over children - - insert heading below, taking over children - - insert heading above, after children - In general Vim Versions:~ - hN - insert heading above - hh - insert heading below, taking over children - hn - insert heading above, after children - - m} - move heading down - m{ - move heading up - m]] - move subtree down - m[[ - move subtree up - - yah - yank heading - dah - delete heading - yar - yank subtree - dar - delete subtree - p - paste subtree - - >> or >ah - demote heading - << or ar - demote subtree - d - select keyword - - previous keyword - - next keyword - - previous keyword set - - next keyword set - - Plain List:~ - cl or - insert plainlist item below - cL or - insert plainlist item above - - Checkboxes:~ - cc - toggle status - cn or - insert checkbox below - cN or - insert checkbox above - - TAGS and properties:~ - st - set tags - - Dates:~ - sa - insert date - si - insert inactive date - pa - insert date by using calendar selection - pi - insert inactive date by using calendar selection - - Agenda:~ - caa - agenda for the week - cat - agenda of all TODOs - caA - agenda for the week for current buffer - caT - agenda of all TODOs for current buffer - - Not yet implemented in vim-orgmode~ - caL - timeline of current buffer - - Export:~ - ep - export as PDF - eb - export as Beamer PDF - eh - export as HTML - el - export as LaTeX - ------------------------------------------------------------------------------- -Inline markup~ - - We support org authoring markup as closely as possible - (we're adding two markdown-like variants for =code= and blockquotes). - - Inline markup: -> - *bold* - /italic/ - _underline_ - +strike-through+ - =code= - ~verbatim~ -< - - Note: - - /italic/ is rendered as reverse in most terms (works fine in gVim, though) - - +strike-through+ doesn't work on Vim / GVim - - the non-standard `code' markup is also supported - - =code= and ~verbatim~ are also supported as block-level markup, see below. - - Ref: http://orgmode.org/manual/Emphasis-and-monospace.html - ------------------------------------------------------------------------------- -INSTALLATION AND UPGRADE *orgguide-installation* - - Download the latest stable release at - http://www.vim.org/scripts/script.php?script_id=3642 - - Open the vimball archive in vim and source it. - - $ vim orgmode.vba -> - :so % -< - ATTENTION: All .pyc files of former versions of vim-orgmode need to be - deleted beforehand! - - Add the following line to your .vimrc file to ensure that filetype plugins - are loaded properly: -> - filetype plugin indent on -< - Installation can also be done with plugin managers that automatically pull - dependencies i.e. vim-plug (https://github.com/junegunn/vim-plug), dein.vim - (https://github.com/Shougo/dein.vim). - - NOTE: For some functionality vim-orgmode relies on external plugins which - are mentioned in suggested plugins. - ------------------------------------------------------------------------------- -Suggested plugins~ - - Universal Text Linking~ - (http://www.vim.org/scripts/script.php?script_id=293) general support for - text linking. The hyperlinks feature of vim-orgmode depends on this - plugin. - - repeat~ - (http://www.vim.org/scripts/script.php?script_id=2136) - Repeat actions that would not be repeatable otherwise. This plugin is - needed when you want to repeat the previous orgmode action. - - taglist~ - ([http://www.vim.org/scripts/script.php?script_id=273) - Display tags for the currently edited file. Vim-orgmode ships with support - for displaying the heading structure and hyperlinks in the taglist plugin. - - tagbar~ - (http://www.vim.org/scripts/script.php?script_id=3465) - A new approach to displaying tags for the currently edited file. - Vim-orgmode ships with support for displaying the heading structure and - hyperlinks in the tagbar plugin. - - speeddating~ - (http://www.vim.org/scripts/script.php?script_id=2120) - In-/decrease dates the vim way: C-a and C-x. Dates and times in the - orgmode format can be in-/decreased if this plugins is installed. - - Narrow Region~ - (http://www.vim.org/scripts/script.php?script_id=3075) - Emulation of Emacs' Narrow Region feature. It might be useful when dealing - with large orgmode files. - - pathogen~ - (http://www.vim.org/scripts/script.php?script_id=2332) - Easy management of multiple vim plugins. - - calendar~ - (https://github.com/mattn/calendar-vim) - This plugin will create a calendar window for timestamp insertion. - - SyntaxRange~ - (http://www.vim.org/scripts/script.php?script_id=4168) - Use proper syntax highlighting for code blocks such as: -> - #+BEGIN_SRC cpp - int i = 1; - #+END_SRC -< - ------------------------------------------------------------------------------- -Feedback~ - If you find problems with vim-orgmode, or if you have questions, remarks, - or ideas about it, please create a ticket on - https://github.com/jceb/vim-orgmode - -============================================================================== -DOCUMENT STRUCTURE *orgguide-docstructure* - ------------------------------------------------------------------------------- -Outlines~ - Outlines allow a document to be organized in a hierarchical structure, which - (at least for me) is the best representation of notes and thoughts. An - overview of this structure is achieved by folding (hiding) large parts of - the document to show only the general document structure and the parts - currently being worked on. vim-orgmode greatly simplifies the use of - outlines by compressing the entire show/hide functionality into a single - command, OrgToggleFolding, which is bound to the key. - ------------------------------------------------------------------------------- -Headlines~ - - Headlines define the structure of an outline tree. The headlines in - vim-orgmode start with one or more stars, on the left margin. For example: -> - * Top level headline - ** Second level - *** 3rd level - some text - *** 3rd level - more text - - * Another top level headline -< - - Some people find the many stars too noisy and would prefer an outline - that has whitespace followed by a single star as headline starters. - |g:org_heading_shade_leading_stars| describes a setup to realize this. - - Body text under headings is not indented by default, but you can control - this with the |g:org_indent| variable. - ------------------------------------------------------------------------------- -Text objects~ - - Vim offers a mighty feature called |text-objects|. A text object is bound to - a certain character sequence that can be used in combination with all kinds - of editing and selection tasks. - - vim-orgmode implements a number of text objects to make editing org files - easier: - - ih inner heading, referring to the current heading - excluding the heading level characters (*) - ah a heading, referring to the current heading including - everything - ir inner subtree, starting with the current heading - ar a subtree, starting with the current heading - Oh inner outer heading, referring to the parent - Or inner outer heading, including subtree, referring to - the parent - OH an outer heading - OT an outer subtree - - Motions can be used like text objects as well. See |orgguide-motion|. - ------------------------------------------------------------------------------- -Visibility cycling~ - Outlines make it possible to hide parts of the text in the buffer. - vim-orgmode uses just two commands, bound to and to change the - visibility in the buffer. - - or *orgguide-Tab* or *orgguide-S-Tab* - Subtree cycling: Rotate current subtree among the - states -> - ,-> FOLDED -> CHILDREN -> SUBTREE --. - '-----------------------------------' -< - - When called with the shift key, global cycling is invoked. - - , or *orgguide-,* or *orgguide-.* - . Global cycling: Rotate the entire buffer among the - states. The same can be achieved by using the - keybindings zm and zr. -> - ,-> OVERVIEW -> CONTENTS -> SHOW ALL --. - '--------------------------------------' -< - - Vim-orgmode doesn't implement the following functionality, yet.~ - When Emacs first visits an org file, the global state is set to - OVERVIEW, i.e. only the top level headlines are visible. This can be - configured through the variable =org-startup-folded=, or on a per-file - basis by adding a startup keyword =overview=, =content=, =showall=, like - this: -> - #+STARTUP: content -< ------------------------------------------------------------------------------- -Motion~ - *orgguide-motion* - The following commands jump to other headlines in the buffer. - - } Next heading. - - { Previous heading. - - ]] Next heading same level. - - [[ Previous heading same level. - - g{ Backward to higher level heading. - - g} Forward to higher level heading. - ------------------------------------------------------------------------------- -Structure editing~ - - *orgguide-S-CR* - Insert new heading with same level as current. If the - cursor is in a plain list item, a new item is created - (see section [[#Plain-lists][Plain lists]]). When this - command is used in the middle of a line, the line is - split and the rest of the line becomes the new - headline. - - Not yet implemented in vim-orgmode~ - M-S- Insert new TODO entry with same level as current - heading. - - or - In a new entry with no text yet, and - will cycle through reasonable levels. - - << or *orgguide-<<* or *orgguide-CTRL-d* - (insert mode) Promote current heading by one level. - - >> or *orgguide->>* or *orgguide-CTRL-t* - (insert mode) Demote current heading by one level. - - *orgguide-<[[* - <[[ Promote the current subtree by one level. - - *orgguide->]]* - >]] Demote the current subtree by one level. - - *orgguide-m{* - m{ Move heading up (swap with previous/next subtree of - same level). - - *orgguide-m}* - m} Move heading down (swap with previous/next subtree of - same level). - - *orgguide-m[[* - m[[ Move subtree up (swap with previous/next subtree of - same level). - - *orgguide-m]]* - m]] Move subtree down (swap with previous/next subtree of - same level). - - Not yet implemented in vim-orgmode~ - C-c C-w Refile entry or region to a different location. See - section [[#Refiling-notes][Refiling notes]]. - - *orgguide-nr* - nr Narrow buffer to current subtree / widen it again - (only if NarrowRegion plugin is installed) - - When there is an active region (Transient Mark mode), promotion and demotion - work on all headlines in the region. - ------------------------------------------------------------------------------- -Sparse trees~ - Not yet implemented in vim-orgmode~ - ------------------------------------------------------------------------------- -Plain lists~ - *orgguide-plain-list* - Within an entry of the outline tree, hand-formatted lists can provide - additional structure. - - They also provide a way to create lists of checkboxes (see section - |orgguide-checkboxes|). - - vim-orgmode supports editing such lists, and the exporter (see section - |orgguide-export|) parses and formats them. - - vim-orgmode knows ordered lists, unordered lists, and description lists: - - 'Unordered' list items start with ‘-’, ‘+’, or ‘*’ as bullets. - - 'Ordered' list items start with ‘1.’ or ‘1)’. - - 'Description' list use ‘ :: ’ to separate the 'term' from the - description. - - Items belonging to the same list must have the same indentation on the - first line. An item ends before the next line that is indented like its - bullet/number, or less. A list ends when all items are closed, or before - two blank lines. An example: -> - ** Lord of the Rings - My favorite scenes are (in this order) - 1. The attack of the Rohirrim - 2. Eowyn's fight with the witch king - + this was already my favorite scene in the book - + I really like Miranda Otto. - Important actors in this film are: - - Elijah Wood :: He plays Frodo - - Sean Austin :: He plays Sam, Frodo's friend. -< - - The following commands act on items when the cursor is in the first line - of an item (the line with the bullet or number). - - Not yet implemented in vim-orgmode~ - The following commands act on items when the cursor is in the first line of - an item (the line with the bullet or number). - ------------------------------------------------------------------------------- -Footnotes~ - Not yet implemented in vim-orgmode~ - -============================================================================== -TABLES *orgguide-tables* - Not yet implemented in vim-orgmode~ - -============================================================================== -HYPERLINKS *orgguide-hyperlinks* - -NOTE: The |utl| plugin is used for this feature and needs to be installed. - http://www.vim.org/scripts/script.php?script_id=293 - -Like HTML, vim-orgmode provides links inside a file, external links to other -files, Usenet articles, emails, and much more. - ------------------------------------------------------------------------------- -Link format~ - *orgguide-linkformat* - vim-orgmode will recognize plain URL-like links and activate them as links. - The general link format, however, looks like this: -> - [[link][description]] or alternatively [[link]] -< - - If vim was compiled with |+conceal|, vim-orgmode will shorten this format to - just display 'description' or 'link' once the link was completely entered - (that is, if all brackets are present) and you've left insert mode or - you're editing another line. - To edit the invisible ‘link’ part, go into insert mode, or call the - 'Insert/edit Link' command by pressing 'gil'. - ------------------------------------------------------------------------------- -Internal links~ - Not yet implemented in vim-orgmode~ - ------------------------------------------------------------------------------- -External links~ - - |utl| supports links to files and websites. Others can be added by extending - utl (see |utl-smartSamples|). External links are URL-like locators. They - start with a short identifying string followed by a colon. There can be no - space after the colon. Here are some examples: -> - http://www.astro.uva.nl/~dominik on the web - file:/home/dominik/images/jupiter.jpg file, absolute path - /home/dominik/images/jupiter.jpg same as above -< - - A link should be enclosed in double brackets and may contain a descriptive - text to be displayed instead of the URL (see section |orgguide-linkformat|), - for example: -> - [[http://www.vim.org/][VIM]] -< - ------------------------------------------------------------------------------- -Handling links~ - - vim-orgmode provides methods to create a link in the correct syntax, to - insert it into an org file, and to follow the link. - - Not yet implemented in vim-orgmode~ - C-c l Store a link to the current location. This is a - /global/ command (you must create the key binding - yourself) which can be used in any buffer to create a - link. The link will be stored for later insertion into - an org buffer (see below). - - *orgguide-gil* - gil Insert a link. This prompts for a link to be inserted - into the buffer. You can just type a link, or use - history keys and to access stored links. - You will be prompted for the description part of the - link. File name completion is enabled to link to a - local file. In addition vim-orgmode provides the - command :OrgHyperlinkInsert to insert a link from - command line. - - gil When the cursor is on an existing link, gil allows you - to edit the link and description parts of the link. - - Not yet implemented in vim-orgmode~ - C-c C-o or mouse-1 or mouse-2 Open link at point. - - Not yet implemented in vim-orgmode~ - C-c & Jump back to a recorded position. A position is - recorded by the commands following internal links, and - by C-c %. Using this command several times in direct - succession moves through a ring of previously recorded - positions. - ------------------------------------------------------------------------------- -Targeted links~ - Not yet implemented in vim-orgmode~ - -============================================================================== -TODO ITEMS *orgguide-todo* - -vim-orgmode does not maintain TODO lists as separate documents. Instead, TODO -items are an integral part of the notes file, because TODO items usually come -up while taking notes! With vim-orgmode, simply mark any entry in a tree as -being a TODO item. In this way, information is not duplicated, and the entire -context from which the TODO item emerged is always present. - -Of course, this technique for managing TODO items scatters them throughout -your notes file. vim-orgmode compensates for this by providing methods to give -you an overview of all the things that you have to do. - ------------------------------------------------------------------------------- -Using TODO states~ - - Any headline becomes a TODO item when it starts with the word ‘TODO’, - for example: -> - *** TODO Write letter to Sam Fortune -< - - The most important commands to work with TODO entries are: - - ct Rotate the TODO state of the current item among. See - |orgguide-tags-settings|for more information. -> - ,-> (unmarked) -> TODO -> DONE --. - '--------------------------------' -< - - Not yet implemented in vim-orgmode~ - The same rotation can also be done “remotely” from the timeline and - agenda buffers with the t command key (see section - |orgguide-agenda-commands|). - - or Select the following/preceding TODO state, similar to - cycling. - - Not yet implemented in vim-orgmode~ - C-c / t View TODO items in a /sparse tree/ (see section - [[#Sparse-trees][Sparse trees]]). Folds the buffer, - but shows all TODO items and the headings hierarchy - above them. - - cat Show the global TODO list. This collects the TODO - items from all agenda files (see section - |orgguide-agenda-views|) into a single buffer. - - Not yet implemented in vim-orgmode~ - S-M- Insert a new TODO entry below the current one. - ------------------------------------------------------------------------------- -Multi-state workflows~ - - You can use TODO keywords to indicate different 'sequential' states in - the process of working on an item, for example: -> - :let g:org_todo_keywords=['TODO', 'FEEDBACK', 'VERIFY', '|', 'DONE', 'DELEGATED'] -< - - The vertical bar separates the TODO keywords (states that 'need action') - from the DONE states (which need 'no further action'). If you don’t - provide the separator bar, the last state is used as the DONE state. - With this setup, the command will cycle an entry from TODO to - FEEDBACK, then to VERIFY, and finally to DONE and DELEGATED. - - Sometimes you may want to use different sets of TODO keywords in - parallel. For example, you may want to have the basic TODO/DONE, but - also a workflow for bug fixing, and a separate state indicating that an - item has been canceled (so it is not DONE, but also does not require - action). Your setup would then look like this: -> - :let g:org_todo_keywords = [['TODO(t)', '|', 'DONE(d)'], - \ ['REPORT(r)', 'BUG(b)', 'KNOWNCAUSE(k)', '|', 'FIXED(f)'], - \ ['CANCELED(c)']] -< - The keywords should all be different, this helps vim-orgmode to keep track - of which subsequence should be used for a given entry. The example also - shows how to define keys for fast access of a particular state, by - adding a letter in parenthesis after each keyword - you will be prompted - for the key after pressing d. - - *orgguide-d* - d prompt for fast access of a todo state - - Not yet implemented in vim-orgmode~ - To define TODO keywords that are valid only in a single file, use the - following text anywhere in the file. - -> - #+BEGIN_EXAMPLE - #+TODO: TODO(t) | DONE(d) - #+TODO: REPORT(r) BUG(b) KNOWNCAUSE(k) | FIXED(f) - #+TODO: | CANCELED(c) - #+END_EXAMPLE -< - - After changing one of these lines, use C-c C-c with the cursor still in - the line to make the changes known to vim-orgmode. - ------------------------------------------------------------------------------- -Progress logging~ - Not yet implemented in vim-orgmode~ - ------------------------------------------------------------------------------- -Priorities~ - Not yet implemented in vim-orgmode~ - ------------------------------------------------------------------------------- -Breaking tasks down into subtasks~ - Not fully implemented in vim-orgmode~ - -It is often advisable to break down large tasks into smaller, manageable -subtasks. You can do this by creating an outline tree below a TODO item, -with detailed subtasks on the tree. To keep the overview over the -fraction of subtasks that are already completed, insert either ‘[/]’ or -‘[%]’ anywhere in the headline. These cookies will be updated each time -the TODO status of a child changes, or when pressing C-c C-c on the -cookie. For example: - -> - * Organize Party [33%] - ** TODO Call people [1/2] - *** TODO Peter - *** DONE Sarah - ** TODO Buy food - ** DONE Talk to neighbor -< - -c# Update the checkboxes status of current heading. It - also update the heading status too. - ------------------------------------------------------------------------------- -Checkboxes~ - *orgguide-checkboxes* - -Every item in a plain list (see section |orgguide-plain-list|) -can be made into a checkbox by starting it with the string ‘[ ]’. -Checkboxes are not included into the global TODO list, so they are often -great to split a task into a number of simple steps. Here is an example -of a checkbox list. - -> - * TODO Organize party [1/3] - - [-] call people [1/2] - - [ ] Peter - - [X] Sarah - - [X] order food - - [ ] think about what music to play -< - -Checkboxes work hierarchically, so if a checkbox item has children that -are checkboxes, toggling one of the children checkboxes will make the -parent checkbox reflect if none, some, or all of the children are -checked. - -The following commands work with checkboxes: - -cc Toggle checkbox status or (with prefix arg) checkbox - presence at point. - -cn or - or Insert a new checkbox below current line. - -cN or - Insert a new checkbox above current line. - -============================================================================== -TAGS *orgguide-tags* - -An excellent way to implement labels and contexts for cross-correlating -information is to assign 'tags' to headlines. vim-orgmode has extensive -support for tags. - -Every headline can contain a list of tags; they occur at the end of the -headline. Tags are normal words containing letters, numbers, ‘_’, and -‘@’. Tags must be preceded and followed by a single colon, e.g., -‘:work:’. Several tags can be specified, as in ‘:work:urgent:’. Tags -will by default be in bold face with the same color as the headline. - ------------------------------------------------------------------------------- -Tag inheritance~ - *orgguide-tags-inheritance* - Not yet implemented in vim-orgmode~ - ------------------------------------------------------------------------------- -Setting tags~ - *orgguide-tags-settings* - Tags can simply be typed into the buffer at the end of a headline. After - a colon, offers completion on tags. There is also a special - command for inserting tags: - - *orgguide-st* - st Enter new tags for the current headline. vim-orgmode - will either offer completion or a special single-key - interface for setting tags, see below. After pressing - , the tags will be inserted and aligned to - 'org-tags-column'. - - *orgguide-ft* - ft Find tags in the current file. - - vim-orgmode will support tag insertion based on a 'list of tags'. By default - this list is constructed dynamically, containing all tags currently used - in the buffer. - ------------------------------------------------------------------------------- -Tag searches~ - *orgguide-tags-search* - Not yet implemented in vim-orgmode~ - -============================================================================== -PROPERTIES *orgguide-properties* - - Not yet implemented in vim-orgmode~ - -============================================================================== -DATES AND TIMES *orgguide-dates* - -To assist project planning, TODO items can be labeled with a date and/or -a time. The specially formatted string carrying the date and time -information is called a 'timestamp' in vim-orgmode. - ------------------------------------------------------------------------------- -Timestamps~ - - A timestamp is a specification of a date (possibly with a time or a range of - times) in a special format, either <2003-09-16 Tue> or <2003-09-16 Tue - 09:39> or <2003-09-16 Tue 12:00-12:30>. A timestamp can appear anywhere in - the headline or body of an org tree entry. Its presence causes entries to - be shown on specific dates in the agenda (see section |orgguide-agenda|). We - distinguish: - - Plain timestamp; Event; Appointment ~ - A simple timestamp just assigns a date/time to an item. This is just like - writing down an appointment or event in a paper agenda. -> - * Meet Peter at the movies <2006-11-01 Wed 19:15> - * Discussion on climate change <2006-11-02 Thu 20:00-22:00> -< - Timestamp with repeater interval ~ - Not yet implemented in vim-orgmode~ - - Diary-style sexp entries ~ - Not yet implemented in vim-orgmode~ - - Time/Date range~ - Two timestamps connected by ‘--’ denote a range. -> - ** Meeting in Amsterdam - <2004-08-23 Mon>--<2004-08-26 Thu> -< - Inactive timestamp~ - Just like a plain timestamp, but with square brackets instead of angular - ones. These timestamps are inactive in the sense that they do 'not' - trigger an entry to show up in the agenda. -> - * Gillian comes late for the fifth time [2006-11-01 Wed] -< ------------------------------------------------------------------------------- -Creating timestamps~ - - For vim-orgmode to recognize timestamps, they need to be in the specific - format. All commands listed below produce timestamps in the correct format. - - *orgmode--sa* - sa Prompt for a date and insert a corresponding - timestamp. - - Not yet implemented in vim-orgmode~ - When the cursor is at an existing timestamp in the - buffer, the command is used to modify this timestamp - instead of inserting a new one. - - Not yet implemented in vim-orgmode~ - When this command is used twice in succession, a time - range is inserted. With a prefix, also add the current - time. - - *orgmode-si* - si Like |orgmode--sa|, but insert an inactive - timestamp that will not cause an agenda entry. - - *orgmode-ctrl-a* or *orgmode-ctrl-x* - CTRL-A or CTRL-X Change the item under the cursor in a timestamp. - The cursor can be on a year, month, day, hour or - minute. NOTE: The plugin 'speeddating' should be - installed for this feature. - - Not yet implemented in vim-orgmode~ - When the timestamp contains a time range like - ‘15:30-16:30’, modifying the first time will also - shift the second, shifting the time block with - constant length. To change the length, modify the - second time. - - When vim-orgmode prompts for a date/time, it will accept any string - containing some date and/or time information, and intelligently interpret - the string, deriving defaults for unspecified information from the current - date and time. - Example~ - If the current date is <2016-06-14 Tue>, entering +3 at the prompt will - insert the date <2016-06-17 Fri>, entering sat will insert date - <2016-06-18 Sat> - - You can also select a date in the pop-up calendar. - NOTE: The plugin 'calendar' should be installed for this feature. - - *orgmode-pa* - pa Open a calendar and prompt a user selected date, then - insert a corresponding timestamp. - - *orgmode-pi* - pi Like |orgmode--pa|, but insert an inactive - timestamp that will not cause an agenda entry. - ------------------------------------------------------------------------------- -Deadlines and scheduling~ - Not yet implemented in vim-orgmode~ - ------------------------------------------------------------------------------- -Clocking work time~ - Not yet implemented in vim-orgmode~ - -============================================================================== -CAPTURE - REFILE - ARCHIVE *orgguide-capture* - - Not yet implemented in vim-orgmode~ - -============================================================================== -AGENDA VIEWS *orgguide-agenda* - -Due to the way vim-orgmode works, TODO items, time-stamped items, and tagged -headlines can be scattered throughout a file or even a number of files. To get -an overview of open action items, or of events that are important for a -particular date, this information must be collected, sorted and displayed in -an organized way. There are several different views, see below. - -The extracted information is displayed in a special agenda buffer. This -buffer is read-only. - -Not yet implemented in vim-orgmode~ -... but provides commands to visit the corresponding locations in the original -org files, and even to edit these files remotely. Remote editing from the -agenda buffer means, for example, that you can change the dates of deadlines -and appointments from the agenda buffer. The commands available in the Agenda -buffer are listed in |orgguide-agenda-commands|. - -- |orgguide-agenda-files| Files being searched for agenda information -- |orgguide-agenda-dispatcher| Keyboard access to agenda views -- |orgguide-agenda-views| What is available out of the box? -- |orgguide-agenda-commands| Remote editing of org trees -- |orgguide-agenda-custom| Defining special searches and views - ------------------------------------------------------------------------------- -Agenda files~ - *g:org_agenda_files* *orgguide-agenda-files* - Default: [] - The information to be shown is normally collected from all 'agendafiles', - the files listed in the variable g:org_agenda_files. - - You can change the list of agenda files like this: -> - let g:org_agenda_files = ['~/org/index.org', ~/org/project.org'] -< - - Also globbing is allowed. This makes it easy to use ALL *.org files in a - folder. Using all *.org files in ~/org/ is done like this: -> - let g:org_agenda_files = ['~/org/*.org'] -< - - WARNING: This might be slow if you have a lot of org files. - ------------------------------------------------------------------------------- -The agenda dispatcher ~ - *orgguide-agenda-dispatcher* - Not yet implemented in vim-orgmode~ - ------------------------------------------------------------------------------- -The built-in agenda views ~ - *orgguide-agenda-views* - - The weekly/daily agenda~ - The purpose of the weekly/daily 'agenda' is to act like a page of a - paper agenda, showing all the tasks for the current week or day. - - *orgguide-caa* - caa Compile an agenda for the current week from a list of - org files. The agenda shows the entries for each day. - - The global TODO list~ - The global TODO list contains all unfinished TODO items formatted and - collected into a single place. - - Not yet implemented in vim-orgmode~ - Remote editing of TODO items lets you change the state of a TODO entry - with a single key press. The commands available in the TODO list are - described in |agenda-commands| - - *orgguide-cat* - cat Show the global TODO list. This collects the TODO - items from all agenda files into a single buffer. - - Not yet implemented in vim-orgmode~ - *orgguide-caT* - caT Like the above, but allows selection of a specific - TODO keyword. - - Matching tags and properties~ - Not yet implemented in vim-orgmode~ - - Timeline for a single file~ - The timeline summarizes all time-stamped items from a single vim-orgmode - file in a /time-sorted view/. The main purpose of this command is to - give an overview over events in a project. - - *orgguide-caL* - caL Show a time-sorted view of the vim-orgmode, with all - time-stamped items. - - Search view~ - Not yet implemented in vim-orgmode~ - ------------------------------------------------------------------------------- -Commands in the agenda buffer~ - *orgguide-agenda-commands* - Entries in the agenda buffer are linked back to the org file where they - originate. Commands are provided to show and jump to the - original entry location, and to edit the org files “remotely” from the - agenda buffer. - - Not yet implemented in vim-orgmode~ - only partly implemented - - Motion~ - Not yet implemented in vim-orgmode~ - - View/Go to org file~ - *orgguide-agenda-Tab* - Go to the original location of the item in an - alternative window. - - *orgguide-agenda-CR* - Go to the original location of the item and stay in - the same/the agenda window. - - *orgguide-agenda-S-CR* - Go to the original location of the item in a new split - window. - - Not yet implemented in vim-orgmode~ - - Change display~ - Not yet implemented in vim-orgmode~ - ------------------------------------------------------------------------------- -Custom agenda views~ - *orgguide-agenda-custom* - Not yet implemented in vim-orgmode~ - -============================================================================== -EXPORTING *orgguide-export* - -NOTE: vim-orgmode relies on Emacs for this feature. Emacs _and_ Emacs' - org-mode need to be installed! For PDF export a Latex environment - is needed as well! - -vim-orgmode documents can be exported into a variety of other formats: -ASCII export for inclusion into emails, HTML to publish on the web, -LaTeX/PDF for beautiful printed documents and DocBook to enter the world -of many other formats using DocBook tools. There is also export to -iCalendar format so that planning information can be incorporated into -desktop calendars. - -Currently, the export to pdf, html, latex and markdown is supported via the -following commands and the 'export' menu: -> - :OrgExportToPDF - :OrgExportToBeamerPDF - :OrgExportToHTML - :OrgExportToLaTeX - :OrgExportToMarkdown -< - -Make sure that you have configured your emacs accordingly, as for instance -the markdown exporter is not loaded by default. To load it, add - -> - (eval-after-load "org" - '(require 'ox-md nil t)) -< - -to your init.el. Make also sure to specify your path by using the -|g:org_export_init_script| option. - - *g:org_export_emacs* -Default: "/usr/bin/emacs" -Path to Emacs executable. Example: -> - :let g:org_export_emacs="~/bin/emcas" -< - - *g:org_export_verbose* -Default: 0 -If set, Emacs' export output is displayed. -> - :let g:org_export_verbose=1 -< - - *g:org_export_init_script* -Default: "" -For the export via Emacs a separate configuration file can be sourced to -determine Emacs' export behavior. Examples: - -Source the ~/.emacs configuration file: -> - :let g:org_export_init_script="~/.emacs" -< - -Or source a different file: -> - :let g:org_export_init_script="~/.emacs_org_init" -< - -============================================================================== -PUBLISHING *orgguide-publishing* - - Not yet implemented in vim-orgmode~ - -============================================================================== -WORKING WITH SOURCE CODE *orgguide-source* - - Not yet implemented in vim-orgmode~ - -============================================================================== -MISCELLANEOUS *orgguide-misc* - - Not yet implemented in vim-orgmode~ - -============================================================================== -MOBILEORG *orgguide-mobileorg* - - Not yet implemented in vim-orgmode~ - -============================================================================== -CUSTOMIZATION *orgguide-customization* - ------------------------------------------------------------------------------- -Remapping shortcuts~ - vim-orgmode provides an easy way for remapping the default keyboard - shortcuts. For this task it relies on vim's mappings. All shortcuts - of vim-orgmode are accessible by s. - - To change a keyboard shortcut the name of the related is needed. - First we need to look up the current mapping in the Org menu. The following - command reveals the 's name: -> - :map -< - - The result should look something like this: -> - :map ,t - n ,t @OrgSetTags -< - - Now we can create an alternate mapping: -> - nmap -< - - To change the mapping for editing tags to t the vimrc entry would - look like this: -> - nmap t @OrgSetTags -< - ------------------------------------------------------------------------------- -Alternate behavior~ - vim-orgmode provides some variables for users to customize certain behaviors - of their orgmode if so desired. - - *g:org_prefer_insert_mode* - Default: 1 - Defines if vim-orgmode will automatically jump into Insert Mode after a new - heading/checkbox/plainlist instance is created through keyboard bindings. If - value is set to 0, orgmode will retain it's original mode. - Example: -> - let org_prefer_insert_mode = 1 -< - ------------------------------------------------------------------------------- -syntax highlighting and indentation~ - Syntax highlighting is customizable to fit nicely with the user's - colorscheme. - - *g:org_aggressive_conceal* - Default: 0 - Defines if format indicating characters for inline markups(bold, italic, - inline code, verbatims, in-file hyper-link, etc.) are displayed. Format - indicating characters will be concealed if value is `1`, rendering a much - cleaner view. However, since this feature is newly introduced(<2016-04-08>) - and still need further testing. It is inactive by default. Example: -> - let g:org_aggressive_conceal = 0 -< - - *g:org_heading_highlight_colors* - Default: ['Title', 'Constant', 'Identifier', 'Statement', 'PreProc', 'Type', - \ 'Special'] - Define the highlighting colors/group names for headings. Example: -> - let g:org_heading_highlight_colors = ['Title', 'Constant', 'Identifier', - \ 'Statement', 'PreProc', 'Type', 'Special'] -< - - *g:org_heading_highlight_levels* - Default: len(g:org_heading_highlight_colors) - Define the number of levels of highlighting. If this number is bigger than - the list of colors defined in of g:org_heading_highlight_colors the colors - of g:org_heading_highlight_colors get repeated. Example: -> - let g:org_heading_highlight_levels = len(g:org_heading_highlight_colors) -< - - *g:org_heading_shade_leading_stars* - Default: 1 - Defines if leading stars are displayed in the color of the heading or if a - special NonText highlighting is used that hides them from user. Example: -> - let g:org_heading_shade_leading_stars = 1 -< - - *g:org_todo_keywords* - Default: ['TODO', '|', 'DONE'] - Defines the keywords that are highlighted in headings. For more information - about this variable, please consult the org-mode documentation - (http://orgmode.org/org.html#index-org_002dtodo_002dkeywords-511). Example: -> - let g:org_todo_keywords = ['TODO', '|', 'DONE'] -< - - *g:org_todo_keyword_faces* - Default: [] - Defines special faces (styles) for displaying g:org_todo_keywords. Please - refer to vim documentation (topic |attr-list|) for allowed values for - :weight, :slant, :decoration. Muliple colors can be separated by comma for - :foreground and :background faces to provide different colors for GUI and - terminal mode. Example: -> - let g:org_todo_keyword_faces = [] -< - - *g:org_indent* - Default: 0 - Defines if body text is indented. By default, text is not indented according - to heading level (heading.level + 1). You can enable it by setting: -> - let g:org_indent = 1 -< - - Syntax Highlighting Examples~ - Define an additionaly keyword 'WAITING' and set the foreground color to - 'cyan'. Define another keyword 'CANCELED' and set the foreground color to - red, background to black and the weight to normal, slant to italc and - decoration to underline: - -> - let g:org_todo_keywords = [['TODO', 'WAITING', '|', 'DONE'], - \ ['|', 'CANCELED']] - let g:org_todo_keyword_faces = [['WAITING', 'cyan'], ['CANCELED', - \ [':foreground red', ':background black', ':weight bold', - \ ':slant italic', ':decoration underline']]] -< - -============================================================================== -DEVELOPMENT *orgguide-development* - -The development of vim-orgmode is coordinated via github: - https://github.com/jceb/vim-orgmode - -If you like this project, have questions, suggestions or problems, simply drop -us a line and open an issue. Patches are very welcome! - -Here is a quick start about the vim-orgmode development. - ------------------------------------------------------------------------------- -Structure and Source Code~ - The majority of the source code is stored in folder ftplugin/orgmode. This - is where the actual functionality of the plugin is located. - - I choose to implement vim-orgmode mainly in Python. I hope this will ease - the implementation especially with the functionality of the Python standard - library at hand. - - Right below the directory ftplugin/orgmode the basic implementation of - vim-orgmode is found. This basic functionality provides everything for - higher level implementations that modify the buffer, provide a menu and - keybindings to the user and everything else that is needed. - - Below the directory ftplugin/orgmode/plugins the plugins are located. Every - plugin must provide a class equal to its filename with the .py-extension. - An example for a plugin can be found in file - ftplugin/orgmode/plugins/Example.py. - - *g:org_plugins* - Default: ['ShowHide', '|', 'Navigator', 'EditStructure', '|', 'Hyperlinks', - \ '|', 'Todo', 'TagsProperties', 'Date', 'Agenda', 'Misc', '|', - \ 'Export'] - Every plugin must be enabled by the user by setting the g:org_plugins - variable. By default all shipped plugins are enabled. Example: -> - let g:org_plugins = ['ShowHide', '|', 'Navigator', 'EditStructure'] -< - - Files and folders~ - . - ├── debian - files needed for building a Debian package - ├── doc - vim documentation - ├── documentation - development documentation - ├── examples - example of aplugin - ├── ftdetect - Filetype detection for orgmode files - ├── ftplugin - Home of the main part of vim-orgmode - │ └── orgmode - Home for all Python code - │ ├── liborgmode - vim unrelated part of vim-orgmde. Contains - │ │ basic data structures and algorithms to - │ │ parse and edit orgfiles. - │ └── plugins - Home for all orgmode plugins - ├── indent - Indentation for orgmode files - ├── syntax - Syntax highlighting - ├── tests - Tests to verify the consistency and - │ correctness of orgmode and the plugins - ├── build_vmb.vim - Build file for creating a Vimball - ├── install-vmb.vim - Local installation of vmb via make target - ├── LICENSE - License Information - ├── README.org - README :) - └── Makefile - make commands - ------------------------------------------------------------------------------- -Writing a plugin~ - To write a plugin: - 1. copy file ftplugin/orgmode/plugins/Example.py to - ftplugin/orgmode/plugins/YourPlugin.py - 2. Change class name to "YourPlugin" - 3. Set the menu name, it doesn't need to match the filename anymore, e.g. - "Your Plugin" - 4. Prepare keybindings in function register by defining a proper action and - a key this action should be mapped to. For further information refer to - section Keybindings. - 5. Register your plugin: -> - let g:org_plugins = ['ShowHide', '|', 'Navigator', 'EditStructure', - \ 'YourPlugin'] -< - - 6. Write unittests and implement YourPlugin. - ------------------------------------------------------------------------------- -Keybindings~ - Keybindings alias mappings are described very well in the vim - documentation, see |map-modes|. vim-orgmode tries to make it easy for the - developer to register new keybindings, make them customizable and provide - menu entries so that the user can access the functionality like in original - orgmode. - - This is done by providing three classes: Keybinding, Plug and ActionEntry - - Keybinding~ - This is the basic class that encapsulates a single keybinding consisting - of a key/mapping and an action. Several options can be set when creating - the object to specify the mode and all kinds of other things. - - If a Plug is given instead of an action string the Plug is bound to the - key. All relevant data is read from the Plug, e.g. name, mode aso. - - Example~ - Map g{ to moving to parent heading in normal mode: -> - Keybinding('g{', \ - ':py ORGMODE.plugins["Navigator"].parent(mode="normal")', \ - mode=MODE_NORMAL) - - vim -> :nmap g{ - \ :py ORGMODE.plugins["Navigator"].parent(mode="normal") -< - - Map g{ to moving to parent heading in normal mode by using a Plug: -> - Keybinding('g{', Plug('OrgJumpToParentNormal', \ - ':py ORGMODE.plugins["Navigator"].parent(mode="normal")')) - - vim -> :nnoremap OrgJumpToParentNormal :py - \ ORGMODE.plugins["Navigator"].parent(mode="normal") - vim -> :nmap g{ OrgJumpToParentNormal -< - - Plug~ - A Plug is a unique keybinding that can not be executed by pressing - any key. This makes it a special Keybinding that takes a name and - an action to create an object. A plug normally goes together with a - regular Keybinding to bind the Plug to a key. - - This special behavior is needed to ensure that keybindings are - customizable by the user. If the user creates a keybinding to a - Plug the Keybinding object makes sure that the users keybinding is - used and the keybinding specified by the plugin is not used. - - Example~ - Map g{ to moving to parent heading in normal mode by using a Plug: -> - Keybinding('g{', Plug('OrgJumpToParentNormal', \ - ':py ORGMODE.plugins["Navigator"].parent(mode="normal")')) - - vim -> :nnoremap OrgJumpToParentNormal - \ :py ORGMODE.plugins["Navigator"].parent(mode="normal") - vim -> :nmap g{ OrgJumpToParentNormal -< - - ActionEntry~ - An ActionEntry makes Keybindings accessible by the vim menu. It takes a - description and a Keybinding object and builds a menu entry from this. The - resulting object can be added to a Submenu object by using the + operator. - - Example~ - Map g{ to moving to parent heading in normal mode by using a Plug: -> - k = Keybinding('g{', Plug('OrgJumpToParentNormal', \ - ':py ORGMODE.plugins["Navigator"].parent(mode="normal")')) - - vim -> :nnoremap OrgJumpToParentNormal - \ :py ORGMODE.plugins["Navigator"].parent(mode="normal") - vim -> :nmap g{ OrgJumpToParentNormal - - menu + ActionEntry('&Up', k) - vim -> :nmenu &Org.&Naviagte Headings.&Upg{ - \ OrgJumpToParentNormal -> - ------------------------------------------------------------------------------- -Building a Vimball~ - Vimball is an archive format for vim plugins. It's of use when you want to - install vim-orgmode for a single user. To build a Vimball just run the - following command in the root folder of this plugin. Please make sure that - vim is installed on your computer: -> - make vmb -< - - For installing the plugin form the resulting orgmode.vmb.gz file, please - refer to the Installation section. - ------------------------------------------------------------------------------- -Building a Debian Package~ - A Debian package is of use when you want to make vim-orgmode available to - all users on your computer. Make sure you've debhelper and vim installed, - than run the following command from the root directory of this plugin to - build the debian package: -> - dpkg-buildpackage -us -uc -< - - For installing the plugin form the resulting vim-orgmode_X.X.X-X.deb file, - please refer to the Installation section. - ------------------------------------------------------------------------------- -Creating Tests Cases~ - For every plugin it's important to write automated test cases. This is - important to ensure that little changes don't break things at the other end - of the project. - - vim-orgmode relies on Pyunit (http://docs.python.org/library/unittest.html). - All tests are located in the tests directory. Run -> - make test -< - - to run all tests. To create a new test the test should be added to the - corresponding test file. - - In case a new plugin is created a new test file needs to be created as well. - The test needs to be added to the test suite located in the file - tests/run_tests.py. - - Finally the -> - make coverage -< - - should be run. The result shows the test coverage of all project files. One - hundred percent (100%) is of course the goal :-) - -============================================================================== -LINKS *orgguide-links* - -- Original org-mode for Emacs (http://orgmode.org) - -- VimOrganizer, another vim port of Emacs org-mode - (http://www.vim.org/scripts/script.php?script_id=3342) - -============================================================================== -CHANGELOG *orgguide-changelog* - -Is found in file CHANGELOG.org - -============================================================================== -CONTRIBUTORS *orgguide-contributors* - -Thanks to all how contributed to vim-orgmode. All contributors are name here -in alphabetic order: - -- Stefan Otte -- Aleksandar Dimitrov - -============================================================================== -LICENSE VIM-ORGMODE *orgguide-license* - -Copyright (C) 2010, 2011 Jan Christoph Ebersbach - -http://www.e-jc.de/ - -All rights reserved. - -The source code of this program is made available under the terms of the GNU -Affero General Public License version 3 (GNU AGPL V3) as published by the Free -Software Foundation. - -Binary versions of this program provided by Univention to you as well as other -copyrighted, protected or trademarked materials like Logos, graphics, fonts, -specific documentations and configurations, cryptographic keys etc. are -subject to a license agreement between you and Univention and not subject to -the GNU AGPL V3. - -In the case you use this program under the terms of the GNU AGPL V3, the -program is provided in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. See the GNU Affero General Public License for more -details. - -You should have received a copy of the GNU Affero General Public License with -the Debian GNU/Linux or Univention distribution in file -/usr/share/common-licenses/AGPL-3; if not, see . - -vim:tw=78:ts=2:sw=2:expandtab:ft=help:norl: diff --git a/pack/acp/start/vim-orgmode/documentation/Makefile b/pack/acp/start/vim-orgmode/documentation/Makefile deleted file mode 100644 index 2e3a821..0000000 --- a/pack/acp/start/vim-orgmode/documentation/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -diagram: diagram.png - -diagram.png: diagram.txt - if [ -n "$(shell which ditaa)" ]; then ditaa $^ $@; elif [ -f ditaa0_9.jar ]; then java -jar ditaa0_9.jar $^ $@; else echo "Unable to find ditaa, please install ditaa or download ditaa0_9.jar (http://ditaa.sf.net/)and place it in folder documentation"; exit 1 ; fi - -clean: - @rm -f diagram.png - -.PHONY: diagram clean diff --git a/pack/acp/start/vim-orgmode/documentation/diagram.txt b/pack/acp/start/vim-orgmode/documentation/diagram.txt deleted file mode 100644 index be71629..0000000 --- a/pack/acp/start/vim-orgmode/documentation/diagram.txt +++ /dev/null @@ -1,75 +0,0 @@ - /------------------------------\ +-----------------------------------+ - | Legend | | vim-orgmode | - | cCCC | | cBLU | - | | | o support for plugins | - | | | o plugins implement orgmode | - +--------------+---------------+ | functionality in vim | - | vim-orgmode | liborgmode | | o mainly plugins implement | - | cBLU | cYEL | | keybindings for interactively | - | | | | changing org-mode files | - | | | | | - +--------------+---------------+ | | - | orgcmd | doesn't exist | +---+-------------------------------+ - | cRED | yet | |1 - | | | | - | | | | - \--------------+-=-------------/ |x - v - +-----------------------------------+ - | Plugins | - | cBLU | - | o manipulate headings | - | o change tags, todo states, lists | - | o integrate with orgcmd | - | o reusable functionality doesn't | - | belong here but into liborgmode!| - | o timer, time tracking | - | | - | | - +---+-------------------------------+ +------------+ - | | VimBuffer | - | | {d} | - | /---------+ cBLU | - | | | | - v | +------------+ - +-----------------------------------+ +---------------++ - 1 | Document | | Extend Document| +-=------------+ - /-----+ cYEL |<-------+ cYEL | |+------------+| - | | o represents an org-mode document | | o abstraction | || file || - | | o contains links to other | | of data/file | || {d} || - | x | documents | | access +-------+| cYEL || - \---->| o contains meta information | | o read | || || - | o contains headings | | o write | |+------------+| - | | | | +--------------+ - | | | | - | | +---------------++ +-=------------+ - +----+------------------------------+ | |+------------+| - |1 ^ | || stdin/ || - | | \--------+| stdout || - | | || {d} || - | \------------\ || cRED || - |x | |+------------+| - v | +--------------+ - +-----------------------------------+ +-+=--------------------------+ - 1 | Heading | |+---------------------------+| - /-----+ cYEL | || orgcmd || - | | o represents a single heading | || cRED || - | | o contains links to other headings| || o implement command line || - | x | o parent heading | || tool for processing org || - \---->| o siblings | || files || - | o children | || o provide output filter || - | | || o convert org-mode docs || - | o title | || to other formats || - | o level | |+---------------------------+| - | o body | +-----------------------------+ - | o tags | - | o todo state | - | o closing date | - | o scheduled date | - | o priority | - | o item lists (class hierarchy) | - | | - | | - | | - +-----------------------------------+ - diff --git a/pack/acp/start/vim-orgmode/documentation/emacs_orgguide.org b/pack/acp/start/vim-orgmode/documentation/emacs_orgguide.org deleted file mode 100644 index 66d7171..0000000 --- a/pack/acp/start/vim-orgmode/documentation/emacs_orgguide.org +++ /dev/null @@ -1,3087 +0,0 @@ -| [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* Org Mode Guide - -Copyright © 2010 Free Software Foundation - -#+BEGIN_QUOTE - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.3 or - any later version published by the Free Software Foundation; with no - Invariant Sections, with the Front-Cover texts being “A GNU Manual,” - and with the Back-Cover Texts as in (a) below. A copy of the license - is included in the section entitled “GNU Free Documentation License.” - - (a) The FSF’s Back-Cover Text is: “You have the freedom to copy and - modify this GNU manual. Buying copies from the FSF supports it in - developing GNU and promoting software freedom.” - - This document is part of a collection distributed under the GNU Free - Documentation License. If you want to distribute this document - separately from the collection, you can do so by adding a copy of the - license to the document, as described in section 6 of the license. -#+END_QUOTE - -[[#Introduction][1. Introduction]] - -Getting started - -[[#Document-Structure][2. Document Structure]] - -A tree works like your brain - -[[#Tables][3. Tables]] - -Pure magic for quick formatting - -[[#Hyperlinks][4. Hyperlinks]] - -Notes in context - -[[#TODO-Items][5. TODO Items]] - -Every tree branch can be a TODO item - -[[#Tags][6. Tags]] - -Tagging headlines and matching sets of tags - -[[#Properties][7. Properties]] - -[[#Dates-and-Times][8. Dates and Times]] - -Making items useful for planning - -[[#Capture-_002d-Refile-_002d-Archive][9. Capture - Refile - Archive]] - -The ins and outs for projects - -[[#Agenda-Views][10. Agenda Views]] - -Collecting information into views - -[[#Markup][11. Markup for rich export]] - -Prepare text for rich export - -[[#Exporting][12. Exporting]] - -Sharing and publishing of notes - -[[#Publishing][13. Publishing]] - -Create a web site of linked Org files - -[[#Working-With-Source-Code][14. Working with source code]] - -Source code snippets embedded in Org - -[[#Miscellaneous][15. Miscellaneous]] - -All the rest which did not fit elsewhere - -#+BEGIN_EXAMPLE - — The Detailed Node Listing — - - Introduction -#+END_EXAMPLE - -[[#Preface][1.1 Preface]] - -Welcome - -[[#Installation][1.2 Installation]] - -How to install a downloaded version of Org - -[[#Activation][1.3 Activation]] - -How to activate Org for certain buffers - -[[#Feedback][1.4 Feedback]] - -Bug reports, ideas, patches etc. - -#+BEGIN_EXAMPLE - Document Structure -#+END_EXAMPLE - -[[#Outlines][2.1 Outlines]] - -Org is based on Outline mode - -[[#Headlines][2.2 Headlines]] - -How to typeset Org tree headlines - -[[#Visibility-cycling][2.3 Visibility cycling]] - -Show and hide, much simplified - -[[#Motion][2.4 Motion]] - -Jumping to other headlines - -[[#Structure-editing][2.5 Structure editing]] - -Changing sequence and level of headlines - -[[#Sparse-trees][2.6 Sparse trees]] - -Matches embedded in context - -[[#Plain-lists][2.7 Plain lists]] - -Additional structure within an entry - -[[#Footnotes][2.8 Footnotes]] - -How footnotes are defined in Org’s syntax - -#+BEGIN_EXAMPLE - Hyperlinks -#+END_EXAMPLE - -[[#Link-format][4.1 Link format]] - -How links in Org are formatted - -[[#Internal-links][4.2 Internal links]] - -Links to other places in the current file - -[[#External-links][4.3 External links]] - -URL-like links to the world - -[[#Handling-links][4.4 Handling links]] - -Creating, inserting and following - -[[#Targeted-links][4.5 Targeted links]] - -Point at a location in a file - -#+BEGIN_EXAMPLE - TODO Items -#+END_EXAMPLE - -[[#Using-TODO-states][5.1 Using TODO states]] - -Setting and switching states - -[[#Multi_002dstate-workflows][5.2 Multi-state workflows]] - -More than just on/off - -[[#Progress-logging][5.3 Progress logging]] - -Dates and notes for progress - -[[#Priorities][5.4 Priorities]] - -Some things are more important than others - -[[#Breaking-down-tasks][5.5 Breaking tasks down into subtasks]] - -Splitting a task into manageable pieces - -[[#Checkboxes][5.6 Checkboxes]] - -Tick-off lists - -#+BEGIN_EXAMPLE - Progress logging -#+END_EXAMPLE - -[[#Closing-items][Closing items]] - -When was this entry marked DONE? - -[[#Tracking-TODO-state-changes][Tracking TODO state changes]] - -When did the status change? - -#+BEGIN_EXAMPLE - Tags -#+END_EXAMPLE - -[[#Tag-inheritance][6.1 Tag inheritance]] - -Tags use the tree structure of the outline - -[[#Setting-tags][6.2 Setting tags]] - -How to assign tags to a headline - -[[#Tag-searches][6.3 Tag searches]] - -Searching for combinations of tags - -#+BEGIN_EXAMPLE - Dates and Times -#+END_EXAMPLE - -[[#Timestamps][8.1 Timestamps]] - -Assigning a time to a tree entry - -[[#Creating-timestamps][8.2 Creating timestamps]] - -Commands which insert timestamps - -[[#Deadlines-and-scheduling][8.3 Deadlines and scheduling]] - -Planning your work - -[[#Clocking-work-time][8.4 Clocking work time]] - -Tracking how long you spend on a task - -#+BEGIN_EXAMPLE - Capture - Refile - Archive -#+END_EXAMPLE - -[[#Capture][9.1 Capture]] - -[[#Refiling-notes][9.2 Refiling notes]] - -Moving a tree from one place to another - -[[#Archiving][9.3 Archiving]] - -What to do with finished projects - -#+BEGIN_EXAMPLE - Capture -#+END_EXAMPLE - -[[#Setting-up-a-capture-location][Setting up a capture location]] - -Where notes will be stored - -[[#Using-capture][Using capture]] - -Commands to invoke and terminate capture - -[[#Capture-templates][Capture templates]] - -Define the outline of different note types - -#+BEGIN_EXAMPLE - Agenda Views -#+END_EXAMPLE - -[[#Agenda-files][10.1 Agenda files]] - -Files being searched for agenda information - -[[#Agenda-dispatcher][10.2 The agenda dispatcher]] - -Keyboard access to agenda views - -[[#Built_002din-agenda-views][10.3 The built-in agenda views]] - -What is available out of the box? - -[[#Agenda-commands][10.4 Commands in the agenda buffer]] - -Remote editing of Org trees - -[[#Custom-agenda-views][10.5 Custom agenda views]] - -Defining special searches and views - -#+BEGIN_EXAMPLE - The built-in agenda views -#+END_EXAMPLE - -[[#Weekly_002fdaily-agenda][10.3.1 The weekly/daily agenda]] - -The calendar page with current tasks - -[[#Global-TODO-list][10.3.2 The global TODO list]] - -All unfinished action items - -[[#Matching-tags-and-properties][10.3.3 Matching tags and properties]] - -Structured information with fine-tuned search - -[[#Timeline][10.3.4 Timeline for a single file]] - -Time-sorted view for single file - -[[#Search-view][10.3.5 Search view]] - -Find entries by searching for text - -#+BEGIN_EXAMPLE - Markup for rich export -#+END_EXAMPLE - -[[#Structural-markup-elements][11.1 Structural markup elements]] - -The basic structure as seen by the exporter - -[[#Images-and-tables][11.2 Images and Tables]] - -Tables and Images will be included - -[[#Literal-examples][11.3 Literal examples]] - -Source code examples with special formatting - -[[#Include-files][11.4 Include files]] - -Include additional files into a document - -[[#Embedded-LaTeX][11.5 Embedded LaTeX]] - -LaTeX can be freely used inside Org documents - -#+BEGIN_EXAMPLE - Structural markup elements -#+END_EXAMPLE - -[[#Document-title][• Document title]] - -Where the title is taken from - -[[#Headings-and-sections][• Headings and sections]] - -The document structure as seen by the exporter - -[[#Table-of-contents][• Table of contents]] - -The if and where of the table of contents - -[[#Paragraphs][• Paragraphs]] - -[[#Emphasis-and-monospace][• Emphasis and monospace]] - -Bold, italic, etc. - -[[#Comment-lines][• Comment lines]] - -What will *not* be exported - -#+BEGIN_EXAMPLE - Exporting -#+END_EXAMPLE - -[[#Export-options][12.1 Export options]] - -Per-file export settings - -[[#The-export-dispatcher][12.2 The export dispatcher]] - -How to access exporter commands - -[[#ASCII_002fLatin_002d1_002fUTF_002d8-export][12.3 ASCII/Latin-1/UTF-8 -export]] - -Exporting to flat files with encoding - -[[#HTML-export][12.4 HTML export]] - -Exporting to HTML - -[[#LaTeX-and-PDF-export][12.5 LaTeX and PDF export]] - -Exporting to LaTeX, and processing to PDF - -[[#DocBook-export][12.6 DocBook export]] - -Exporting to DocBook - -[[#iCalendar-export][12.7 iCalendar export]] - -#+BEGIN_EXAMPLE - Miscellaneous -#+END_EXAMPLE - -[[#Completion][15.1 Completion]] - -M-TAB knows what you need - -[[#Clean-view][15.2 A cleaner outline view]] - -Getting rid of leading stars in the outline - -[[#MobileOrg][15.3 MobileOrg]] - -Org-mode on the iPhone - -#+BEGIN_EXAMPLE -#+END_EXAMPLE - --------------- - -| [[[#Top][<]]] | [[[#Preface][>]]] | | [[[#Top][<<]]] | [[[#Top][Up]]] | [[[#Document-Structure][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 1. Introduction - -| [[#Preface][1.1 Preface]] | | Welcome | -| [[#Installation][1.2 Installation]] | | How to install a downloaded version of Org | -| [[#Activation][1.3 Activation]] | | How to activate Org for certain buffers | -| [[#Feedback][1.4 Feedback]] | | Bug reports, ideas, patches etc. | - --------------- - -| [[[#Introduction][<]]] | [[[#Installation][>]]] | | [[[#Introduction][<<]]] | [[[#Introduction][Up]]] | [[[#Document-Structure][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 1.1 Preface - -Org is a mode for keeping notes, maintaining TODO lists, and doing -project planning with a fast and effective plain-text system. It is also -an authoring and publishing system. - -/This document is a much compressed derivative of the -[[http://orgmode.org/index.html#sec-4_1][comprehensive Org-mode -manual]]. It contains all basic features and commands, along with -important hints for customization. It is intended for beginners who -would shy back from a 200 page manual because of sheer size./ - --------------- - -| [[[#Preface][<]]] | [[[#Activation][>]]] | | [[[#Introduction][<<]]] | [[[#Introduction][Up]]] | [[[#Document-Structure][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 1.2 Installation - -*Important:* /If you are using a version of Org that is part of the -Emacs distribution or an XEmacs package, please skip this section and go -directly to [[#Activation][Activation]]./ - -If you have downloaded Org from the Web, either as a distribution -‘=.zip=’ or ‘=.tar=’ file, or as a Git archive, it is best to run it -directly from the distribution directory. You need to add the ‘=lisp=’ -subdirectories to the Emacs load path. To do this, add the following -line to ‘=.emacs=’: - -#+BEGIN_EXAMPLE - (setq load-path (cons "~/path/to/orgdir/lisp" load-path)) - (setq load-path (cons "~/path/to/orgdir/contrib/lisp" load-path)) -#+END_EXAMPLE - -For speed you should byte-compile the Lisp files with the shell command: - -#+BEGIN_EXAMPLE - make -#+END_EXAMPLE - -Then add the following line to ‘=.emacs=’. It is needed so that Emacs -can autoload functions that are located in files not immediately loaded -when Org-mode starts. - -#+BEGIN_EXAMPLE - (require 'org-install) -#+END_EXAMPLE - --------------- - -| [[[#Installation][<]]] | [[[#Feedback][>]]] | | [[[#Introduction][<<]]] | [[[#Introduction][Up]]] | [[[#Document-Structure][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 1.3 Activation - -Add the following lines to your ‘=.emacs=’ file. The last three lines -define /global/ keys for some commands — please choose suitable keys -yourself. - -#+BEGIN_EXAMPLE - ;; The following lines are always needed. Choose your own keys. - (add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode)) - (add-hook 'org-mode-hook 'turn-on-font-lock) ; not needed when global-font-lock-mode is on - (global-set-key "\C-cl" 'org-store-link) - (global-set-key "\C-ca" 'org-agenda) - (global-set-key "\C-cb" 'org-iswitchb) -#+END_EXAMPLE - -With this setup, all files with extension ‘.org’ will be put into Org -mode. - --------------- - -| [[[#Activation][<]]] | [[[#Document-Structure][>]]] | | [[[#Introduction][<<]]] | [[[#Introduction][Up]]] | [[[#Document-Structure][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 1.4 Feedback - -If you find problems with Org, or if you have questions, remarks, or -ideas about it, please mail to the Org mailing list -[[mailto:emacs-orgmode@gnu.org][emacs-orgmode@gnu.org]]. For information -on how to submit bug reports, see the main manual. - --------------- - -| [[[#Feedback][<]]] | [[[#Outlines][>]]] | | [[[#Introduction][<<]]] | [[[#Top][Up]]] | [[[#Tables][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 2. Document Structure - -Org is based on Outline mode and provides flexible commands to edit the -structure of the document. - -| [[#Outlines][2.1 Outlines]] | | Org is based on Outline mode | -| [[#Headlines][2.2 Headlines]] | | How to typeset Org tree headlines | -| [[#Visibility-cycling][2.3 Visibility cycling]] | | Show and hide, much simplified | -| [[#Motion][2.4 Motion]] | | Jumping to other headlines | -| [[#Structure-editing][2.5 Structure editing]] | | Changing sequence and level of headlines | -| [[#Sparse-trees][2.6 Sparse trees]] | | Matches embedded in context | -| [[#Plain-lists][2.7 Plain lists]] | | Additional structure within an entry | -| [[#Footnotes][2.8 Footnotes]] | | How footnotes are defined in Org’s syntax | - --------------- - -| [[[#Document-Structure][<]]] | [[[#Headlines][>]]] | | [[[#Document-Structure][<<]]] | [[[#Document-Structure][Up]]] | [[[#Tables][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 2.1 Outlines - -Org is implemented on top of Outline mode. Outlines allow a document to -be organized in a hierarchical structure, which (at least for me) is the -best representation of notes and thoughts. An overview of this structure -is achieved by folding (hiding) large parts of the document to show only -the general document structure and the parts currently being worked on. -Org greatly simplifies the use of outlines by compressing the entire -show/hide functionality into a single command, =org-cycle=, which is -bound to the key. - --------------- - -| [[[#Outlines][<]]] | [[[#Visibility-cycling][>]]] | | [[[#Document-Structure][<<]]] | [[[#Document-Structure][Up]]] | [[[#Tables][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 2.2 Headlines - -Headlines define the structure of an outline tree. The headlines in Org -start with one or more stars, on the left margin[[#FOOT1][(1)]]. For -example: - -#+BEGIN_EXAMPLE - * Top level headline - ** Second level - *** 3rd level - some text - *** 3rd level - more text - - * Another top level headline -#+END_EXAMPLE - -Some people find the many stars too noisy and would prefer an outline -that has whitespace followed by a single star as headline starters. -[[#Clean-view][A cleaner outline view]], describes a setup to realize -this. - --------------- - -| [[[#Headlines][<]]] | [[[#Motion][>]]] | | [[[#Document-Structure][<<]]] | [[[#Document-Structure][Up]]] | [[[#Tables][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 2.3 Visibility cycling - -Outlines make it possible to hide parts of the text in the buffer. Org -uses just two commands, bound to and S- to change the -visibility in the buffer. - -- :: /Subtree cycling/: Rotate current subtree among the states - - #+BEGIN_EXAMPLE - ,-> FOLDED -> CHILDREN -> SUBTREE --. - '-----------------------------------' - #+END_EXAMPLE - - When called with a prefix argument (C-u ) or with the shift key, - global cycling is invoked. - -- S- and C-u :: /Global cycling/: Rotate the entire buffer - among the states - - #+BEGIN_EXAMPLE - ,-> OVERVIEW -> CONTENTS -> SHOW ALL --. - '--------------------------------------' - #+END_EXAMPLE - -- C-u C-u C-u :: Show all, including drawers. - -When Emacs first visits an Org file, the global state is set to -OVERVIEW, i.e. only the top level headlines are visible. This can be -configured through the variable =org-startup-folded=, or on a per-file -basis by adding a startup keyword =overview=, =content=, =showall=, like -this: - -#+BEGIN_EXAMPLE - #+STARTUP: content -#+END_EXAMPLE - --------------- - -| [[[#Visibility-cycling][<]]] | [[[#Structure-editing][>]]] | | [[[#Document-Structure][<<]]] | [[[#Document-Structure][Up]]] | [[[#Tables][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 2.4 Motion - -The following commands jump to other headlines in the buffer. - -- C-c C-n :: Next heading. - -- C-c C-p :: Previous heading. - -- C-c C-f :: Next heading same level. - -- C-c C-b :: Previous heading same level. - -- C-c C-u :: Backward to higher level heading. - --------------- - -| [[[#Motion][<]]] | [[[#Sparse-trees][>]]] | | [[[#Document-Structure][<<]]] | [[[#Document-Structure][Up]]] | [[[#Tables][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 2.5 Structure editing - -- M- :: Insert new heading with same level as current. If the - cursor is in a plain list item, a new item is created (see section - [[#Plain-lists][Plain lists]]). When this command is used in the - middle of a line, the line is split and the rest of the line becomes - the new headline[[#FOOT2][(2)]]. - -- M-S- :: Insert new TODO entry with same level as current - heading. - -- in new, empty entry :: In a new entry with no text yet, - will cycle through reasonable levels. - -- M-/ :: Promote/demote current heading by one level. - -- M-S-/ :: Promote/demote the current subtree by one - level. - -- M-S-/ :: Move subtree up/down (swap with previous/next - subtree of same level). - -- C-c C-w :: Refile entry or region to a different location. See - section [[#Refiling-notes][Refiling notes]]. - -- C-x n s/w :: Narrow buffer to current subtree / widen it again - -When there is an active region (Transient Mark mode), promotion and -demotion work on all headlines in the region. - --------------- - -| [[[#Structure-editing][<]]] | [[[#Plain-lists][>]]] | | [[[#Document-Structure][<<]]] | [[[#Document-Structure][Up]]] | [[[#Tables][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 2.6 Sparse trees - -An important feature of Org mode is the ability to construct /sparse -trees/ for selected information in an outline tree, so that the entire -document is folded as much as possible, but the selected information is -made visible along with the headline structure above it[[#FOOT3][(3)]]. -Just try it out and you will see immediately how it works. - -Org mode contains several commands creating such trees, all these -commands can be accessed through a dispatcher: - -- C-c / :: This prompts for an extra key to select a sparse-tree - creating command. - -- C-c / r :: Occur. Prompts for a regexp and shows a sparse tree with - all matches. Each match is also highlighted; the highlights disappear - by pressing C-c C-c. - -The other sparse tree commands select headings based on TODO keywords, -tags, or properties and will be discussed later in this manual. - --------------- - -| [[[#Sparse-trees][<]]] | [[[#Footnotes][>]]] | | [[[#Document-Structure][<<]]] | [[[#Document-Structure][Up]]] | [[[#Tables][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 2.7 Plain lists - -Within an entry of the outline tree, hand-formatted lists can provide -additional structure. They also provide a way to create lists of -checkboxes (see section [[#Checkboxes][Checkboxes]]). Org supports -editing such lists, and the HTML exporter (see section -[[#Exporting][Exporting]]) parses and formats them. - -Org knows ordered lists, unordered lists, and description lists. - -- /Unordered/ list items start with ‘-’, ‘+’, or ‘*’ as bullets. -- /Ordered/ list items start with ‘1.’ or ‘1)’. -- /Description/ list use ‘ :: ’ to separate the /term/ from the - description. - -Items belonging to the same list must have the same indentation on the -first line. An item ends before the next line that is indented like its -bullet/number, or less. A list ends when all items are closed, or before -two blank lines. An example: - -#+BEGIN_EXAMPLE - ** Lord of the Rings - My favorite scenes are (in this order) - 1. The attack of the Rohirrim - 2. Eowyn's fight with the witch king - + this was already my favorite scene in the book - + I really like Miranda Otto. - Important actors in this film are: - - Elijah Wood :: He plays Frodo - - Sean Austin :: He plays Sam, Frodo's friend. -#+END_EXAMPLE - -The following commands act on items when the cursor is in the first line -of an item (the line with the bullet or number). - -- :: Items can be folded just like headline levels. - -- M- :: Insert new item at current level. With a prefix argument, - force a new heading (see section [[#Structure-editing][Structure - editing]]). - -- M-S- :: Insert a new item with a checkbox (see section - [[#Checkboxes][Checkboxes]]). - -- M-S-/ :: Move the item including subitems up/down (swap - with previous/next item of same indentation). If the list is ordered, - renumbering is automatic. - -- M-/M- :: Decrease/increase the indentation of an item, - leaving children alone. - -- M-S-/ :: Decrease/increase the indentation of the item, - including subitems. - -- C-c C-c :: If there is a checkbox (see section - [[#Checkboxes][Checkboxes]]) in the item line, toggle the state of - the checkbox. Also verify bullets and indentation consistency in the - whole list. - -- C-c - :: Cycle the entire list level through the different - itemize/enumerate bullets (‘-’, ‘+’, ‘*’, ‘1.’, ‘1)’). - --------------- - -| [[[#Plain-lists][<]]] | [[[#Tables][>]]] | | [[[#Document-Structure][<<]]] | [[[#Document-Structure][Up]]] | [[[#Tables][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 2.8 Footnotes - -A footnote is defined in a paragraph that is started by a footnote -marker in square brackets in column 0, no indentation allowed. The -footnote reference is simply the marker in square brackets, inside text. -For example: - -#+BEGIN_EXAMPLE - The Org homepage[fn:1] now looks a lot better than it used to. - ... - [fn:1] The link is: http://orgmode.org -#+END_EXAMPLE - -The following commands handle footnotes: - -- C-c C-x f :: The footnote action command. When the cursor is on a - footnote reference, jump to the definition. When it is at a - definition, jump to the (first) reference. Otherwise, create a new - footnote. When this command is called with a prefix argument, a menu - of additional options including renumbering is offered. - -- C-c C-c :: Jump between definition and reference. - -*Further reading* -[[http://orgmode.org/manual/Document-Structure.html#Document-Structure][Chapter -2 of the manual]] - [[http://sachachua.com/wp/2008/01/outlining-your-notes-with-org/][Sacha -Chua’s tutorial]] - --------------- - -| [[[#Footnotes][<]]] | [[[#Hyperlinks][>]]] | | [[[#Document-Structure][<<]]] | [[[#Top][Up]]] | [[[#Hyperlinks][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 3. Tables - -Org comes with a fast and intuitive table editor. Spreadsheet-like -calculations are supported in connection with the Emacs ‘=calc=’ package -(see the Emacs Calculator manual for more information about the Emacs -calculator). - -Org makes it easy to format tables in plain ASCII. Any line with ‘|’ as -the first non-whitespace character is considered part of a table. ‘|’ is -also the column separator. A table might look like this: - -#+BEGIN_EXAMPLE - | Name | Phone | Age | - |-------+-------+-----| - | Peter | 1234 | 17 | - | Anna | 4321 | 25 | -#+END_EXAMPLE - -A table is re-aligned automatically each time you press or -or C-c C-c inside the table. also moves to the next field ( -to the next row) and creates new table rows at the end of the table or -before horizontal lines. The indentation of the table is set by the -first line. Any line starting with ‘|-’ is considered as a horizontal -separator line and will be expanded on the next re-align to span the -whole table width. So, to create the above table, you would only type - -#+BEGIN_EXAMPLE - |Name|Phone|Age| - |- -#+END_EXAMPLE - -and then press to align the table and start filling in fields. -Even faster would be to type =|Name|Phone|Age= followed by C-c . - -When typing text into a field, Org treats , , and all -character keys in a special way, so that inserting and deleting avoids -shifting other fields. Also, when typing /immediately after the cursor -was moved into a new field with , S- or /, the field is -automatically made blank. - -- *Creation and conversion* - C-c | :: Convert the active region to table. If every line contains - at least one TAB character, the function assumes that the material is - tab separated. If every line contains a comma, comma-separated values - (CSV) are assumed. If not, lines are split at whitespace into fields. - If there is no active region, this command creates an empty Org - table. But it’s easier just to start typing, like |Name|Phone|Age C-c - . - -- *Re-aligning and field motion* - C-c C-c :: Re-align the table without moving the cursor. - -- :: Re-align the table, move to the next field. Creates a new - row if necessary. - -- S- :: Re-align, move to previous field. - -- :: Re-align the table and move down to next row. Creates a new - row if necessary. - -- *Column and row editing* - M- - M- :: Move the current column left/right. - -- M-S- :: Kill the current column. - -- M-S- :: Insert a new column to the left of the cursor - position. - -- M- - M- :: Move the current row up/down. - -- M-S- :: Kill the current row or horizontal line. - -- M-S- :: Insert a new row above the current row. With a prefix - argument, the line is created below the current one. - -- C-c - :: Insert a horizontal line below current row. With a prefix - argument, the line is created above the current line. - -- C-c :: Insert a horizontal line below current row, and move - the cursor into the row below that line. - -- C-c \^ :: Sort the table lines in the region. The position of point - indicates the column to be used for sorting, and the range of lines - is the range between the nearest horizontal separator lines, or the - entire table. - -*Further reading* -[[http://orgmode.org/manual/Tables.html#Tables][Chapter 3 of the -manual]] - [[http://orgmode.org/worg/org-tutorials/tables.php][Bastien’s table -tutorial]] - -[[http://orgmode.org/worg/org-tutorials/org-spreadsheet-intro.php][Bastien’s -spreadsheet tutorial]] - [[http://orgmode.org/worg/org-tutorials/org-plot.php][Eric’s plotting -tutorial]] - --------------- - -| [[[#Tables][<]]] | [[[#Link-format][>]]] | | [[[#Tables][<<]]] | [[[#Top][Up]]] | [[[#TODO-Items][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 4. Hyperlinks - -Like HTML, Org provides links inside a file, external links to other -files, Usenet articles, emails, and much more. - -| [[#Link-format][4.1 Link format]] | | How links in Org are formatted | -| [[#Internal-links][4.2 Internal links]] | | Links to other places in the current file | -| [[#External-links][4.3 External links]] | | URL-like links to the world | -| [[#Handling-links][4.4 Handling links]] | | Creating, inserting and following | -| [[#Targeted-links][4.5 Targeted links]] | | Point at a location in a file | - --------------- - -| [[[#Hyperlinks][<]]] | [[[#Internal-links][>]]] | | [[[#Hyperlinks][<<]]] | [[[#Hyperlinks][Up]]] | [[[#TODO-Items][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 4.1 Link format - -Org will recognize plain URL-like links and activate them as clickable -links. The general link format, however, looks like this: - -#+BEGIN_EXAMPLE - [[link][description]] or alternatively [[link]] -#+END_EXAMPLE - -Once a link in the buffer is complete (all brackets present), Org will -change the display so that ‘description’ is displayed instead of -‘[[link][description]]’ and ‘link’ is displayed instead of ‘[[link]]’. -To edit the invisible ‘link’ part, use C-c C-l with the cursor on the -link. - --------------- - -| [[[#Link-format][<]]] | [[[#External-links][>]]] | | [[[#Hyperlinks][<<]]] | [[[#Hyperlinks][Up]]] | [[[#TODO-Items][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 4.2 Internal links - -If the link does not look like a URL, it is considered to be internal in -the current file. The most important case is a link like -‘[[#my-custom-id]]’ which will link to the entry with the =CUSTOM_ID= -property ‘my-custom-id’. - -Links such as ‘[[My Target]]’ or ‘[[My Target][Find my target]]’ lead to -a text search in the current file for the corresponding target which -looks like ‘<>’. - --------------- - -| [[[#Internal-links][<]]] | [[[#Handling-links][>]]] | | [[[#Hyperlinks][<<]]] | [[[#Hyperlinks][Up]]] | [[[#TODO-Items][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 4.3 External links - -Org supports links to files, websites, Usenet and email messages, BBDB -database entries and links to both IRC conversations and their logs. -External links are URL-like locators. They start with a short -identifying string followed by a colon. There can be no space after the -colon. Here are some examples: - -#+BEGIN_EXAMPLE - http://www.astro.uva.nl/~dominik on the web - file:/home/dominik/images/jupiter.jpg file, absolute path - /home/dominik/images/jupiter.jpg same as above - file:papers/last.pdf file, relative path - file:projects.org another Org file - docview:papers/last.pdf::NNN open file in doc-view mode at page NNN - id:B7423F4D-2E8A-471B-8810-C40F074717E9 Link to heading by ID - news:comp.emacs Usenet link - mailto:adent@galaxy.net Mail link - vm:folder VM folder link - vm:folder#id VM message link - wl:folder#id WANDERLUST message link - mhe:folder#id MH-E message link - rmail:folder#id RMAIL message link - gnus:group#id Gnus article link - bbdb:R.*Stallman BBDB link (with regexp) - irc:/irc.com/#emacs/bob IRC link - info:org:External%20links Info node link (with encoded space) -#+END_EXAMPLE - -A link should be enclosed in double brackets and may contain a -descriptive text to be displayed instead of the URL (see section -[[#Link-format][Link format]]), for example: - -#+BEGIN_EXAMPLE - [[http://www.gnu.org/software/emacs/][GNU Emacs]] -#+END_EXAMPLE - -If the description is a file name or URL that points to an image, HTML -export (see section [[#HTML-export][HTML export]]) will inline the image -as a clickable button. If there is no description at all and the link -points to an image, that image will be inlined into the exported HTML -file. - --------------- - -| [[[#External-links][<]]] | [[[#Targeted-links][>]]] | | [[[#Hyperlinks][<<]]] | [[[#Hyperlinks][Up]]] | [[[#TODO-Items][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 4.4 Handling links - -Org provides methods to create a link in the correct syntax, to insert -it into an Org file, and to follow the link. - -- C-c l :: Store a link to the current location. This is a /global/ - command (you must create the key binding yourself) which can be used - in any buffer to create a link. The link will be stored for later - insertion into an Org buffer (see below). - -- C-c C-l :: Insert a link. This prompts for a link to be inserted - into the buffer. You can just type a link, or use history keys - and to access stored links. You will be prompted for the - description part of the link. When called with a C-u prefix argument, - file name completion is used to link to a file. - -- C-c C-l (with cursor on existing link) :: When the cursor is on an - existing link, C-c C-l allows you to edit the link and description - parts of the link. - -- C-c C-o or mouse-1 or mouse-2 :: Open link at point. - -- C-c & :: Jump back to a recorded position. A position is recorded by - the commands following internal links, and by C-c %. Using this - command several times in direct succession moves through a ring of - previously recorded positions. - --------------- - -| [[[#Handling-links][<]]] | [[[#TODO-Items][>]]] | | [[[#Hyperlinks][<<]]] | [[[#Hyperlinks][Up]]] | [[[#TODO-Items][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 4.5 Targeted links - -File links can contain additional information to make Emacs jump to a -particular location in the file when following a link. This can be a -line number or a search option after a double colon. - -Here is the syntax of the different ways to attach a search to a file -link, together with an explanation: - -#+BEGIN_EXAMPLE - [[file:~/code/main.c::255]] Find line 255 - [[file:~/xx.org::My Target]] Find ‘<>’ - [[file:~/xx.org::#my-custom-id]] Find entry with custom id -#+END_EXAMPLE - -*Further reading* -[[http://orgmode.org/manual/Hyperlinks.html#Hyperlinks][Chapter 4 of the -manual]] - --------------- - -| [[[#Targeted-links][<]]] | [[[#Using-TODO-states][>]]] | | [[[#Hyperlinks][<<]]] | [[[#Top][Up]]] | [[[#Tags][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 5. TODO Items - -Org mode does not maintain TODO lists as separate -documents[[#FOOT4][(4)]]. Instead, TODO items are an integral part of -the notes file, because TODO items usually come up while taking notes! -With Org mode, simply mark any entry in a tree as being a TODO item. In -this way, information is not duplicated, and the entire context from -which the TODO item emerged is always present. - -Of course, this technique for managing TODO items scatters them -throughout your notes file. Org mode compensates for this by providing -methods to give you an overview of all the things that you have to do. - -| [[#Using-TODO-states][5.1 Using TODO states]] | | Setting and switching states | -| [[#Multi_002dstate-workflows][5.2 Multi-state workflows]] | | More than just on/off | -| [[#Progress-logging][5.3 Progress logging]] | | Dates and notes for progress | -| [[#Priorities][5.4 Priorities]] | | Some things are more important than others | -| [[#Breaking-down-tasks][5.5 Breaking tasks down into subtasks]] | | Splitting a task into manageable pieces | -| [[#Checkboxes][5.6 Checkboxes]] | | Tick-off lists | - --------------- - -| [[[#TODO-Items][<]]] | [[[#Multi_002dstate-workflows][>]]] | | [[[#TODO-Items][<<]]] | [[[#TODO-Items][Up]]] | [[[#Tags][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 5.1 Using TODO states - -Any headline becomes a TODO item when it starts with the word ‘TODO’, -for example: - -#+BEGIN_EXAMPLE - *** TODO Write letter to Sam Fortune -#+END_EXAMPLE - -The most important commands to work with TODO entries are: - -- C-c C-t :: Rotate the TODO state of the current item among - - #+BEGIN_EXAMPLE - ,-> (unmarked) -> TODO -> DONE --. - '--------------------------------' - #+END_EXAMPLE - - The same rotation can also be done “remotely” from the timeline and - agenda buffers with the t command key (see section - [[#Agenda-commands][Commands in the agenda buffer]]). - -- S-/ :: Select the following/preceding TODO state, - similar to cycling. - -- C-c / t :: View TODO items in a /sparse tree/ (see section - [[#Sparse-trees][Sparse trees]]). Folds the buffer, but shows all - TODO items and the headings hierarchy above them. - -- C-c a t :: Show the global TODO list. Collects the TODO items from - all agenda files (see section [[#Agenda-Views][Agenda Views]]) into a - single buffer. See section [[#Global-TODO-list][The global TODO - list]], for more information. - -- S-M- :: Insert a new TODO entry below the current one. - -Changing a TODO state can also trigger tag changes. See the docstring of -the option =org-todo-state-tags-triggers= for details. - --------------- - -| [[[#Using-TODO-states][<]]] | [[[#Progress-logging][>]]] | | [[[#TODO-Items][<<]]] | [[[#TODO-Items][Up]]] | [[[#Tags][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 5.2 Multi-state workflows - -You can use TODO keywords to indicate different /sequential/ states in -the process of working on an item, for example: - -#+BEGIN_EXAMPLE - (setq org-todo-keywords - '((sequence "TODO" "FEEDBACK" "VERIFY" "|" "DONE" "DELEGATED"))) -#+END_EXAMPLE - -The vertical bar separates the TODO keywords (states that /need action/) -from the DONE states (which need /no further action/). If you don’t -provide the separator bar, the last state is used as the DONE state. -With this setup, the command C-c C-t will cycle an entry from TODO to -FEEDBACK, then to VERIFY, and finally to DONE and DELEGATED. - -Sometimes you may want to use different sets of TODO keywords in -parallel. For example, you may want to have the basic =TODO=/=DONE=, but -also a workflow for bug fixing, and a separate state indicating that an -item has been canceled (so it is not DONE, but also does not require -action). Your setup would then look like this: - -#+BEGIN_EXAMPLE - (setq org-todo-keywords - '((sequence "TODO(t)" "|" "DONE(d)") - (sequence "REPORT(r)" "BUG(b)" "KNOWNCAUSE(k)" "|" "FIXED(f)") - (sequence "|" "CANCELED(c)"))) -#+END_EXAMPLE - -The keywords should all be different, this helps Org mode to keep track -of which subsequence should be used for a given entry. The example also -shows how to define keys for fast access of a particular state, by -adding a letter in parenthesis after each keyword - you will be prompted -for the key after C-c C-t. - -To define TODO keywords that are valid only in a single file, use the -following text anywhere in the file. - -#+BEGIN_EXAMPLE - #+TODO: TODO(t) | DONE(d) - #+TODO: REPORT(r) BUG(b) KNOWNCAUSE(k) | FIXED(f) - #+TODO: | CANCELED(c) -#+END_EXAMPLE - -After changing one of these lines, use C-c C-c with the cursor still in -the line to make the changes known to Org mode. - --------------- - -| [[[#Multi_002dstate-workflows][<]]] | [[[#Closing-items][>]]] | | [[[#TODO-Items][<<]]] | [[[#TODO-Items][Up]]] | [[[#Tags][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 5.3 Progress logging - -Org mode can automatically record a timestamp and possibly a note when -you mark a TODO item as DONE, or even each time you change the state of -a TODO item. This system is highly configurable, settings can be on a -per-keyword basis and can be localized to a file or even a subtree. For -information on how to clock working time for a task, see -[[#Clocking-work-time][Clocking work time]]. - -| [[#Closing-items][Closing items]] | | When was this entry marked DONE? | -| [[#Tracking-TODO-state-changes][Tracking TODO state changes]] | | When did the status change? | - --------------- - -| [[[#Progress-logging][<]]] | [[[#Tracking-TODO-state-changes][>]]] | | [[[#TODO-Items][<<]]] | [[[#Progress-logging][Up]]] | [[[#Tags][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -*** Closing items - -The most basic logging is to keep track of /when/ a certain TODO item -was finished. This is achieved with[[#FOOT5][(5)]]. - -#+BEGIN_EXAMPLE - (setq org-log-done 'time) -#+END_EXAMPLE - -Then each time you turn an entry from a TODO (not-done) state into any -of the DONE states, a line ‘CLOSED: [timestamp]’ will be inserted just -after the headline. If you want to record a note along with the -timestamp, use[[#FOOT6][(6)]] - -#+BEGIN_EXAMPLE - (setq org-log-done 'note) -#+END_EXAMPLE - -You will then be prompted for a note, and that note will be stored below -the entry with a ‘Closing Note’ heading. - --------------- - -| [[[#Closing-items][<]]] | [[[#Priorities][>]]] | | [[[#TODO-Items][<<]]] | [[[#Progress-logging][Up]]] | [[[#Tags][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -*** Tracking TODO state changes - -You might want to keep track of TODO state changes. You can either -record just a timestamp, or a time-stamped note for a change. These -records will be inserted after the headline as an itemized list. When -taking a lot of notes, you might want to get the notes out of the way -into a drawer. Customize the variable =org-log-into-drawer= to get this -behavior. - -For state logging, Org mode expects configuration on a per-keyword -basis. This is achieved by adding special markers ‘!’ (for a timestamp) -and ‘@’ (for a note) in parentheses after each keyword. For example: - -#+BEGIN_EXAMPLE - #+TODO: TODO(t) WAIT(w@/!) | DONE(d!) CANCELED(c@) -#+END_EXAMPLE - -will define TODO keywords and fast access keys, and also request that a -time is recorded when the entry is set to DONE, and that a note is -recorded when switching to WAIT or CANCELED. The same syntax works also -when setting =org-todo-keywords=. - --------------- - -| [[[#Tracking-TODO-state-changes][<]]] | [[[#Breaking-down-tasks][>]]] | | [[[#TODO-Items][<<]]] | [[[#TODO-Items][Up]]] | [[[#Tags][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 5.4 Priorities - -If you use Org mode extensively, you may end up with enough TODO items -that it starts to make sense to prioritize them. Prioritizing can be -done by placing a /priority cookie/ into the headline of a TODO item, -like this - -#+BEGIN_EXAMPLE - *** TODO [#A] Write letter to Sam Fortune -#+END_EXAMPLE - -Org mode supports three priorities: ‘A’, ‘B’, and ‘C’. ‘A’ is the -highest, ‘B’ the default if none is given. Priorities make a difference -only in the agenda. - -- C-c , :: Set the priority of the current headline. Press ‘A’, ‘B’ or - ‘C’ to select a priority, or to remove the cookie. - -- S- - S- :: Increase/decrease priority of current headline - --------------- - -| [[[#Priorities][<]]] | [[[#Checkboxes][>]]] | | [[[#TODO-Items][<<]]] | [[[#TODO-Items][Up]]] | [[[#Tags][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 5.5 Breaking tasks down into subtasks - -It is often advisable to break down large tasks into smaller, manageable -subtasks. You can do this by creating an outline tree below a TODO item, -with detailed subtasks on the tree. To keep the overview over the -fraction of subtasks that are already completed, insert either ‘[/]’ or -‘[%]’ anywhere in the headline. These cookies will be updated each time -the TODO status of a child changes, or when pressing C-c C-c on the -cookie. For example: - -#+BEGIN_EXAMPLE - * Organize Party [33%] - ** TODO Call people [1/2] - *** TODO Peter - *** DONE Sarah - ** TODO Buy food - ** DONE Talk to neighbor -#+END_EXAMPLE - --------------- - -| [[[#Breaking-down-tasks][<]]] | [[[#Tags][>]]] | | [[[#TODO-Items][<<]]] | [[[#TODO-Items][Up]]] | [[[#Tags][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 5.6 Checkboxes - -Every item in a plain list (see section [[#Plain-lists][Plain lists]]) -can be made into a checkbox by starting it with the string ‘[ ]’. -Checkboxes are not included into the global TODO list, so they are often -great to split a task into a number of simple steps. Here is an example -of a checkbox list. - -#+BEGIN_EXAMPLE - * TODO Organize party [1/3] - - [-] call people [1/2] - - [ ] Peter - - [X] Sarah - - [X] order food - - [ ] think about what music to play -#+END_EXAMPLE - -Checkboxes work hierarchically, so if a checkbox item has children that -are checkboxes, toggling one of the children checkboxes will make the -parent checkbox reflect if none, some, or all of the children are -checked. - -The following commands work with checkboxes: - -- C-c C-c :: Toggle checkbox status or (with prefix arg) checkbox - presence at point. - -- M-S- :: Insert a new item with a checkbox. This works only if - the cursor is already in a plain list item (see section - [[#Plain-lists][Plain lists]]). - -*Further reading* -[[http://orgmode.org/manual/TODO-Items.html#TODO-Items][Chapter 5 of the -manual]] - [[http://orgmode.org/worg/org-tutorials/orgtutorial_dto.php][David -O’Toole’s introductory tutorial]] - -[[http://members.optusnet.com.au/~charles57/GTD/gtd_workflow.html][Charles -Cave’s GTD setup]] - --------------- - -| [[[#Checkboxes][<]]] | [[[#Tag-inheritance][>]]] | | [[[#TODO-Items][<<]]] | [[[#Top][Up]]] | [[[#Properties][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 6. Tags - -An excellent way to implement labels and contexts for cross-correlating -information is to assign /tags/ to headlines. Org mode has extensive -support for tags. - -Every headline can contain a list of tags; they occur at the end of the -headline. Tags are normal words containing letters, numbers, ‘\_’, and -‘@’. Tags must be preceded and followed by a single colon, e.g., -‘:work:’. Several tags can be specified, as in ‘:work:urgent:’. Tags -will by default be in bold face with the same color as the headline. - -| [[#Tag-inheritance][6.1 Tag inheritance]] | | Tags use the tree structure of the outline | -| [[#Setting-tags][6.2 Setting tags]] | | How to assign tags to a headline | -| [[#Tag-searches][6.3 Tag searches]] | | Searching for combinations of tags | - --------------- - -| [[[#Tags][<]]] | [[[#Setting-tags][>]]] | | [[[#Tags][<<]]] | [[[#Tags][Up]]] | [[[#Properties][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 6.1 Tag inheritance - -/Tags/ make use of the hierarchical structure of outline trees. If a -heading has a certain tag, all subheadings will inherit the tag as well. -For example, in the list - -#+BEGIN_EXAMPLE - * Meeting with the French group :work: - ** Summary by Frank :boss:notes: - *** TODO Prepare slides for him :action: -#+END_EXAMPLE - -the final heading will have the tags ‘:work:’, ‘:boss:’, ‘:notes:’, and -‘:action:’ even though the final heading is not explicitly marked with -those tags. You can also set tags that all entries in a file should -inherit just as if these tags were defined in a hypothetical level zero -that surrounds the entire file. Use a line like this[[#FOOT7][(7)]]: - -#+BEGIN_EXAMPLE - #+FILETAGS: :Peter:Boss:Secret: -#+END_EXAMPLE - --------------- - -| [[[#Tag-inheritance][<]]] | [[[#Tag-searches][>]]] | | [[[#Tags][<<]]] | [[[#Tags][Up]]] | [[[#Properties][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 6.2 Setting tags - -Tags can simply be typed into the buffer at the end of a headline. After -a colon, M- offers completion on tags. There is also a special -command for inserting tags: - -- C-c C-q :: Enter new tags for the current headline. Org mode will - either offer completion or a special single-key interface for setting - tags, see below. After pressing , the tags will be inserted and - aligned to =org-tags-column=. When called with a C-u prefix, all tags - in the current buffer will be aligned to that column, just to make - things look nice. - -- C-c C-c :: When the cursor is in a headline, this does the same as - C-c C-q. - -Org will support tag insertion based on a /list of tags/. By default -this list is constructed dynamically, containing all tags currently used -in the buffer. You may also globally specify a hard list of tags with -the variable =org-tag-alist=. Finally you can set the default tags for a -given file with lines like - -#+BEGIN_EXAMPLE - #+TAGS: @work @home @tennisclub - #+TAGS: laptop car pc sailboat -#+END_EXAMPLE - -By default Org mode uses the standard minibuffer completion facilities -for entering tags. However, it also implements another, quicker, tag -selection method called /fast tag selection/. This allows you to select -and deselect tags with just a single key press. For this to work well -you should assign unique letters to most of your commonly used tags. You -can do this globally by configuring the variable =org-tag-alist= in your -‘=.emacs=’ file. For example, you may find the need to tag many items in -different files with ‘:@home:’. In this case you can set something like: - -#+BEGIN_EXAMPLE - (setq org-tag-alist '(("@work" . ?w) ("@home" . ?h) ("laptop" . ?l))) -#+END_EXAMPLE - -If the tag is only relevant to the file you are working on, then you can -instead set the TAGS option line as: - -#+BEGIN_EXAMPLE - #+TAGS: @work(w) @home(h) @tennisclub(t) laptop(l) pc(p) -#+END_EXAMPLE - --------------- - -| [[[#Setting-tags][<]]] | [[[#Properties][>]]] | | [[[#Tags][<<]]] | [[[#Tags][Up]]] | [[[#Properties][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 6.3 Tag searches - -Once a system of tags has been set up, it can be used to collect related -information into special lists. - -- C-c \ - C-c / m :: Create a sparse tree with all headlines matching a tags - search. With a C-u prefix argument, ignore headlines that are not a - TODO line. - -- C-c a m :: Create a global list of tag matches from all agenda - files. See section [[#Matching-tags-and-properties][Matching tags and - properties]]. - -- C-c a M :: Create a global list of tag matches from all agenda - files, but check only TODO items and force checking subitems (see - variable =org-tags-match-list-sublevels=). - -These commands all prompt for a match string which allows basic Boolean -logic like ‘+boss+urgent-project1’, to find entries with tags ‘boss’ and -‘urgent’, but not ‘project1’, or ‘Kathy|Sally’ to find entries which are -tagged, like ‘Kathy’ or ‘Sally’. The full syntax of the search string is -rich and allows also matching against TODO keywords, entry levels and -properties. For a complete description with many examples, see -[[#Matching-tags-and-properties][Matching tags and properties]]. - -*Further reading* -[[http://orgmode.org/manual/Tags.html#Tags][Chapter 6 of the manual]] - -[[http://sachachua.com/wp/2008/01/tagging-in-org-plus-bonus-code-for-timeclocks-and-tags/][Sacha -Chua’s article about tagging in Org-mode]] - --------------- - -| [[[#Tag-searches][<]]] | [[[#Dates-and-Times][>]]] | | [[[#Tags][<<]]] | [[[#Top][Up]]] | [[[#Dates-and-Times][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 7. Properties - -Properties are key-value pairs associates with and entry. They live in a -special drawer with the name =PROPERTIES=. Each property is specified on -a single line, with the key (surrounded by colons) first, and the value -after it: - -#+BEGIN_EXAMPLE - * CD collection - ** Classic - *** Goldberg Variations - :PROPERTIES: - :Title: Goldberg Variations - :Composer: J.S. Bach - :Publisher: Deutsche Grammophon - :NDisks: 1 - :END: -#+END_EXAMPLE - -You may define the allowed values for a particular property ‘:Xyz:’ by -setting a property ‘:Xyz\_ALL:’. This special property is /inherited/, -so if you set it in a level 1 entry, it will apply to the entire tree. -When allowed values are defined, setting the corresponding property -becomes easier and is less prone to typing errors. For the example with -the CD collection, we can predefine publishers and the number of disks -in a box like this: - -#+BEGIN_EXAMPLE - * CD collection - :PROPERTIES: - :NDisks_ALL: 1 2 3 4 - :Publisher_ALL: "Deutsche Grammophon" Philips EMI - :END: -#+END_EXAMPLE - -or globally using =org-global-properties=, or file-wide like this: - -#+BEGIN_EXAMPLE - #+PROPERTY: NDisks_ALL 1 2 3 4 -#+END_EXAMPLE - -- C-c C-x p :: Set a property. This prompts for a property name and a - value. - -- C-c C-c d :: Remove a property from the current entry. - -To create sparse trees and special lists with selection based on -properties, the same commands are used as for tag searches (see section -[[#Tag-searches][Tag searches]]). The syntax for the search string is -described in [[#Matching-tags-and-properties][Matching tags and -properties]]. - -*Further reading* -[[http://orgmode.org/manual/Properties-and-Columns.html#Properties-and-Columns][Chapter -7 of the manual]] - -[[http://orgmode.org/worg/org-tutorials/org-column-view-tutorial.php][Bastien -Guerry’s column view tutorial]] - --------------- - -| [[[#Properties][<]]] | [[[#Timestamps][>]]] | | [[[#Properties][<<]]] | [[[#Top][Up]]] | [[[#Capture-_002d-Refile-_002d-Archive][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 8. Dates and Times - -To assist project planning, TODO items can be labeled with a date and/or -a time. The specially formatted string carrying the date and time -information is called a /timestamp/ in Org mode. - -| [[#Timestamps][8.1 Timestamps]] | | Assigning a time to a tree entry | -| [[#Creating-timestamps][8.2 Creating timestamps]] | | Commands which insert timestamps | -| [[#Deadlines-and-scheduling][8.3 Deadlines and scheduling]] | | Planning your work | -| [[#Clocking-work-time][8.4 Clocking work time]] | | Tracking how long you spend on a task | - --------------- - -| [[[#Dates-and-Times][<]]] | [[[#Creating-timestamps][>]]] | | [[[#Dates-and-Times][<<]]] | [[[#Dates-and-Times][Up]]] | [[[#Capture-_002d-Refile-_002d-Archive][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 8.1 Timestamps - -A timestamp is a specification of a date (possibly with a time or a -range of times) in a special format, either ‘<2003-09-16 Tue>’ or -‘<2003-09-16 Tue 09:39>’ or ‘<2003-09-16 Tue 12:00-12:30>’. A timestamp -can appear anywhere in the headline or body of an Org tree entry. Its -presence causes entries to be shown on specific dates in the agenda (see -section [[#Weekly_002fdaily-agenda][The weekly/daily agenda]]). We -distinguish: - -*Plain timestamp; Event; Appointment* - A simple timestamp just assigns a date/time to an item. This is just -like writing down an appointment or event in a paper agenda. - -#+BEGIN_EXAMPLE - * Meet Peter at the movies <2006-11-01 Wed 19:15> - * Discussion on climate change <2006-11-02 Thu 20:00-22:00> -#+END_EXAMPLE - -*Timestamp with repeater interval* - A timestamp may contain a /repeater interval/, indicating that it -applies not only on the given date, but again and again after a certain -interval of N days (d), weeks (w), months (m), or years (y). The -following will show up in the agenda every Wednesday: - -#+BEGIN_EXAMPLE - * Pick up Sam at school <2007-05-16 Wed 12:30 +1w> -#+END_EXAMPLE - -*Diary-style sexp entries* - For more complex date specifications, Org mode supports using the -special sexp diary entries implemented in the Emacs calendar/diary -package. For example - -#+BEGIN_EXAMPLE - * The nerd meeting on every 2nd Thursday of the month - <%%(diary-float t 4 2)> -#+END_EXAMPLE - -*Time/Date range* - Two timestamps connected by ‘--’ denote a range. - -#+BEGIN_EXAMPLE - ** Meeting in Amsterdam - <2004-08-23 Mon>--<2004-08-26 Thu> -#+END_EXAMPLE - -*Inactive timestamp* - Just like a plain timestamp, but with square brackets instead of -angular ones. These timestamps are inactive in the sense that they do -/not/ trigger an entry to show up in the agenda. - -#+BEGIN_EXAMPLE - * Gillian comes late for the fifth time [2006-11-01 Wed] -#+END_EXAMPLE - --------------- - -| [[[#Timestamps][<]]] | [[[#Deadlines-and-scheduling][>]]] | | [[[#Dates-and-Times][<<]]] | [[[#Dates-and-Times][Up]]] | [[[#Capture-_002d-Refile-_002d-Archive][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 8.2 Creating timestamps - -For Org mode to recognize timestamps, they need to be in the specific -format. All commands listed below produce timestamps in the correct -format. - -- C-c . :: Prompt for a date and insert a corresponding timestamp. - When the cursor is at an existing timestamp in the buffer, the - command is used to modify this timestamp instead of inserting a new - one. When this command is used twice in succession, a time range is - inserted. With a prefix, also add the current time. - -- C-c ! :: Like C-c ., but insert an inactive timestamp that will not - cause an agenda entry. - -- S-/ :: Change date at cursor by one day. - -- S-/ :: Change the item under the cursor in a timestamp. - The cursor can be on a year, month, day, hour or minute. When the - timestamp contains a time range like ‘15:30-16:30’, modifying the - first time will also shift the second, shifting the time block with - constant length. To change the length, modify the second time. - -When Org mode prompts for a date/time, it will accept any string -containing some date and/or time information, and intelligently -interpret the string, deriving defaults for unspecified information from -the current date and time. You can also select a date in the pop-up -calendar. See the manual for more information on how exactly the -date/time prompt works. - --------------- - -| [[[#Creating-timestamps][<]]] | [[[#Clocking-work-time][>]]] | | [[[#Dates-and-Times][<<]]] | [[[#Dates-and-Times][Up]]] | [[[#Capture-_002d-Refile-_002d-Archive][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 8.3 Deadlines and scheduling - -A timestamp may be preceded by special keywords to facilitate planning: - -*DEADLINE* - Meaning: the task (most likely a TODO item, though not necessarily) is -supposed to be finished on that date. - -- C-c C-d :: Insert ‘DEADLINE’ keyword along with a stamp, in the line - following the headline. - -On the deadline date, the task will be listed in the agenda. In -addition, the agenda for /today/ will carry a warning about the -approaching or missed deadline, starting =org-deadline-warning-days= -before the due date, and continuing until the entry is marked DONE. An -example: - -#+BEGIN_EXAMPLE - *** TODO write article about the Earth for the Guide - The editor in charge is [[bbdb:Ford Prefect]] - DEADLINE: <2004-02-29 Sun> -#+END_EXAMPLE - -*SCHEDULED* - Meaning: you are /planning to start working/ on that task on the given -date[[#FOOT8][(8)]]. - -- C-c C-s :: Insert ‘SCHEDULED’ keyword along with a stamp, in the - line following the headline. - -The headline will be listed under the given date[[#FOOT9][(9)]]. In -addition, a reminder that the scheduled date has passed will be present -in the compilation for /today/, until the entry is marked DONE. I.e. the -task will automatically be forwarded until completed. - -#+BEGIN_EXAMPLE - *** TODO Call Trillian for a date on New Years Eve. - SCHEDULED: <2004-12-25 Sat> -#+END_EXAMPLE - -Some tasks need to be repeated again and again. Org mode helps to -organize such tasks using a so-called repeater in a DEADLINE, SCHEDULED, -or plain timestamp. In the following example - -#+BEGIN_EXAMPLE - ** TODO Pay the rent - DEADLINE: <2005-10-01 Sat +1m> -#+END_EXAMPLE - -the =+1m= is a repeater; the intended interpretation is that the task -has a deadline on <2005-10-01> and repeats itself every (one) month -starting from that time. - --------------- - -| [[[#Deadlines-and-scheduling][<]]] | [[[#Capture-_002d-Refile-_002d-Archive][>]]] | | [[[#Dates-and-Times][<<]]] | [[[#Dates-and-Times][Up]]] | [[[#Capture-_002d-Refile-_002d-Archive][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 8.4 Clocking work time - -Org mode allows you to clock the time you spend on specific tasks in a -project. - -- C-c C-x C-i :: Start the clock on the current item (clock-in). This - inserts the CLOCK keyword together with a timestamp. When called with - a C-u prefix argument, select the task from a list of recently - clocked tasks. - -- C-c C-x C-o :: Stop the clock (clock-out). This inserts another - timestamp at the same location where the clock was last started. It - also directly computes the resulting time in inserts it after the - time range as ‘=> HH:MM’. - -- C-c C-x C-e :: Update the effort estimate for the current clock - task. - -- C-c C-x C-x :: Cancel the current clock. This is useful if a clock - was started by mistake, or if you ended up working on something else. - -- C-c C-x C-j :: Jump to the entry that contains the currently running - clock. With a C-u prefix arg, select the target task from a list of - recently clocked tasks. - -- C-c C-x C-r :: Insert a dynamic block containing a clock report as - an Org-mode table into the current file. When the cursor is at an - existing clock table, just update it. - - #+BEGIN_EXAMPLE - #+BEGIN: clocktable :maxlevel 2 :emphasize nil :scope file - #+END: clocktable - #+END_EXAMPLE - - For details about how to customize this view, see - [[http://orgmode.org/manual/Clocking-work-time.html#Clocking-work-time][the - manual]]. - -- C-c C-c :: Update dynamic block at point. The cursor needs to be in - the =#+BEGIN= line of the dynamic block. - -The l key may be used in the timeline (see section [[#Timeline][Timeline -for a single file]]) and in the agenda (see section -[[#Weekly_002fdaily-agenda][The weekly/daily agenda]]) to show which -tasks have been worked on or closed during a day. - -*Further reading* -[[http://orgmode.org/manual/Dates-and-Times.html#Dates-and-Times][Chapter -8 of the manual]] - [[http://members.optusnet.com.au/~charles57/GTD/org_dates/][Charles -Cave’s Date and Time tutorial]] - [[http://doc.norang.ca/org-mode.html#Clocking][Bernt Hansen’s clocking -workflow]] - --------------- - -| [[[#Clocking-work-time][<]]] | [[[#Capture][>]]] | | [[[#Dates-and-Times][<<]]] | [[[#Top][Up]]] | [[[#Agenda-Views][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 9. Capture - Refile - Archive - -An important part of any organization system is the ability to quickly -capture new ideas and tasks, and to associate reference material with -them. Org defines a capture process to create tasks. It stores files -related to a task (/attachments/) in a special directory. Once in the -system, tasks and projects need to be moved around. Moving completed -project trees to an archive file keeps the system compact and fast. - -| [[#Capture][9.1 Capture]] | | | -| [[#Refiling-notes][9.2 Refiling notes]] | | Moving a tree from one place to another | -| [[#Archiving][9.3 Archiving]] | | What to do with finished projects | - --------------- - -| [[[#Capture-_002d-Refile-_002d-Archive][<]]] | [[[#Setting-up-a-capture-location][>]]] | | [[[#Capture-_002d-Refile-_002d-Archive][<<]]] | [[[#Capture-_002d-Refile-_002d-Archive][Up]]] | [[[#Agenda-Views][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 9.1 Capture - -Org’s method for capturing new items is heavily inspired by John Wiegley -excellent remember package. It lets you store quick notes with little -interruption of your work flow. Org lets you define templates for new -entries and associate them with different targets for storing notes. - -| [[#Setting-up-a-capture-location][Setting up a capture location]] | | Where notes will be stored | -| [[#Using-capture][Using capture]] | | Commands to invoke and terminate capture | -| [[#Capture-templates][Capture templates]] | | Define the outline of different note types | - --------------- - -| [[[#Capture][<]]] | [[[#Using-capture][>]]] | | [[[#Capture-_002d-Refile-_002d-Archive][<<]]] | [[[#Capture][Up]]] | [[[#Agenda-Views][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -*** Setting up a capture location - -The following customization sets a default target[[#FOOT10][(10)]] file -for notes, and defines a global key[[#FOOT11][(11)]] for capturing new -stuff. - -#+BEGIN_EXAMPLE - (setq org-default-notes-file (concat org-directory "/notes.org")) - (define-key global-map "\C-cc" 'org-capture) -#+END_EXAMPLE - --------------- - -| [[[#Setting-up-a-capture-location][<]]] | [[[#Capture-templates][>]]] | | [[[#Capture-_002d-Refile-_002d-Archive][<<]]] | [[[#Capture][Up]]] | [[[#Agenda-Views][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -*** Using capture - -- C-c c :: Start a capture process. You will be placed into a narrowed - indirect buffer to edit the item. - -- C-c C-c :: Once you are done entering information into the capture - buffer, C-c C-c will return you to the window configuration before - the capture process, so that you can resume your work without further - distraction. - -- C-c C-w :: Finalize by moving the entry to a refile location (see - section [[#Refiling-notes][Refiling notes]]). - -- C-c C-k :: Abort the capture process and return to the previous - state. - --------------- - -| [[[#Using-capture][<]]] | [[[#Refiling-notes][>]]] | | [[[#Capture-_002d-Refile-_002d-Archive][<<]]] | [[[#Capture][Up]]] | [[[#Agenda-Views][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -*** Capture templates - -You can use templates to generate different types of capture notes, and -to store them in different places. For example, if you would like to -store new tasks under a heading ‘Tasks’ in file ‘=TODO.org=’, and -journal entries in a date tree in ‘=journal.org=’ you could use: - -#+BEGIN_EXAMPLE - (setq org-capture-templates - '(("t" "Todo" entry (file+headline "~/org/gtd.org" "Tasks") - "* TODO %?\n %i\n %a") - ("j" "Journal" entry (file+datetree "~/org/journal.org") - "* %?\nEntered on %U\n %i\n %a"))) -#+END_EXAMPLE - -In these entries, the first string is the key to reach the template, the -second is a short description. Then follows the type of the entry and a -definition of the target location for storing the note. Finally, the -template itself, a string with %-escapes to fill in information based on -time and context. - -When you call M-x org-capture, Org will prompt for a key to select the -template (if you have more than one template) and then prepare the -buffer like - -#+BEGIN_EXAMPLE - * TODO - [[file:link to where you were when initiating capture]] -#+END_EXAMPLE - -During expansion of the template, special %-escapes[[#FOOT12][(12)]] -allow dynamic insertion of content. Here is a small selection of the -possibilities, consult the manual for more. - -#+BEGIN_EXAMPLE - %a annotation, normally the link created with org-store-link - %i initial content, the region when remember is called with C-u. - %t timestamp, date only - %T timestamp with date and time - %u, %U like the above, but inactive timestamps -#+END_EXAMPLE - --------------- - -| [[[#Capture-templates][<]]] | [[[#Archiving][>]]] | | [[[#Capture-_002d-Refile-_002d-Archive][<<]]] | [[[#Capture-_002d-Refile-_002d-Archive][Up]]] | [[[#Agenda-Views][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 9.2 Refiling notes - -When reviewing the captured data, you may want to refile some of the -entries into a different list, for example into a project. Cutting, -finding the right location, and then pasting the note is cumbersome. To -simplify this process, you can use the following special command: - -- C-c C-w :: Refile the entry or region at point. This command offers - possible locations for refiling the entry and lets you select one - with completion. The item (or all items in the region) is filed below - the target heading as a subitem. - By default, all level 1 headlines in the current buffer are - considered to be targets, but you can have more complex definitions - across a number of files. See the variable =org-refile-targets= for - details. - -- C-u C-c C-w :: Use the refile interface to jump to a heading. - -- C-u C-u C-c C-w :: Jump to the location where =org-refile= last - moved a tree to. - --------------- - -| [[[#Refiling-notes][<]]] | [[[#Agenda-Views][>]]] | | [[[#Capture-_002d-Refile-_002d-Archive][<<]]] | [[[#Capture-_002d-Refile-_002d-Archive][Up]]] | [[[#Agenda-Views][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 9.3 Archiving - -When a project represented by a (sub)tree is finished, you may want to -move the tree out of the way and to stop it from contributing to the -agenda. Archiving is important to keep your working files compact and -global searches like the construction of agenda views fast. The most -common archiving action is to move a project tree to another file, the -archive file. - -- C-c C-x C-a :: Archive the current entry using the command specified - in the variable =org-archive-default-command=. - -- C-c C-x C-s or short C-c $ :: Archive the subtree starting at the - cursor position to the location given by =org-archive-location=. - -The default archive location is a file in the same directory as the -current file, with the name derived by appending ‘=_archive=’ to the -current file name. For information and examples on how to change this, -see the documentation string of the variable =org-archive-location=. -There is also an in-buffer option for setting this variable, for example - -#+BEGIN_EXAMPLE - #+ARCHIVE: %s_done:: -#+END_EXAMPLE - -*Further reading* -[[http://orgmode.org/manual/Capture-_002d-Refile-_002d-Archive.html#Capture-_002d-Refile-_002d-Archive][Chapter -9 of the manual]] - [[http://members.optusnet.com.au/~charles57/GTD/remember.html][Charles -Cave’s remember tutorial]] - -[[http://orgmode.org/worg/org-tutorials/org-protocol-custom-handler.php][Sebastian -Rose’s tutorial for capturing from a web browser]] - --------------- - -| [[[#Archiving][<]]] | [[[#Agenda-files][>]]] | | [[[#Capture-_002d-Refile-_002d-Archive][<<]]] | [[[#Top][Up]]] | [[[#Markup][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 10. Agenda Views - -Due to the way Org works, TODO items, time-stamped items, and tagged -headlines can be scattered throughout a file or even a number of files. -To get an overview of open action items, or of events that are important -for a particular date, this information must be collected, sorted and -displayed in an organized way. There are several different views, see -below. - -The extracted information is displayed in a special /agenda buffer/. -This buffer is read-only, but provides commands to visit the -corresponding locations in the original Org files, and even to edit -these files remotely. Remote editing from the agenda buffer means, for -example, that you can change the dates of deadlines and appointments -from the agenda buffer. The commands available in the Agenda buffer are -listed in [[#Agenda-commands][Commands in the agenda buffer]]. - -| [[#Agenda-files][10.1 Agenda files]] | | Files being searched for agenda information | -| [[#Agenda-dispatcher][10.2 The agenda dispatcher]] | | Keyboard access to agenda views | -| [[#Built_002din-agenda-views][10.3 The built-in agenda views]] | | What is available out of the box? | -| [[#Agenda-commands][10.4 Commands in the agenda buffer]] | | Remote editing of Org trees | -| [[#Custom-agenda-views][10.5 Custom agenda views]] | | Defining special searches and views | - --------------- - -| [[[#Agenda-Views][<]]] | [[[#Agenda-dispatcher][>]]] | | [[[#Agenda-Views][<<]]] | [[[#Agenda-Views][Up]]] | [[[#Markup][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 10.1 Agenda files - -The information to be shown is normally collected from all /agenda -files/, the files listed in the variable =org-agenda-files=. - -- C-c [ :: Add current file to the list of agenda files. The file is - added to the front of the list. If it was already in the list, it is - moved to the front. With a prefix argument, file is added/moved to - the end. - -- C-c ] :: Remove current file from the list of agenda files. - -- C-, :: Cycle through agenda file list, visiting one file after the - other. - --------------- - -| [[[#Agenda-files][<]]] | [[[#Built_002din-agenda-views][>]]] | | [[[#Agenda-Views][<<]]] | [[[#Agenda-Views][Up]]] | [[[#Markup][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 10.2 The agenda dispatcher - -The views are created through a dispatcher, which should be bound to a -global key—for example C-c a (see section -[[#Installation][Installation]]). After pressing C-c a, an additional -letter is required to execute a command: - -- a :: The calendar-like agenda (see section - [[#Weekly_002fdaily-agenda][The weekly/daily agenda]]). - -- t / T :: A list of all TODO items (see section - [[#Global-TODO-list][The global TODO list]]). - -- m / M :: A list of headlines matching a TAGS expression (see section - [[#Matching-tags-and-properties][Matching tags and properties]]). - -- L :: The timeline view for the current buffer (see section - [[#Timeline][Timeline for a single file]]). - -- s :: A list of entries selected by a boolean expression of keywords - and/or regular expressions that must or must not occur in the entry. - --------------- - -| [[[#Agenda-dispatcher][<]]] | [[[#Weekly_002fdaily-agenda][>]]] | | [[[#Agenda-Views][<<]]] | [[[#Agenda-Views][Up]]] | [[[#Markup][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 10.3 The built-in agenda views - -| [[#Weekly_002fdaily-agenda][10.3.1 The weekly/daily agenda]] | | The calendar page with current tasks | -| [[#Global-TODO-list][10.3.2 The global TODO list]] | | All unfinished action items | -| [[#Matching-tags-and-properties][10.3.3 Matching tags and properties]] | | Structured information with fine-tuned search | -| [[#Timeline][10.3.4 Timeline for a single file]] | | Time-sorted view for single file | -| [[#Search-view][10.3.5 Search view]] | | Find entries by searching for text | - --------------- - -| [[[#Built_002din-agenda-views][<]]] | [[[#Global-TODO-list][>]]] | | [[[#Agenda-Views][<<]]] | [[[#Built_002din-agenda-views][Up]]] | [[[#Markup][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -*** 10.3.1 The weekly/daily agenda - -The purpose of the weekly/daily /agenda/ is to act like a page of a -paper agenda, showing all the tasks for the current week or day. - -- C-c a a :: Compile an agenda for the current week from a list of Org - files. The agenda shows the entries for each day. - -Emacs contains the calendar and diary by Edward M. Reingold. Org-mode -understands the syntax of the diary and allows you to use diary sexp -entries directly in Org files: - -#+BEGIN_EXAMPLE - * Birthdays and similar stuff - #+CATEGORY: Holiday - %%(org-calendar-holiday) ; special function for holiday names - #+CATEGORY: Ann - %%(diary-anniversary 5 14 1956)(13) Arthur Dent is %d years old - %%(diary-anniversary 10 2 1869) Mahatma Gandhi would be %d years old -#+END_EXAMPLE - -Org can interact with Emacs appointments notification facility. To add -all the appointments of your agenda files, use the command -=org-agenda-to-appt=. See the docstring for details. - --------------- - -| [[[#Weekly_002fdaily-agenda][<]]] | [[[#Matching-tags-and-properties][>]]] | | [[[#Agenda-Views][<<]]] | [[[#Built_002din-agenda-views][Up]]] | [[[#Markup][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -*** 10.3.2 The global TODO list - -The global TODO list contains all unfinished TODO items formatted and -collected into a single place. Remote editing of TODO items lets you can -change the state of a TODO entry with a single key press. The commands -available in the TODO list are described in [[#Agenda-commands][Commands -in the agenda buffer]]. - -- C-c a t :: Show the global TODO list. This collects the TODO items - from all agenda files (see section [[#Agenda-Views][Agenda Views]]) - into a single buffer. - -- C-c a T :: Like the above, but allows selection of a specific TODO - keyword. - --------------- - -| [[[#Global-TODO-list][<]]] | [[[#Timeline][>]]] | | [[[#Agenda-Views][<<]]] | [[[#Built_002din-agenda-views][Up]]] | [[[#Markup][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -*** 10.3.3 Matching tags and properties - -If headlines in the agenda files are marked with /tags/ (see section -[[#Tags][Tags]]), or have properties (see section -[[#Properties][Properties]]), you can select headlines based on this -metadata and collect them into an agenda buffer. The match syntax -described here also applies when creating sparse trees with C-c / m. The -commands available in the tags list are described in -[[#Agenda-commands][Commands in the agenda buffer]]. - -- C-c a m :: Produce a list of all headlines that match a given set of - tags. The command prompts for a selection criterion, which is a - boolean logic expression with tags, like ‘+work+urgent-withboss’ or - ‘work|home’ (see section [[#Tags][Tags]]). If you often need a - specific search, define a custom command for it (see section - [[#Agenda-dispatcher][The agenda dispatcher]]). - -- C-c a M :: Like C-c a m, but only select headlines that are also - TODO items. - -**** Match syntax - -A search string can use Boolean operators ‘&’ for AND and ‘|’ for OR. -‘&’ binds more strongly than ‘|’. Parentheses are currently not -implemented. Each element in the search is either a tag, a regular -expression matching tags, or an expression like -=PROPERTY OPERATOR VALUE= with a comparison operator, accessing a -property value. Each element may be preceded by ‘-’, to select against -it, and ‘+’ is syntactic sugar for positive selection. The AND operator -‘&’ is optional when ‘+’ or ‘-’ is present. Here are some examples, -using only tags. - -- ‘+work-boss’ :: Select headlines tagged ‘:work:’, but discard those - also tagged ‘:boss:’. - -- ‘work|laptop’ :: Selects lines tagged ‘:work:’ or ‘:laptop:’. - -- ‘work|laptop+night’ :: Like before, but require the ‘:laptop:’ lines - to be tagged also ‘:night:’. - -You may also test for properties at the same time as matching tags, see -the manual for more information. - --------------- - -| [[[#Matching-tags-and-properties][<]]] | [[[#Search-view][>]]] | | [[[#Agenda-Views][<<]]] | [[[#Built_002din-agenda-views][Up]]] | [[[#Markup][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -*** 10.3.4 Timeline for a single file - -The timeline summarizes all time-stamped items from a single Org mode -file in a /time-sorted view/. The main purpose of this command is to -give an overview over events in a project. - -- C-c a L :: Show a time-sorted view of the Org file, with all - time-stamped items. When called with a C-u prefix, all unfinished - TODO entries (scheduled or not) are also listed under the current - date. - --------------- - -| [[[#Timeline][<]]] | [[[#Agenda-commands][>]]] | | [[[#Agenda-Views][<<]]] | [[[#Built_002din-agenda-views][Up]]] | [[[#Markup][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -*** 10.3.5 Search view - -This agenda view is a general text search facility for Org mode entries. -It is particularly useful to find notes. - -- C-c a s :: This is a special search that lets you select entries by - matching a substring or specific words using a boolean logic. - -For example, the search string ‘computer equipment’ will find entries -that contain ‘computer equipment’ as a substring. Search view can also -search for specific keywords in the entry, using Boolean logic. The -search string ‘+computer +wifi -ethernet -{8\.11[bg]}’ will search for -note entries that contain the keywords =computer= and =wifi=, but not -the keyword =ethernet=, and which are also not matched by the regular -expression =8\.11[bg]=, meaning to exclude both 8.11b and 8.11g. - -Note that in addition to the agenda files, this command will also search -the files listed in =org-agenda-text-search-extra-files=. - --------------- - -| [[[#Search-view][<]]] | [[[#Custom-agenda-views][>]]] | | [[[#Agenda-Views][<<]]] | [[[#Agenda-Views][Up]]] | [[[#Markup][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 10.4 Commands in the agenda buffer - -Entries in the agenda buffer are linked back to the Org file or diary -file where they originate. Commands are provided to show and jump to the -original entry location, and to edit the Org files “remotely” from the -agenda buffer. This is just a selection of the many commands, explore -the =Agenda= menu and the manual for a complete list. - -- *Motion* - n :: Next line (same as and C-p). - -- p :: Previous line (same as and C-n). - -- *View/Go to Org file* - mouse-3 - :: Display the original location of the item in another - window. With prefix arg, make sure that the entire entry is made - visible in the outline, not only the heading. - -- :: Go to the original location of the item in another window. - Under Emacs 22, mouse-1 will also works for this. - -- :: Go to the original location of the item and delete other - windows. - -- *Change display* - o :: Delete other windows. - -- d / w :: Switch to day/week view. - -- f and b :: Go forward/backward in time to display the following - =org-agenda-current-span= days. For example, if the display covers a - week, switch to the following/previous week. - -- . :: Go to today. - -- j :: Prompt for a date and go there. - -- v l or short l :: Toggle Logbook mode. In Logbook mode, entries that - were marked DONE while logging was on (variable =org-log-done=) are - shown in the agenda, as are entries that have been clocked on that - day. When called with a C-u prefix, show all possible logbook - entries, including state changes. - -- r or g :: Recreate the agenda buffer, to reflect the changes. - -- s :: Save all Org buffers in the current Emacs session, and also the - locations of IDs. - -- *Secondary filtering and query editing* - / :: Filter the current agenda view with respect to a tag. You are - prompted for a letter to select a tag. Press ‘-’ first to select - against the tag. - -- \ :: Narrow the current agenda filter by an additional condition. - -- *Remote editing (see the manual for many more commands)* - 0-9 :: Digit argument. - -- t :: Change the TODO state of the item, in the agenda and in the org - file. - -- C-k :: Delete the current agenda item along with the entire subtree - belonging to it in the original Org file. - -- C-c C-w :: Refile the entry at point. - -- C-c C-x C-a or short a :: Archive the subtree corresponding to the - entry at point using the default archiving command set in - =org-archive-default-command=. - -- C-c C-x C-s or short $ :: Archive the subtree corresponding to the - current headline. - -- C-c C-s :: Schedule this item, with prefix arg remove the scheduling - timestamp - -- C-c C-d :: Set a deadline for this item, with prefix arg remove the - deadline. - -- S- and S- :: Change the timestamp associated with the - current line by one day. - -- I :: Start the clock on the current item. - -- O / X :: Stop/cancel the previously started clock. - -- J :: Jump to the running clock in another window. - --------------- - -| [[[#Agenda-commands][<]]] | [[[#Markup][>]]] | | [[[#Agenda-Views][<<]]] | [[[#Agenda-Views][Up]]] | [[[#Markup][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 10.5 Custom agenda views - -The main application of custom searches is the definition of keyboard -shortcuts for frequently used searches, either creating an agenda -buffer, or a sparse tree (the latter covering of course only the current -buffer). Custom commands are configured in the variable -=org-agenda-custom-commands=. You can customize this variable, for -example by pressing C-c a C. You can also directly set it with Emacs -Lisp in ‘=.emacs=’. The following example contains all valid search -types: - -#+BEGIN_EXAMPLE - (setq org-agenda-custom-commands - '(("w" todo "WAITING") - ("u" tags "+boss-urgent") - ("v" tags-todo "+boss-urgent"))) -#+END_EXAMPLE - -The initial string in each entry defines the keys you have to press -after the dispatcher command C-c a in order to access the command. -Usually this will be just a single character. The second parameter is -the search type, followed by the string or regular expression to be used -for the matching. The example above will therefore define: - -- C-c a w :: as a global search for TODO entries with ‘WAITING’ as the - TODO keyword - -- C-c a u :: as a global tags search for headlines marked ‘:boss:’ but - not ‘:urgent:’ - -- C-c a v :: as the same search as C-c a u, but limiting the search to - headlines that are also TODO items - -*Further reading* -[[http://orgmode.org/manual/Agenda-Views.html#Agenda-Views][Chapter 10 -of the manual]] - -[[http://orgmode.org/worg/org-tutorials/org-custom-agenda-commands.php][Mat -Lundin’s tutorial about custom agenda commands]] - -[[http://www.newartisans.com/2007/08/using-org-mode-as-a-day-planner.html][John -Wiegley’s setup]] - --------------- - -| [[[#Custom-agenda-views][<]]] | [[[#Structural-markup-elements][>]]] | | [[[#Agenda-Views][<<]]] | [[[#Top][Up]]] | [[[#Exporting][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 11. Markup for rich export - -When exporting Org-mode documents, the exporter tries to reflect the -structure of the document as accurately as possible in the backend. -Since export targets like HTML, LaTeX, or DocBook allow much richer -formatting, Org mode has rules on how to prepare text for rich export. -This section summarizes the markup rules used in an Org-mode buffer. - -| [[#Structural-markup-elements][11.1 Structural markup elements]] | | The basic structure as seen by the exporter | -| [[#Images-and-tables][11.2 Images and Tables]] | | Tables and Images will be included | -| [[#Literal-examples][11.3 Literal examples]] | | Source code examples with special formatting | -| [[#Include-files][11.4 Include files]] | | Include additional files into a document | -| [[#Embedded-LaTeX][11.5 Embedded LaTeX]] | | LaTeX can be freely used inside Org documents | - --------------- - -| [[[#Markup][<]]] | [[[#Images-and-tables][>]]] | | [[[#Markup][<<]]] | [[[#Markup][Up]]] | [[[#Exporting][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 11.1 Structural markup elements - -| [[#Document-title][• Document title]] | | Where the title is taken from | -| [[#Headings-and-sections][• Headings and sections]] | | The document structure as seen by the exporter | -| [[#Table-of-contents][• Table of contents]] | | The if and where of the table of contents | -| [[#Paragraphs][• Paragraphs]] | | | -| [[#Emphasis-and-monospace][• Emphasis and monospace]] | | Bold, italic, etc. | -| [[#Comment-lines][• Comment lines]] | | What will *not* be exported | - -*** Document title - -The title of the exported document is taken from the special line - -#+BEGIN_EXAMPLE - #+TITLE: This is the title of the document -#+END_EXAMPLE - -*** Headings and sections - -The outline structure of the document as described in -[[#Document-Structure][Document Structure]], forms the basis for -defining sections of the exported document. However, since the outline -structure is also used for (for example) lists of tasks, only the first -three outline levels will be used as headings. Deeper levels will become -itemized lists. You can change the location of this switch globally by -setting the variable =org-export-headline-levels=, or on a per-file -basis with a line - -#+BEGIN_EXAMPLE - #+OPTIONS: H:4 -#+END_EXAMPLE - -*** Table of contents - -The table of contents is normally inserted directly before the first -headline of the file. - -#+BEGIN_EXAMPLE - #+OPTIONS: toc:2 (only to two levels in TOC) - #+OPTIONS: toc:nil (no TOC at all) -#+END_EXAMPLE - -*** Paragraphs, line breaks, and quoting - -Paragraphs are separated by at least one empty line. If you need to -enforce a line break within a paragraph, use ‘\\’ at the end of a line. - -To keep the line breaks in a region, but otherwise use normal -formatting, you can use this construct, which can also be used to format -poetry. - -#+BEGIN_EXAMPLE - #+BEGIN_VERSE - Great clouds overhead - Tiny black birds rise and fall - Snow covers Emacs - - -- AlexSchroeder - #+END_VERSE -#+END_EXAMPLE - -When quoting a passage from another document, it is customary to format -this as a paragraph that is indented on both the left and the right -margin. You can include quotations in Org-mode documents like this: - -#+BEGIN_EXAMPLE - #+BEGIN_QUOTE - Everything should be made as simple as possible, - but not any simpler -- Albert Einstein - #+END_QUOTE -#+END_EXAMPLE - -If you would like to center some text, do it like this: - -#+BEGIN_EXAMPLE - #+BEGIN_CENTER - Everything should be made as simple as possible, \\ - but not any simpler - #+END_CENTER -#+END_EXAMPLE - -*** Emphasis and monospace - -You can make words **bold**, //italic//, \_underlined\_, ==code== and -=~verbatim~=, and, if you must, ‘+strike-through+’. Text in the code and -verbatim string is not processed for Org-mode specific syntax, it is -exported verbatim. To insert a horizontal rules, use a line consisting -of only dashes, and at least 5 of them. - -*** Comment lines - -Lines starting with ‘#’ in column zero are treated as comments and will -never be exported. If you want an indented line to be treated as a -comment, start it with ‘#+ ’. Also entire subtrees starting with the -word ‘COMMENT’ will never be exported. Finally, regions surrounded by -‘#+BEGIN\_COMMENT’ ... ‘#+END\_COMMENT’ will not be exported. - -- C-c ; :: Toggle the COMMENT keyword at the beginning of an entry. - --------------- - -| [[[#Structural-markup-elements][<]]] | [[[#Literal-examples][>]]] | | [[[#Markup][<<]]] | [[[#Markup][Up]]] | [[[#Exporting][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 11.2 Images and Tables - -For Org mode tables, the lines before the first horizontal separator -line will become table header lines. You can use the following lines -somewhere before the table to assign a caption and a label for cross -references, and in the text you can refer to the object with -=\ref{tab:basic-data}=: - -#+BEGIN_EXAMPLE - #+CAPTION: This is the caption for the next table (or link) - #+LABEL: tbl:basic-data - | ... | ...| - |-----|----| -#+END_EXAMPLE - -Some backends (HTML, LaTeX, and DocBook) allow you to directly include -images into the exported document. Org does this, if a link to an image -files does not have a description part, for example =[[./img/a.jpg]]=. -If you wish to define a caption for the image and maybe a label for -internal cross references, you sure that the link is on a line by itself -precede it with: - -#+BEGIN_EXAMPLE - #+CAPTION: This is the caption for the next figure link (or table) - #+LABEL: fig:SED-HR4049 - [[./img/a.jpg]] -#+END_EXAMPLE - -You may also define additional attributes for the figure. As this is -backend-specific, see the sections about the individual backends for -more information. - --------------- - -| [[[#Images-and-tables][<]]] | [[[#Include-files][>]]] | | [[[#Markup][<<]]] | [[[#Markup][Up]]] | [[[#Exporting][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 11.3 Literal examples - -You can include literal examples that should not be subjected to markup. -Such examples will be typeset in monospace, so this is well suited for -source code and similar examples. - -#+BEGIN_EXAMPLE - #+BEGIN_EXAMPLE - Some example from a text file. - #+END_EXAMPLE -#+END_EXAMPLE - -For simplicity when using small examples, you can also start the example -lines with a colon followed by a space. There may also be additional -whitespace before the colon: - -#+BEGIN_EXAMPLE - Here is an example - : Some example from a text file. -#+END_EXAMPLE - -For source code from a programming language, or any other text that can -be marked up by font-lock in Emacs, you can ask for it to look like the -fontified Emacs buffer - -#+BEGIN_EXAMPLE - #+BEGIN_SRC emacs-lisp - (defun org-xor (a b) - "Exclusive or." - (if a (not b) b)) - #+END_SRC -#+END_EXAMPLE - -To edit the example in a special buffer supporting this language, use -C-c ' to both enter and leave the editing buffer. - --------------- - -| [[[#Literal-examples][<]]] | [[[#Embedded-LaTeX][>]]] | | [[[#Markup][<<]]] | [[[#Markup][Up]]] | [[[#Exporting][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 11.4 Include files - -During export, you can include the content of another file. For example, -to include your ‘=.emacs=’ file, you could use: - -#+BEGIN_EXAMPLE - #+INCLUDE: "~/.emacs" src emacs-lisp -#+END_EXAMPLE - -The optional second and third parameter are the markup (e.g. ‘quote’, -‘example’, or ‘src’), and, if the markup is ‘src’, the language for -formatting the contents. The markup is optional, if it is not given, the -text will be assumed to be in Org mode format and will be processed -normally. C-c ' will visit the included file. - --------------- - -| [[[#Include-files][<]]] | [[[#Exporting][>]]] | | [[[#Markup][<<]]] | [[[#Markup][Up]]] | [[[#Exporting][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 11.5 Embedded LaTeX - -For scientific notes which need to be able to contain mathematical -symbols and the occasional formula, Org-mode supports embedding LaTeX -code into its files. You can directly use TeX-like macros for special -symbols, enter formulas and entire LaTeX environments. - -#+BEGIN_EXAMPLE - Angles are written as Greek letters \alpha, \beta and \gamma. The mass if - the sun is M_sun = 1.989 x 10^30 kg. The radius of the sun is R_{sun} = - 6.96 x 10^8 m. If $a^2=b$ and $b=2$, then the solution must be either - $a=+\sqrt{2}$ or $a=-\sqrt{2}$. - - \begin{equation} - x=\sqrt{b} - \end{equation} -#+END_EXAMPLE - -With -[[http://orgmode.org/manual/LaTeX-fragments.html#LaTeX-fragments][special -setup]], LaTeX snippets will be included as images when exporting to -HTML. - -*Further reading* -[[http://orgmode.org/manual/Markup.html#Markup][Chapter 11 of the -manual]] - --------------- - -| [[[#Embedded-LaTeX][<]]] | [[[#Export-options][>]]] | | [[[#Markup][<<]]] | [[[#Top][Up]]] | [[[#Publishing][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 12. Exporting - -Org-mode documents can be exported into a variety of other formats: -ASCII export for inclusion into emails, HTML to publish on the web, -LaTeX/PDF for beautiful printed documents and DocBook to enter the world -of many other formats using DocBook tools. There is also export to -iCalendar format so that planning information can be incorporated into -desktop calendars. - -| [[#Export-options][12.1 Export options]] | | Per-file export settings | -| [[#The-export-dispatcher][12.2 The export dispatcher]] | | How to access exporter commands | -| [[#ASCII_002fLatin_002d1_002fUTF_002d8-export][12.3 ASCII/Latin-1/UTF-8 export]] | | Exporting to flat files with encoding | -| [[#HTML-export][12.4 HTML export]] | | Exporting to HTML | -| [[#LaTeX-and-PDF-export][12.5 LaTeX and PDF export]] | | Exporting to LaTeX, and processing to PDF | -| [[#DocBook-export][12.6 DocBook export]] | | Exporting to DocBook | -| [[#iCalendar-export][12.7 iCalendar export]] | | | - --------------- - -| [[[#Exporting][<]]] | [[[#The-export-dispatcher][>]]] | | [[[#Exporting][<<]]] | [[[#Exporting][Up]]] | [[[#Publishing][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 12.1 Export options - -The exporter recognizes special lines in the buffer which provide -additional information. These lines may be put anywhere in the file. The -whole set of lines can be inserted into the buffer with C-c C-e t. - -- C-c C-e t :: Insert template with export options, see example below. - -#+BEGIN_EXAMPLE - #+TITLE: the title to be shown (default is the buffer name) - #+AUTHOR: the author (default taken from user-full-name) - #+DATE: a date, fixed, of a format string for format-time-string - #+EMAIL: his/her email address (default from user-mail-address) - #+DESCRIPTION: the page description, e.g. for the XHTML meta tag - #+KEYWORDS: the page keywords, e.g. for the XHTML meta tag - #+LANGUAGE: language for HTML, e.g. ‘en’ (org-export-default-language) - #+TEXT: Some descriptive text to be inserted at the beginning. - #+TEXT: Several lines may be given. - #+OPTIONS: H:2 num:t toc:t \n:nil @:t ::t |:t ^:t f:t TeX:t ... - #+LINK_UP: the ``up'' link of an exported page - #+LINK_HOME: the ``home'' link of an exported page - #+LATEX_HEADER: extra line(s) for the LaTeX header, like \usepackage{xyz} -#+END_EXAMPLE - --------------- - -| [[[#Export-options][<]]] | [[[#ASCII_002fLatin_002d1_002fUTF_002d8-export][>]]] | | [[[#Exporting][<<]]] | [[[#Exporting][Up]]] | [[[#Publishing][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 12.2 The export dispatcher - -All export commands can be reached using the export dispatcher, which is -a prefix key that prompts for an additional key specifying the command. -Normally the entire file is exported, but if there is an active region -that contains one outline tree, the first heading is used as document -title and the subtrees are exported. - -- C-c C-e :: Dispatcher for export and publishing commands. - --------------- - -| [[[#The-export-dispatcher][<]]] | [[[#HTML-export][>]]] | | [[[#Exporting][<<]]] | [[[#Exporting][Up]]] | [[[#Publishing][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 12.3 ASCII/Latin-1/UTF-8 export - -ASCII export produces a simple and very readable version of an Org-mode -file, containing only plain ASCII. Latin-1 and UTF-8 export augment the -file with special characters and symbols available in these encodings. - -- C-c C-e a :: Export as ASCII file. - -- C-c C-e n and C-c C-e N :: Like the above commands, but use Latin-1 - encoding. - -- C-c C-e u and C-c C-e U :: Like the above commands, but use UTF-8 - encoding. - --------------- - -| [[[#ASCII_002fLatin_002d1_002fUTF_002d8-export][<]]] | [[[#LaTeX-and-PDF-export][>]]] | | [[[#Exporting][<<]]] | [[[#Exporting][Up]]] | [[[#Publishing][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 12.4 HTML export - -- C-c C-e h :: Export as HTML file ‘=myfile.html=’. - -- C-c C-e b :: Export as HTML file and immediately open it with a - browser. - -To insert HTML that should be copied verbatim to the exported file use -either - -#+BEGIN_EXAMPLE - #+HTML: Literal HTML code for export -#+END_EXAMPLE - -or - -#+BEGIN_EXAMPLE - #+BEGIN_HTML - All lines between these markers are exported literally - #+END_HTML -#+END_EXAMPLE - --------------- - -| [[[#HTML-export][<]]] | [[[#DocBook-export][>]]] | | [[[#Exporting][<<]]] | [[[#Exporting][Up]]] | [[[#Publishing][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 12.5 LaTeX and PDF export - -- C-c C-e l :: Export as LaTeX file ‘=myfile.tex=’. - -- C-c C-e p :: Export as LaTeX and then process to PDF. - -- C-c C-e d :: Export as LaTeX and then process to PDF, then open the - resulting PDF file. - -By default, the LaTeX output uses the class =article=. You can change -this by adding an option like =#+LaTeX_CLASS: myclass= in your file. The -class must be listed in =org-export-latex-classes=. - -Embedded LaTeX as described in [[#Embedded-LaTeX][Embedded LaTeX]], will -be correctly inserted into the LaTeX file. Similarly to the HTML -exporter, you can use =#+LaTeX:= and =#+BEGIN_LaTeX ... #+END_LaTeX= -construct to add verbatim LaTeX code. - --------------- - -| [[[#LaTeX-and-PDF-export][<]]] | [[[#iCalendar-export][>]]] | | [[[#Exporting][<<]]] | [[[#Exporting][Up]]] | [[[#Publishing][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 12.6 DocBook export - -- C-c C-e D :: Export as DocBook file. - -Similarly to the HTML exporter, you can use =#+DocBook:= and -=#+BEGIN_DocBook ... #+END_DocBook= construct to add verbatim LaTeX -code. - --------------- - -| [[[#DocBook-export][<]]] | [[[#Publishing][>]]] | | [[[#Exporting][<<]]] | [[[#Exporting][Up]]] | [[[#Publishing][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 12.7 iCalendar export - -- C-c C-e i :: Create iCalendar entries for the current file in a - ‘=.ics=’ file. - -- C-c C-e c :: Create a single large iCalendar file from all files in - =org-agenda-files= and write it to the file given by - =org-combined-agenda-icalendar-file=. - -*Further reading* -[[http://orgmode.org/manual/Exporting.html#Exporting][Chapter 12 of the -manual]] - -[[http://orgmode.org/worg/org-tutorials/images-and-xhtml-export.php][Sebastian -Rose’s image handling tutorial]] - [[http://orgmode.org/worg/org-tutorials/org-latex-export.php][Thomas -Dye’s LaTeX export tutorial]] -[[http://orgmode.org/worg/org-tutorials/org-beamer/tutorial.php][Eric -Fraga’s BEAMER presentation tutorial]] - --------------- - -| [[[#iCalendar-export][<]]] | [[[#Working-With-Source-Code][>]]] | | [[[#Exporting][<<]]] | [[[#Top][Up]]] | [[[#Working-With-Source-Code][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 13. Publishing - -Org includes a publishing management system that allows you to configure -automatic HTML conversion of /projects/ composed of interlinked org -files. You can also configure Org to automatically upload your exported -HTML pages and related attachments, such as images and source code -files, to a web server. For detailed instructions about setup, see the -manual. - -Here is an example: - -#+BEGIN_EXAMPLE - (setq org-publish-project-alist - '(("org" - :base-directory "~/org/" - :publishing-directory "~/public_html" - :section-numbers nil - :table-of-contents nil - :style ""))) -#+END_EXAMPLE - -- C-c C-e C :: Prompt for a specific project and publish all files - that belong to it. - -- C-c C-e P :: Publish the project containing the current file. - -- C-c C-e F :: Publish only the current file. - -- C-c C-e E :: Publish every project. - -Org uses timestamps to track when a file has changed. The above -functions normally only publish changed files. You can override this and -force publishing of all files by giving a prefix argument to any of the -commands above. - -*Further reading* -[[http://orgmode.org/manual/Publishing.html#Publishing][Chapter 13 of -the manual]] - -[[http://orgmode.org/worg/org-tutorials/org-publish-html-tutorial.php][Sebastian -Rose’s publishing tutorial]] - [[http://orgmode.org/worg/org-tutorials/org-jekyll.php][Ian Barton’s -Jekyll/blogging setup]] - --------------- - -| [[[#Publishing][<]]] | [[[#Miscellaneous][>]]] | | [[[#Publishing][<<]]] | [[[#Top][Up]]] | [[[#Miscellaneous][>>]]] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 14. Working with source code - -Org-mode provides a number of features for working with source code, -including editing of code blocks in their native major-mode, evaluation -of code blocks, tangling of code blocks, and exporting code blocks and -their results in several formats. - -*** Structure of Code Blocks - -The structure of code blocks is as follows: - -#+BEGIN_EXAMPLE - #+srcname: - #+begin_src
- - #+end_src -#+END_EXAMPLE - -Where == is a string used to name the code block, == -specifies the language of the code block (e.g. =emacs-lisp=, =shell=, -=R=, =python=, etc...), == can be used to control export of -the code block, =
= can be used to control many aspects -of code block behavior as demonstrated below, and == contains the -actual source code. - -*** Editing source code - -Use C-c ' to edit the current code block. This brings up a language -major-mode edit buffer containing the body of the code block. Saving -this buffer will write the new contents back to the Org buffer. Use C-c -' again to exit the edit buffer. - -*** Evaluating code blocks - -Use C-c C-c to evaluate the current code block and insert its results in -the Org-mode buffer. By default, evaluation is only turned on for -=emacs-lisp= code blocks, however support exists for evaluating blocks -in many languages. For a complete list of supported languages see the -manual. The following shows a code block and its results. - -#+BEGIN_EXAMPLE - #+begin_src emacs-lisp - (+ 1 2 3 4) - #+end_src - - #+results: - : 10 -#+END_EXAMPLE - -*** Extracting source code - -Use C-c C-v t to create pure source code files by extracting code from -source blocks in the current buffer. This is referred to as “tangling”—a -term adopted from the literate programming community. During “tangling” -of code blocks their bodies are expanded using -=org-babel-expand-src-block= which can expand both variable and “noweb” -style references. In order to tangle a code block it must have a -=:tangle= header argument, see the manual for details. - -*** Library of Babel - -Use C-c C-v l to load the code blocks from an Org-mode files into the -“Library of Babel”, these blocks can then be evaluated from any Org-mode -buffer. A collection of generally useful code blocks is distributed with -Org-mode in =contrib/library-of-babel.org=. - -*** Header Arguments - -Many aspects of the evaluation and export of code blocks are controlled -through header arguments. These can be specified globally, at the file -level, at the outline subtree level, and at the individual code block -level. The following describes some of the header arguments. - -- =:var= :: The =:var= header argument is used to pass arguments to - code blocks. The values passed to arguments can be literal values, - values from org-mode tables and literal example blocks, or the - results of other named code blocks. - -- =:results= :: The =:results= header argument controls the - /collection/, /type/, and /handling/ of code block results. Values of - =output= or =value= (the default) specify how results are collected - from a code block’s evaluation. Values of =vector=, =scalar= =file= - =raw= =html= =latex= and =code= specify the type of the results of - the code block which dictates how they will be incorporated into the - Org-mode buffer. Values of =silent=, =replace=, =prepend=, and - =append= specify handling of code block results, specifically if and - how the results should be inserted into the Org-mode buffer. - -- =:session= :: A header argument of =:session= will cause the code - block to be evaluated in a persistent interactive inferior process in - Emacs. This allows for persisting state between code block - evaluations, and for manual inspection of the results of evaluation. - -- =:exports= :: Any combination of the /code/ or the /results/ of a - block can be retained on export, this is specified by setting the - =:results= header argument to =code= =results= =none= or =both=. - -- =:tangle= :: A header argument of =:tangle yes= will cause a code - block’s contents to be tangled to a file named after the filename of - the Org-mode buffer. An alternate file name can be specified with - =:tangle filename=. - -- =:cache= :: A header argument of =:cache yes= will cause associate a - hash of the expanded code block with the results, ensuring that code - blocks are only re-run when their inputs have changed. - -- =:noweb= :: A header argument of =:noweb yes= will expand “noweb” - style references on evaluation and tangling. - -- =:file= :: Code blocks which output results to files (e.g. graphs, - diagrams and figures) can accept a =:file filename= header argument - in which case the results are saved to the named file, and a link to - the file is inserted into the Org-mode buffer. - -*Further reading* -[[http://orgmode.org/manual/Literal-examples.html#Literal-examples][Chapter -11.3 of the manual]] - [[http://orgmode.org/worg/org-contrib/babel/index.php][The Babel site -on Worg]] - --------------- - -| [[[#Working-With-Source-Code][<]]] | [[[#Completion][>]]] | | [[[#Working-With-Source-Code][<<]]] | [[[#Top][Up]]] | [ >> ] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* 15. Miscellaneous - -| [[#Completion][15.1 Completion]] | | M-TAB knows what you need | -| [[#Clean-view][15.2 A cleaner outline view]] | | Getting rid of leading stars in the outline | -| [[#MobileOrg][15.3 MobileOrg]] | | Org-mode on the iPhone | - --------------- - -| [[[#Miscellaneous][<]]] | [[[#Clean-view][>]]] | | [[[#Miscellaneous][<<]]] | [[[#Miscellaneous][Up]]] | [ >> ] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 15.1 Completion - -Org supports in-buffer completion with M-. This type of completion -does not make use of the minibuffer. You simply type a few letters into -the buffer and use the key to complete text right there. For example, -this command will complete TeX symbols after ‘\’, TODO keywords at the -beginning of a headline, and tags after ‘:’ in a headline. - --------------- - -| [[[#Completion][<]]] | [[[#MobileOrg][>]]] | | [[[#Miscellaneous][<<]]] | [[[#Miscellaneous][Up]]] | [ >> ] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 15.2 A cleaner outline view - -Some people find it noisy and distracting that the Org headlines start -with a potentially large number of stars, and that text below the -headlines is not indented. While this is no problem when writing a -/book-like/ document where the outline headings are really section -headings, in a more /list-oriented/ outline, indented structure is a lot -cleaner: - -#+BEGIN_EXAMPLE - * Top level headline | * Top level headline - ** Second level | * Second level - *** 3rd level | * 3rd level - some text | some text - *** 3rd level | * 3rd level - more text | more text - * Another top level headline | * Another top level headline -#+END_EXAMPLE - -If you are using at least Emacs 23.1.50.3 and version 6.29 of Org, this -kind of view can be achieved dynamically at display time using -=org-indent-mode=, which will prepend intangible space to each line. You -can turn on =org-indent-mode= for all files by customizing the variable -=org-startup-indented=, or you can turn it on for individual files using - -#+BEGIN_EXAMPLE - #+STARTUP: indent -#+END_EXAMPLE - -If you want a similar effect in earlier version of Emacs and/or Org, or -if you want the indentation to be hard space characters so that the -plain text file looks as similar as possible to the Emacs display, Org -supports you by helping to indent (with ) text below each headline, -by hiding leading stars, and by only using levels 1, 3, etc to get two -characters indentation for each level. To get this support in a file, -use - -#+BEGIN_EXAMPLE - #+STARTUP: hidestars odd -#+END_EXAMPLE - --------------- - -| [[[#Clean-view][<]]] | [ > ] | | [[[#Miscellaneous][<<]]] | [[[#Miscellaneous][Up]]] | [ >> ] | | | | | [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -** 15.3 MobileOrg - -/MobileOrg/ is an application originally developed for the /iPhone/iPod -Touch/ series of devices, developed by Richard Moreland. There is also -an independent implementation for Android devices, by Matt Jones. For -details, see the Org-mode manual. - -*Further reading* -[[http://orgmode.org/manual/Miscellaneous.html#Miscellaneous][Chapter 15 -of the manual]] - [[http://orgmode.org/manual/MobileOrg.html#MobileOrg][Appendix B of the -manual]] - [[http://orgmode.org/orgcard.pdf][Key reference card]] - --------------- - -| [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* Footnotes - -*** [[#DOCF1][(1)]] - -See the variable =org-special-ctrl-a/e= to configure special behavior of -C-a and C-e in headlines. - -*** [[#DOCF2][(2)]] - -If you do not want the line to be split, customize the variable -=org-M-RET-may-split-line=. - -*** [[#DOCF3][(3)]] - -See also the variables =org-show-hierarchy-above=, -=org-show-following-heading=, =org-show-siblings=, and -=org-show-entry-below= for detailed control on how much context is shown -around each match. - -*** [[#DOCF4][(4)]] - -Of course, you can make a document that contains only long lists of TODO -items, but this is not required. - -*** [[#DOCF5][(5)]] - -The corresponding in-buffer setting is: =#+STARTUP: logdone= - -*** [[#DOCF6][(6)]] - -The corresponding in-buffer setting is: =#+STARTUP: lognotedone= - -*** [[#DOCF7][(7)]] - -As with all these in-buffer settings, pressing C-c C-c activates any -changes in the line. - -*** [[#DOCF8][(8)]] - -This is quite different from what is normally understood by /scheduling -a meeting/, which is done in Org-mode by just inserting a time stamp -without keyword. - -*** [[#DOCF9][(9)]] - -It will still be listed on that date after it has been marked DONE. If -you don’t like this, set the variable -=org-agenda-skip-scheduled-if-done=. - -*** [[#DOCF10][(10)]] - -Using capture templates, you can define more fine-grained capture -locations, see [[#Capture-templates][Capture templates]]. - -*** [[#DOCF11][(11)]] - -Please select your own key, C-c c is only a suggestion. - -*** [[#DOCF12][(12)]] - -If you need one of these sequences literally, escape the % with a -backslash. - -*** [[#DOCF13][(13)]] - -Note that the order of the arguments (month, day, year) depends on the -setting of =calendar-date-style=. - --------------- - -| [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* Short Table of Contents - -- [[#Introduction][1. Introduction]] -- [[#Document-Structure][2. Document Structure]] -- [[#Tables][3. Tables]] -- [[#Hyperlinks][4. Hyperlinks]] -- [[#TODO-Items][5. TODO Items]] -- [[#Tags][6. Tags]] -- [[#Properties][7. Properties]] -- [[#Dates-and-Times][8. Dates and Times]] -- [[#Capture-_002d-Refile-_002d-Archive][9. Capture - Refile - - Archive]] -- [[#Agenda-Views][10. Agenda Views]] -- [[#Markup][11. Markup for rich export]] -- [[#Exporting][12. Exporting]] -- [[#Publishing][13. Publishing]] -- [[#Working-With-Source-Code][14. Working with source code]] -- [[#Miscellaneous][15. Miscellaneous]] - --------------- - -| [[[#Top][Top]]] | [Contents] | [Index] | [[[#SEC_About][?]]] | - -* About This Document - -This document was generated by /Stefan Otte/ on /August 4, 2011/ using -[[http://www.nongnu.org/texi2html/][/texi2html 1.82/]]. - -The buttons in the navigation panels have the following meaning: - -| Button | Name | Go to | From 1.2.3 go to | -|--------------+---------------+-------------------------------------------------+--------------------| -| [ < ] | Back | Previous section in reading order | 1.2.2 | -| [ > ] | Forward | Next section in reading order | 1.2.4 | -| [ << ] | FastBack | Beginning of this chapter or previous chapter | 1 | -| [ Up ] | Up | Up section | 1.2 | -| [ >> ] | FastForward | Next chapter | 2 | -| [Top] | Top | Cover (top) of document | | -| [Contents] | Contents | Table of contents | | -| [Index] | Index | Index | | -| [ ? ] | About | About (help) | | - -where the *Example* assumes that the current position is at -*Subsubsection One-Two-Three* of a document of the following structure: - -- 1. Section One - - - 1.1 Subsection One-One - - - ... - - - 1.2 Subsection One-Two - - - 1.2.1 Subsubsection One-Two-One - - 1.2.2 Subsubsection One-Two-Two - - 1.2.3 Subsubsection One-Two-Three *<== Current Position* - - 1.2.4 Subsubsection One-Two-Four - - - 1.3 Subsection One-Three - - - ... - - - 1.4 Subsection One-Four - --------------- - -This document was generated by /Stefan Otte/ on /August 4, 2011/ using -[[http://www.nongnu.org/texi2html/][/texi2html 1.82/]]. - diff --git a/pack/acp/start/vim-orgmode/documentation/emacs_orgguide.texi b/pack/acp/start/vim-orgmode/documentation/emacs_orgguide.texi deleted file mode 100644 index 61045ef..0000000 --- a/pack/acp/start/vim-orgmode/documentation/emacs_orgguide.texi +++ /dev/null @@ -1,2689 +0,0 @@ -\input texinfo -@c %**start of header -@setfilename ../../info/orgguide -@settitle The compact Org-mode Guide - -@set VERSION 7.7 -@set DATE July 2011 - -@c Use proper quote and backtick for code sections in PDF output -@c Cf. Texinfo manual 14.2 -@set txicodequoteundirected -@set txicodequotebacktick - -@c Version and Contact Info -@set MAINTAINERSITE @uref{http://orgmode.org,maintainers webpage} -@set AUTHOR Carsten Dominik -@set MAINTAINER Carsten Dominik -@set MAINTAINEREMAIL @email{carsten at orgmode dot org} -@set MAINTAINERCONTACT @uref{mailto:carsten at orgmode dot org,contact the maintainer} -@c %**end of header -@finalout - -@c Macro definitions -@iftex -@c @hyphenation{time-stamp time-stamps time-stamp-ing time-stamp-ed} -@end iftex - -@c Subheadings inside a table. -@macro tsubheading{text} -@ifinfo -@subsubheading \text\ -@end ifinfo -@ifnotinfo -@item @b{\text\} -@end ifnotinfo -@end macro - -@macro seealso{text} -@noindent @b{Further reading}@*@noindent \text\ -@end macro -@copying - -Copyright @copyright{} 2010 Free Software Foundation - -@quotation -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.3 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU Manual,'' -and with the Back-Cover Texts as in (a) below. A copy of the license -is included in the section entitled ``GNU Free Documentation License.'' - -(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and -modify this GNU manual. Buying copies from the FSF supports it in -developing GNU and promoting software freedom.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. -@end quotation -@end copying - -@dircategory Emacs -@direntry -* Org Mode Guide: (orgguide). Abbreviated Org-mode Manual -@end direntry - -@titlepage -@title The compact Org-mode Guide - -@subtitle Release @value{VERSION} -@author by Carsten Dominik - -@c The following two commands start the copyright page. -@page -@vskip 0pt plus 1filll -@insertcopying -@end titlepage - -@c Output the table of contents at the beginning. -@shortcontents - -@ifnottex -@node Top, Introduction, (dir), (dir) -@top Org Mode Guide - -@insertcopying -@end ifnottex - -@menu -* Introduction:: Getting started -* Document Structure:: A tree works like your brain -* Tables:: Pure magic for quick formatting -* Hyperlinks:: Notes in context -* TODO Items:: Every tree branch can be a TODO item -* Tags:: Tagging headlines and matching sets of tags -* Properties:: Properties -* Dates and Times:: Making items useful for planning -* Capture - Refile - Archive:: The ins and outs for projects -* Agenda Views:: Collecting information into views -* Markup:: Prepare text for rich export -* Exporting:: Sharing and publishing of notes -* Publishing:: Create a web site of linked Org files -* Working With Source Code:: Source code snippets embedded in Org -* Miscellaneous:: All the rest which did not fit elsewhere - -@detailmenu - --- The Detailed Node Listing --- - -Introduction - -* Preface:: Welcome -* Installation:: How to install a downloaded version of Org -* Activation:: How to activate Org for certain buffers -* Feedback:: Bug reports, ideas, patches etc. - -Document Structure - -* Outlines:: Org is based on Outline mode -* Headlines:: How to typeset Org tree headlines -* Visibility cycling:: Show and hide, much simplified -* Motion:: Jumping to other headlines -* Structure editing:: Changing sequence and level of headlines -* Sparse trees:: Matches embedded in context -* Plain lists:: Additional structure within an entry -* Footnotes:: How footnotes are defined in Org's syntax - -Hyperlinks - -* Link format:: How links in Org are formatted -* Internal links:: Links to other places in the current file -* External links:: URL-like links to the world -* Handling links:: Creating, inserting and following -* Targeted links:: Point at a location in a file - -TODO Items - -* Using TODO states:: Setting and switching states -* Multi-state workflows:: More than just on/off -* Progress logging:: Dates and notes for progress -* Priorities:: Some things are more important than others -* Breaking down tasks:: Splitting a task into manageable pieces -* Checkboxes:: Tick-off lists - -Progress logging - -* Closing items:: When was this entry marked DONE? -* Tracking TODO state changes:: When did the status change? - -Tags - -* Tag inheritance:: Tags use the tree structure of the outline -* Setting tags:: How to assign tags to a headline -* Tag searches:: Searching for combinations of tags - -Dates and Times - -* Timestamps:: Assigning a time to a tree entry -* Creating timestamps:: Commands which insert timestamps -* Deadlines and scheduling:: Planning your work -* Clocking work time:: Tracking how long you spend on a task - -Capture - Refile - Archive - -* Capture:: -* Refiling notes:: Moving a tree from one place to another -* Archiving:: What to do with finished projects - -Capture - -* Setting up a capture location:: Where notes will be stored -* Using capture:: Commands to invoke and terminate capture -* Capture templates:: Define the outline of different note types - -Agenda Views - -* Agenda files:: Files being searched for agenda information -* Agenda dispatcher:: Keyboard access to agenda views -* Built-in agenda views:: What is available out of the box? -* Agenda commands:: Remote editing of Org trees -* Custom agenda views:: Defining special searches and views - -The built-in agenda views - -* Weekly/daily agenda:: The calendar page with current tasks -* Global TODO list:: All unfinished action items -* Matching tags and properties:: Structured information with fine-tuned search -* Timeline:: Time-sorted view for single file -* Search view:: Find entries by searching for text - -Markup for rich export - -* Structural markup elements:: The basic structure as seen by the exporter -* Images and tables:: Tables and Images will be included -* Literal examples:: Source code examples with special formatting -* Include files:: Include additional files into a document -* Embedded LaTeX:: LaTeX can be freely used inside Org documents - -Structural markup elements - -* Document title:: Where the title is taken from -* Headings and sections:: The document structure as seen by the exporter -* Table of contents:: The if and where of the table of contents -* Paragraphs:: Paragraphs -* Emphasis and monospace:: Bold, italic, etc. -* Comment lines:: What will *not* be exported - -Exporting - -* Export options:: Per-file export settings -* The export dispatcher:: How to access exporter commands -* ASCII/Latin-1/UTF-8 export:: Exporting to flat files with encoding -* HTML export:: Exporting to HTML -* LaTeX and PDF export:: Exporting to La@TeX{}, and processing to PDF -* DocBook export:: Exporting to DocBook -* iCalendar export:: - -Miscellaneous - -* Completion:: M-TAB knows what you need -* Clean view:: Getting rid of leading stars in the outline -* MobileOrg:: Org-mode on the iPhone - -@end detailmenu -@end menu - -@node Introduction, Document Structure, Top, Top -@chapter Introduction - -@menu -* Preface:: Welcome -* Installation:: How to install a downloaded version of Org -* Activation:: How to activate Org for certain buffers -* Feedback:: Bug reports, ideas, patches etc. -@end menu - -@node Preface, Installation, Introduction, Introduction -@section Preface - -Org is a mode for keeping notes, maintaining TODO lists, and doing project -planning with a fast and effective plain-text system. It is also an -authoring and publishing system. - -@i{This document is a much compressed derivative of the -@uref{http://orgmode.org/index.html#sec-4_1, comprehensive Org-mode manual}. -It contains all basic features and commands, along with important hints for -customization. It is intended for beginners who would shy back from a 200 -page manual because of sheer size.} - -@node Installation, Activation, Preface, Introduction -@section Installation - -@b{Important:} @i{If you are using a version of Org that is part of the Emacs -distribution or an XEmacs package, please skip this section and go directly -to @ref{Activation}.} - -If you have downloaded Org from the Web, either as a distribution @file{.zip} -or @file{.tar} file, or as a Git archive, it is best to run it directly from -the distribution directory. You need to add the @file{lisp} subdirectories -to the Emacs load path. To do this, add the following line to @file{.emacs}: - -@smallexample -(setq load-path (cons "~/path/to/orgdir/lisp" load-path)) -(setq load-path (cons "~/path/to/orgdir/contrib/lisp" load-path)) -@end smallexample - -@noindent For speed you should byte-compile the Lisp files with the shell -command: - -@smallexample -make -@end smallexample - -Then add the following line to @file{.emacs}. It is needed so that -Emacs can autoload functions that are located in files not immediately loaded -when Org-mode starts. -@smalllisp -(require 'org-install) -@end smalllisp - -@node Activation, Feedback, Installation, Introduction -@section Activation - -Add the following lines to your @file{.emacs} file. The last three lines -define @emph{global} keys for some commands --- please choose suitable keys -yourself. - -@smalllisp -;; The following lines are always needed. Choose your own keys. -(add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode)) -(add-hook 'org-mode-hook 'turn-on-font-lock) ; not needed when global-font-lock-mode is on -(global-set-key "\C-cl" 'org-store-link) -(global-set-key "\C-ca" 'org-agenda) -(global-set-key "\C-cb" 'org-iswitchb) -@end smalllisp - -With this setup, all files with extension @samp{.org} will be put -into Org mode. - -@node Feedback, , Activation, Introduction -@section Feedback - -If you find problems with Org, or if you have questions, remarks, or ideas -about it, please mail to the Org mailing list @email{emacs-orgmode@@gnu.org}. -For information on how to submit bug reports, see the main manual. - -@node Document Structure, Tables, Introduction, Top -@chapter Document Structure - -Org is based on Outline mode and provides flexible commands to -edit the structure of the document. - -@menu -* Outlines:: Org is based on Outline mode -* Headlines:: How to typeset Org tree headlines -* Visibility cycling:: Show and hide, much simplified -* Motion:: Jumping to other headlines -* Structure editing:: Changing sequence and level of headlines -* Sparse trees:: Matches embedded in context -* Plain lists:: Additional structure within an entry -* Footnotes:: How footnotes are defined in Org's syntax -@end menu - -@node Outlines, Headlines, Document Structure, Document Structure -@section Outlines - -Org is implemented on top of Outline mode. Outlines allow a -document to be organized in a hierarchical structure, which (at least -for me) is the best representation of notes and thoughts. An overview -of this structure is achieved by folding (hiding) large parts of the -document to show only the general document structure and the parts -currently being worked on. Org greatly simplifies the use of -outlines by compressing the entire show/hide functionality into a single -command, @command{org-cycle}, which is bound to the @key{TAB} key. - -@node Headlines, Visibility cycling, Outlines, Document Structure -@section Headlines - -Headlines define the structure of an outline tree. The headlines in -Org start with one or more stars, on the left margin@footnote{See -the variable @code{org-special-ctrl-a/e} to configure special behavior -of @kbd{C-a} and @kbd{C-e} in headlines.}. For example: - -@smallexample -* Top level headline -** Second level -*** 3rd level - some text -*** 3rd level - more text - -* Another top level headline -@end smallexample - -@noindent Some people find the many stars too noisy and would prefer an -outline that has whitespace followed by a single star as headline -starters. @ref{Clean view}, describes a setup to realize this. - -@node Visibility cycling, Motion, Headlines, Document Structure -@section Visibility cycling - -Outlines make it possible to hide parts of the text in the buffer. -Org uses just two commands, bound to @key{TAB} and -@kbd{S-@key{TAB}} to change the visibility in the buffer. - -@table @kbd -@item @key{TAB} -@emph{Subtree cycling}: Rotate current subtree among the states - -@smallexample -,-> FOLDED -> CHILDREN -> SUBTREE --. -'-----------------------------------' -@end smallexample - -When called with a prefix argument (@kbd{C-u @key{TAB}}) or with the shift -key, global cycling is invoked. - -@item S-@key{TAB} @r{and} C-u @key{TAB} -@emph{Global cycling}: Rotate the entire buffer among the states - -@smallexample -,-> OVERVIEW -> CONTENTS -> SHOW ALL --. -'--------------------------------------' -@end smallexample - -@item C-u C-u C-u @key{TAB} -Show all, including drawers. -@end table - -When Emacs first visits an Org file, the global state is set to -OVERVIEW, i.e.@: only the top level headlines are visible. This can be -configured through the variable @code{org-startup-folded}, or on a -per-file basis by adding a startup keyword @code{overview}, @code{content}, -@code{showall}, like this: - -@smallexample -#+STARTUP: content -@end smallexample - - -@node Motion, Structure editing, Visibility cycling, Document Structure -@section Motion -The following commands jump to other headlines in the buffer. - -@table @kbd -@item C-c C-n -Next heading. -@item C-c C-p -Previous heading. -@item C-c C-f -Next heading same level. -@item C-c C-b -Previous heading same level. -@item C-c C-u -Backward to higher level heading. -@end table - -@node Structure editing, Sparse trees, Motion, Document Structure -@section Structure editing - -@table @kbd -@item M-@key{RET} -Insert new heading with same level as current. If the cursor is in a plain -list item, a new item is created (@pxref{Plain lists}). When this command is -used in the middle of a line, the line is split and the rest of the line -becomes the new headline@footnote{If you do not want the line to be split, -customize the variable @code{org-M-RET-may-split-line}.}. -@item M-S-@key{RET} -Insert new TODO entry with same level as current heading. -@item @key{TAB} @r{in new, empty entry} -In a new entry with no text yet, @key{TAB} will cycle through reasonable -levels. -@item M-@key{left}@r{/}@key{right} -Promote/demote current heading by one level. -@item M-S-@key{left}@r{/}@key{right} -Promote/demote the current subtree by one level. -@item M-S-@key{up}@r{/}@key{down} -Move subtree up/down (swap with previous/next subtree of same -level). -@item C-c C-w -Refile entry or region to a different location. @xref{Refiling notes}. -@item C-x n s/w -Narrow buffer to current subtree / widen it again -@end table - -When there is an active region (Transient Mark mode), promotion and -demotion work on all headlines in the region. - -@node Sparse trees, Plain lists, Structure editing, Document Structure -@section Sparse trees - -An important feature of Org mode is the ability to construct @emph{sparse -trees} for selected information in an outline tree, so that the entire -document is folded as much as possible, but the selected information is made -visible along with the headline structure above it@footnote{See also the -variables @code{org-show-hierarchy-above}, @code{org-show-following-heading}, -@code{org-show-siblings}, and @code{org-show-entry-below} for detailed -control on how much context is shown around each match.}. Just try it out -and you will see immediately how it works. - -Org mode contains several commands creating such trees, all these -commands can be accessed through a dispatcher: - -@table @kbd -@item C-c / -This prompts for an extra key to select a sparse-tree creating command. -@item C-c / r -Occur. Prompts for a regexp and shows a sparse tree with all matches. Each -match is also highlighted; the highlights disappear by pressing @kbd{C-c C-c}. -@end table - -The other sparse tree commands select headings based on TODO keywords, -tags, or properties and will be discussed later in this manual. - -@node Plain lists, Footnotes, Sparse trees, Document Structure -@section Plain lists - -Within an entry of the outline tree, hand-formatted lists can provide -additional structure. They also provide a way to create lists of -checkboxes (@pxref{Checkboxes}). Org supports editing such lists, -and the HTML exporter (@pxref{Exporting}) parses and formats them. - -Org knows ordered lists, unordered lists, and description lists. -@itemize @bullet -@item -@emph{Unordered} list items start with @samp{-}, @samp{+}, or -@samp{*} as bullets. -@item -@emph{Ordered} list items start with @samp{1.} or @samp{1)}. -@item -@emph{Description} list use @samp{ :: } to separate the @emph{term} from the -description. -@end itemize - -Items belonging to the same list must have the same indentation on the first -line. An item ends before the next line that is indented like its -bullet/number, or less. A list ends when all items are closed, or before two -blank lines. An example: - -@smallexample -@group -** Lord of the Rings - My favorite scenes are (in this order) - 1. The attack of the Rohirrim - 2. Eowyn's fight with the witch king - + this was already my favorite scene in the book - + I really like Miranda Otto. - Important actors in this film are: - - @b{Elijah Wood} :: He plays Frodo - - @b{Sean Austin} :: He plays Sam, Frodo's friend. -@end group -@end smallexample - -The following commands act on items when the cursor is in the first line of -an item (the line with the bullet or number). - -@table @kbd -@item @key{TAB} -Items can be folded just like headline levels. -@item M-@key{RET} -Insert new item at current level. With a prefix argument, force a new -heading (@pxref{Structure editing}). -@item M-S-@key{RET} -Insert a new item with a checkbox (@pxref{Checkboxes}). -@item M-S-@key{up}@r{/}@key{down} -Move the item including subitems up/down (swap with previous/next item -of same indentation). If the list is ordered, renumbering is -automatic. -@item M-@key{left}@r{/}M-@key{right} -Decrease/increase the indentation of an item, leaving children alone. -@item M-S-@key{left}@r{/}@key{right} -Decrease/increase the indentation of the item, including subitems. -@item C-c C-c -If there is a checkbox (@pxref{Checkboxes}) in the item line, toggle the -state of the checkbox. Also verify bullets and indentation consistency in -the whole list. -@item C-c - -Cycle the entire list level through the different itemize/enumerate bullets -(@samp{-}, @samp{+}, @samp{*}, @samp{1.}, @samp{1)}). -@end table - -@node Footnotes, , Plain lists, Document Structure -@section Footnotes - -A footnote is defined in a paragraph that is started by a footnote marker in -square brackets in column 0, no indentation allowed. The footnote reference -is simply the marker in square brackets, inside text. For example: - -@smallexample -The Org homepage[fn:1] now looks a lot better than it used to. -... -[fn:1] The link is: http://orgmode.org -@end smallexample - -@noindent The following commands handle footnotes: - -@table @kbd -@item C-c C-x f -The footnote action command. When the cursor is on a footnote reference, -jump to the definition. When it is at a definition, jump to the (first) -reference. Otherwise, create a new footnote. When this command is called -with a prefix argument, a menu of additional options including renumbering is -offered. - -@item C-c C-c -Jump between definition and reference. -@end table - -@seealso{ -@uref{http://orgmode.org/manual/Document-Structure.html#Document-Structure, -Chapter 2 of the manual}@* -@uref{http://sachachua.com/wp/2008/01/outlining-your-notes-with-org/, -Sacha Chua's tutorial}} - - -@node Tables, Hyperlinks, Document Structure, Top -@chapter Tables - -Org comes with a fast and intuitive table editor. Spreadsheet-like -calculations are supported in connection with the Emacs @file{calc} -package -@ifinfo -(@pxref{Top,Calc,,Calc,Gnu Emacs Calculator Manual}). -@end ifinfo -@ifnotinfo -(see the Emacs Calculator manual for more information about the Emacs -calculator). -@end ifnotinfo - -Org makes it easy to format tables in plain ASCII. Any line with -@samp{|} as the first non-whitespace character is considered part of a -table. @samp{|} is also the column separator. A table might look like -this: - -@smallexample -| Name | Phone | Age | -|-------+-------+-----| -| Peter | 1234 | 17 | -| Anna | 4321 | 25 | -@end smallexample - -A table is re-aligned automatically each time you press @key{TAB} or -@key{RET} or @kbd{C-c C-c} inside the table. @key{TAB} also moves to -the next field (@key{RET} to the next row) and creates new table rows -at the end of the table or before horizontal lines. The indentation -of the table is set by the first line. Any line starting with -@samp{|-} is considered as a horizontal separator line and will be -expanded on the next re-align to span the whole table width. So, to -create the above table, you would only type - -@smallexample -|Name|Phone|Age| -|- -@end smallexample - -@noindent and then press @key{TAB} to align the table and start filling in -fields. Even faster would be to type @code{|Name|Phone|Age} followed by -@kbd{C-c @key{RET}}. - -When typing text into a field, Org treats @key{DEL}, -@key{Backspace}, and all character keys in a special way, so that -inserting and deleting avoids shifting other fields. Also, when -typing @emph{immediately after the cursor was moved into a new field -with @kbd{@key{TAB}}, @kbd{S-@key{TAB}} or @kbd{@key{RET}}}, the -field is automatically made blank. - -@table @kbd -@tsubheading{Creation and conversion} -@item C-c | -Convert the active region to table. If every line contains at least one TAB -character, the function assumes that the material is tab separated. If every -line contains a comma, comma-separated values (CSV) are assumed. If not, -lines are split at whitespace into fields. -@* -If there is no active region, this command creates an empty Org -table. But it's easier just to start typing, like -@kbd{|Name|Phone|Age C-c @key{RET}}. - -@tsubheading{Re-aligning and field motion} -@item C-c C-c -Re-align the table without moving the cursor. -@c -@item @key{TAB} -Re-align the table, move to the next field. Creates a new row if -necessary. -@c -@item S-@key{TAB} -Re-align, move to previous field. -@c -@item @key{RET} -Re-align the table and move down to next row. Creates a new row if -necessary. - -@tsubheading{Column and row editing} -@item M-@key{left} -@itemx M-@key{right} -Move the current column left/right. -@c -@item M-S-@key{left} -Kill the current column. -@c -@item M-S-@key{right} -Insert a new column to the left of the cursor position. -@c -@item M-@key{up} -@itemx M-@key{down} -Move the current row up/down. -@c -@item M-S-@key{up} -Kill the current row or horizontal line. -@c -@item M-S-@key{down} -Insert a new row above the current row. With a prefix argument, the line is -created below the current one. -@c -@item C-c - -Insert a horizontal line below current row. With a prefix argument, the line -is created above the current line. -@c -@item C-c @key{RET} -Insert a horizontal line below current row, and move the cursor into the row -below that line. -@c -@item C-c ^ -Sort the table lines in the region. The position of point indicates the -column to be used for sorting, and the range of lines is the range -between the nearest horizontal separator lines, or the entire table. - -@end table - -@seealso{ -@uref{http://orgmode.org/manual/Tables.html#Tables, Chapter 3 of the -manual}@* -@uref{http://orgmode.org/worg/org-tutorials/tables.php, Bastien's -table tutorial}@* -@uref{http://orgmode.org/worg/org-tutorials/org-spreadsheet-intro.php, -Bastien's spreadsheet tutorial}@* -@uref{http://orgmode.org/worg/org-tutorials/org-plot.php, Eric's plotting tutorial}} - -@node Hyperlinks, TODO Items, Tables, Top -@chapter Hyperlinks - -Like HTML, Org provides links inside a file, external links to -other files, Usenet articles, emails, and much more. - -@menu -* Link format:: How links in Org are formatted -* Internal links:: Links to other places in the current file -* External links:: URL-like links to the world -* Handling links:: Creating, inserting and following -* Targeted links:: Point at a location in a file -@end menu - -@node Link format, Internal links, Hyperlinks, Hyperlinks -@section Link format - -Org will recognize plain URL-like links and activate them as -clickable links. The general link format, however, looks like this: - -@smallexample -[[link][description]] @r{or alternatively} [[link]] -@end smallexample - -@noindent -Once a link in the buffer is complete (all brackets present), Org will change -the display so that @samp{description} is displayed instead of -@samp{[[link][description]]} and @samp{link} is displayed instead of -@samp{[[link]]}. To edit the invisible @samp{link} part, use @kbd{C-c -C-l} with the cursor on the link. - -@node Internal links, External links, Link format, Hyperlinks -@section Internal links - -If the link does not look like a URL, it is considered to be internal in the -current file. The most important case is a link like -@samp{[[#my-custom-id]]} which will link to the entry with the -@code{CUSTOM_ID} property @samp{my-custom-id}. - -Links such as @samp{[[My Target]]} or @samp{[[My Target][Find my target]]} -lead to a text search in the current file for the corresponding target which -looks like @samp{<>}. - -@node External links, Handling links, Internal links, Hyperlinks -@section External links - -Org supports links to files, websites, Usenet and email messages, -BBDB database entries and links to both IRC conversations and their -logs. External links are URL-like locators. They start with a short -identifying string followed by a colon. There can be no space after -the colon. Here are some examples: - -@smallexample -http://www.astro.uva.nl/~dominik @r{on the web} -file:/home/dominik/images/jupiter.jpg @r{file, absolute path} -/home/dominik/images/jupiter.jpg @r{same as above} -file:papers/last.pdf @r{file, relative path} -file:projects.org @r{another Org file} -docview:papers/last.pdf::NNN @r{open file in doc-view mode at page NNN} -id:B7423F4D-2E8A-471B-8810-C40F074717E9 @r{Link to heading by ID} -news:comp.emacs @r{Usenet link} -mailto:adent@@galaxy.net @r{Mail link} -vm:folder @r{VM folder link} -vm:folder#id @r{VM message link} -wl:folder#id @r{WANDERLUST message link} -mhe:folder#id @r{MH-E message link} -rmail:folder#id @r{RMAIL message link} -gnus:group#id @r{Gnus article link} -bbdb:R.*Stallman @r{BBDB link (with regexp)} -irc:/irc.com/#emacs/bob @r{IRC link} -info:org:External%20links @r{Info node link (with encoded space)} -@end smallexample - -A link should be enclosed in double brackets and may contain a -descriptive text to be displayed instead of the URL (@pxref{Link -format}), for example: - -@smallexample -[[http://www.gnu.org/software/emacs/][GNU Emacs]] -@end smallexample - -@noindent -If the description is a file name or URL that points to an image, HTML export -(@pxref{HTML export}) will inline the image as a clickable button. If there -is no description at all and the link points to an image, that image will be -inlined into the exported HTML file. - -@node Handling links, Targeted links, External links, Hyperlinks -@section Handling links - -Org provides methods to create a link in the correct syntax, to -insert it into an Org file, and to follow the link. - -@table @kbd -@item C-c l -Store a link to the current location. This is a @emph{global} command (you -must create the key binding yourself) which can be used in any buffer to -create a link. The link will be stored for later insertion into an Org -buffer (see below). -@c -@item C-c C-l -Insert a link. This prompts for a link to be inserted into the buffer. You -can just type a link, or use history keys @key{up} and @key{down} to access -stored links. You will be prompted for the description part of the link. -When called with a @kbd{C-u} prefix argument, file name completion is used to -link to a file. -@c -@item C-c C-l @r{(with cursor on existing link)} -When the cursor is on an existing link, @kbd{C-c C-l} allows you to edit the -link and description parts of the link. -@c -@item C-c C-o @r{or} mouse-1 @r{or} mouse-2 -Open link at point. -@item C-c & -Jump back to a recorded position. A position is recorded by the -commands following internal links, and by @kbd{C-c %}. Using this -command several times in direct succession moves through a ring of -previously recorded positions. -@c -@end table - -@node Targeted links, , Handling links, Hyperlinks -@section Targeted links - -File links can contain additional information to make Emacs jump to a -particular location in the file when following a link. This can be a -line number or a search option after a double colon. - -Here is the syntax of the different ways to attach a search to a file -link, together with an explanation: - -@smallexample -[[file:~/code/main.c::255]] @r{Find line 255} -[[file:~/xx.org::My Target]] @r{Find @samp{<>}} -[[file:~/xx.org::#my-custom-id]] @r{Find entry with custom id} -@end smallexample - -@seealso{ -@uref{http://orgmode.org/manual/Hyperlinks.html#Hyperlinks, Chapter 4 of the -manual}} - -@node TODO Items, Tags, Hyperlinks, Top -@chapter TODO Items - -Org mode does not maintain TODO lists as separate documents@footnote{Of -course, you can make a document that contains only long lists of TODO items, -but this is not required.}. Instead, TODO items are an integral part of the -notes file, because TODO items usually come up while taking notes! With Org -mode, simply mark any entry in a tree as being a TODO item. In this way, -information is not duplicated, and the entire context from which the TODO -item emerged is always present. - -Of course, this technique for managing TODO items scatters them -throughout your notes file. Org mode compensates for this by providing -methods to give you an overview of all the things that you have to do. - -@menu -* Using TODO states:: Setting and switching states -* Multi-state workflows:: More than just on/off -* Progress logging:: Dates and notes for progress -* Priorities:: Some things are more important than others -* Breaking down tasks:: Splitting a task into manageable pieces -* Checkboxes:: Tick-off lists -@end menu - -@node Using TODO states, Multi-state workflows, TODO Items, TODO Items -@section Using TODO states - -Any headline becomes a TODO item when it starts with the word -@samp{TODO}, for example: - -@smallexample -*** TODO Write letter to Sam Fortune -@end smallexample - -@noindent -The most important commands to work with TODO entries are: - -@table @kbd -@item C-c C-t -Rotate the TODO state of the current item among - -@smallexample -,-> (unmarked) -> TODO -> DONE --. -'--------------------------------' -@end smallexample - -The same rotation can also be done ``remotely'' from the timeline and -agenda buffers with the @kbd{t} command key (@pxref{Agenda commands}). - -@item S-@key{right}@r{/}@key{left} -Select the following/preceding TODO state, similar to cycling. -@item C-c / t -View TODO items in a @emph{sparse tree} (@pxref{Sparse trees}). Folds the -buffer, but shows all TODO items and the headings hierarchy above -them. -@item C-c a t -Show the global TODO list. Collects the TODO items from all agenda files -(@pxref{Agenda Views}) into a single buffer. @xref{Global TODO list}, for -more information. -@item S-M-@key{RET} -Insert a new TODO entry below the current one. -@end table - -@noindent -Changing a TODO state can also trigger tag changes. See the docstring of the -option @code{org-todo-state-tags-triggers} for details. - -@node Multi-state workflows, Progress logging, Using TODO states, TODO Items -@section Multi-state workflows - -You can use TODO keywords to indicate different @emph{sequential} states -in the process of working on an item, for example: - -@smalllisp -(setq org-todo-keywords - '((sequence "TODO" "FEEDBACK" "VERIFY" "|" "DONE" "DELEGATED"))) -@end smalllisp - -The vertical bar separates the TODO keywords (states that @emph{need -action}) from the DONE states (which need @emph{no further action}). If -you don't provide the separator bar, the last state is used as the DONE -state. -With this setup, the command @kbd{C-c C-t} will cycle an entry from TODO -to FEEDBACK, then to VERIFY, and finally to DONE and DELEGATED. - -Sometimes you may want to use different sets of TODO keywords in -parallel. For example, you may want to have the basic -@code{TODO}/@code{DONE}, but also a workflow for bug fixing, and a -separate state indicating that an item has been canceled (so it is not -DONE, but also does not require action). Your setup would then look -like this: - -@smalllisp -(setq org-todo-keywords - '((sequence "TODO(t)" "|" "DONE(d)") - (sequence "REPORT(r)" "BUG(b)" "KNOWNCAUSE(k)" "|" "FIXED(f)") - (sequence "|" "CANCELED(c)"))) -@end smalllisp - -The keywords should all be different, this helps Org mode to keep track of -which subsequence should be used for a given entry. The example also shows -how to define keys for fast access of a particular state, by adding a letter -in parenthesis after each keyword - you will be prompted for the key after -@kbd{C-c C-t}. - -To define TODO keywords that are valid only in a single file, use the -following text anywhere in the file. - -@smallexample -#+TODO: TODO(t) | DONE(d) -#+TODO: REPORT(r) BUG(b) KNOWNCAUSE(k) | FIXED(f) -#+TODO: | CANCELED(c) -@end smallexample - -After changing one of these lines, use @kbd{C-c C-c} with the cursor still in -the line to make the changes known to Org mode. - -@node Progress logging, Priorities, Multi-state workflows, TODO Items -@section Progress logging - -Org mode can automatically record a timestamp and possibly a note when -you mark a TODO item as DONE, or even each time you change the state of -a TODO item. This system is highly configurable, settings can be on a -per-keyword basis and can be localized to a file or even a subtree. For -information on how to clock working time for a task, see @ref{Clocking -work time}. - -@menu -* Closing items:: When was this entry marked DONE? -* Tracking TODO state changes:: When did the status change? -@end menu - -@node Closing items, Tracking TODO state changes, Progress logging, Progress logging -@unnumberedsubsec Closing items - -The most basic logging is to keep track of @emph{when} a certain TODO -item was finished. This is achieved with@footnote{The corresponding -in-buffer setting is: @code{#+STARTUP: logdone}}. - -@smalllisp -(setq org-log-done 'time) -@end smalllisp - -@noindent -Then each time you turn an entry from a TODO (not-done) state into any of the -DONE states, a line @samp{CLOSED: [timestamp]} will be inserted just after -the headline. If you want to record a note along with the timestamp, -use@footnote{The corresponding in-buffer setting is: @code{#+STARTUP: -lognotedone}} - -@smalllisp -(setq org-log-done 'note) -@end smalllisp - -@noindent -You will then be prompted for a note, and that note will be stored below -the entry with a @samp{Closing Note} heading. - -@node Tracking TODO state changes, , Closing items, Progress logging -@unnumberedsubsec Tracking TODO state changes - -You might want to keep track of TODO state changes. You can either record -just a timestamp, or a time-stamped note for a change. These records will be -inserted after the headline as an itemized list. When taking a lot of notes, -you might want to get the notes out of the way into a drawer. Customize the -variable @code{org-log-into-drawer} to get this behavior. - -For state logging, Org mode expects configuration on a per-keyword basis. -This is achieved by adding special markers @samp{!} (for a timestamp) and -@samp{@@} (for a note) in parentheses after each keyword. For example: -@smallexample -#+TODO: TODO(t) WAIT(w@@/!) | DONE(d!) CANCELED(c@@) -@end smallexample -@noindent -will define TODO keywords and fast access keys, and also request that a time -is recorded when the entry is set to DONE, and that a note is recorded when -switching to WAIT or CANCELED. The same syntax works also when setting -@code{org-todo-keywords}. - -@node Priorities, Breaking down tasks, Progress logging, TODO Items -@section Priorities - -If you use Org mode extensively, you may end up with enough TODO items that -it starts to make sense to prioritize them. Prioritizing can be done by -placing a @emph{priority cookie} into the headline of a TODO item, like this - -@smallexample -*** TODO [#A] Write letter to Sam Fortune -@end smallexample - -@noindent -Org mode supports three priorities: @samp{A}, @samp{B}, and @samp{C}. -@samp{A} is the highest, @samp{B} the default if none is given. Priorities -make a difference only in the agenda. - -@table @kbd -@item @kbd{C-c ,} -Set the priority of the current headline. Press @samp{A}, @samp{B} or -@samp{C} to select a priority, or @key{SPC} to remove the cookie. -@c -@item S-@key{up} -@itemx S-@key{down} -Increase/decrease priority of current headline -@end table - -@node Breaking down tasks, Checkboxes, Priorities, TODO Items -@section Breaking tasks down into subtasks - -It is often advisable to break down large tasks into smaller, manageable -subtasks. You can do this by creating an outline tree below a TODO item, -with detailed subtasks on the tree. To keep the overview over the fraction -of subtasks that are already completed, insert either @samp{[/]} or -@samp{[%]} anywhere in the headline. These cookies will be updated each time -the TODO status of a child changes, or when pressing @kbd{C-c C-c} on the -cookie. For example: - -@smallexample -* Organize Party [33%] -** TODO Call people [1/2] -*** TODO Peter -*** DONE Sarah -** TODO Buy food -** DONE Talk to neighbor -@end smallexample - -@node Checkboxes, , Breaking down tasks, TODO Items -@section Checkboxes - -Every item in a plain list (@pxref{Plain lists}) can be made into a checkbox -by starting it with the string @samp{[ ]}. Checkboxes are not included into -the global TODO list, so they are often great to split a task into a number -of simple steps. -Here is an example of a checkbox list. - -@smallexample -* TODO Organize party [1/3] - - [-] call people [1/2] - - [ ] Peter - - [X] Sarah - - [X] order food - - [ ] think about what music to play -@end smallexample - -Checkboxes work hierarchically, so if a checkbox item has children that -are checkboxes, toggling one of the children checkboxes will make the -parent checkbox reflect if none, some, or all of the children are -checked. - -@noindent The following commands work with checkboxes: - -@table @kbd -@item C-c C-c -Toggle checkbox status or (with prefix arg) checkbox presence at point. -@item M-S-@key{RET} -Insert a new item with a checkbox. -This works only if the cursor is already in a plain list item -(@pxref{Plain lists}). -@end table - -@seealso{ -@uref{http://orgmode.org/manual/TODO-Items.html#TODO-Items, Chapter 5 of the manual}@* -@uref{http://orgmode.org/worg/org-tutorials/orgtutorial_dto.php, David -O'Toole's introductory tutorial}@* -@uref{http://members.optusnet.com.au/~charles57/GTD/gtd_workflow.html, -Charles Cave's GTD setup}} - -@node Tags, Properties, TODO Items, Top -@chapter Tags - -An excellent way to implement labels and contexts for cross-correlating -information is to assign @i{tags} to headlines. Org mode has extensive -support for tags. - -Every headline can contain a list of tags; they occur at the end of the -headline. Tags are normal words containing letters, numbers, @samp{_}, and -@samp{@@}. Tags must be preceded and followed by a single colon, e.g., -@samp{:work:}. Several tags can be specified, as in @samp{:work:urgent:}. -Tags will by default be in bold face with the same color as the headline. - -@menu -* Tag inheritance:: Tags use the tree structure of the outline -* Setting tags:: How to assign tags to a headline -* Tag searches:: Searching for combinations of tags -@end menu - -@node Tag inheritance, Setting tags, Tags, Tags -@section Tag inheritance - -@i{Tags} make use of the hierarchical structure of outline trees. If a -heading has a certain tag, all subheadings will inherit the tag as -well. For example, in the list - -@smallexample -* Meeting with the French group :work: -** Summary by Frank :boss:notes: -*** TODO Prepare slides for him :action: -@end smallexample - -@noindent -the final heading will have the tags @samp{:work:}, @samp{:boss:}, -@samp{:notes:}, and @samp{:action:} even though the final heading is not -explicitly marked with those tags. You can also set tags that all entries in -a file should inherit just as if these tags were defined in a hypothetical -level zero that surrounds the entire file. Use a line like this@footnote{As -with all these in-buffer settings, pressing @kbd{C-c C-c} activates any -changes in the line.}: - -@smallexample -#+FILETAGS: :Peter:Boss:Secret: -@end smallexample - -@node Setting tags, Tag searches, Tag inheritance, Tags -@section Setting tags - -Tags can simply be typed into the buffer at the end of a headline. -After a colon, @kbd{M-@key{TAB}} offers completion on tags. There is -also a special command for inserting tags: - -@table @kbd -@item C-c C-q -Enter new tags for the current headline. Org mode will either offer -completion or a special single-key interface for setting tags, see -below. After pressing @key{RET}, the tags will be inserted and aligned -to @code{org-tags-column}. When called with a @kbd{C-u} prefix, all -tags in the current buffer will be aligned to that column, just to make -things look nice. -@item C-c C-c -When the cursor is in a headline, this does the same as @kbd{C-c C-q}. -@end table - -Org will support tag insertion based on a @emph{list of tags}. By -default this list is constructed dynamically, containing all tags -currently used in the buffer. You may also globally specify a hard list -of tags with the variable @code{org-tag-alist}. Finally you can set -the default tags for a given file with lines like - -@smallexample -#+TAGS: @@work @@home @@tennisclub -#+TAGS: laptop car pc sailboat -@end smallexample - -By default Org mode uses the standard minibuffer completion facilities for -entering tags. However, it also implements another, quicker, tag selection -method called @emph{fast tag selection}. This allows you to select and -deselect tags with just a single key press. For this to work well you should -assign unique letters to most of your commonly used tags. You can do this -globally by configuring the variable @code{org-tag-alist} in your -@file{.emacs} file. For example, you may find the need to tag many items in -different files with @samp{:@@home:}. In this case you can set something -like: - -@smalllisp -(setq org-tag-alist '(("@@work" . ?w) ("@@home" . ?h) ("laptop" . ?l))) -@end smalllisp - -@noindent If the tag is only relevant to the file you are working on, then you -can instead set the TAGS option line as: - -@smallexample -#+TAGS: @@work(w) @@home(h) @@tennisclub(t) laptop(l) pc(p) -@end smallexample - -@node Tag searches, , Setting tags, Tags -@section Tag searches - -Once a system of tags has been set up, it can be used to collect related -information into special lists. - -@table @kbd -@item C-c \ -@itemx C-c / m -Create a sparse tree with all headlines matching a tags search. With a -@kbd{C-u} prefix argument, ignore headlines that are not a TODO line. -@item C-c a m -Create a global list of tag matches from all agenda files. -@xref{Matching tags and properties}. -@item C-c a M -Create a global list of tag matches from all agenda files, but check -only TODO items and force checking subitems (see variable -@code{org-tags-match-list-sublevels}). -@end table - -These commands all prompt for a match string which allows basic Boolean logic -like @samp{+boss+urgent-project1}, to find entries with tags @samp{boss} and -@samp{urgent}, but not @samp{project1}, or @samp{Kathy|Sally} to find entries -which are tagged, like @samp{Kathy} or @samp{Sally}. The full syntax of the -search string is rich and allows also matching against TODO keywords, entry -levels and properties. For a complete description with many examples, see -@ref{Matching tags and properties}. - -@seealso{ -@uref{http://orgmode.org/manual/Tags.html#Tags, Chapter 6 of the manual}@* -@uref{http://sachachua.com/wp/2008/01/tagging-in-org-plus-bonus-code-for-timeclocks-and-tags/, -Sacha Chua's article about tagging in Org-mode}} - -@node Properties, Dates and Times, Tags, Top -@chapter Properties - -Properties are key-value pairs associates with and entry. They live in a -special drawer with the name @code{PROPERTIES}. Each -property is specified on a single line, with the key (surrounded by colons) -first, and the value after it: - -@smallexample -* CD collection -** Classic -*** Goldberg Variations - :PROPERTIES: - :Title: Goldberg Variations - :Composer: J.S. Bach - :Publisher: Deutsche Grammophon - :NDisks: 1 - :END: -@end smallexample - -You may define the allowed values for a particular property @samp{:Xyz:} -by setting a property @samp{:Xyz_ALL:}. This special property is -@emph{inherited}, so if you set it in a level 1 entry, it will apply to -the entire tree. When allowed values are defined, setting the -corresponding property becomes easier and is less prone to typing -errors. For the example with the CD collection, we can predefine -publishers and the number of disks in a box like this: - -@smallexample -* CD collection - :PROPERTIES: - :NDisks_ALL: 1 2 3 4 - :Publisher_ALL: "Deutsche Grammophon" Philips EMI - :END: -@end smallexample -or globally using @code{org-global-properties}, or file-wide like this: -@smallexample -#+PROPERTY: NDisks_ALL 1 2 3 4 -@end smallexample - -@table @kbd -@item C-c C-x p -Set a property. This prompts for a property name and a value. -@item C-c C-c d -Remove a property from the current entry. -@end table - -To create sparse trees and special lists with selection based on properties, -the same commands are used as for tag searches (@pxref{Tag searches}). The -syntax for the search string is described in @ref{Matching tags and -properties}. - -@table @kbd -@end table - -@seealso{ -@uref{http://orgmode.org/manual/Properties-and-Columns.html#Properties-and-Columns, -Chapter 7 of the manual}@* -@uref{http://orgmode.org/worg/org-tutorials/org-column-view-tutorial.php,Bastien -Guerry's column view tutorial}} - -@node Dates and Times, Capture - Refile - Archive, Properties, Top -@chapter Dates and Times - -To assist project planning, TODO items can be labeled with a date and/or -a time. The specially formatted string carrying the date and time -information is called a @emph{timestamp} in Org mode. - -@menu -* Timestamps:: Assigning a time to a tree entry -* Creating timestamps:: Commands which insert timestamps -* Deadlines and scheduling:: Planning your work -* Clocking work time:: Tracking how long you spend on a task -@end menu - - -@node Timestamps, Creating timestamps, Dates and Times, Dates and Times -@section Timestamps - -A timestamp is a specification of a date (possibly with a time or a range of -times) in a special format, either @samp{<2003-09-16 Tue>} or -@samp{<2003-09-16 Tue 09:39>} or @samp{<2003-09-16 Tue 12:00-12:30>}. A -timestamp can appear anywhere in the headline or body of an Org tree entry. -Its presence causes entries to be shown on specific dates in the agenda -(@pxref{Weekly/daily agenda}). We distinguish: - -@noindent @b{Plain timestamp; Event; Appointment}@* -A simple timestamp just assigns a date/time to an item. This is just -like writing down an appointment or event in a paper agenda. - -@smallexample -* Meet Peter at the movies <2006-11-01 Wed 19:15> -* Discussion on climate change <2006-11-02 Thu 20:00-22:00> -@end smallexample - -@noindent @b{Timestamp with repeater interval}@* -A timestamp may contain a @emph{repeater interval}, indicating that it -applies not only on the given date, but again and again after a certain -interval of N days (d), weeks (w), months (m), or years (y). The -following will show up in the agenda every Wednesday: -@smallexample -* Pick up Sam at school <2007-05-16 Wed 12:30 +1w> -@end smallexample - -@noindent @b{Diary-style sexp entries}@* -For more complex date specifications, Org mode supports using the -special sexp diary entries implemented in the Emacs calendar/diary -package. For example -@smallexample -* The nerd meeting on every 2nd Thursday of the month - <%%(diary-float t 4 2)> -@end smallexample - -@noindent @b{Time/Date range}@* -Two timestamps connected by @samp{--} denote a range. -@smallexample -** Meeting in Amsterdam - <2004-08-23 Mon>--<2004-08-26 Thu> -@end smallexample - -@noindent @b{Inactive timestamp}@* -Just like a plain timestamp, but with square brackets instead of -angular ones. These timestamps are inactive in the sense that they do -@emph{not} trigger an entry to show up in the agenda. - -@smallexample -* Gillian comes late for the fifth time [2006-11-01 Wed] -@end smallexample - - -@node Creating timestamps, Deadlines and scheduling, Timestamps, Dates and Times -@section Creating timestamps - -For Org mode to recognize timestamps, they need to be in the specific -format. All commands listed below produce timestamps in the correct -format. - -@table @kbd -@item C-c . -Prompt for a date and insert a corresponding timestamp. When the cursor is -at an existing timestamp in the buffer, the command is used to modify this -timestamp instead of inserting a new one. When this command is used twice in -succession, a time range is inserted. With a prefix, also add the current -time. -@c -@item C-c ! -Like @kbd{C-c .}, but insert an inactive timestamp that will not cause -an agenda entry. -@c -@item S-@key{left}@r{/}@key{right} -Change date at cursor by one day. -@c -@item S-@key{up}@r{/}@key{down} -Change the item under the cursor in a timestamp. The cursor can be on a -year, month, day, hour or minute. When the timestamp contains a time range -like @samp{15:30-16:30}, modifying the first time will also shift the second, -shifting the time block with constant length. To change the length, modify -the second time. -@end table - -When Org mode prompts for a date/time, it will accept any string containing -some date and/or time information, and intelligently interpret the string, -deriving defaults for unspecified information from the current date and time. -You can also select a date in the pop-up calendar. See the manual for more -information on how exactly the date/time prompt works. - -@node Deadlines and scheduling, Clocking work time, Creating timestamps, Dates and Times -@section Deadlines and scheduling - -A timestamp may be preceded by special keywords to facilitate planning: - -@noindent @b{DEADLINE}@* -Meaning: the task (most likely a TODO item, though not necessarily) is supposed -to be finished on that date. -@table @kbd -@item C-c C-d -Insert @samp{DEADLINE} keyword along with a stamp, in the line following the -headline. -@end table - -On the deadline date, the task will be listed in the agenda. In -addition, the agenda for @emph{today} will carry a warning about the -approaching or missed deadline, starting -@code{org-deadline-warning-days} before the due date, and continuing -until the entry is marked DONE. An example: - -@smallexample -*** TODO write article about the Earth for the Guide - The editor in charge is [[bbdb:Ford Prefect]] - DEADLINE: <2004-02-29 Sun> -@end smallexample - - -@noindent @b{SCHEDULED}@* -Meaning: you are @i{planning to start working} on that task on the given -date@footnote{This is quite different from what is normally understood by -@i{scheduling a meeting}, which is done in Org-mode by just inserting a time -stamp without keyword.}. - -@table @kbd -@item C-c C-s -Insert @samp{SCHEDULED} keyword along with a stamp, in the line following the -headline. -@end table - -The headline will be listed under the given date@footnote{It will still -be listed on that date after it has been marked DONE. If you don't like -this, set the variable @code{org-agenda-skip-scheduled-if-done}.}. In -addition, a reminder that the scheduled date has passed will be present -in the compilation for @emph{today}, until the entry is marked DONE. -I.e.@: the task will automatically be forwarded until completed. - -@smallexample -*** TODO Call Trillian for a date on New Years Eve. - SCHEDULED: <2004-12-25 Sat> -@end smallexample - -Some tasks need to be repeated again and again. Org mode helps to -organize such tasks using a so-called repeater in a DEADLINE, SCHEDULED, -or plain timestamp. In the following example -@smallexample -** TODO Pay the rent - DEADLINE: <2005-10-01 Sat +1m> -@end smallexample -@noindent -the @code{+1m} is a repeater; the intended interpretation is that the task -has a deadline on <2005-10-01> and repeats itself every (one) month starting -from that time. - -@node Clocking work time, , Deadlines and scheduling, Dates and Times -@section Clocking work time - -Org mode allows you to clock the time you spend on specific tasks in a -project. - -@table @kbd -@item C-c C-x C-i -Start the clock on the current item (clock-in). This inserts the CLOCK -keyword together with a timestamp. When called with a @kbd{C-u} prefix -argument, select the task from a list of recently clocked tasks. -@c -@item C-c C-x C-o -Stop the clock (clock-out). This inserts another timestamp at the same -location where the clock was last started. It also directly computes -the resulting time in inserts it after the time range as @samp{=> -HH:MM}. -@item C-c C-x C-e -Update the effort estimate for the current clock task. -@item C-c C-x C-x -Cancel the current clock. This is useful if a clock was started by -mistake, or if you ended up working on something else. -@item C-c C-x C-j -Jump to the entry that contains the currently running clock. With a -@kbd{C-u} prefix arg, select the target task from a list of recently clocked -tasks. -@item C-c C-x C-r -Insert a dynamic block containing a clock -report as an Org-mode table into the current file. When the cursor is -at an existing clock table, just update it. -@smallexample -#+BEGIN: clocktable :maxlevel 2 :emphasize nil :scope file -#+END: clocktable -@end smallexample -@noindent -For details about how to customize this view, see @uref{http://orgmode.org/manual/Clocking-work-time.html#Clocking-work-time,the manual}. -@item C-c C-c -Update dynamic block at point. The cursor needs to be in the -@code{#+BEGIN} line of the dynamic block. -@end table - -The @kbd{l} key may be used in the timeline (@pxref{Timeline}) and in -the agenda (@pxref{Weekly/daily agenda}) to show which tasks have been -worked on or closed during a day. - -@seealso{ -@uref{http://orgmode.org/manual/Dates-and-Times.html#Dates-and-Times, -Chapter 8 of the manual}@* -@uref{http://members.optusnet.com.au/~charles57/GTD/org_dates/, Charles -Cave's Date and Time tutorial}@* -@uref{http://doc.norang.ca/org-mode.html#Clocking, Bernt Hansen's clocking workflow}} - -@node Capture - Refile - Archive, Agenda Views, Dates and Times, Top -@chapter Capture - Refile - Archive - -An important part of any organization system is the ability to quickly -capture new ideas and tasks, and to associate reference material with them. -Org defines a capture process to create tasks. It stores files related to a -task (@i{attachments}) in a special directory. Once in the system, tasks and -projects need to be moved around. Moving completed project trees to an -archive file keeps the system compact and fast. - -@menu -* Capture:: -* Refiling notes:: Moving a tree from one place to another -* Archiving:: What to do with finished projects -@end menu - -@node Capture, Refiling notes, Capture - Refile - Archive, Capture - Refile - Archive -@section Capture - -Org's method for capturing new items is heavily inspired by John Wiegley -excellent remember package. It lets you store quick notes with little -interruption of your work flow. Org lets you define templates for new -entries and associate them with different targets for storing notes. - -@menu -* Setting up a capture location:: Where notes will be stored -* Using capture:: Commands to invoke and terminate capture -* Capture templates:: Define the outline of different note types -@end menu - -@node Setting up a capture location, Using capture, Capture, Capture -@unnumberedsubsec Setting up a capture location - -The following customization sets a default target@footnote{Using capture -templates, you can define more fine-grained capture locations, see -@ref{Capture templates}.} file for notes, and defines a global -key@footnote{Please select your own key, @kbd{C-c c} is only a suggestion.} -for capturing new stuff. - -@example -(setq org-default-notes-file (concat org-directory "/notes.org")) -(define-key global-map "\C-cc" 'org-capture) -@end example - -@node Using capture, Capture templates, Setting up a capture location, Capture -@unnumberedsubsec Using capture - -@table @kbd -@item C-c c -Start a capture process. You will be placed into a narrowed indirect buffer -to edit the item. -@item C-c C-c -Once you are done entering information into the capture buffer, -@kbd{C-c C-c} will return you to the window configuration before the capture -process, so that you can resume your work without further distraction. -@item C-c C-w -Finalize by moving the entry to a refile location (@pxref{Refiling notes}). -@item C-c C-k -Abort the capture process and return to the previous state. -@end table - -@node Capture templates, , Using capture, Capture -@unnumberedsubsec Capture templates - -You can use templates to generate different types of capture notes, and to -store them in different places. For example, if you would like -to store new tasks under a heading @samp{Tasks} in file @file{TODO.org}, and -journal entries in a date tree in @file{journal.org} you could -use: - -@smallexample -(setq org-capture-templates - '(("t" "Todo" entry (file+headline "~/org/gtd.org" "Tasks") - "* TODO %?\n %i\n %a") - ("j" "Journal" entry (file+datetree "~/org/journal.org") - "* %?\nEntered on %U\n %i\n %a"))) -@end smallexample - -@noindent In these entries, the first string is the key to reach the -template, the second is a short description. Then follows the type of the -entry and a definition of the target location for storing the note. Finally, -the template itself, a string with %-escapes to fill in information based on -time and context. - -When you call @kbd{M-x org-capture}, Org will prompt for a key to select the -template (if you have more than one template) and then prepare the buffer like -@smallexample -* TODO - [[file:@var{link to where you were when initiating capture}]] -@end smallexample - -@noindent -During expansion of the template, special @kbd{%}-escapes@footnote{If you -need one of these sequences literally, escape the @kbd{%} with a backslash.} -allow dynamic insertion of content. Here is a small selection of the -possibilities, consult the manual for more. -@smallexample -%a @r{annotation, normally the link created with @code{org-store-link}} -%i @r{initial content, the region when remember is called with C-u.} -%t @r{timestamp, date only} -%T @r{timestamp with date and time} -%u, %U @r{like the above, but inactive timestamps} -@end smallexample - -@node Refiling notes, Archiving, Capture, Capture - Refile - Archive -@section Refiling notes - -When reviewing the captured data, you may want to refile some of the entries -into a different list, for example into a project. Cutting, finding the -right location, and then pasting the note is cumbersome. To simplify this -process, you can use the following special command: - -@table @kbd -@item C-c C-w -Refile the entry or region at point. This command offers possible locations -for refiling the entry and lets you select one with completion. The item (or -all items in the region) is filed below the target heading as a subitem.@* -By default, all level 1 headlines in the current buffer are considered to be -targets, but you can have more complex definitions across a number of files. -See the variable @code{org-refile-targets} for details. -@item C-u C-c C-w -Use the refile interface to jump to a heading. -@item C-u C-u C-c C-w -Jump to the location where @code{org-refile} last moved a tree to. -@end table - -@node Archiving, , Refiling notes, Capture - Refile - Archive -@section Archiving - -When a project represented by a (sub)tree is finished, you may want -to move the tree out of the way and to stop it from contributing to the -agenda. Archiving is important to keep your working files compact and global -searches like the construction of agenda views fast. -The most common archiving action is to move a project tree to another file, -the archive file. - -@table @kbd -@item C-c C-x C-a -Archive the current entry using the command specified in the variable -@code{org-archive-default-command}. -@item C-c C-x C-s@ @r{or short} @ C-c $ -Archive the subtree starting at the cursor position to the location -given by @code{org-archive-location}. -@end table - -The default archive location is a file in the same directory as the -current file, with the name derived by appending @file{_archive} to the -current file name. For information and examples on how to change this, -see the documentation string of the variable -@code{org-archive-location}. There is also an in-buffer option for -setting this variable, for example - -@smallexample -#+ARCHIVE: %s_done:: -@end smallexample - -@seealso{ -@uref{http://orgmode.org/manual/Capture-_002d-Refile-_002d-Archive.html#Capture-_002d-Refile-_002d-Archive, -Chapter 9 of the manual}@* -@uref{http://members.optusnet.com.au/~charles57/GTD/remember.html, Charles -Cave's remember tutorial}@* -@uref{http://orgmode.org/worg/org-tutorials/org-protocol-custom-handler.php, -Sebastian Rose's tutorial for capturing from a web browser}}@uref{}@* - -@node Agenda Views, Markup, Capture - Refile - Archive, Top -@chapter Agenda Views - -Due to the way Org works, TODO items, time-stamped items, and tagged -headlines can be scattered throughout a file or even a number of files. To -get an overview of open action items, or of events that are important for a -particular date, this information must be collected, sorted and displayed in -an organized way. There are several different views, see below. - -The extracted information is displayed in a special @emph{agenda buffer}. -This buffer is read-only, but provides commands to visit the corresponding -locations in the original Org files, and even to edit these files remotely. -Remote editing from the agenda buffer means, for example, that you can -change the dates of deadlines and appointments from the agenda buffer. -The commands available in the Agenda buffer are listed in @ref{Agenda -commands}. - -@menu -* Agenda files:: Files being searched for agenda information -* Agenda dispatcher:: Keyboard access to agenda views -* Built-in agenda views:: What is available out of the box? -* Agenda commands:: Remote editing of Org trees -* Custom agenda views:: Defining special searches and views -@end menu - -@node Agenda files, Agenda dispatcher, Agenda Views, Agenda Views -@section Agenda files - -The information to be shown is normally collected from all @emph{agenda -files}, the files listed in the variable -@code{org-agenda-files}. - -@table @kbd -@item C-c [ -Add current file to the list of agenda files. The file is added to -the front of the list. If it was already in the list, it is moved to -the front. With a prefix argument, file is added/moved to the end. -@item C-c ] -Remove current file from the list of agenda files. -@item C-, -Cycle through agenda file list, visiting one file after the other. -@end table - -@node Agenda dispatcher, Built-in agenda views, Agenda files, Agenda Views -@section The agenda dispatcher -The views are created through a dispatcher, which should be bound to a -global key---for example @kbd{C-c a} (@pxref{Installation}). After -pressing @kbd{C-c a}, an additional letter is required to execute a -command: -@table @kbd -@item a -The calendar-like agenda (@pxref{Weekly/daily agenda}). -@item t @r{/} T -A list of all TODO items (@pxref{Global TODO list}). -@item m @r{/} M -A list of headlines matching a TAGS expression (@pxref{Matching -tags and properties}). -@item L -The timeline view for the current buffer (@pxref{Timeline}). -@item s -A list of entries selected by a boolean expression of keywords -and/or regular expressions that must or must not occur in the entry. -@end table - -@node Built-in agenda views, Agenda commands, Agenda dispatcher, Agenda Views -@section The built-in agenda views - -@menu -* Weekly/daily agenda:: The calendar page with current tasks -* Global TODO list:: All unfinished action items -* Matching tags and properties:: Structured information with fine-tuned search -* Timeline:: Time-sorted view for single file -* Search view:: Find entries by searching for text -@end menu - -@node Weekly/daily agenda, Global TODO list, Built-in agenda views, Built-in agenda views -@subsection The weekly/daily agenda - -The purpose of the weekly/daily @emph{agenda} is to act like a page of a -paper agenda, showing all the tasks for the current week or day. - -@table @kbd -@item C-c a a -Compile an agenda for the current week from a list of Org files. The agenda -shows the entries for each day. -@end table - -Emacs contains the calendar and diary by Edward M. Reingold. Org-mode -understands the syntax of the diary and allows you to use diary sexp entries -directly in Org files: - -@smallexample -* Birthdays and similar stuff -#+CATEGORY: Holiday -%%(org-calendar-holiday) ; special function for holiday names -#+CATEGORY: Ann -%%(diary-anniversary 5 14 1956)@footnote{Note that the order of the arguments (month, day, year) depends on the setting of @code{calendar-date-style}.} Arthur Dent is %d years old -%%(diary-anniversary 10 2 1869) Mahatma Gandhi would be %d years old -@end smallexample - -Org can interact with Emacs appointments notification facility. To add all -the appointments of your agenda files, use the command -@code{org-agenda-to-appt}. See the docstring for details. - -@node Global TODO list, Matching tags and properties, Weekly/daily agenda, Built-in agenda views -@subsection The global TODO list - -The global TODO list contains all unfinished TODO items formatted and -collected into a single place. Remote editing of TODO items lets you -can change the state of a TODO entry with a single key press. The commands -available in the TODO list are described in @ref{Agenda commands}. - -@table @kbd -@item C-c a t -Show the global TODO list. This collects the TODO items from all -agenda files (@pxref{Agenda Views}) into a single buffer. -@item C-c a T -Like the above, but allows selection of a specific TODO keyword. -@end table - -@node Matching tags and properties, Timeline, Global TODO list, Built-in agenda views -@subsection Matching tags and properties - -If headlines in the agenda files are marked with @emph{tags} (@pxref{Tags}), -or have properties (@pxref{Properties}), you can select headlines -based on this metadata and collect them into an agenda buffer. The match -syntax described here also applies when creating sparse trees with @kbd{C-c / -m}. The commands available in the tags list are described in @ref{Agenda -commands}. - -@table @kbd -@item C-c a m -Produce a list of all headlines that match a given set of tags. The -command prompts for a selection criterion, which is a boolean logic -expression with tags, like @samp{+work+urgent-withboss} or -@samp{work|home} (@pxref{Tags}). If you often need a specific search, -define a custom command for it (@pxref{Agenda dispatcher}). -@item C-c a M -Like @kbd{C-c a m}, but only select headlines that are also TODO items. -@end table - -@subsubheading Match syntax - -A search string can use Boolean operators @samp{&} for AND and @samp{|} for -OR. @samp{&} binds more strongly than @samp{|}. Parentheses are currently -not implemented. Each element in the search is either a tag, a regular -expression matching tags, or an expression like @code{PROPERTY OPERATOR -VALUE} with a comparison operator, accessing a property value. Each element -may be preceded by @samp{-}, to select against it, and @samp{+} is syntactic -sugar for positive selection. The AND operator @samp{&} is optional when -@samp{+} or @samp{-} is present. Here are some examples, using only tags. - -@table @samp -@item +work-boss -Select headlines tagged @samp{:work:}, but discard those also tagged -@samp{:boss:}. -@item work|laptop -Selects lines tagged @samp{:work:} or @samp{:laptop:}. -@item work|laptop+night -Like before, but require the @samp{:laptop:} lines to be tagged also -@samp{:night:}. -@end table - -You may also test for properties at the same -time as matching tags, see the manual for more information. - -@node Timeline, Search view, Matching tags and properties, Built-in agenda views -@subsection Timeline for a single file - -The timeline summarizes all time-stamped items from a single Org mode -file in a @emph{time-sorted view}. The main purpose of this command is -to give an overview over events in a project. - -@table @kbd -@item C-c a L -Show a time-sorted view of the Org file, with all time-stamped items. -When called with a @kbd{C-u} prefix, all unfinished TODO entries -(scheduled or not) are also listed under the current date. -@end table - -@node Search view, , Timeline, Built-in agenda views -@subsection Search view - -This agenda view is a general text search facility for Org mode entries. -It is particularly useful to find notes. - -@table @kbd -@item C-c a s -This is a special search that lets you select entries by matching a substring -or specific words using a boolean logic. -@end table -For example, the search string @samp{computer equipment} will find entries -that contain @samp{computer equipment} as a substring. -Search view can also search for specific keywords in the entry, using Boolean -logic. The search string @samp{+computer +wifi -ethernet -@{8\.11[bg]@}} -will search for note entries that contain the keywords @code{computer} -and @code{wifi}, but not the keyword @code{ethernet}, and which are also -not matched by the regular expression @code{8\.11[bg]}, meaning to -exclude both 8.11b and 8.11g. - -Note that in addition to the agenda files, this command will also search -the files listed in @code{org-agenda-text-search-extra-files}. - -@node Agenda commands, Custom agenda views, Built-in agenda views, Agenda Views -@section Commands in the agenda buffer - -Entries in the agenda buffer are linked back to the Org file or diary -file where they originate. Commands are provided to show and jump to the -original entry location, and to edit the Org files ``remotely'' from -the agenda buffer. This is just a selection of the many commands, explore -the @code{Agenda} menu and the manual for a complete list. - -@table @kbd -@tsubheading{Motion} -@item n -Next line (same as @key{up} and @kbd{C-p}). -@item p -Previous line (same as @key{down} and @kbd{C-n}). -@tsubheading{View/Go to Org file} -@item mouse-3 -@itemx @key{SPC} -Display the original location of the item in another window. -With prefix arg, make sure that the entire entry is made visible in the -outline, not only the heading. -@c -@itemx @key{TAB} -Go to the original location of the item in another window. Under Emacs -22, @kbd{mouse-1} will also works for this. -@c -@itemx @key{RET} -Go to the original location of the item and delete other windows. -@c - -@tsubheading{Change display} -@item o -Delete other windows. -@c -@item d @r{/} w -Switch to day/week view. -@c -@item f @r{and} b -Go forward/backward in time to display the following -@code{org-agenda-current-span} days. For example, if the display covers a -week, switch to the following/previous week. -@c -@item . -Go to today. -@c -@item j -Prompt for a date and go there. -@c -@item v l @ @r{or short} @ l -Toggle Logbook mode. In Logbook mode, entries that were marked DONE while -logging was on (variable @code{org-log-done}) are shown in the agenda, as are -entries that have been clocked on that day. When called with a @kbd{C-u} -prefix, show all possible logbook entries, including state changes. -@c -@item r @r{or} g -Recreate the agenda buffer, to reflect the changes. -@item s -Save all Org buffers in the current Emacs session, and also the locations of -IDs. - -@tsubheading{Secondary filtering and query editing} - -@item / -Filter the current agenda view with respect to a tag. You are prompted for a -letter to select a tag. Press @samp{-} first to select against the tag. - -@item \ -Narrow the current agenda filter by an additional condition. - -@tsubheading{Remote editing (see the manual for many more commands)} - -@item 0-9 -Digit argument. -@c -@item t -Change the TODO state of the item, in the agenda and in the -org file. -@c -@item C-k -Delete the current agenda item along with the entire subtree belonging -to it in the original Org file. -@c -@item C-c C-w -Refile the entry at point. -@c -@item C-c C-x C-a @ @r{or short} @ a -Archive the subtree corresponding to the entry at point using the default -archiving command set in @code{org-archive-default-command}. -@c -@item C-c C-x C-s @ @r{or short} @ $ -Archive the subtree corresponding to the current headline. -@c -@item C-c C-s -Schedule this item, with prefix arg remove the scheduling timestamp -@c -@item C-c C-d -Set a deadline for this item, with prefix arg remove the deadline. -@c -@item S-@key{right} @r{and} S-@key{left} -Change the timestamp associated with the current line by one day. -@c -@item I -Start the clock on the current item. -@c -@item O / X -Stop/cancel the previously started clock. - -@item J -Jump to the running clock in another window. -@end table - -@node Custom agenda views, , Agenda commands, Agenda Views -@section Custom agenda views - -The main application of custom searches is the definition of keyboard -shortcuts for frequently used searches, either creating an agenda -buffer, or a sparse tree (the latter covering of course only the current -buffer). -Custom commands are configured in the variable -@code{org-agenda-custom-commands}. You can customize this variable, for -example by pressing @kbd{C-c a C}. You can also directly set it with -Emacs Lisp in @file{.emacs}. The following example contains all valid -search types: - -@smalllisp -@group -(setq org-agenda-custom-commands - '(("w" todo "WAITING") - ("u" tags "+boss-urgent") - ("v" tags-todo "+boss-urgent"))) -@end group -@end smalllisp - -@noindent -The initial string in each entry defines the keys you have to press after the -dispatcher command @kbd{C-c a} in order to access the command. Usually this -will be just a single character. The second parameter is the search type, -followed by the string or regular expression to be used for the matching. -The example above will therefore define: - -@table @kbd -@item C-c a w -as a global search for TODO entries with @samp{WAITING} as the TODO -keyword -@item C-c a u -as a global tags search for headlines marked @samp{:boss:} but not -@samp{:urgent:} -@item C-c a v -as the same search as @kbd{C-c a u}, but limiting the search to -headlines that are also TODO items -@end table - -@seealso{ -@uref{http://orgmode.org/manual/Agenda-Views.html#Agenda-Views, Chapter 10 of -the manual}@* -@uref{http://orgmode.org/worg/org-tutorials/org-custom-agenda-commands.php, -Mat Lundin's tutorial about custom agenda commands}@* -@uref{http://www.newartisans.com/2007/08/using-org-mode-as-a-day-planner.html, -John Wiegley's setup}} - -@node Markup, Exporting, Agenda Views, Top -@chapter Markup for rich export - -When exporting Org-mode documents, the exporter tries to reflect the -structure of the document as accurately as possible in the backend. Since -export targets like HTML, La@TeX{}, or DocBook allow much richer formatting, -Org mode has rules on how to prepare text for rich export. This section -summarizes the markup rules used in an Org-mode buffer. - -@menu -* Structural markup elements:: The basic structure as seen by the exporter -* Images and tables:: Tables and Images will be included -* Literal examples:: Source code examples with special formatting -* Include files:: Include additional files into a document -* Embedded LaTeX:: LaTeX can be freely used inside Org documents -@end menu - -@node Structural markup elements, Images and tables, Markup, Markup -@section Structural markup elements - -@menu -* Document title:: Where the title is taken from -* Headings and sections:: The document structure as seen by the exporter -* Table of contents:: The if and where of the table of contents -* Paragraphs:: Paragraphs -* Emphasis and monospace:: Bold, italic, etc. -* Comment lines:: What will *not* be exported -@end menu - -@node Document title, Headings and sections, Structural markup elements, Structural markup elements -@subheading Document title - -@noindent -The title of the exported document is taken from the special line - -@smallexample -#+TITLE: This is the title of the document -@end smallexample - -@node Headings and sections, Table of contents, Document title, Structural markup elements -@subheading Headings and sections - -The outline structure of the document as described in @ref{Document -Structure}, forms the basis for defining sections of the exported document. -However, since the outline structure is also used for (for example) lists of -tasks, only the first three outline levels will be used as headings. Deeper -levels will become itemized lists. You can change the location of this -switch globally by setting the variable @code{org-export-headline-levels}, or on a -per-file basis with a line - -@smallexample -#+OPTIONS: H:4 -@end smallexample - -@node Table of contents, Paragraphs, Headings and sections, Structural markup elements -@subheading Table of contents - -The table of contents is normally inserted directly before the first headline -of the file. - -@smallexample -#+OPTIONS: toc:2 (only to two levels in TOC) -#+OPTIONS: toc:nil (no TOC at all) -@end smallexample - -@node Paragraphs, Emphasis and monospace, Table of contents, Structural markup elements -@subheading Paragraphs, line breaks, and quoting - -Paragraphs are separated by at least one empty line. If you need to enforce -a line break within a paragraph, use @samp{\\} at the end of a line. - -To keep the line breaks in a region, but otherwise use normal formatting, you -can use this construct, which can also be used to format poetry. - -@smallexample -#+BEGIN_VERSE - Great clouds overhead - Tiny black birds rise and fall - Snow covers Emacs - - -- AlexSchroeder -#+END_VERSE -@end smallexample - -When quoting a passage from another document, it is customary to format this -as a paragraph that is indented on both the left and the right margin. You -can include quotations in Org-mode documents like this: - -@smallexample -#+BEGIN_QUOTE -Everything should be made as simple as possible, -but not any simpler -- Albert Einstein -#+END_QUOTE -@end smallexample - -If you would like to center some text, do it like this: -@smallexample -#+BEGIN_CENTER -Everything should be made as simple as possible, \\ -but not any simpler -#+END_CENTER -@end smallexample - -@node Emphasis and monospace, Comment lines, Paragraphs, Structural markup elements -@subheading Emphasis and monospace - -You can make words @b{*bold*}, @i{/italic/}, _underlined_, @code{=code=} -and @code{~verbatim~}, and, if you must, @samp{+strike-through+}. Text -in the code and verbatim string is not processed for Org-mode specific -syntax, it is exported verbatim. To insert a horizontal rules, use a line -consisting of only dashes, and at least 5 of them. - -@node Comment lines, , Emphasis and monospace, Structural markup elements -@subheading Comment lines - -Lines starting with @samp{#} in column zero are treated as comments and will -never be exported. If you want an indented line to be treated as a comment, -start it with @samp{#+ }. Also entire subtrees starting with the word -@samp{COMMENT} will never be exported. Finally, regions surrounded by -@samp{#+BEGIN_COMMENT} ... @samp{#+END_COMMENT} will not be exported. - -@table @kbd -@item C-c ; -Toggle the COMMENT keyword at the beginning of an entry. -@end table - -@node Images and tables, Literal examples, Structural markup elements, Markup -@section Images and Tables - -For Org mode tables, the lines before the first horizontal separator line -will become table header lines. You can use the following lines somewhere -before the table to assign a caption and a label for cross references, and in -the text you can refer to the object with @code{\ref@{tab:basic-data@}}: - -@smallexample -#+CAPTION: This is the caption for the next table (or link) -#+LABEL: tbl:basic-data - | ... | ...| - |-----|----| -@end smallexample - -Some backends (HTML, La@TeX{}, and DocBook) allow you to directly include -images into the exported document. Org does this, if a link to an image -files does not have a description part, for example @code{[[./img/a.jpg]]}. -If you wish to define a caption for the image and maybe a label for internal -cross references, you sure that the link is on a line by itself precede it -with: - -@smallexample -#+CAPTION: This is the caption for the next figure link (or table) -#+LABEL: fig:SED-HR4049 -[[./img/a.jpg]] -@end smallexample - -You may also define additional attributes for the figure. As this is -backend-specific, see the sections about the individual backends for more -information. - - -@node Literal examples, Include files, Images and tables, Markup -@section Literal examples - -You can include literal examples that should not be subjected to -markup. Such examples will be typeset in monospace, so this is well suited -for source code and similar examples. - -@smallexample -#+BEGIN_EXAMPLE -Some example from a text file. -#+END_EXAMPLE -@end smallexample - -For simplicity when using small examples, you can also start the example -lines with a colon followed by a space. There may also be additional -whitespace before the colon: - -@smallexample -Here is an example - : Some example from a text file. -@end smallexample - -For source code from a programming language, or any other text -that can be marked up by font-lock in Emacs, you can ask for it to -look like the fontified Emacs buffer - -@smallexample -#+BEGIN_SRC emacs-lisp -(defun org-xor (a b) - "Exclusive or." - (if a (not b) b)) -#+END_SRC -@end smallexample - -To edit the example in a special buffer supporting this language, use -@kbd{C-c '} to both enter and leave the editing buffer. - -@node Include files, Embedded LaTeX, Literal examples, Markup -@section Include files - -During export, you can include the content of another file. For example, to -include your @file{.emacs} file, you could use: - -@smallexample -#+INCLUDE: "~/.emacs" src emacs-lisp -@end smallexample -@noindent -The optional second and third parameter are the markup (e.g.@: @samp{quote}, -@samp{example}, or @samp{src}), and, if the markup is @samp{src}, the -language for formatting the contents. The markup is optional, if it is not -given, the text will be assumed to be in Org mode format and will be -processed normally. @kbd{C-c '} will visit the included file. - -@node Embedded LaTeX, , Include files, Markup -@section Embedded La@TeX{} - -For scientific notes which need to be able to contain mathematical symbols -and the occasional formula, Org-mode supports embedding La@TeX{} code into -its files. You can directly use TeX-like macros for special symbols, enter -formulas and entire LaTeX environments. - -@smallexample -Angles are written as Greek letters \alpha, \beta and \gamma. The mass if -the sun is M_sun = 1.989 x 10^30 kg. The radius of the sun is R_@{sun@} = -6.96 x 10^8 m. If $a^2=b$ and $b=2$, then the solution must be either -$a=+\sqrt@{2@}$ or $a=-\sqrt@{2@}$. - -\begin@{equation@} -x=\sqrt@{b@} -\end@{equation@} -@end smallexample -@noindent With -@uref{http://orgmode.org/manual/LaTeX-fragments.html#LaTeX-fragments,special -setup}, LaTeX snippets will be included as images when exporting to HTML. - -@seealso{ -@uref{http://orgmode.org/manual/Markup.html#Markup, Chapter 11 of the manual}} - -@node Exporting, Publishing, Markup, Top -@chapter Exporting - -Org-mode documents can be exported into a variety of other formats: ASCII -export for inclusion into emails, HTML to publish on the web, La@TeX{}/PDF -for beautiful printed documents and DocBook to enter the world of many other -formats using DocBook tools. There is also export to iCalendar format so -that planning information can be incorporated into desktop calendars. - -@menu -* Export options:: Per-file export settings -* The export dispatcher:: How to access exporter commands -* ASCII/Latin-1/UTF-8 export:: Exporting to flat files with encoding -* HTML export:: Exporting to HTML -* LaTeX and PDF export:: Exporting to La@TeX{}, and processing to PDF -* DocBook export:: Exporting to DocBook -* iCalendar export:: -@end menu - -@node Export options, The export dispatcher, Exporting, Exporting -@section Export options - -The exporter recognizes special lines in the buffer which provide -additional information. These lines may be put anywhere in the file. -The whole set of lines can be inserted into the buffer with @kbd{C-c -C-e t}. - -@table @kbd -@item C-c C-e t -Insert template with export options, see example below. -@end table - -@smallexample -#+TITLE: the title to be shown (default is the buffer name) -#+AUTHOR: the author (default taken from @code{user-full-name}) -#+DATE: a date, fixed, of a format string for @code{format-time-string} -#+EMAIL: his/her email address (default from @code{user-mail-address}) -#+DESCRIPTION: the page description, e.g.@: for the XHTML meta tag -#+KEYWORDS: the page keywords, e.g.@: for the XHTML meta tag -#+LANGUAGE: language for HTML, e.g.@: @samp{en} (@code{org-export-default-language}) -#+TEXT: Some descriptive text to be inserted at the beginning. -#+TEXT: Several lines may be given. -#+OPTIONS: H:2 num:t toc:t \n:nil @@:t ::t |:t ^:t f:t TeX:t ... -#+LINK_UP: the ``up'' link of an exported page -#+LINK_HOME: the ``home'' link of an exported page -#+LATEX_HEADER: extra line(s) for the LaTeX header, like \usepackage@{xyz@} -@end smallexample - -@node The export dispatcher, ASCII/Latin-1/UTF-8 export, Export options, Exporting -@section The export dispatcher - -All export commands can be reached using the export dispatcher, which is a -prefix key that prompts for an additional key specifying the command. -Normally the entire file is exported, but if there is an active region that -contains one outline tree, the first heading is used as document title and -the subtrees are exported. - -@table @kbd -@item C-c C-e -Dispatcher for export and publishing commands. -@end table - -@node ASCII/Latin-1/UTF-8 export, HTML export, The export dispatcher, Exporting -@section ASCII/Latin-1/UTF-8 export - -ASCII export produces a simple and very readable version of an Org-mode -file, containing only plain ASCII. Latin-1 and UTF-8 export augment the file -with special characters and symbols available in these encodings. - -@table @kbd -@item C-c C-e a -Export as ASCII file. -@item C-c C-e n @ @ @r{and} @ @ C-c C-e N -Like the above commands, but use Latin-1 encoding. -@item C-c C-e u @ @ @r{and} @ @ C-c C-e U -Like the above commands, but use UTF-8 encoding. -@end table - -@node HTML export, LaTeX and PDF export, ASCII/Latin-1/UTF-8 export, Exporting -@section HTML export - -@table @kbd -@item C-c C-e h -Export as HTML file @file{myfile.html}. -@item C-c C-e b -Export as HTML file and immediately open it with a browser. -@end table - -To insert HTML that should be copied verbatim to -the exported file use either - -@smallexample -#+HTML: Literal HTML code for export -@end smallexample -@noindent or -@smallexample -#+BEGIN_HTML -All lines between these markers are exported literally -#+END_HTML -@end smallexample - -@node LaTeX and PDF export, DocBook export, HTML export, Exporting -@section La@TeX{} and PDF export - -@table @kbd -@item C-c C-e l -Export as La@TeX{} file @file{myfile.tex}. -@item C-c C-e p -Export as La@TeX{} and then process to PDF. -@item C-c C-e d -Export as La@TeX{} and then process to PDF, then open the resulting PDF file. -@end table - -By default, the La@TeX{} output uses the class @code{article}. You can -change this by adding an option like @code{#+LaTeX_CLASS: myclass} in your -file. The class must be listed in @code{org-export-latex-classes}. - -Embedded La@TeX{} as described in @ref{Embedded LaTeX}, will be correctly -inserted into the La@TeX{} file. Similarly to the HTML exporter, you can use -@code{#+LaTeX:} and @code{#+BEGIN_LaTeX ... #+END_LaTeX} construct to add -verbatim LaTeX code. - -@node DocBook export, iCalendar export, LaTeX and PDF export, Exporting -@section DocBook export - -@table @kbd -@item C-c C-e D -Export as DocBook file. -@end table - -Similarly to the HTML exporter, you can use @code{#+DocBook:} and -@code{#+BEGIN_DocBook ... #+END_DocBook} construct to add verbatim LaTeX -code. - -@node iCalendar export, , DocBook export, Exporting -@section iCalendar export - -@table @kbd -@item C-c C-e i -Create iCalendar entries for the current file in a @file{.ics} file. -@item C-c C-e c -Create a single large iCalendar file from all files in -@code{org-agenda-files} and write it to the file given by -@code{org-combined-agenda-icalendar-file}. -@end table - -@seealso{ -@uref{http://orgmode.org/manual/Exporting.html#Exporting, Chapter 12 of the manual}@* -@uref{http://orgmode.org/worg/org-tutorials/images-and-xhtml-export.php, -Sebastian Rose's image handling tutorial}@* -@uref{http://orgmode.org/worg/org-tutorials/org-latex-export.php, Thomas -Dye's LaTeX export tutorial} -@uref{http://orgmode.org/worg/org-tutorials/org-beamer/tutorial.php, Eric -Fraga's BEAMER presentation tutorial}} - -@node Publishing, Working With Source Code, Exporting, Top -@chapter Publishing - -Org includes a publishing management system that allows you to configure -automatic HTML conversion of @emph{projects} composed of interlinked org -files. You can also configure Org to automatically upload your exported HTML -pages and related attachments, such as images and source code files, to a web -server. For detailed instructions about setup, see the manual. - -Here is an example: - -@smalllisp -(setq org-publish-project-alist - '(("org" - :base-directory "~/org/" - :publishing-directory "~/public_html" - :section-numbers nil - :table-of-contents nil - :style ""))) -@end smalllisp - -@table @kbd -@item C-c C-e C -Prompt for a specific project and publish all files that belong to it. -@item C-c C-e P -Publish the project containing the current file. -@item C-c C-e F -Publish only the current file. -@item C-c C-e E -Publish every project. -@end table - -Org uses timestamps to track when a file has changed. The above functions -normally only publish changed files. You can override this and force -publishing of all files by giving a prefix argument to any of the commands -above. - -@seealso{ -@uref{http://orgmode.org/manual/Publishing.html#Publishing, Chapter 13 of the -manual}@* -@uref{http://orgmode.org/worg/org-tutorials/org-publish-html-tutorial.php, -Sebastian Rose's publishing tutorial}@* -@uref{http://orgmode.org/worg/org-tutorials/org-jekyll.php, Ian Barton's -Jekyll/blogging setup}} - -@node Working With Source Code, Miscellaneous, Publishing, Top -@chapter Working with source code -Org-mode provides a number of features for working with source code, -including editing of code blocks in their native major-mode, evaluation of -code blocks, tangling of code blocks, and exporting code blocks and their -results in several formats. - -@subheading Structure of Code Blocks -The structure of code blocks is as follows: - -@example -#+srcname: -#+begin_src
- -#+end_src -@end example - -Where @code{} is a string used to name the code block, -@code{} specifies the language of the code block -(e.g.@: @code{emacs-lisp}, @code{shell}, @code{R}, @code{python}, etc...), -@code{} can be used to control export of the code block, -@code{
} can be used to control many aspects of code block -behavior as demonstrated below, and @code{} contains the actual source -code. - -@subheading Editing source code -Use @kbd{C-c '} to edit the current code block. This brings up a language -major-mode edit buffer containing the body of the code block. Saving this -buffer will write the new contents back to the Org buffer. Use @kbd{C-c '} -again to exit the edit buffer. - -@subheading Evaluating code blocks -Use @kbd{C-c C-c} to evaluate the current code block and insert its results -in the Org-mode buffer. By default, evaluation is only turned on for -@code{emacs-lisp} code blocks, however support exists for evaluating blocks -in many languages. For a complete list of supported languages see the -manual. The following shows a code block and its results. - -@example -#+begin_src emacs-lisp - (+ 1 2 3 4) -#+end_src - -#+results: -: 10 -@end example - -@subheading Extracting source code -Use @kbd{C-c C-v t} to create pure source code files by extracting code from -source blocks in the current buffer. This is referred to as ``tangling''---a -term adopted from the literate programming community. During ``tangling'' of -code blocks their bodies are expanded using @code{org-babel-expand-src-block} -which can expand both variable and ``noweb'' style references. In order to -tangle a code block it must have a @code{:tangle} header argument, see the -manual for details. - -@subheading Library of Babel -Use @kbd{C-c C-v l} to load the code blocks from an Org-mode files into the -``Library of Babel'', these blocks can then be evaluated from any Org-mode -buffer. A collection of generally useful code blocks is distributed with -Org-mode in @code{contrib/library-of-babel.org}. - -@subheading Header Arguments -Many aspects of the evaluation and export of code blocks are controlled -through header arguments. These can be specified globally, at the file -level, at the outline subtree level, and at the individual code block level. -The following describes some of the header arguments. -@table @code -@item :var -The @code{:var} header argument is used to pass arguments to code blocks. -The values passed to arguments can be literal values, values from org-mode -tables and literal example blocks, or the results of other named code blocks. -@item :results -The @code{:results} header argument controls the @emph{collection}, -@emph{type}, and @emph{handling} of code block results. Values of -@code{output} or @code{value} (the default) specify how results are collected -from a code block's evaluation. Values of @code{vector}, @code{scalar} -@code{file} @code{raw} @code{html} @code{latex} and @code{code} specify the -type of the results of the code block which dictates how they will be -incorporated into the Org-mode buffer. Values of @code{silent}, -@code{replace}, @code{prepend}, and @code{append} specify handling of code -block results, specifically if and how the results should be inserted into -the Org-mode buffer. -@item :session -A header argument of @code{:session} will cause the code block to be -evaluated in a persistent interactive inferior process in Emacs. This allows -for persisting state between code block evaluations, and for manual -inspection of the results of evaluation. -@item :exports -Any combination of the @emph{code} or the @emph{results} of a block can be -retained on export, this is specified by setting the @code{:results} header -argument to @code{code} @code{results} @code{none} or @code{both}. -@item :tangle -A header argument of @code{:tangle yes} will cause a code block's contents to -be tangled to a file named after the filename of the Org-mode buffer. An -alternate file name can be specified with @code{:tangle filename}. -@item :cache -A header argument of @code{:cache yes} will cause associate a hash of the -expanded code block with the results, ensuring that code blocks are only -re-run when their inputs have changed. -@item :noweb -A header argument of @code{:noweb yes} will expand ``noweb'' style references -on evaluation and tangling. -@item :file -Code blocks which output results to files (e.g.@: graphs, diagrams and figures) -can accept a @code{:file filename} header argument in which case the results -are saved to the named file, and a link to the file is inserted into the -Org-mode buffer. -@end table - -@seealso{ -@uref{http://orgmode.org/manual/Literal-examples.html#Literal-examples, -Chapter 11.3 of the manual}@* -@uref{http://orgmode.org/worg/org-contrib/babel/index.php, -The Babel site on Worg}} - -@node Miscellaneous, , Working With Source Code, Top -@chapter Miscellaneous - -@menu -* Completion:: M-TAB knows what you need -* Clean view:: Getting rid of leading stars in the outline -* MobileOrg:: Org-mode on the iPhone -@end menu - -@node Completion, Clean view, Miscellaneous, Miscellaneous -@section Completion - -Org supports in-buffer completion with @kbd{M-@key{TAB}}. This type of -completion does not make use of the minibuffer. You simply type a few -letters into the buffer and use the key to complete text right there. For -example, this command will complete @TeX{} symbols after @samp{\}, TODO -keywords at the beginning of a headline, and tags after @samp{:} in a -headline. - -@node Clean view, MobileOrg, Completion, Miscellaneous -@section A cleaner outline view - -Some people find it noisy and distracting that the Org headlines start with a -potentially large number of stars, and that text below the headlines is not -indented. While this is no problem when writing a @emph{book-like} document -where the outline headings are really section headings, in a more -@emph{list-oriented} outline, indented structure is a lot cleaner: - -@smallexample -@group -* Top level headline | * Top level headline -** Second level | * Second level -*** 3rd level | * 3rd level -some text | some text -*** 3rd level | * 3rd level -more text | more text -* Another top level headline | * Another top level headline -@end group -@end smallexample - -@noindent -If you are using at least Emacs 23.1.50.3 and version 6.29 of Org, this kind -of view can be achieved dynamically at display time using -@code{org-indent-mode}, which will prepend intangible space to each line. -You can turn on @code{org-indent-mode} for all files by customizing the -variable @code{org-startup-indented}, or you can turn it on for individual -files using - -@smallexample -#+STARTUP: indent -@end smallexample - -If you want a similar effect in earlier version of Emacs and/or Org, or if -you want the indentation to be hard space characters so that the plain text -file looks as similar as possible to the Emacs display, Org supports you by -helping to indent (with @key{TAB}) text below each headline, by hiding -leading stars, and by only using levels 1, 3, etc to get two characters -indentation for each level. To get this support in a file, use - -@smallexample -#+STARTUP: hidestars odd -@end smallexample - -@node MobileOrg, , Clean view, Miscellaneous -@section MobileOrg - -@i{MobileOrg} is an application originally developed for the @i{iPhone/iPod -Touch} series of devices, developed by Richard Moreland. There is also an -independent implementation for Android devices, by Matt Jones. -For details, see the Org-mode manual. - -@seealso{ -@uref{http://orgmode.org/manual/Miscellaneous.html#Miscellaneous, Chapter 15 -of the manual}@* -@uref{http://orgmode.org/manual/MobileOrg.html#MobileOrg, Appendix B of the -manual}@* -@uref{http://orgmode.org/orgcard.pdf,Key reference card}} - -@bye - -@ignore - arch-tag: 8f0a8557-0acc-4436-b2b2-0197699e1452 -@end ignore - -@c Local variables: -@c fill-column: 77 -@c End: - - -@c LocalWords: webdavhost pre diff --git a/pack/acp/start/vim-orgmode/examples/mylife.gif b/pack/acp/start/vim-orgmode/examples/mylife.gif deleted file mode 100644 index 71e7f654020101cddf2e184aac7e4dfb29d3c76e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101565 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≫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 diff --git a/pack/acp/start/vim-orgmode/examples/mylife.org b/pack/acp/start/vim-orgmode/examples/mylife.org deleted file mode 100644 index 090edfe..0000000 --- a/pack/acp/start/vim-orgmode/examples/mylife.org +++ /dev/null @@ -1,26 +0,0 @@ -* My Life in plain text - - [X] birth - - [-] life [50%] - - [X] use vim - - [ ] get everything else done -* Write minutes of last meeting <2014-08-08 Fri> :work: -** DONE John said - this -** TODO Mary said - that -** WAITING What did Mark say? - [[http://example.com/here/is/the/recording][1st recording]] - [[http://example.com/here/is/the/recording][2nd recording]] -* Some folding headline 1 :one: -** Folded -*** Even more folded -* Some folding headline 2 -** Folded :two: -*** Even more folded -* Some folding headline 3 -** Folded -*** Even more folded :three: -* Some folding headline 4 -** Folded -*** Even more folded - completely unfolded diff --git a/pack/acp/start/vim-orgmode/examples/mylife.png b/pack/acp/start/vim-orgmode/examples/mylife.png deleted file mode 100644 index 70cca310274d1f1c0119143a915377b567e33b12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67333 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

44_<=#47neiIa4 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

^nU?UhkNUftjLIn2mDVYil1o&W#na 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 diff --git a/pack/acp/start/vim-orgmode/examples/plugins/PluginExample.py b/pack/acp/start/vim-orgmode/examples/plugins/PluginExample.py deleted file mode 100644 index 5e4ea8d..0000000 --- a/pack/acp/start/vim-orgmode/examples/plugins/PluginExample.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- - -from orgmode import echo, echom, echoe, ORGMODE, apply_count, repeat -from orgmode.menu import Submenu, Separator, ActionEntry -from orgmode.keybinding import Keybinding, Plug, Command - -import vim - - -class Example(object): - u""" - Example plugin. - - TODO: Extend this doc! - """ - - def __init__(self): - u""" Initialize plugin """ - object.__init__(self) - # menu entries this plugin should create - self.menu = ORGMODE.orgmenu + Submenu(u'Example') - - # key bindings for this plugin - # key bindings are also registered through the menu so only additional - # bindings should be put in this variable - self.keybindings = [] - - # commands for this plugin - self.commands = [] - - @classmethod - def action(cls): - u""" - Some kind of action. - - :returns: TODO - """ - pass - - def register(self): - u""" - Registration of the plugin. - - Key bindings and other initialization should be done here. - """ - # an Action menu entry which binds "keybinding" to action ":action" - self.commands.append(Command(u'OrgActionCommand', - u':py ORGMODE.plugins["Example"].action()')) - self.keybindings.append(Keybinding(u'keybinding', - Plug(u'OrgAction', self.commands[-1]))) - self.menu + ActionEntry(u'&Action', self.keybindings[-1]) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftdetect/org.vim b/pack/acp/start/vim-orgmode/ftdetect/org.vim deleted file mode 100644 index 6eae3f8..0000000 --- a/pack/acp/start/vim-orgmode/ftdetect/org.vim +++ /dev/null @@ -1,2 +0,0 @@ -autocmd BufNewFile,BufRead *.org setfiletype org -"autocmd BufNewFile,BufReadPost org:todo* setfiletype orgtodo diff --git a/pack/acp/start/vim-orgmode/ftplugin/org.cnf b/pack/acp/start/vim-orgmode/ftplugin/org.cnf deleted file mode 100644 index af1f7d0..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/org.cnf +++ /dev/null @@ -1,5 +0,0 @@ ---langdef=org ---langmap=org:.org ---regex-org=/^(\*+)[[:space:]]+(.*)([[:space:]]+:[^\t ]*:)?$/\1 \2/s,sections/ ---regex-org=/\[\[([^][]+)\]\]/\1/h,hyperlinks/ ---regex-org=/\[\[[^][]+\]\[([^][]+)\]\]/\1/h,hyperlinks/ diff --git a/pack/acp/start/vim-orgmode/ftplugin/org.vim b/pack/acp/start/vim-orgmode/ftplugin/org.vim deleted file mode 100644 index f973ab6..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/org.vim +++ /dev/null @@ -1,169 +0,0 @@ -" org.vim -- Text outlining and task management for Vim based on Emacs' Org-Mode -" @Author : Jan Christoph Ebersbach (jceb@e-jc.de) -" @License : AGPL3 (see http://www.gnu.org/licenses/agpl.txt) -" @Created : 2010-10-03 -" @Last Modified: Tue 13. Sep 2011 20:52:57 +0200 CEST -" @Revision : 0.4 -" vi: ft=vim:tw=80:sw=4:ts=4:fdm=marker - -if v:version > 702 - if has('python3') - let s:py_version = 'python3 ' - let s:py_env = 'python3 << EOF' - elseif has('python') - let s:py_version = 'python ' - let s:py_env = 'python << EOF' - else - echoerr "Unable to start orgmode. Orgmode depends on Vim >= 7.3 with Python support complied in." - finish - endif -else - echoerr "Unable to start orgmode. Orgmode depends on Vim >= 7.3 with Python support complied in." - finish -endif - -" Init buffer for file {{{1 -if ! exists('b:did_ftplugin') - " default emacs settings - setlocal comments=fb:*,b:#,fb:- - setlocal commentstring=#\ %s - setlocal conceallevel=2 concealcursor=nc - " original emacs settings are: setlocal tabstop=6 shiftwidth=6, but because - " of checkbox indentation the following settings are used: - setlocal tabstop=6 shiftwidth=6 - if exists('g:org_tag_column') - exe 'setlocal textwidth='.g:org_tag_column - else - setlocal textwidth=77 - endif - - " expand tab for counting level of checkbox - setlocal expandtab - - " enable % for angle brackets < > - setlocal matchpairs+=<:> - - " register keybindings if they don't have been registered before - if exists("g:loaded_org") - exe s:py_version . 'ORGMODE.register_keybindings()' - endif -endif - -" Load orgmode just once {{{1 -if &cp || exists("g:loaded_org") - finish -endif -let g:loaded_org = 1 - -" Default org plugins that will be loaded (in the given order) {{{2 -if ! exists('g:org_plugins') && ! exists('b:org_plugins') - let g:org_plugins = ['ShowHide', '|', 'Navigator', 'EditStructure', 'EditCheckbox', '|', 'Hyperlinks', '|', 'Todo', 'TagsProperties', 'Date', 'Agenda', 'Misc', '|', 'Export'] -endif - -" Default org plugin settings {{{2 -" What does this do? -if ! exists('g:org_syntax_highlight_leading_stars') && ! exists('b:org_syntax_highlight_leading_stars') - let g:org_syntax_highlight_leading_stars = 1 -endif - -" setting to conceal aggresively -if ! exists('g:org_aggressive_conceal') && ! exists('b:org_aggressive_conceal') - let g:org_aggressive_conceal = 0 -endif - -" Defined in separate plugins -" Adding Behavior preference: -" 1: go into insert-mode when new heading/checkbox/plainlist added -" 0: retain original mode when new heading/checkbox/plainlist added -if ! exists('g:org_prefer_insert_mode') && ! exists('b:org_prefer_insert_mode') - let g:org_prefer_insert_mode = 1 -endif - -" Menu and document handling {{{1 -function! OrgRegisterMenu() - exe s:py_version . 'ORGMODE.register_menu()' -endfunction - -function! OrgUnregisterMenu() - exe s:py_version . 'ORGMODE.unregister_menu()' -endfunction - -function! OrgDeleteUnusedDocument(bufnr) - exe s:py_env -b = int(vim.eval('a:bufnr')) -if b in ORGMODE._documents: - del ORGMODE._documents[b] -EOF -endfunction - -" show and hide Org menu depending on the filetype -augroup orgmode - au BufEnter * :if &filetype == "org" | call OrgRegisterMenu() | endif - au BufLeave * :if &filetype == "org" | call OrgUnregisterMenu() | endif - au BufDelete * :call OrgDeleteUnusedDocument(expand('')) -augroup END - -" Start orgmode {{{1 -" Expand our path -exec s:py_env -import vim, os, sys - -for p in vim.eval("&runtimepath").split(','): - dname = os.path.join(p, "ftplugin") - if os.path.exists(os.path.join(dname, "orgmode")): - if dname not in sys.path: - sys.path.append(dname) - break - -from orgmode._vim import ORGMODE, insert_at_cursor, get_user_input, date_to_str -ORGMODE.start() - -from Date import Date -import datetime -EOF - -" 3rd Party Plugin Integration {{{1 -" * Repeat {{{2 -try - call repeat#set() -catch -endtry - -" * Tagbar {{{2 -let g:tagbar_type_org = { - \ 'ctagstype' : 'org', - \ 'kinds' : [ - \ 's:sections', - \ 'h:hyperlinks', - \ ], - \ 'sort' : 0, - \ 'deffile' : expand(':p:h') . '/org.cnf' - \ } - -" * Taglist {{{2 -if exists('g:Tlist_Ctags_Cmd') - " Pass parameters to taglist - let g:tlist_org_settings = 'org;s:section;h:hyperlinks' - let g:Tlist_Ctags_Cmd .= ' --options=' . expand(':p:h') . '/org.cnf ' -endif - -" * Calendar.vim {{{2 -fun CalendarAction(day, month, year, week, dir) - let g:org_timestamp = printf("%04d-%02d-%02d Fri", a:year, a:month, a:day) - let datetime_date = printf("datetime.date(%d, %d, %d)", a:year, a:month, a:day) - exe s:py_version . "selected_date = " . datetime_date - " get_user_input - let msg = printf("Inserting %s | Modify date", g:org_timestamp) - exe s:py_version . "modifier = get_user_input('" . msg . "')" - " change date according to user input - exe s:py_version . "newdate = Date._modify_time(selected_date, modifier)" - exe s:py_version . "newdate = date_to_str(newdate)" - " close Calendar - exe "q" - " goto previous window - exe "wincmd p" - exe s:py_version . "timestamp = '" . g:org_timestamp_template . "' % newdate" - exe s:py_version . "insert_at_cursor(timestamp)" - " restore calendar_action - let g:calendar_action = g:org_calendar_action_backup -endf diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/__init__.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/__init__.py deleted file mode 100644 index 40a96af..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/_vim.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/_vim.py deleted file mode 100644 index 73ba2c4..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/_vim.py +++ /dev/null @@ -1,411 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - VIM ORGMODE - ~~~~~~~~~~~~ - - TODO -""" - -import imp -import re -import sys - -import vim -from datetime import datetime - -import orgmode.keybinding -import orgmode.menu -import orgmode.plugins -import orgmode.settings -from orgmode.exceptions import PluginError -from orgmode.vimbuffer import VimBuffer -from orgmode.liborgmode.agenda import AgendaManager - - -REPEAT_EXISTS = bool(int(vim.eval('exists("*repeat#set()")'))) -TAGSPROPERTIES_EXISTS = False - -cache_heading = None - -from orgmode.py3compat.unicode_compatibility import * -from orgmode.py3compat.encode_compatibility import * - - -def realign_tags(f): - u""" - Update tag alignment, dependency to TagsProperties plugin! - """ - def r(*args, **kwargs): - global TAGSPROPERTIES_EXISTS - res = f(*args, **kwargs) - - if not TAGSPROPERTIES_EXISTS and u'TagsProperties' in ORGMODE.plugins: - TAGSPROPERTIES_EXISTS = True - - if TAGSPROPERTIES_EXISTS: - ORGMODE.plugins[u'TagsProperties'].realign_tags() - - return res - return r - - -def repeat(f): - u""" - Integrate with the repeat plugin if available - - The decorated function must return the name of the command to - execute by the repeat plugin. - """ - def r(*args, **kwargs): - res = f(*args, **kwargs) - if REPEAT_EXISTS and isinstance(res, basestring): - vim.command(u_encode(u'silent! call repeat#set("\\%s")' % res)) - return res - return r - - -def apply_count(f): - u""" - Decorator which executes function v:count or v:prevount (not implemented, - yet) times. The decorated function must return a value that evaluates to - True otherwise the function is not repeated. - """ - def r(*args, **kwargs): - count = 0 - try: - count = int(vim.eval(u_encode(u'v:count'))) - - # visual count is not implemented yet - #if not count: - # count = int(vim.eval(u'v:prevcount'.encode(u'utf-8'))) - except BaseException as e: - pass - - res = f(*args, **kwargs) - count -= 1 - while res and count > 0: - f(*args, **kwargs) - count -= 1 - return res - return r - - -def echo(message): - u""" - Print a regular message that will not be visible to the user when - multiple lines are printed - """ - for m in message.split(u'\n'): - vim.command(u_encode(u':echo "%s"' % m)) - - -def echom(message): - u""" - Print a regular message that will be visible to the user, even when - multiple lines are printed - """ - # probably some escaping is needed here - for m in message.split(u'\n'): - vim.command(u_encode(u':echomsg "%s"' % m)) - - -def echoe(message): - u""" - Print an error message. This should only be used for serious errors! - """ - # probably some escaping is needed here - for m in message.split(u'\n'): - vim.command(u_encode(u':echoerr "%s"' % m)) - - -def insert_at_cursor(text, move=True, start_insertmode=False): - u"""Insert text at the position of the cursor. - - If move==True move the cursor with the inserted text. - """ - d = ORGMODE.get_document(allow_dirty=True) - line, col = vim.current.window.cursor - _text = d._content[line - 1] - d._content[line - 1] = _text[:col + 1] + text + _text[col + 1:] - if move: - vim.current.window.cursor = (line, col + len(text)) - if start_insertmode: - vim.command(u_encode(u'startinsert')) - - -def get_user_input(message): - u"""Print the message and take input from the user. - Return the input or None if there is no input. - """ - vim.command(u_encode(u'call inputsave()')) - vim.command(u_encode(u"let user_input = input('" + message + u": ')")) - vim.command(u_encode(u'call inputrestore()')) - try: - return u_decode(vim.eval(u_encode(u'user_input'))) - except: - return None - - -def get_bufnumber(bufname): - """ - Return the number of the buffer for the given bufname if it exist; - else None. - """ - for b in vim.buffers: - if b.name == bufname: - return int(b.number) - - -def get_bufname(bufnr): - """ - Return the name of the buffer for the given bufnr if it exist; else None. - """ - for b in vim.buffers: - if b.number == bufnr: - return b.name - - -def indent_orgmode(): - u""" Set the indent value for the current line in the variable - b:indent_level - - Vim prerequisites: - :setlocal indentexpr=Method-which-calls-indent_orgmode - - :returns: None - """ - line = int(vim.eval(u_encode(u'v:lnum'))) - d = ORGMODE.get_document() - heading = d.current_heading(line - 1) - if heading and line != heading.start_vim: - heading.init_checkboxes() - checkbox = heading.current_checkbox() - level = heading.level + 1 - if checkbox: - if line != checkbox.start_vim: - # indent body up to the beginning of the checkbox' text - # if checkbox isn't indented to the proper location, the body - # won't be indented either - level = checkbox.level + len(checkbox.type) + 1 + \ - (4 if checkbox.status else 0) - vim.command(u_encode((u'let b:indent_level = %d' % level))) - - -def fold_text(allow_dirty=False): - u""" Set the fold text - :setlocal foldtext=Method-which-calls-foldtext - - :allow_dirty: Perform a query without (re)building the DOM if True - :returns: None - """ - line = int(vim.eval(u_encode(u'v:foldstart'))) - d = ORGMODE.get_document(allow_dirty=allow_dirty) - heading = None - if allow_dirty: - heading = d.find_current_heading(line - 1) - else: - heading = d.current_heading(line - 1) - if heading: - str_heading = unicode(heading) - - # expand tabs - ts = int(vim.eval(u_encode(u'&ts'))) - idx = str_heading.find(u'\t') - if idx != -1: - tabs, spaces = divmod(idx, ts) - str_heading = str_heading.replace(u'\t', u' ' * (ts - spaces), 1) - str_heading = str_heading.replace(u'\t', u' ' * ts) - - # Workaround for vim.command seems to break the completion menu - vim.eval(u_encode(u'SetOrgFoldtext("%s...")' % (re.sub(r'\[\[([^[\]]*\]\[)?([^[\]]+)\]\]', r'\2', - str_heading).replace( u'\\', u'\\\\').replace(u'"', u'\\"'), ))) - - -def fold_orgmode(allow_dirty=False): - u""" Set the fold expression/value for the current line in the variable - b:fold_expr - - Vim prerequisites: - :setlocal foldmethod=expr - :setlocal foldexpr=Method-which-calls-fold_orgmode - - :allow_dirty: Perform a query without (re)building the DOM if True - :returns: None - """ - line = int(vim.eval(u_encode(u'v:lnum'))) - d = ORGMODE.get_document(allow_dirty=allow_dirty) - heading = None - if allow_dirty: - heading = d.find_current_heading(line - 1) - else: - heading = d.current_heading(line - 1) - - # if cache_heading != heading: - # heading.init_checkboxes() - # checkbox = heading.current_checkbox() - - # cache_heading = heading - if heading: - # if checkbox: - # vim.command((u'let b:fold_expr = ">%d"' % heading.level + checkbox.level).encode(u'utf-8')) - if 0: - pass - elif line == heading.start_vim: - vim.command(u_encode(u'let b:fold_expr = ">%d"' % heading.level)) - #elif line == heading.end_vim: - # vim.command((u'let b:fold_expr = "<%d"' % heading.level).encode(u'utf-8')) - # end_of_last_child_vim is a performance junky and is actually not needed - #elif line == heading.end_of_last_child_vim: - # vim.command((u'let b:fold_expr = "<%d"' % heading.level).encode(u'utf-8')) - else: - vim.command(u_encode(u'let b:fold_expr = %d' % heading.level)) - - -def date_to_str(date): - if isinstance(date, datetime): - date = date.strftime(u_decode(u_encode(u'%Y-%m-%d %a %H:%M'))) - else: - date = date.strftime(u_decode(u_encode(u'%Y-%m-%d %a'))) - return date - -class OrgMode(object): - u""" Vim Buffer """ - - def __init__(self): - object.__init__(self) - self.debug = bool(int(orgmode.settings.get(u'org_debug', False))) - - self.orgmenu = orgmode.menu.Submenu(u'&Org') - self._plugins = {} - # list of vim buffer objects - self._documents = {} - - # agenda manager - self.agenda_manager = AgendaManager() - - def get_document(self, bufnr=0, allow_dirty=False): - """ Retrieve instance of vim buffer document. This Document should be - used for manipulating the vim buffer. - - :bufnr: Retrieve document with bufnr - :allow_dirty: Allow the retrieved document to be dirty - - :returns: vim buffer instance - """ - if bufnr == 0: - bufnr = vim.current.buffer.number - - if bufnr in self._documents: - if allow_dirty or self._documents[bufnr].is_insync: - return self._documents[bufnr] - self._documents[bufnr] = VimBuffer(bufnr).init_dom() - return self._documents[bufnr] - - @property - def plugins(self): - return self._plugins.copy() - - @orgmode.keybinding.register_keybindings - @orgmode.keybinding.register_commands - @orgmode.menu.register_menu - def register_plugin(self, plugin): - if not isinstance(plugin, basestring): - raise ValueError(u'Parameter plugin is not of type string') - - if plugin == u'|': - self.orgmenu + orgmode.menu.Separator() - self.orgmenu.children[-1].create() - return - - if plugin in self._plugins: - raise PluginError(u'Plugin %s has already been loaded') - - # a python module - module = None - - # actual plugin class - _class = None - - # locate module and initialize plugin class - try: - module = imp.find_module(plugin, orgmode.plugins.__path__) - except ImportError as e: - echom(u'Plugin not found: %s' % plugin) - if self.debug: - raise e - return - - if not module: - echom(u'Plugin not found: %s' % plugin) - return - - try: - module = imp.load_module(plugin, *module) - if not hasattr(module, plugin): - echoe(u'Unable to find plugin: %s' % plugin) - if self.debug: - raise PluginError(u'Unable to find class %s' % plugin) - return - _class = getattr(module, plugin) - self._plugins[plugin] = _class() - self._plugins[plugin].register() - if self.debug: - echo(u'Plugin registered: %s' % plugin) - return self._plugins[plugin] - except BaseException as e: - echoe(u'Unable to activate plugin: %s' % plugin) - echoe(u"%s" % e) - if self.debug: - import traceback - echoe(traceback.format_exc()) - - def register_keybindings(self): - @orgmode.keybinding.register_keybindings - def dummy(plugin): - return plugin - - if sys.version_info < (3, ): - for p in self.plugins.itervalues(): - dummy(p) - else: - for p in self.plugins.values(): - dummy(p) - - def register_menu(self): - self.orgmenu.create() - - def unregister_menu(self): - vim.command(u_encode(u'silent! aunmenu Org')) - - def start(self): - u""" Start orgmode and load all requested plugins - """ - plugins = orgmode.settings.get(u"org_plugins") - - if not plugins: - echom(u'orgmode: No plugins registered.') - - if isinstance(plugins, basestring): - try: - self.register_plugin(plugins) - except BaseException as e: - import traceback - traceback.print_exc() - elif isinstance(plugins, list) or \ - isinstance(plugins, tuple): - for p in plugins: - try: - self.register_plugin(p) - except BaseException as e: - echoe('Error in %s plugin:' % p) - import traceback - traceback.print_exc() - - return plugins - - -ORGMODE = OrgMode() - - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/Makefile b/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/Makefile deleted file mode 100644 index ff92ec5..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/Makefile +++ /dev/null @@ -1,230 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# User-friendly check for sphinx-build -ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) - $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don\'t have Sphinx installed, grab it from http://sphinx-doc.org/) -endif - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " applehelp to make an Apple Help Book" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " epub3 to make an epub3" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " xml to make Docutils-native XML files" - @echo " pseudoxml to make pseudoxml-XML files for display purposes" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - @echo " coverage to run coverage check of the documentation (if enabled)" - @echo " dummy to check syntax errors of document sources" - -.PHONY: clean -clean: - rm -rf $(BUILDDIR)/* - -.PHONY: html -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -.PHONY: dirhtml -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -.PHONY: singlehtml -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -.PHONY: pickle -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -.PHONY: json -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -.PHONY: htmlhelp -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -.PHONY: qthelp -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/orgmode.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/orgmode.qhc" - -.PHONY: applehelp -applehelp: - $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp - @echo - @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." - @echo "N.B. You won't be able to view it unless you put it in" \ - "~/Library/Documentation/Help or install it in your application" \ - "bundle." - -.PHONY: devhelp -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/orgmode" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/orgmode" - @echo "# devhelp" - -.PHONY: epub -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -.PHONY: epub3 -epub3: - $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 - @echo - @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." - -.PHONY: latex -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -.PHONY: latexpdf -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: latexpdfja -latexpdfja: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through platex and dvipdfmx..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -.PHONY: text -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -.PHONY: man -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -.PHONY: texinfo -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -.PHONY: info -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -.PHONY: gettext -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -.PHONY: changes -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -.PHONY: linkcheck -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -.PHONY: doctest -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - -.PHONY: coverage -coverage: - $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage - @echo "Testing of coverage in the sources finished, look at the " \ - "results in $(BUILDDIR)/coverage/python.txt." - -.PHONY: xml -xml: - $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml - @echo - @echo "Build finished. The XML files are in $(BUILDDIR)/xml." - -.PHONY: pseudoxml -pseudoxml: - $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml - @echo - @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." - -.PHONY: dummy -dummy: - $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy - @echo - @echo "Build finished. Dummy builder generates no files." diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/conf.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/conf.py deleted file mode 100644 index 246a80d..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/conf.py +++ /dev/null @@ -1,387 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# orgmode documentation build configuration file, created by -# sphinx-quickstart on Sat May 21 15:51:55 2016. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys -import os -import mock - -# Mock vim -MOCK_MODULES = ['vim'] -for m in MOCK_MODULES: - sys.modules[m] = mock.Mock() - -import vim -vim.eval = mock.MagicMock(return_value=1) - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) -sys.path.insert(0, os.path.abspath('../..')) - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.todo', - 'sphinx.ext.viewcode', - 'sphinx.ext.doctest', - 'sphinx.ext.coverage', - 'sphinx.ext.viewcode', - 'sphinx.ext.napoleon', -] - -# Napoleon config -napoleon_google_docstring = True -napoleon_numpy_docstring = True -napoleon_include_private_with_doc = True -napoleon_include_special_with_doc = True -napoleon_use_admonition_for_examples = False -napoleon_use_admonition_for_notes = False -napoleon_use_admonition_for_references = False -napoleon_use_ivar = False -napoleon_use_param = True -napoleon_use_rtype = True - -# Add any paths that contain templates here, relative to this directory. -#templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = 'orgmode' -copyright = '2016, Author' -author = 'Author' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '' -# The full version, including alpha/beta/rc tags. -release = '' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = 'en' - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'alabaster' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. -# " v documentation" by default. -html_title = 'orgmode v0.5' - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (relative to this directory) to use as a favicon of -# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -#html_static_path = ['_static'] - -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -#html_extra_path = [] - -# If not None, a 'Last updated on:' timestamp is inserted at every page -# bottom, using the given strftime format. -# The empty string is equivalent to '%b %d, %Y'. -#html_last_updated_fmt = None - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Language to be used for generating the HTML full-text search index. -# Sphinx supports the following languages: -# 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja' -# 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr', 'zh' -#html_search_language = 'en' - -# A dictionary with options for the search language support, empty by default. -# 'ja' uses this config value. -# 'zh' user can custom change `jieba` dictionary path. -#html_search_options = {'type': 'default'} - -# The name of a javascript file (relative to the configuration directory) that -# implements a search results scorer. If empty, the default will be used. -#html_search_scorer = 'scorer.js' - -# Output file base name for HTML help builder. -htmlhelp_basename = 'orgmodedoc' - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', - -# Latex figure (float) alignment -#'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, 'orgmode.tex', 'orgmode Documentation', - 'Author', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'orgmode', 'orgmode Documentation', - [author], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, 'orgmode', 'orgmode Documentation', - author, 'orgmode', 'One line description of project.', - 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False - - -# -- Options for Epub output ---------------------------------------------- - -# Bibliographic Dublin Core info. -epub_title = project -epub_author = author -epub_publisher = author -epub_copyright = copyright - -# The basename for the epub file. It defaults to the project name. -#epub_basename = project - -# The HTML theme for the epub output. Since the default themes are not -# optimized for small screen space, using the same theme for HTML and epub -# output is usually not wise. This defaults to 'epub', a theme designed to save -# visual space. -#epub_theme = 'epub' - -# The language of the text. It defaults to the language option -# or 'en' if the language is not set. -#epub_language = '' - -# The scheme of the identifier. Typical schemes are ISBN or URL. -#epub_scheme = '' - -# The unique identifier of the text. This can be a ISBN number -# or the project homepage. -#epub_identifier = '' - -# A unique identification for the text. -#epub_uid = '' - -# A tuple containing the cover image and cover page html template filenames. -#epub_cover = () - -# A sequence of (type, uri, title) tuples for the guide element of content.opf. -#epub_guide = () - -# HTML files that should be inserted before the pages created by sphinx. -# The format is a list of tuples containing the path and title. -#epub_pre_files = [] - -# HTML files that should be inserted after the pages created by sphinx. -# The format is a list of tuples containing the path and title. -#epub_post_files = [] - -# A list of files that should not be packed into the epub file. -epub_exclude_files = ['search.html'] - -# The depth of the table of contents in toc.ncx. -#epub_tocdepth = 3 - -# Allow duplicate toc entries. -#epub_tocdup = True - -# Choose between 'default' and 'includehidden'. -#epub_tocscope = 'default' - -# Fix unsupported image types using the Pillow. -#epub_fix_images = False - -# Scale large images. -#epub_max_image_width = 0 - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#epub_show_urls = 'inline' - -# If false, no index is generated. -#epub_use_index = True diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/index.rst b/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/index.rst deleted file mode 100644 index 3680d38..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/index.rst +++ /dev/null @@ -1,22 +0,0 @@ -.. orgmode documentation master file, created by - sphinx-quickstart on Sat May 21 16:35:00 2016. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to orgmode's documentation! -=================================== - -Contents: - -.. toctree:: - :maxdepth: 4 - - orgmode - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/make.bat b/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/make.bat deleted file mode 100644 index 3de72e8..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/make.bat +++ /dev/null @@ -1,281 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. epub3 to make an epub3 - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. xml to make Docutils-native XML files - echo. pseudoxml to make pseudoxml-XML files for display purposes - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - echo. coverage to run coverage check of the documentation if enabled - echo. dummy to check syntax errors of document sources - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - - -REM Check if sphinx-build is available and fallback to Python version if any -%SPHINXBUILD% 1>NUL 2>NUL -if errorlevel 9009 goto sphinx_python -goto sphinx_ok - -:sphinx_python - -set SPHINXBUILD=python -m sphinx.__init__ -%SPHINXBUILD% 2> nul -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -:sphinx_ok - - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\orgmode.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\orgmode.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "epub3" ( - %SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3 - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub3 file is in %BUILDDIR%/epub3. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdf" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "latexpdfja" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - cd %BUILDDIR%/latex - make all-pdf-ja - cd %~dp0 - echo. - echo.Build finished; the PDF files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -if "%1" == "coverage" ( - %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage - if errorlevel 1 exit /b 1 - echo. - echo.Testing of coverage in the sources finished, look at the ^ -results in %BUILDDIR%/coverage/python.txt. - goto end -) - -if "%1" == "xml" ( - %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The XML files are in %BUILDDIR%/xml. - goto end -) - -if "%1" == "pseudoxml" ( - %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. - goto end -) - -if "%1" == "dummy" ( - %SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. Dummy builder generates no files. - goto end -) - -:end diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.liborgmode.rst b/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.liborgmode.rst deleted file mode 100644 index 3994f07..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.liborgmode.rst +++ /dev/null @@ -1,78 +0,0 @@ -orgmode.liborgmode package -========================== - -Submodules ----------- - -orgmode.liborgmode.agenda module --------------------------------- - -.. automodule:: orgmode.liborgmode.agenda - :members: - :undoc-members: - :show-inheritance: - -orgmode.liborgmode.agendafilter module --------------------------------------- - -.. automodule:: orgmode.liborgmode.agendafilter - :members: - :undoc-members: - :show-inheritance: - -orgmode.liborgmode.base module ------------------------------- - -.. automodule:: orgmode.liborgmode.base - :members: - :undoc-members: - :show-inheritance: - -orgmode.liborgmode.checkboxes module ------------------------------------- - -.. automodule:: orgmode.liborgmode.checkboxes - :members: - :undoc-members: - :show-inheritance: - -orgmode.liborgmode.documents module ------------------------------------ - -.. automodule:: orgmode.liborgmode.documents - :members: - :undoc-members: - :show-inheritance: - -orgmode.liborgmode.dom_obj module ---------------------------------- - -.. automodule:: orgmode.liborgmode.dom_obj - :members: - :undoc-members: - :show-inheritance: - -orgmode.liborgmode.headings module ----------------------------------- - -.. automodule:: orgmode.liborgmode.headings - :members: - :undoc-members: - :show-inheritance: - -orgmode.liborgmode.orgdate module ---------------------------------- - -.. automodule:: orgmode.liborgmode.orgdate - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: orgmode.liborgmode - :members: - :undoc-members: - :show-inheritance: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.plugins.rst b/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.plugins.rst deleted file mode 100644 index 0722df5..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.plugins.rst +++ /dev/null @@ -1,110 +0,0 @@ -orgmode.plugins package -======================= - -Submodules ----------- - -orgmode.plugins.Agenda module ------------------------------ - -.. automodule:: orgmode.plugins.Agenda - :members: - :undoc-members: - :show-inheritance: - -orgmode.plugins.Date module ---------------------------- - -.. automodule:: orgmode.plugins.Date - :members: - :undoc-members: - :show-inheritance: - -orgmode.plugins.EditCheckbox module ------------------------------------ - -.. automodule:: orgmode.plugins.EditCheckbox - :members: - :undoc-members: - :show-inheritance: - -orgmode.plugins.EditStructure module ------------------------------------- - -.. automodule:: orgmode.plugins.EditStructure - :members: - :undoc-members: - :show-inheritance: - -orgmode.plugins.Export module ------------------------------ - -.. automodule:: orgmode.plugins.Export - :members: - :undoc-members: - :show-inheritance: - -orgmode.plugins.Hyperlinks module ---------------------------------- - -.. automodule:: orgmode.plugins.Hyperlinks - :members: - :undoc-members: - :show-inheritance: - -orgmode.plugins.LoggingWork module ----------------------------------- - -.. automodule:: orgmode.plugins.LoggingWork - :members: - :undoc-members: - :show-inheritance: - -orgmode.plugins.Misc module ---------------------------- - -.. automodule:: orgmode.plugins.Misc - :members: - :undoc-members: - :show-inheritance: - -orgmode.plugins.Navigator module --------------------------------- - -.. automodule:: orgmode.plugins.Navigator - :members: - :undoc-members: - :show-inheritance: - -orgmode.plugins.ShowHide module -------------------------------- - -.. automodule:: orgmode.plugins.ShowHide - :members: - :undoc-members: - :show-inheritance: - -orgmode.plugins.TagsProperties module -------------------------------------- - -.. automodule:: orgmode.plugins.TagsProperties - :members: - :undoc-members: - :show-inheritance: - -orgmode.plugins.Todo module ---------------------------- - -.. automodule:: orgmode.plugins.Todo - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: orgmode.plugins - :members: - :undoc-members: - :show-inheritance: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.py3compat.rst b/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.py3compat.rst deleted file mode 100644 index 4b37cc3..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.py3compat.rst +++ /dev/null @@ -1,46 +0,0 @@ -orgmode.py3compat package -========================= - -Submodules ----------- - -orgmode.py3compat.encode_compatibility module ---------------------------------------------- - -.. automodule:: orgmode.py3compat.encode_compatibility - :members: - :undoc-members: - :show-inheritance: - -orgmode.py3compat.py_py3_string module --------------------------------------- - -.. automodule:: orgmode.py3compat.py_py3_string - :members: - :undoc-members: - :show-inheritance: - -orgmode.py3compat.unicode_compatibility module ----------------------------------------------- - -.. automodule:: orgmode.py3compat.unicode_compatibility - :members: - :undoc-members: - :show-inheritance: - -orgmode.py3compat.xrange_compatibility module ---------------------------------------------- - -.. automodule:: orgmode.py3compat.xrange_compatibility - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: orgmode.py3compat - :members: - :undoc-members: - :show-inheritance: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.rst b/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.rst deleted file mode 100644 index afddb3f..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/docs/orgmode.rst +++ /dev/null @@ -1,71 +0,0 @@ -orgmode package -=============== - -Subpackages ------------ - -.. toctree:: - - orgmode.liborgmode - orgmode.plugins - orgmode.py3compat - -Submodules ----------- - -orgmode._vim module -------------------- - -.. automodule:: orgmode._vim - :members: - :undoc-members: - :show-inheritance: - -orgmode.exceptions module -------------------------- - -.. automodule:: orgmode.exceptions - :members: - :undoc-members: - :show-inheritance: - -orgmode.keybinding module -------------------------- - -.. automodule:: orgmode.keybinding - :members: - :undoc-members: - :show-inheritance: - -orgmode.menu module -------------------- - -.. automodule:: orgmode.menu - :members: - :undoc-members: - :show-inheritance: - -orgmode.settings module ------------------------ - -.. automodule:: orgmode.settings - :members: - :undoc-members: - :show-inheritance: - -orgmode.vimbuffer module ------------------------- - -.. automodule:: orgmode.vimbuffer - :members: - :undoc-members: - :show-inheritance: - - -Module contents ---------------- - -.. automodule:: orgmode - :members: - :undoc-members: - :show-inheritance: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/exceptions.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/exceptions.py deleted file mode 100644 index 52ffe4e..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/exceptions.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- - - -class PluginError(BaseException): - def __init__(self, message): - BaseException.__init__(self, message) - - -class BufferNotFound(BaseException): - def __init__(self, message): - BaseException.__init__(self, message) - - -class BufferNotInSync(BaseException): - def __init__(self, message): - BaseException.__init__(self, message) - - -class HeadingDomError(BaseException): - def __init__(self, message): - BaseException.__init__(self, message) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/keybinding.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/keybinding.py deleted file mode 100644 index ebee100..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/keybinding.py +++ /dev/null @@ -1,217 +0,0 @@ -# -*- coding: utf-8 -*- - -import vim - -MODE_ALL = u'a' -MODE_NORMAL = u'n' -MODE_VISUAL = u'v' -MODE_INSERT = u'i' -MODE_OPERATOR = u'o' - -OPTION_BUFFER_ONLY = u'' -OPTION_SLIENT = u'' - -from orgmode.py3compat.encode_compatibility import * - -def _register(f, name): - def r(*args, **kwargs): - p = f(*args, **kwargs) - if hasattr(p, name) and isinstance(getattr(p, name), list): - for i in getattr(p, name): - i.create() - return p - return r - - -def register_keybindings(f): - return _register(f, u'keybindings') - - -def register_commands(f): - return _register(f, u'commands') - - -class Command(object): - u""" A vim command """ - - def __init__(self, name, command, arguments=u'0', complete=None, overwrite_exisiting=False): - u""" - :name: The name of command, first character must be uppercase - :command: The actual command that is executed - :arguments: See :h :command-nargs, only the arguments need to be specified - :complete: See :h :command-completion, only the completion arguments need to be specified - """ - object.__init__(self) - - self._name = name - self._command = command - self._arguments = arguments - self._complete = complete - self._overwrite_exisiting = overwrite_exisiting - - def __unicode__(self): - return u':%s' % self.name - - def __str__(self): - return u_encode(self.__unicode__()) - - @property - def name(self): - return self._name - - @property - def command(self): - return self._command - - @property - def arguments(self): - return self._arguments - - @property - def complete(self): - return self._complete - - @property - def overwrite_exisiting(self): - return self._overwrite_exisiting - - def create(self): - u""" Register/create the command - """ - vim.command(u_encode(':command%(overwrite)s -nargs=%(arguments)s %(complete)s %(name)s %(command)s' % - {u'overwrite': '!' if self.overwrite_exisiting else '', - u'arguments': u_encode(self.arguments), - u'complete': '-complete=%s' % u_encode(self.complete) if self.complete else '', - u'name': self.name, - u'command': self.command} - )) - - -class Plug(object): - u""" Represents a to an abitrary command """ - - def __init__(self, name, command, mode=MODE_NORMAL): - u""" - :name: the name of the should be ScriptnameCommandname - :command: the actual command - """ - object.__init__(self) - - if mode not in (MODE_ALL, MODE_NORMAL, MODE_VISUAL, MODE_INSERT, MODE_OPERATOR): - raise ValueError(u'Parameter mode not in MODE_ALL, MODE_NORMAL, MODE_VISUAL, MODE_INSERT, MODE_OPERATOR') - self._mode = mode - - self.name = name - self.command = command - self.created = False - - def __unicode__(self): - return u'%s' % self.name - - def __str__(self): - return u_encode(self.__unicode__()) - - def create(self): - if not self.created: - self.created = True - cmd = self._mode - if cmd == MODE_ALL: - cmd = u'' - vim.command(u_encode(u':%snoremap %s %s' % (cmd, str(self), self.command))) - - @property - def mode(self): - return self._mode - - -class Keybinding(object): - u""" Representation of a single key binding """ - - def __init__(self, key, action, mode=None, options=None, remap=True, buffer_only=True, silent=True): - u""" - :key: the key(s) action is bound to - :action: the action triggered by key(s) - :mode: definition in which vim modes the key binding is valid. Should be one of MODE_* - :option: list of other options like , ... - :repmap: allow or disallow nested mapping - :buffer_only: define the key binding only for the current buffer - """ - object.__init__(self) - self._key = key - self._action = action - - # grab mode from plug if not set otherwise - if isinstance(self._action, Plug) and not mode: - mode = self._action.mode - - if mode not in (MODE_ALL, MODE_NORMAL, MODE_VISUAL, MODE_INSERT, MODE_OPERATOR): - raise ValueError(u'Parameter mode not in MODE_ALL, MODE_NORMAL, MODE_VISUAL, MODE_INSERT, MODE_OPERATOR') - self._mode = mode - self._options = options - if self._options is None: - self._options = [] - self._remap = remap - self._buffer_only = buffer_only - self._silent = silent - - if self._buffer_only and OPTION_BUFFER_ONLY not in self._options: - self._options.append(OPTION_BUFFER_ONLY) - - if self._silent and OPTION_SLIENT not in self._options: - self._options.append(OPTION_SLIENT) - - @property - def key(self): - return self._key - - @property - def action(self): - return str(self._action) - - @property - def mode(self): - return self._mode - - @property - def options(self): - return self._options[:] - - @property - def remap(self): - return self._remap - - @property - def buffer_only(self): - return self._buffer_only - - @property - def silent(self): - return self._silent - - def create(self): - from orgmode._vim import ORGMODE, echom - - cmd = self._mode - if cmd == MODE_ALL: - cmd = u'' - if not self._remap: - cmd += u'nore' - try: - create_mapping = True - if isinstance(self._action, Plug): - # create plug - self._action.create() - if int(vim.eval(u_encode(u'hasmapto("%s")' % (self._action, )))): - create_mapping = False - if isinstance(self._action, Command): - # create command - self._action.create() - - if create_mapping: - vim.command(u_encode(u':%smap %s %s %s' % (cmd, u' '.join(self._options), self._key, self._action))) - except BaseException as e: - if ORGMODE.debug: - echom(u'Failed to register key binding %s %s' % (self._key, self._action)) - - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/__init__.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/__init__.py deleted file mode 100644 index 40a96af..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/agenda.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/agenda.py deleted file mode 100644 index 5f34195..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/agenda.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- - -u""" - Agenda - ~~~~~~~~~~~~~~~~~~ - - The agenda is one of the main concepts of orgmode. It allows to - collect TODO items from multiple org documents in an agenda view. - - Features: - * filtering - * sorting -""" - -from orgmode.liborgmode.agendafilter import filter_items -from orgmode.liborgmode.agendafilter import is_within_week_and_active_todo -from orgmode.liborgmode.agendafilter import contains_active_todo -from orgmode.liborgmode.agendafilter import contains_active_date - - -class AgendaManager(object): - u"""Simple parsing of Documents to create an agenda.""" - # TODO Move filters in this file, they do the same thing - - def __init__(self): - super(AgendaManager, self).__init__() - - def get_todo(self, documents): - u""" - Get the todo agenda for the given documents (list of document). - """ - filtered = [] - for document in iter(documents): - # filter and return headings - filtered.extend(filter_items(document.all_headings(), - [contains_active_todo])) - return sorted(filtered) - - def get_next_week_and_active_todo(self, documents): - u""" - Get the agenda for next week for the given documents (list of - document). - """ - filtered = [] - for document in iter(documents): - # filter and return headings - filtered.extend(filter_items(document.all_headings(), - [is_within_week_and_active_todo])) - return sorted(filtered) - - def get_timestamped_items(self, documents): - u""" - Get all time-stamped items in a time-sorted way for the given - documents (list of document). - """ - filtered = [] - for document in iter(documents): - # filter and return headings - filtered.extend(filter_items(document.all_headings(), - [contains_active_date])) - return sorted(filtered) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/agendafilter.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/agendafilter.py deleted file mode 100644 index 64deff7..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/agendafilter.py +++ /dev/null @@ -1,93 +0,0 @@ -# -*- coding: utf-8 -*- - -u""" - agendafilter - ~~~~~~~~~~~~~~~~ - - AgendaFilter contains all the filters that can be applied to create the - agenda. - - - All functions except filter_items() in the module are filters. Given a - heading they return if the heading meets the critera of the filter. - - The function filter_items() can combine different filters and only returns - the filtered headings. -""" -from datetime import datetime -from datetime import timedelta - -try: - from itertools import ifilter as filter -except: - pass - - -def filter_items(headings, filters): - u""" Filter the given headings. - - Args: - headings (list): Contains headings - filters (list): Filters that will be applied. All functions in - this module (except this function) are filters. - - Returns: - filter iterator: Headings which were not filtered. - - Examples: - >>> filtered = filter_items(headings, [contains_active_date, - contains_active_todo]) - """ - filtered = headings - for f in filters: - filtered = filter(f, filtered) - return filtered - - -def is_within_week(heading): - u""" Test if headings date is withing a week - - Returns: - bool: True if the date in the deading is within a week in the future (or - older False otherwise. - """ - if contains_active_date(heading): - next_week = datetime.today() + timedelta(days=7) - if heading.active_date < next_week: - return True - - -def is_within_week_and_active_todo(heading): - u""" - Returns: - bool: True if heading contains an active TODO and the date is within a - week. - """ - return is_within_week(heading) and contains_active_todo(heading) - - -def contains_active_todo(heading): - u""" - - Returns: - bool: True if heading contains an active TODO. - """ - # TODO make this more efficient by checking some val and not calling the - # function - # TODO why is this import failing at top level? circular dependecy... - from orgmode._vim import ORGMODE - active = [] - for act in ORGMODE.get_document().get_todo_states(): - active.extend(act[0]) - return heading.todo in active - - -def contains_active_date(heading): - u""" - - Returns: - bool: True if heading contains an active date. - """ - return not(heading.active_date is None) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/base.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/base.py deleted file mode 100644 index 4f3ea84..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/base.py +++ /dev/null @@ -1,190 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - base - ~~~~~~~~~~ - - Here are some really basic data structures that are used throughout - the liborgmode. -""" - -try: - from collections import UserList -except: - from UserList import UserList - -import collections -import sys -from orgmode.py3compat.unicode_compatibility import * - - -def flatten_list(lst): - """ Flattens a list - - Args: - lst (iterable): An iterable that will is non-flat - - Returns: - list: Flat list - """ - # TODO write tests - def gen_lst(item): - if isinstance(item, basestring) or isinstance(item, bytes): - yield item - elif isinstance(item, collections.Iterable): - # yield from would be so nice... but c'est la vie - for val in item: - for final in gen_lst(val): - yield final - else: - yield item - return [i for i in gen_lst(lst)] - - -class Direction(): - u""" - Direction is used to indicate the direction of certain actions. - - Example: it defines the direction headings get parted in. - """ - FORWARD = 1 - BACKWARD = 2 - - -class MultiPurposeList(UserList): - u""" - A Multi Purpose List is a list that calls a user defined hook on - change. The implementation is very basic - the hook is called without any - parameters. Otherwise the Multi Purpose List can be used like any other - list. - - The member element "data" can be used to fill the list without causing the - list to be marked dirty. This should only be used during initialization! - """ - - def __init__(self, initlist=None, on_change=None): - UserList.__init__(self, initlist) - self._on_change = on_change - - def _changed(self): - u""" Call hook """ - if callable(self._on_change): - self._on_change() - - def __setitem__(self, i, item): - if sys.version_info < (3, ) and isinstance(i, slice): - start, stop, _ = i.indices(len(self)) - UserList.__setslice__(self, start, stop, item) - else: - UserList.__setitem__(self, i, item) - self._changed() - - def __delitem__(self, i): - if sys.version_info < (3, ) and isinstance(i, slice): - start, stop, _ = i.indices(len(self)) - UserList.__delslice__(self, start, stop) - else: - UserList.__delitem__(self, i) - self._changed() - - def __getitem__(self, i): - if sys.version_info < (3, ): - if isinstance(i, slice): - # TODO Return just a list. Why? - return [self[i] for i in range(*i.indices(len(self)))] - # return UserList([self[i] for i in range(*i.indices(len(self)))]) - return UserList.__getitem__(self, i) - - # NOTE: These wrappers are necessary because of python 2 - def __setslice__(self, i, j, other): - self.__setitem__(slice(i, j), other) - - def __delslice__(self, i, j): - self.__delitem__(slice(i, j)) - - def __getslice__(self, i, j): - return self.__getitem__(slice(i, j)) - - def __iadd__(self, other): - res = UserList.__iadd__(self, other) - self._changed() - return res - - def __imul__(self, n): - res = UserList.__imul__(self, n) - self._changed() - return res - - def append(self, item): - UserList.append(self, item) - self._changed() - - def insert(self, i, item): - UserList.insert(self, i, item) - self._changed() - - def pop(self, i=-1): - item = self[i] - del self[i] - return item - - def remove(self, item): - self.__delitem__(self.index(item)) - - def reverse(self): - UserList.reverse(self) - self._changed() - - def sort(self, *args, **kwds): - UserList.sort(self, *args, **kwds) - self._changed() - - def extend(self, other): - UserList.extend(self, other) - self._changed() - - -def get_domobj_range(content=[], position=0, direction=Direction.FORWARD, identify_fun=None): - u""" - Get the start and end line number of the dom obj lines from content. - - :content: String to be recognized dom obj - :positon: Line number in content - :direction: Search direction - :identify_fun: A identify function to recognize dom obj(Heading, Checkbox) title string. - - :return: Start and end line number for the recognized dom obj. - """ - len_cb = len(content) - - if position < 0 or position > len_cb: - return (None, None) - - tmp_line = position - start = None - end = None - - if direction == Direction.FORWARD: - while tmp_line < len_cb: - if identify_fun(content[tmp_line]) is not None: - if start is None: - start = tmp_line - elif end is None: - end = tmp_line - 1 - if start is not None and end is not None: - break - tmp_line += 1 - else: - while tmp_line >= 0 and tmp_line < len_cb: - if identify_fun(content[tmp_line]) is not None: - if start is None: - start = tmp_line - elif end is None: - end = tmp_line - 1 - if start is not None and end is not None: - break - tmp_line -= 1 if start is None else -1 - - return (start, end) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/checkboxes.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/checkboxes.py deleted file mode 100644 index fcf23a7..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/checkboxes.py +++ /dev/null @@ -1,406 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - checkboxes - ~~~~~~~~~~ - - TODO: explain this :) -""" - -import re -try: - from collections import UserList -except: - from UserList import UserList - -import vim -from orgmode.liborgmode.base import MultiPurposeList, flatten_list -from orgmode.liborgmode.orgdate import OrgTimeRange -from orgmode.liborgmode.orgdate import get_orgdate -from orgmode.liborgmode.dom_obj import DomObj, DomObjList, REGEX_SUBTASK, REGEX_SUBTASK_PERCENT, REGEX_HEADING, REGEX_CHECKBOX - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.unicode_compatibility import * - - -class Checkbox(DomObj): - u""" Structural checkbox object """ - STATUS_ON = u'[X]' - STATUS_OFF = u'[ ]' - # intermediate status - STATUS_INT = u'[-]' - - def __init__(self, level=1, type=u'-', title=u'', status=u'[ ]', body=None): - u""" - :level: Indent level of the checkbox - :type: Type of the checkbox list (-, +, *) - :title: Title of the checkbox - :status: Status of the checkbox ([ ], [X], [-]) - :body: Body of the checkbox - """ - DomObj.__init__(self, level=level, title=title, body=body) - - # heading - self._heading = None - - self._children = CheckboxList(obj=self) - self._dirty_checkbox = False - # list type - self._type = u'-' - if type: - self.type = type - # status - self._status = Checkbox.STATUS_OFF - if status: - self.status = status - - def __unicode__(self): - return u' ' * self.level + self.type + u' ' + \ - (self.status + u' ' if self.status else u'') + self.title - - def __str__(self): - return u_encode(self.__unicode__()) - - def __len__(self): - # 1 is for the heading's title - return 1 + len(self.body) - - def copy(self, including_children=True, parent=None): - u""" - Create a copy of the current checkbox. The checkbox will be completely - detached and not even belong to a document anymore. - - :including_children: If True a copy of all children is create as - well. If False the returned checkbox doesn't - have any children. - :parent: Don't use this parameter. It's set - automatically. - """ - checkbox = self.__class__( - level=self.level, title=self.title, - body=self.body[:]) - if parent: - parent.children.append(checkbox) - if including_children and self.children: - for item in self.children: - item.copy( - including_children=including_children, - parent=checkbox) - checkbox._orig_start = self._orig_start - checkbox._orig_len = self._orig_len - - checkbox._dirty_heading = self.is_dirty_checkbox - - return checkbox - - @classmethod - def parse_checkbox_from_data(cls, data, heading=None, orig_start=None): - u""" Construct a new checkbox from the provided data - - :data: List of lines - :heading: The heading object this checkbox belongs to - :orig_start: The original start of the heading in case it was read - from a document. If orig_start is provided, the - resulting heading will not be marked dirty. - - :returns: The newly created checkbox - """ - def parse_title(heading_line): - # checkbox is not heading - if REGEX_HEADING.match(heading_line) is not None: - return None - m = REGEX_CHECKBOX.match(heading_line) - if m: - r = m.groupdict() - return (len(r[u'level']), r[u'type'], r[u'status'], r[u'title']) - - return None - - if not data: - raise ValueError(u'Unable to create checkbox, no data provided.') - - # create new checkbox - nc = cls() - nc.level, nc.type, nc.status, nc.title = parse_title(data[0]) - nc.body = data[1:] - if orig_start is not None: - nc._dirty_heading = False - nc._dirty_body = False - nc._orig_start = orig_start - nc._orig_len = len(nc) - if heading: - nc._heading = heading - - return nc - - def update_subtasks(self, total=0, on=0): - if total != 0: - percent = (on * 100) / total - else: - percent = 0 - - count = "%d/%d" % (on, total) - self.title = REGEX_SUBTASK.sub("[%s]" % (count), self.title) - self.title = REGEX_SUBTASK_PERCENT.sub("[%d%%]" % (percent), self.title) - d = self._heading.document.write_checkbox(self, including_children=False) - - @classmethod - def identify_checkbox(cls, line): - u""" Test if a certain line is a checkbox or not. - - :line: the line to check - - :returns: indent_level - """ - # checkbox is not heading - if REGEX_HEADING.match(line) is not None: - return None - m = REGEX_CHECKBOX.match(line) - if m: - r = m.groupdict() - return len(r[u'level']) - - return None - - @property - def is_dirty(self): - u""" Return True if the heading's body is marked dirty """ - return self._dirty_checkbox or self._dirty_body - - @property - def is_dirty_checkbox(self): - u""" Return True if the heading is marked dirty """ - return self._dirty_checkbox - - def get_index_in_parent_list(self): - """ Retrieve the index value of current checkbox in the parents list of - checkboxes. This works also for top level checkboxes. - - :returns: Index value or None if heading doesn't have a - parent/document or is not in the list of checkboxes - """ - if self.parent: - return super(Checkbox, self).get_index_in_parent_list() - elif self.document: - l = self.get_parent_list() - if l: - return l.index(self) - - def get_parent_list(self): - """ Retrieve the parents' list of headings. This works also for top - level headings. - - :returns: List of headings or None if heading doesn't have a - parent/document or is not in the list of headings - """ - if self.parent: - return super(Checkbox, self).get_parent_list() - elif self.document: - if self in self.document.checkboxes: - return self.document.checkboxes - - def set_dirty(self): - u""" Mark the heading and body dirty so that it will be rewritten when - saving the document """ - self._dirty_checkbox = True - self._dirty_body = True - if self._document: - self._document.set_dirty_document() - - def set_dirty_checkbox(self): - u""" Mark the checkbox dirty so that it will be rewritten when saving the - document """ - self._dirty_checkbox = True - if self._document: - self._document.set_dirty_document() - - @property - def previous_checkbox(self): - u""" Serialized access to the previous checkbox """ - return super(Checkbox, self).previous_item - - @property - def next_checkbox(self): - u""" Serialized access to the next checkbox """ - return super(Checkbox, self).next_item - - @property - def first_checkbox(self): - u""" Access to the first child heading or None if no children exist """ - if self.children: - return self.children[0] - - @property - def start(self): - u""" Access to the starting line of the checkbox """ - return super(Checkbox, self).start - - def toggle(self): - u""" Toggle status of this checkbox """ - if self.status == Checkbox.STATUS_OFF or self.status is None: - self.status = Checkbox.STATUS_ON - else: - self.status = Checkbox.STATUS_OFF - self.set_dirty() - - def all_siblings(self): - if not self.parent: - p = self._heading - else: - p = self.parent - if not p.children: - return - - c = p.first_checkbox - while c: - yield c - c = c.next_sibling - return - - def all_children(self): - if not self.children: - return - - c = self.first_checkbox - while c: - yield c - for d in c.all_children(): - yield d - c = c.next_sibling - - return - - def all_children_status(self): - u""" Return checkboxes status for currnet checkbox's all children - - :return: (total, on) - total: total # of checkboxes - on: # of checkboxes which are on - """ - total, on = 0, 0 - for c in self.all_children(): - if c.status is not None: - total += 1 - - if c.status == Checkbox.STATUS_ON: - on += 1 - - return (total, on) - - def all_siblings_status(self): - u""" Return checkboxes status for currnet checkbox's all siblings - - :return: (total, on) - total: total # of checkboxes - on: # of checkboxes which are on - """ - total, on = 0, 0 - for c in self.all_siblings(): - if c.status is not None: - total += 1 - - if c.status == Checkbox.STATUS_ON: - on += 1 - - return (total, on) - - def are_children_all(self, status): - u""" Check all children checkboxes status """ - clen = len(self.children) - for i in range(clen): - if self.children[i].status != status: - return False - # recursively check children's status - if not self.children[i].are_children_all(status): - return False - - return True - - def is_child_one(self, status): - u""" Return true, if there is one child with given status """ - clen = len(self.children) - for i in range(clen): - if self.children[i].status == status: - return True - - return False - - def are_siblings_all(self, status): - u""" Check all sibling checkboxes status """ - for c in self.all_siblings(): - if c.status != status: - return False - - return True - - @DomObj.level.setter - def level(self, value): - u""" Set the checkbox level and mark the checkbox and the document - dirty """ - self._level = int(value) - self.set_dirty_checkbox() - - @DomObj.title.setter - def title(self, value): - u""" Set the title and mark the document and the checkbox dirty """ - if type(value) not in (unicode, str): - raise ValueError(u'Title must be a string.') - v = value - if type(v) == str: - v = u_decode(v) - self._title = v.strip() - self.set_dirty_checkbox() - - @property - def status(self): - u""" status of current checkbox """ - return self._status - - @status.setter - def status(self, value): - self._status = value - self.set_dirty() - - @status.deleter - def status(self): - self._status = u'' - - @property - def type(self): - u""" type of current checkbox list type """ - return self._type - - @type.setter - def type(self, value): - self._type = value - - @type.deleter - def type(self): - self._type = u'' - - -class CheckboxList(DomObjList): - u""" - Checkbox List - """ - def __init__(self, initlist=None, obj=None): - """ - :initlist: Initial data - :obj: Link to a concrete Checkbox or Document object - """ - # it's not necessary to register a on_change hook because the heading - # list will itself take care of marking headings dirty or adding - # headings to the deleted headings list - DomObjList.__init__(self, initlist, obj) - - @classmethod - def is_checkbox(cls, obj): - return CheckboxList.is_domobj(obj) - - def _get_heading(self): - if self.__class__.is_checkbox(self._obj): - return self._obj._document - return self._obj - - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/documents.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/documents.py deleted file mode 100644 index a2eeca7..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/documents.py +++ /dev/null @@ -1,315 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - documents - ~~~~~~~~~ - - TODO: explain this :) -""" - -try: - from collections import UserList -except: - from UserList import UserList - -from orgmode.liborgmode.base import MultiPurposeList, flatten_list, Direction, get_domobj_range -from orgmode.liborgmode.headings import Heading, HeadingList - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.unicode_compatibility import * - -class Document(object): - u""" - Representation of a whole org-mode document. - - A Document consists basically of headings (see Headings) and some metadata. - - TODO: explain the 'dirty' mechanism - """ - - def __init__(self): - u""" - Don't call this constructor directly but use one of the concrete - implementations. - - TODO: what are the concrete implementatiions? - """ - object.__init__(self) - - # is a list - only the Document methods should work on this list! - self._content = None - self._dirty_meta_information = False - self._dirty_document = False - self._meta_information = MultiPurposeList( - on_change=self.set_dirty_meta_information) - self._orig_meta_information_len = None - self._headings = HeadingList(obj=self) - self._deleted_headings = [] - - # settings needed to align tags properly - self._tabstop = 8 - self._tag_column = 77 - - # TODO this doesn't differentiate between ACTIVE and FINISHED todo's - self.todo_states = [u'TODO', u'DONE'] - - def __unicode__(self): - if self.meta_information is None: - return u'\n'.join(self.all_headings()) - return u'\n'.join(self.meta_information) + u'\n' + u'\n'.join([u'\n'.join([unicode(i)] + i.body) for i in self.all_headings()]) - - def __str__(self): - return u_encode(self.__unicode__()) - - def get_all_todo_states(self): - u""" Convenience function that returns all todo and done states and - sequences in one big list. - - Returns: - list: [all todo/done states] - """ - # TODO This is not necessary remove - return flatten_list(self.get_todo_states()) - - def get_todo_states(self): - u""" Returns a list containing a tuple of two lists of allowed todo - states split by todo and done states. Multiple todo-done state - sequences can be defined. - - Returns: - list: [([todo states], [done states]), ..] - """ - # TODO this should be made into property so todo states can be set like - # this too.. or there was also some todo property around... oh well.. - # TODO there is the same method in vimbuffer - return self.todo_states - - @property - def tabstop(self): - u""" Tabstop for this document """ - return self._tabstop - - @tabstop.setter - def tabstop(self, value): - self._tabstop = value - - @property - def tag_column(self): - u""" The column all tags are right-aligned to """ - return self._tag_column - - @tag_column.setter - def tag_column(self, value): - self._tag_column = value - - def init_dom(self, heading=Heading): - u""" Initialize all headings in document - build DOM. This method - should be call prior to accessing the document. - - Returns: - self - """ - def init_heading(_h): - u""" - :returns the initialized heading - """ - start = _h.end + 1 - prev_heading = None - while True: - new_heading = self.find_heading(start, heading=heading) - - # * Heading 1 <- heading - # * Heading 1 <- sibling - # or - # * Heading 2 <- heading - # * Heading 1 <- parent's sibling - if not new_heading or \ - new_heading.level <= _h.level: - break - - # * Heading 1 <- heading - # * Heading 2 <- first child - # * Heading 2 <- another child - new_heading._parent = _h - if prev_heading: - prev_heading._next_sibling = new_heading - new_heading._previous_sibling = prev_heading - _h.children.data.append(new_heading) - # the start and end computation is only - # possible when the new heading was properly - # added to the document structure - init_heading(new_heading) - if new_heading.children: - # skip children - start = new_heading.end_of_last_child + 1 - else: - start = new_heading.end + 1 - prev_heading = new_heading - - return _h - - h = self.find_heading(heading=heading) - # initialize meta information - if h: - self._meta_information.data.extend(self._content[:h._orig_start]) - else: - self._meta_information.data.extend(self._content[:]) - self._orig_meta_information_len = len(self.meta_information) - - # initialize dom tree - prev_h = None - while h: - if prev_h: - prev_h._next_sibling = h - h._previous_sibling = prev_h - self.headings.data.append(h) - init_heading(h) - prev_h = h - h = self.find_heading(h.end_of_last_child + 1, heading=heading) - - return self - - @property - def meta_information(self): - u""" Meta information is text that precedes all headings in an org-mode - document. It might contain additional information about the document, - e.g. author - """ - return self._meta_information - - @meta_information.setter - def meta_information(self, value): - if self._orig_meta_information_len is None: - self._orig_meta_information_len = len(self.meta_information) - if type(value) in (list, tuple) or isinstance(value, UserList): - self._meta_information[:] = flatten_list(value) - elif type(value) in (str, ): - self._meta_information[:] = u_decode(value).split(u'\n') - elif type(value) in (unicode, ): - self._meta_information[:] = value.split(u'\n') - self.set_dirty_meta_information() - - @meta_information.deleter - def meta_information(self): - self.meta_information = u'' - - @property - def headings(self): - u""" List of top level headings """ - return self._headings - - @headings.setter - def headings(self, value): - self._headings[:] = value - - @headings.deleter - def headings(self): - del self.headings[:] - - def write(self): - u""" Write the document - - Returns: - bool: True if something was written, otherwise False - """ - raise NotImplementedError(u'Abstract method, please use concrete impelementation!') - - def set_dirty_meta_information(self): - u""" Mark the meta information dirty. - - Note: - Causes meta information to be rewritten when saving the document - """ - self._dirty_meta_information = True - - def set_dirty_document(self): - u""" Mark the whole document dirty. - - Note: - When changing a heading this method must be executed in order to - changed computation of start and end positions from a static to a - dynamic computation - """ - self._dirty_document = True - - @property - def is_dirty(self): - u""" Return information about unsaved changes for the document and all - related headings. - - Returns: - bool: True if document contains unsaved changes. - """ - if self.is_dirty_meta_information: - return True - - if self.is_dirty_document: - return True - - if self._deleted_headings: - return True - - return False - - @property - def is_dirty_meta_information(self): - u""" Return True if the meta information is marked dirty """ - return self._dirty_meta_information - - @property - def is_dirty_document(self): - u""" Return True if the document is marked dirty """ - return self._dirty_document - - def all_headings(self): - u""" Iterate over all headings of the current document in serialized - order - - :returns: Returns an iterator object which returns all headings of - the current file in serialized order - """ - if not self.headings: - return - - h = self.headings[0] - while h: - yield h - h = h.next_heading - return - - def find_heading( - self, position=0, direction=Direction.FORWARD, heading=Heading, - connect_with_document=True): - u""" Find heading in the given direction - - Args: - position (int): starting line, counting from 0 (in vim you start - counting from 1, don't forget) - direction: downwards == Direction.FORWARD, - upwards == Direction.BACKWARD - heading: Heading class from which new heading objects will be - instanciated - connect_with_document: if True, the newly created heading will be - connected with the document, otherwise not - - Returns: - heading or None: New heading - """ - start, end = get_domobj_range( - content=self._content, position=position, direction=direction, - identify_fun=heading.identify_heading) - - if start is None: - return None - - if end is None: - end = len(self._content) - 1 - - document = self if connect_with_document else None - - return heading.parse_heading_from_data( - self._content[start:end + 1], self.get_all_todo_states(), - document=document, orig_start=start) - - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/dom_obj.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/dom_obj.py deleted file mode 100644 index 5270d19..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/dom_obj.py +++ /dev/null @@ -1,505 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - dom object - ~~~~~~~~~~ - - TODO: explain this :) -""" - -import re -from orgmode.liborgmode.base import MultiPurposeList, flatten_list - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.unicode_compatibility import * - -try: - from collections import UserList -except: - from UserList import UserList - -# breaking down tasks regex -REGEX_SUBTASK = re.compile(r'\[(\d*)/(\d*)\]') -REGEX_SUBTASK_PERCENT = re.compile(r'\[(\d*)%\]') - -# heading regex -REGEX_HEADING = re.compile( - r'^(?P\*+)(\s+(?P.*?))?\s*(\s(?P<tags>:[\w_:@]+:))?$', - flags=re.U) -REGEX_TAG = re.compile( - r'^\s*((?P<title>[^\s]*?)\s+)?(?P<tags>:[\w_:@]+:)$', - flags=re.U) -REGEX_TODO = re.compile(r'^[^\s]*$') - -# checkbox regex: -# - [ ] checkbox item -# - [X] checkbox item -# - [ ] -# - no status checkbox -UnOrderListType = [u'-', u'+', u'*'] -OrderListType = [u'.', u')'] -REGEX_CHECKBOX = re.compile( - r'^(?P<level>\s*)(?P<type>[%s]|([a-zA-Z]|[\d]+)[%s])(\s+(?P<status>\[.\]))?\s*(?P<title>.*)$' - % (''.join(UnOrderListType), ''.join(OrderListType)), flags=re.U) - - -class DomObj(object): - u""" - A DomObj is DOM structure element, like Heading and Checkbox. - Its purpose is to abstract the same parts of Heading and Checkbox objects, - and make code reusable. - - All methods and properties are extracted from Heading object. - Heading and Checkbox objects inherit from DomObj, and override some specific - methods in their own objects. - - Normally, we don't intend to use DomObj directly. However, we can add some more - DOM structure element based on this class to make code more concise. - """ - # TODO should this and DomObj_list be abstract methods? If so use ABC to - # force abstract methods - - def __init__(self, level=1, title=u'', body=None): - u""" - :level: Level of the dom object - :title: Title of the dom object - :body: Body of the dom object - """ - object.__init__(self) - - self._document = None - self._parent = None - self._previous_sibling = None - self._next_sibling = None - self._children = MultiPurposeList() - self._orig_start = None - self._orig_len = 0 - - self._level = level - # title - self._title = u'' - if title: - self.title = title - - # body - self._dirty_body = False - self._body = MultiPurposeList(on_change=self.set_dirty_body) - if body: - self.body = body - - def __unicode__(self): - return u'<dom obj level=%s, title=%s>' % (level, title) - - def __str__(self): - return u_encode(self.__unicode__()) - - def __len__(self): - # 1 is for the heading's title - return 1 + len(self.body) - - @property - def is_dirty(self): - u""" Return True if the dom obj body is marked dirty """ - return self._dirty_body - - @property - def is_dirty_body(self): - u""" Return True if the dom obj body is marked dirty """ - return self._dirty_body - - def get_index_in_parent_list(self): - """ Retrieve the index value of current dom obj in the parents list of - dom objs. This works also for top level dom objs. - - :returns: Index value or None if dom obj doesn't have a - parent/document or is not in the list of dom objs - """ - l = self.get_parent_list() - if l: - return l.index(self) - - def get_parent_list(self): - """ Retrieve the parents list of dom objs. This works also for top - level dom objs. - - :returns: List of dom objs or None if dom objs doesn't have a - parent/document or is not in the list of dom objs - """ - if self.parent: - if self in self.parent.children: - return self.parent.children - - def set_dirty(self): - u""" Mark the dom objs and body dirty so that it will be rewritten when - saving the document """ - if self._document: - self._document.set_dirty_document() - - def set_dirty_body(self): - u""" Mark the dom objs' body dirty so that it will be rewritten when - saving the document """ - self._dirty_body = True - if self._document: - self._document.set_dirty_document() - - @property - def document(self): - u""" Read only access to the document. If you want to change the - document, just assign the dom obj to another document """ - return self._document - - @property - def parent(self): - u""" Access to the parent dom obj """ - return self._parent - - @property - def number_of_parents(self): - u""" Access to the number of parent dom objs before reaching the root - document """ - def count_parents(h): - if h.parent: - return 1 + count_parents(h.parent) - else: - return 0 - return count_parents(self) - - @property - def previous_sibling(self): - u""" Access to the previous dom obj that's a sibling of the current one - """ - return self._previous_sibling - - @property - def next_sibling(self): - u""" Access to the next dom obj that's a sibling of the current one """ - return self._next_sibling - - @property - def previous_item(self): - u""" Serialized access to the previous dom obj """ - if self.previous_sibling: - h = self.previous_sibling - while h.children: - h = h.children[-1] - return h - elif self.parent: - return self.parent - - @property - def next_item(self): - u""" Serialized access to the next dom obj """ - if self.children: - return self.children[0] - elif self.next_sibling: - return self.next_sibling - else: - h = self.parent - while h: - if h.next_sibling: - return h.next_sibling - else: - h = h.parent - - @property - def start(self): - u""" Access to the starting line of the dom obj """ - if self.document is None or not self.document.is_dirty: - return self._orig_start - - def item_len_generator(h): - while h: - yield len(h) - h = h.previous_item - return sum(item for item in item_len_generator(self.previous_item)) - - @property - def start_vim(self): - if self.start is not None: - return self.start + 1 - - @property - def end(self): - u""" Access to the ending line of the dom obj """ - if self.start is not None: - return self.start + len(self.body) - - @property - def end_vim(self): - if self.end is not None: - return self.end + 1 - - @property - def end_of_last_child(self): - u""" Access to end of the last child """ - if self.children: - child = self.children[-1] - while child.children: - child = child.children[-1] - return child.end - return self.end - - @property - def end_of_last_child_vim(self): - return self.end_of_last_child + 1 - - @property - def children(self): - u""" MultiPurposeList[dom_objects??]: subheadings of the current DomObj - - Setter method takes list, tuple or userlist with DOMObjects - """ - return self._children - - @children.setter - def children(self, value): - v = value - if type(v) in (list, tuple) or isinstance(v, UserList): - v = flatten_list(v) - self._children[:] = v - - @children.deleter - def children(self): - del self.children[:] - - @property - def first_child(self): - u""" Access to the first child dom obj or None if no children exist """ - if self.children: - return self.children[0] - - @property - def last_child(self): - u""" Access to the last child dom obj or None if no children exist """ - if self.children: - return self.children[-1] - - @property - def level(self): - u""" int: Access the the dom obj level - - Setter sets the DOM object and the document as dirty if invoked. - """ - return self._level - - @level.setter - def level(self, value): - # TODO Shouldn't there be and error when values is not int? - self._level = int(value) - self.set_dirty() - - @level.deleter - def level(self): - self.level = None - - @property - def title(self): - u""" str: Get the title of current dom object - - Setter sets the DOM object and the document as dirty if invoked. - """ - return self._title.strip() - - @title.setter - def title(self, value): - if type(value) not in (unicode, str): - raise ValueError(u'Title must be a string.') - v = value - if type(v) == str: - v = u_decode(v) - self._title = v.strip() - self.set_dirty() - - @title.deleter - def title(self): - self._title = u'' - - @property - def body(self): - u""" MultiPurposeList[]: Holds the content belonging to the heading """ - return self._body - - @body.setter - def body(self, value): - if type(value) in (list, tuple) or isinstance(value, UserList): - self._body[:] = flatten_list(value) - elif type(value) in (str, ): - self._body[:] = u_decode(value).split(u'\n') - elif type(value) in (unicode, ): - self._body[:] = value.split(u'\n') - else: - self.body = list(unicode(value)) - - @body.deleter - def body(self): - # TODO write this as del self._body[:] because there is no reason to - # call so much code for deleting a list - self.body = [] - - -class DomObjList(MultiPurposeList): - u""" - A Dom Obj List - """ - def __init__(self, initlist=None, obj=None): - """ - :initlist: Initial data - :obj: Link to a concrete Heading or Document object - """ - # it's not necessary to register a on_change hook because the heading - # list will itself take care of marking headings dirty or adding - # headings to the deleted headings list - MultiPurposeList.__init__(self) - - self._obj = obj - - # initialization must be done here, because - # self._document is not initialized when the - # constructor of MultiPurposeList is called - if initlist: - self.extend(initlist) - - @classmethod - def is_domobj(cls, obj): - # TODO no reason for it to be class method. Does it even need to exist - # because it is quite clear what isinstance does and in derived methods - # isinstance(Heading, DomObj) would return True anyway. - return isinstance(obj, DomObj) - - # TODO this should be made into a property - def _get_document(self): - if self.__class__.is_domobj(self._obj): - return self._obj._document - return self._obj - - def __setitem__(self, i, item): - if isinstance(i, slice): - o = item - if self.__class__.is_domobj(o): - o = (o, ) - o = flatten_list(o) - for item in o: - if not self.__class__.is_domobj(item): - raise ValueError(u'List contains items that are not a Dom obj!') - - # self._add_to_deleted_domobjs(self[i:j]) - # self._associate_domobj(o, \ - # self[i - 1] if i - 1 >= 0 and i < len(self) else None, \ - # self[j] if j >= 0 and j < len(self) else None) - MultiPurposeList.__setitem__(self, i, o) - else: - if not self.__class__.is_domobj(item): - raise ValueError(u'Item is not a Dom obj!') - if item in self: - raise ValueError(u'Dom obj is already part of this list!') - # self._add_to_deleted_domobjs(self[i]) - - # self._associate_domobj(item, \ - # self[i - 1] if i - 1 >= 0 else None, \ - # self[i + 1] if i + 1 < len(self) else None) - MultiPurposeList.__setitem__(self, i, item) - - def __delitem__(self, i, taint=True): - if isinstance(i, slice): - items = self[i] - if items: - first = items[0] - last = items[-1] - if first.previous_sibling: - first.previous_sibling._next_sibling = last.next_sibling - if last.next_sibling: - last.next_sibling._previous_sibling = first.previous_sibling - # if taint: - # self._add_to_deleted_domobjs(items) - else: - item = self[i] - if item.previous_sibling: - item.previous_sibling._next_sibling = item.next_sibling - if item.next_sibling: - item.next_sibling._previous_sibling = item.previous_sibling - - # if taint: - # self._add_to_deleted_domobjs(item) - MultiPurposeList.__delitem__(self, i) - - def __setslice__(self, i, j, other): - self.__setitem__(slice(i, j), other) - - def __delslice__(self, i, j, taint=True): - self.__delitem__(slice(i, j), taint=taint) - - def __iadd__(self, other): - o = other - if self.__class__.is_domobj(o): - o = (o, ) - for item in flatten_list(o): - if not self.__class__.is_domobj(item): - raise ValueError(u'List contains items that are not a Dom obj!') - # self._associate_domobj(o, self[-1] if len(self) > 0 else None, None) - return MultiPurposeList.__iadd__(self, o) - - def __imul__(self, n): - # TODO das müsste eigentlich ein klonen von objekten zur Folge haben - return MultiPurposeList.__imul__(self, n) - - def append(self, item, taint=True): - if not self.__class__.is_domobj(item): - raise ValueError(u'Item is not a heading!') - if item in self: - raise ValueError(u'Heading is already part of this list!') - # self._associate_domobj( - # item, self[-1] if len(self) > 0 else None, - # None, taint=taint) - MultiPurposeList.append(self, item) - - def insert(self, i, item, taint=True): - # self._associate_domobj( - # item, - # self[i - 1] if i - 1 >= 0 and i - 1 < len(self) else None, - # self[i] if i >= 0 and i < len(self) else None, taint=taint) - MultiPurposeList.insert(self, i, item) - - def pop(self, i=-1): - item = self[i] - # self._add_to_deleted_domobjs(item) - del self[i] - return item - - def remove_slice(self, i, j, taint=True): - self.__delitem__(slice(i, j), taint=taint) - - def remove(self, item, taint=True): - self.__delitem__(self.index(item), taint=taint) - - def reverse(self): - MultiPurposeList.reverse(self) - prev_h = None - for h in self: - h._previous_sibling = prev_h - h._next_sibling = None - prev_h._next_sibling = h - h.set_dirty() - prev_h = h - - def sort(self, *args, **kwds): - MultiPurposeList.sort(*args, **kwds) - prev_h = None - for h in self: - h._previous_sibling = prev_h - h._next_sibling = None - prev_h._next_sibling = h - h.set_dirty() - prev_h = h - - def extend(self, other): - o = other - if self.__class__.is_domobj(o): - o = (o, ) - for item in o: - if not self.__class__.is_domobj(item): - raise ValueError(u'List contains items that are not a heading!') - # self._associate_domobj(o, self[-1] if len(self) > 0 else None, None) - MultiPurposeList.extend(self, o) - - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/headings.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/headings.py deleted file mode 100644 index 228a4ba..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/headings.py +++ /dev/null @@ -1,889 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - headings - ~~~~~~~~~ - - TODO: explain this :) -""" - -import re - -import vim -from orgmode.liborgmode.base import MultiPurposeList, flatten_list, Direction, get_domobj_range -from orgmode.liborgmode.orgdate import OrgTimeRange -from orgmode.liborgmode.orgdate import get_orgdate -from orgmode.liborgmode.checkboxes import Checkbox, CheckboxList -from orgmode.liborgmode.dom_obj import DomObj, DomObjList, REGEX_SUBTASK, REGEX_SUBTASK_PERCENT, REGEX_HEADING, REGEX_TAG, REGEX_TODO - -from orgmode.py3compat.xrange_compatibility import * -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.unicode_compatibility import * - -try: - from collections import UserList -except: - from UserList import UserList - from itertools import ifilter as filter - -class Heading(DomObj): - u""" Structural heading object """ - - def __init__(self, level=1, title=u'', tags=None, todo=None, body=None, active_date=None): - u""" - :level: Level of the heading - :title: Title of the heading - :tags: Tags of the heading - :todo: Todo state of the heading - :body: Body of the heading - :active_date: active date that is used in the agenda - """ - DomObj.__init__(self, level=level, title=title, body=body) - - self._children = HeadingList(obj=self) - self._dirty_heading = False - - # todo - self._todo = None - if todo: - self.todo = todo - - # tags - self._tags = MultiPurposeList(on_change=self.set_dirty_heading) - if tags: - self.tags = tags - - # active date - self._active_date = active_date - if active_date: - self.active_date = active_date - - # checkboxes - self._checkboxes = CheckboxList(obj=self) - self._cached_checkbox = None - - def __unicode__(self): - res = u'*' * self.level - if self.todo: - res = u' '.join((res, self.todo)) - if self.title: - res = u' '.join((res, self.title)) - - # compute position of tags - if self.tags: - tabs = 0 - spaces = 2 - tags = u':%s:' % (u':'.join(self.tags), ) - - # FIXME this is broken because of missing associations for headings - ts = 6 - tag_column = 77 - if self.document: - ts = self.document.tabstop - tag_column = self.document.tag_column - - len_heading = len(res) - len_tags = len(tags) - if len_heading + spaces + len_tags < tag_column: - spaces_to_next_tabstop = ts - divmod(len_heading, ts)[1] - - if len_heading + spaces_to_next_tabstop + len_tags < tag_column: - tabs, spaces = divmod( - tag_column - (len_heading + spaces_to_next_tabstop + len_tags), - ts) - - if spaces_to_next_tabstop: - tabs += 1 - else: - spaces = tag_column - (len_heading + len_tags) - - res += u'\t' * tabs + u' ' * spaces + tags - - # append a trailing space when there are just * and no text - if len(res) == self.level: - res += u' ' - return res - - def __str__(self): - return u_encode(self.__unicode__()) - - def __len__(self): - # 1 is for the heading's title - return 1 + len(self.body) - - def __lt__(self, other): - """ - Headings can be sorted by date. - """ - try: - if self.active_date < other.active_date: - return True - elif self.active_date == other.active_date: - return False - elif self.active_date > other.active_date: - return False - except: - if self.active_date and not other.active_date: - return True - elif not self.active_date and other.active_date: - return False - elif not self.active_date and not other.active_date: - return False - - def __le__(self, other): - """ - Headings can be sorted by date. - """ - try: - if self.active_date < other.active_date: - return True - elif self.active_date == other.active_date: - return True - elif self.active_date > other.active_date: - return False - except: - if self.active_date and not other.active_date: - return True - elif not self.active_date and other.active_date: - return False - elif not self.active_date and not other.active: - return True - - def __ge__(self, other): - """ - Headings can be sorted by date. - """ - try: - if self.active_date > other.active_date: - return True - elif self.active_date == other.active_date: - return True - elif self.active_date < other.active_date: - return False - except: - if not self.active_date and other.active_date: - return True - elif self.active_date and not other.active_date: - return False - elif not self.active_date and not other.active: - return True - - def __gt__(self, other): - """ - Headings can be sorted by date. - """ - try: - if self.active_date > other.active_date: - return True - elif self.active_date == other.active_date: - return False - elif self.active_date < other.active_date: - return False - except: - if not self.active_date and other.active_date: - return True - elif self.active_date and not other.active_date: - return False - elif not self.active_date and not other.active: - return False - - def copy(self, including_children=True, parent=None): - u""" - Create a copy of the current heading. The heading will be completely - detached and not even belong to a document anymore. - - :including_children: If True a copy of all children is create as - well. If False the returned heading doesn't - have any children. - :parent: Don't use this parameter. It's set - automatically. - """ - heading = self.__class__( - level=self.level, title=self.title, - tags=self.tags, todo=self.todo, body=self.body[:]) - if parent: - parent.children.append(heading) - if including_children and self.children: - for item in self.children: - item.copy( - including_children=including_children, - parent=heading) - heading._orig_start = self._orig_start - heading._orig_len = self._orig_len - - heading._dirty_heading = self.is_dirty_heading - - return heading - - def all_checkboxes(self): - u""" Iterate over all checkboxes of the current heading in serialized - order - - :returns: Returns an iterator object which returns all checkboxes of - the current heading in serialized order - """ - if not self.checkboxes: - return - - c = self.first_checkbox - while c: - yield c - c = c.next_checkbox - return - - def all_toplevel_checkboxes(self): - u""" return all top level checkboxes for current heading """ - if not self.checkboxes: - return - - c = self.first_checkbox - while c: - yield c - c = c.next_sibling - return - - def find_checkbox(self, position=0, direction=Direction.FORWARD, - checkbox=Checkbox, connect_with_heading=True): - u""" Find checkbox in the given direction - - :postition: starting line, counting from 0 (in vim you start - counting from 1, don't forget) - :direction: downwards == Direction.FORWARD, - upwards == Direction.BACKWARD - :checkbox: Checkbox class from which new checkbox objects will be - instanciated - :connect_with_heading: if True, the newly created checkbox will be - connected with the heading, otherwise not - - :returns: New checkbox object or None - """ - doc = self.document - (start, end) = get_domobj_range(content=doc._content, position=position, direction=direction, identify_fun=checkbox.identify_checkbox) - # if out of current headinig range, reutrn None - heading_end = self.start + len(self) - 1 - if start is not None and start > heading_end: - return None - - if end is not None and end > heading_end: - end = heading_end - - if start is not None and end is None: - end = heading_end - if start is not None and end is not None: - return checkbox.parse_checkbox_from_data( - doc._content[start:end + 1], - heading=self if connect_with_heading else None, orig_start=start) - - def init_checkboxes(self, checkbox=Checkbox): - u""" Initialize all checkboxes in current heading - build DOM. - - :returns: self - """ - def init_checkbox(_c): - u""" - :returns the initialized checkbox - """ - start = _c.end + 1 - prev_checkbox = None - while True: - new_checkbox = self.find_checkbox(start, checkbox=checkbox) - - # * Checkbox 1 <- checkbox - # * Checkbox 1 <- sibling - # or - # * Checkbox 2 <- checkbox - # * Checkbox 1 <- parent's sibling - if not new_checkbox or \ - new_checkbox.level <= _c.level: - break - - # * Checkbox 1 <- heading - # * Checkbox 2 <- first child - # * Checkbox 2 <- another child - new_checkbox._parent = _c - if prev_checkbox: - prev_checkbox._next_sibling = new_checkbox - new_checkbox._previous_sibling = prev_checkbox - _c.children.data.append(new_checkbox) - # the start and end computation is only - # possible when the new checkbox was properly - # added to the document structure - init_checkbox(new_checkbox) - if new_checkbox.children: - # skip children - start = new_checkbox.end_of_last_child + 1 - else: - start = new_checkbox.end + 1 - prev_checkbox = new_checkbox - - return _c - - c = self.find_checkbox(checkbox=checkbox, position=self.start) - - # initialize dom tree - prev_c = None - while c: - if prev_c and prev_c.level == c.level: - prev_c._next_sibling = c - c._previous_sibling = prev_c - self.checkboxes.data.append(c) - init_checkbox(c) - prev_c = c - c = self.find_checkbox(c.end_of_last_child + 1, checkbox=checkbox) - - return self - - def current_checkbox(self, position=None): - u""" Find the current checkbox (search backward) and return the related object - :returns: Checkbox object or None - """ - if position is None: - position = vim.current.window.cursor[0] - 1 - - if not self.checkboxes: - return - - def binaryFindInHeading(): - hi = len(self.checkboxes) - lo = 0 - while lo < hi: - mid = (lo + hi) // 2 - c = self.checkboxes[mid] - if c.end_of_last_child < position: - lo = mid + 1 - elif c.start > position: - hi = mid - else: - return binaryFindCheckbox(c) - - def binaryFindCheckbox(checkbox): - if not checkbox.children or checkbox.end >= position: - return checkbox - - hi = len(checkbox.children) - lo = 0 - while lo < hi: - mid = (lo + hi) // 2 - c = checkbox.children[mid] - if c.end_of_last_child < position: - lo = mid + 1 - elif c.start > position: - hi = mid - else: - return binaryFindCheckbox(c) - - # look at the cache to find the heading - c_tmp = self._cached_checkbox - if c_tmp is not None: - if c_tmp.end_of_last_child > position and \ - c_tmp.start < position: - if c_tmp.end < position: - self._cached_checkbox = binaryFindCheckbox(c_tmp) - return self._cached_checkbox - - self._cached_checkbox = binaryFindInHeading() - return self._cached_checkbox - - @property - def first_checkbox(self): - u""" Access to the first child checkbox or None if no children exist """ - if self.checkboxes: - return self.checkboxes[0] - - @classmethod - def parse_heading_from_data( - cls, data, allowed_todo_states, document=None, - orig_start=None): - u""" Construct a new heading from the provided data - - :data: List of lines - :allowed_todo_states: TODO??? - :document: The document object this heading belongs to - :orig_start: The original start of the heading in case it was read - from a document. If orig_start is provided, the - resulting heading will not be marked dirty. - - :returns: The newly created heading - """ - test_not_empty = lambda x: x != u'' - - def parse_title(heading_line): - # WARNING this regular expression fails if there is just one or no - # word in the heading but a tag! - m = REGEX_HEADING.match(heading_line) - if m: - r = m.groupdict() - level = len(r[u'level']) - todo = None - title = u'' - tags = filter(test_not_empty, r[u'tags'].split(u':')) if r[u'tags'] else [] - tags = list(tags) - - # if there is just one or no word in the heading, redo the parsing - mt = REGEX_TAG.match(r[u'title']) - if not tags and mt: - r = mt.groupdict() - tags = filter(test_not_empty, r[u'tags'].split(u':')) if r[u'tags'] else [] - tags = list(tags) - if r[u'title'] is not None: - _todo_title = [i.strip() for i in r[u'title'].split(None, 1)] - if _todo_title and _todo_title[0] in allowed_todo_states: - todo = _todo_title[0] - if len(_todo_title) > 1: - title = _todo_title[1] - else: - title = r[u'title'].strip() - - return (level, todo, title, tags) - raise ValueError(u'Data doesn\'t start with a heading definition.') - - if not data: - raise ValueError(u'Unable to create heading, no data provided.') - - # create new heaing - new_heading = cls() - new_heading.level, new_heading.todo, new_heading.title, new_heading.tags = parse_title(data[0]) - new_heading.body = data[1:] - if orig_start is not None: - new_heading._dirty_heading = False - new_heading._dirty_body = False - new_heading._orig_start = orig_start - new_heading._orig_len = len(new_heading) - if document: - new_heading._document = document - - # try to find active dates - tmp_orgdate = get_orgdate(data) - if tmp_orgdate and tmp_orgdate.active \ - and not isinstance(tmp_orgdate, OrgTimeRange): - new_heading.active_date = tmp_orgdate - else: - new_heading.active_date = None - - return new_heading - - def update_subtasks(self, total=0, on=0): - u""" Update subtask information for current heading - :total: total # of top level checkboxes - :on: # of top level checkboxes which are on - """ - if total != 0: - percent = (on * 100) / total - else: - percent = 0 - - count = "%d/%d" % (on, total) - self.title = REGEX_SUBTASK.sub("[%s]" % (count), self.title) - self.title = REGEX_SUBTASK_PERCENT.sub("[%d%%]" % (percent), self.title) - self.document.write_heading(self, including_children=False) - - @staticmethod - def identify_heading(line): - u""" Test if a certain line is a heading or not. - - Args: - line (str): the line to check - - Returns: - int or None: level of heading or None if line is not heading - """ - # TODO would it make sense to return 0 for heading level? - # TODO add tests e.g. '*** abc', '**', '', '* ', '*\t', '*' - for i, item in enumerate(line): - if item == '*': - continue - elif i and item in ('\t', ' '): - return i - break - return None - - @property - def is_dirty(self): - u""" Return True if the heading's body is marked dirty """ - return self._dirty_heading or self._dirty_body - - @property - def is_dirty_heading(self): - u""" Return True if the heading is marked dirty """ - return self._dirty_heading - - def get_index_in_parent_list(self): - """ Retrieve the index value of current heading in the parents list of - headings. This works also for top level headings. - - :returns: Index value or None if heading doesn't have a - parent/document or is not in the list of headings - """ - if self.parent: - return super(Heading, self).get_index_in_parent_list() - elif self.document: - l = self.get_parent_list() - if l: - return l.index(self) - - def get_parent_list(self): - """ Retrieve the parents' list of headings. This works also for top - level headings. - - :returns: List of headings or None if heading doesn't have a - parent/document or is not in the list of headings - """ - if self.parent: - return super(Heading, self).get_parent_list() - elif self.document: - if self in self.document.headings: - return self.document.headings - - def set_dirty(self): - u""" Mark the heading and body dirty so that it will be rewritten when - saving the document """ - self._dirty_heading = True - self._dirty_body = True - if self._document: - self._document.set_dirty_document() - - def set_dirty_heading(self): - u""" Mark the heading dirty so that it will be rewritten when saving the - document """ - self._dirty_heading = True - if self._document: - self._document.set_dirty_document() - - @property - def previous_heading(self): - u""" Serialized access to the previous heading """ - return super(Heading, self).previous_item - - @property - def next_heading(self): - u""" Serialized access to the next heading """ - return super(Heading, self).next_item - - @property - def start(self): - u""" Access to the starting line of the heading """ - if self.document is None or not self.document.is_dirty: - return self._orig_start - - meta_len = len(self.document.meta_information) if \ - self.document.meta_information else 0 - return super(Heading, self).start + meta_len - - @DomObj.level.setter - def level(self, value): - u""" Set the heading level and mark the heading and the document dirty """ - self._level = int(value) - self.set_dirty_heading() - - @property - def todo(self): - u""" Todo state of current heading. When todo state is set""" - # extract todo state from heading - return self._todo - - @todo.setter - def todo(self, value): - # update todo state - if type(value) not in (unicode, str, type(None)): - raise ValueError(u'Todo state must be a string or None.') - if value and not REGEX_TODO.match(value): - raise ValueError(u'Found non allowed character in todo state! %s' % value) - if not value: - self._todo = None - else: - v = value - if type(v) == str: - v = u_decode(v) - self._todo = v - self.set_dirty_heading() - - @todo.deleter - def todo(self): - self.todo = None - - @property - def active_date(self): - u""" - active date of the hearing. - - active dates are used in the agenda view. they can be part of the - heading and/or the body. - """ - return self._active_date - - @active_date.setter - def active_date(self, value): - self._active_date = value - - @active_date.deleter - def active_date(self): - self._active_date = None - - @DomObj.title.setter - def title(self, value): - u""" Set the title and mark the document and the heading dirty """ - # TODO these setter should be rewriten to also reuse code from DOM OBJ - if type(value) not in (unicode, str): - raise ValueError(u'Title must be a string.') - v = value - if type(v) == str: - v = u_decode(v) - self._title = v.strip() - self.set_dirty_heading() - - @property - def tags(self): - u""" Tags of the current heading """ - return self._tags - - @tags.setter - def tags(self, value): - v = value - if type(v) in (unicode, str): - v = list(unicode(v)) - if type(v) not in (list, tuple) and not isinstance(v, UserList): - v = list(unicode(v)) - v = flatten_list(v) - v_decoded = [] - for i in v: - if type(i) not in (unicode, str): - raise ValueError(u'Found non string value in tags! %s' % unicode(i)) - if u':' in i: - raise ValueError(u'Found non allowed character in tag! %s' % i) - i_tmp = i.strip().replace(' ', '_').replace('\t', '_') - if type(i) == str: - i_tmp = u_decode(i) - v_decoded.append(i_tmp) - - self._tags[:] = v_decoded - - @tags.deleter - def tags(self): - self.tags = [] - - @property - def checkboxes(self): - u""" All checkboxes in current heading """ - return self._checkboxes - - @checkboxes.setter - def checkboxes(self, value): - self._checkboxes[:] = value - - @checkboxes.deleter - def checkboxes(self): - del self.checkboxes[:] - - -class HeadingList(DomObjList): - u""" - A Heading List just contains headings. It's used for documents to store top - level headings and for headings to store subheadings. - - A Heading List must be linked to a Document or Heading! - - See documenatation of MultiPurposeList for more information. - """ - def __init__(self, initlist=None, obj=None): - """ - :initlist: Initial data - :obj: Link to a concrete Heading or Document object - """ - # it's not necessary to register a on_change hook because the heading - # list will itself take care of marking headings dirty or adding - # headings to the deleted headings list - DomObjList.__init__(self, initlist, obj) - - @classmethod - def is_heading(cls, obj): - # TODO no need to make this or is_domobj a class methods - return HeadingList.is_domobj(obj) - - def _get_document(self): - if self.__class__.is_heading(self._obj): - return self._obj._document - return self._obj - - def _add_to_deleted_headings(self, item): - u""" - Serialize headings so that all subheadings are also marked for deletion - """ - if not self._get_document(): - # HeadingList has not yet been associated - return - - if type(item) in (list, tuple) or isinstance(item, UserList): - for i in flatten_list(item): - self._add_to_deleted_headings(i) - else: - self._get_document()._deleted_headings.append( - item.copy(including_children=False)) - self._add_to_deleted_headings(item.children) - self._get_document().set_dirty_document() - - def _associate_heading( - self, heading, previous_sibling, next_sibling, - children=False, taint=True): - """ - :heading: The heading or list to associate with the current heading - :previous_sibling: The previous sibling of the current heading. If - heading is a list the first heading will be - connected with the previous sibling and the last - heading with the next sibling. The items in between - will be linked with one another. - :next_sibling: The next sibling of the current heading. If - heading is a list the first heading will be - connected with the previous sibling and the last - heading with the next sibling. The items in between - will be linked with one another. - :children: Marks whether children are processed in the current - iteration or not (should not be use, it's set - automatically) - :taint: If not True, the heading is not marked dirty at the end - of the association process and its orig_start and - orig_len values are not updated. - """ - # TODO this method should be externalized and moved to the Heading class - # TODO should this method work with slice? - if type(heading) in (list, tuple) or isinstance(heading, UserList): - prev = previous_sibling - current = None - for _next in flatten_list(heading): - if current: - self._associate_heading( - current, prev, _next, - children=children, taint=taint) - prev = current - current = _next - if current: - self._associate_heading( - current, prev, next_sibling, - children=children, taint=taint) - else: - if taint: - heading._orig_start = None - heading._orig_len = None - d = self._get_document() - if heading._document != d: - heading._document = d - if not children: - # connect heading with previous and next headings - heading._previous_sibling = previous_sibling - if previous_sibling: - previous_sibling._next_sibling = heading - heading._next_sibling = next_sibling - if next_sibling: - next_sibling._previous_sibling = heading - - if d == self._obj: - # self._obj is a Document - heading._parent = None - elif heading._parent != self._obj: - # self._obj is a Heading - heading._parent = self._obj - if taint: - heading.set_dirty() - - self._associate_heading( - heading.children, None, None, - children=True, taint=taint) - - def __setitem__(self, i, item): - if isinstance(i, slice): - start, stop, step = i.indices(len(self)) - items = item - if self.__class__.is_heading(items): - items = (items, ) - items = flatten_list(items) - for head in items: - if not self.__class__.is_heading(head): - raise ValueError(u'List contains items that are not a heading!') - - self._add_to_deleted_headings(self[i]) - self._associate_heading( - items, - self[start - 1] if start - 1 >= 0 else None, - self[stop] if stop < len(self) else None) - MultiPurposeList.__setitem__(self, i, items) - else: - if not self.__class__.is_heading(item): - raise ValueError(u'Item is not a heading!') - if item in self: - raise ValueError(u'Heading is already part of this list!') - self._add_to_deleted_headings(self[i]) - self._associate_heading( - item, - self[i - 1] if i - 1 >= 0 else None, - self[i + 1] if i + 1 < len(self) else None) - MultiPurposeList.__setitem__(self, i, item) - - def __delitem__(self, i, taint=True): - # TODO refactor this item, it works the same in dom_obj except taint? - if isinstance(i, slice): - items = self[i] - if items: - first = items[0] - last = items[-1] - if first.previous_sibling: - first.previous_sibling._next_sibling = last.next_sibling - if last.next_sibling: - last.next_sibling._previous_sibling = first.previous_sibling - if taint: - self._add_to_deleted_headings(items) - MultiPurposeList.__delitem__(self, i) - else: - item = self[i] - if item.previous_sibling: - item.previous_sibling._next_sibling = item.next_sibling - if item.next_sibling: - item.next_sibling._previous_sibling = item.previous_sibling - - if taint: - self._add_to_deleted_headings(item) - MultiPurposeList.__delitem__(self, i) - - def __iadd__(self, other): - o = other - if self.__class__.is_heading(o): - o = (o, ) - for item in flatten_list(o): - if not self.__class__.is_heading(item): - raise ValueError(u'List contains items that are not a heading!') - self._associate_heading(o, self[-1] if len(self) > 0 else None, None) - return MultiPurposeList.__iadd__(self, o) - - def append(self, item, taint=True): - if not self.__class__.is_heading(item): - raise ValueError(u'Item is not a heading!') - if item in self: - raise ValueError(u'Heading is already part of this list!') - self._associate_heading( - item, self[-1] if len(self) > 0 else None, - None, taint=taint) - MultiPurposeList.append(self, item) - - def insert(self, i, item, taint=True): - self._associate_heading( - item, - self[i - 1] if i - 1 >= 0 and i - 1 < len(self) else None, - self[i] if i >= 0 and i < len(self) else None, taint=taint) - MultiPurposeList.insert(self, i, item) - - def pop(self, i=-1): - item = self[i] - self._add_to_deleted_headings(item) - del self[i] - return item - - def extend(self, other): - o = other - if self.__class__.is_heading(o): - o = (o, ) - for item in o: - if not self.__class__.is_heading(item): - raise ValueError(u'List contains items that are not a heading!') - self._associate_heading(o, self[-1] if len(self) > 0 else None, None) - MultiPurposeList.extend(self, o) - - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/orgdate.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/orgdate.py deleted file mode 100644 index 93a6776..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/liborgmode/orgdate.py +++ /dev/null @@ -1,296 +0,0 @@ -# -*- coding: utf-8 -*- -u""" - OrgDate - ~~~~~~~~~~~~~~~~~~ - - This module contains all date/time/timerange representations that exist in - orgmode. - - There exist three different kinds: - - * OrgDate: is similar to a date object in python and it looks like - '2011-09-07 Wed'. - - * OrgDateTime: is similar to a datetime object in python and looks like - '2011-09-07 Wed 10:30' - - * OrgTimeRange: indicates a range of time. It has a start and and end date: - * <2011-09-07 Wed>--<2011-09-08 Fri> - * <2011-09-07 Wed 10:00-13:00> - - All OrgTime oblects can be active or inactive. -""" - -import datetime -import re - -from orgmode.py3compat.encode_compatibility import * - -# <2011-09-12 Mon> -_DATE_REGEX = re.compile(r"<(\d\d\d\d)-(\d\d)-(\d\d) [A-Z]\w\w>", re.UNICODE) -# [2011-09-12 Mon] -_DATE_PASSIVE_REGEX = re.compile(r"\[(\d\d\d\d)-(\d\d)-(\d\d) [A-Z]\w\w\]", re.UNICODE) - -# <2011-09-12 Mon 10:20> -_DATETIME_REGEX = re.compile( - r"<(\d\d\d\d)-(\d\d)-(\d\d) [A-Z]\w\w (\d{1,2}):(\d\d)>", re.UNICODE) -# [2011-09-12 Mon 10:20] -_DATETIME_PASSIVE_REGEX = re.compile( - r"\[(\d\d\d\d)-(\d\d)-(\d\d) [A-Z]\w\w (\d{1,2}):(\d\d)\]", re.UNICODE) - -# <2011-09-12 Mon>--<2011-09-13 Tue> -_DATERANGE_REGEX = re.compile( - # <2011-09-12 Mon>-- - r"<(\d\d\d\d)-(\d\d)-(\d\d) [A-Z]\w\w>--" - # <2011-09-13 Tue> - "<(\d\d\d\d)-(\d\d)-(\d\d) [A-Z]\w\w>", re.UNICODE) -# <2011-09-12 Mon 10:00>--<2011-09-12 Mon 11:00> -_DATETIMERANGE_REGEX = re.compile( - # <2011-09-12 Mon 10:00>-- - r"<(\d\d\d\d)-(\d\d)-(\d\d) [A-Z]\w\w (\d\d):(\d\d)>--" - # <2011-09-12 Mon 11:00> - "<(\d\d\d\d)-(\d\d)-(\d\d) [A-Z]\w\w (\d\d):(\d\d)>", re.UNICODE) -# <2011-09-12 Mon 10:00--12:00> -_DATETIMERANGE_SAME_DAY_REGEX = re.compile( - r"<(\d\d\d\d)-(\d\d)-(\d\d) [A-Z]\w\w (\d\d):(\d\d)-(\d\d):(\d\d)>", re.UNICODE) - - -def get_orgdate(data): - u""" - Parse the given data (can be a string or list). Return an OrgDate if data - contains a string representation of an OrgDate; otherwise return None. - - data can be a string or a list containing strings. - """ - # TODO maybe it should be checked just for iterable? Does it affect here if - # in base __getitem__(slice(i,j)) doesn't return a list but userlist... - if isinstance(data, list): - return _findfirst(_text2orgdate, data) - else: - return _text2orgdate(data) - # if no dates found - return None - - -def _findfirst(f, seq): - u""" - Return first item in sequence seq where f(item) == True. - - TODO: this is a general help function and it should be moved somewhere - else; preferably into the standard lib :) - """ - for found in (f(item) for item in seq if f(item)): - return found - - -def _text2orgdate(string): - u""" - Transform the given string into an OrgDate. - Return an OrgDate if data contains a string representation of an OrgDate; - otherwise return None. - """ - # handle active datetime with same day - result = _DATETIMERANGE_SAME_DAY_REGEX.search(string) - if result: - try: - (syear, smonth, sday, shour, smin, ehour, emin) = \ - [int(m) for m in result.groups()] - start = datetime.datetime(syear, smonth, sday, shour, smin) - end = datetime.datetime(syear, smonth, sday, ehour, emin) - return OrgTimeRange(True, start, end) - except BaseException: - return None - - # handle active datetime - result = _DATETIMERANGE_REGEX.search(string) - if result: - try: - tmp = [int(m) for m in result.groups()] - (syear, smonth, sday, shour, smin, eyear, emonth, eday, ehour, emin) = tmp - start = datetime.datetime(syear, smonth, sday, shour, smin) - end = datetime.datetime(eyear, emonth, eday, ehour, emin) - return OrgTimeRange(True, start, end) - except BaseException: - return None - - # handle active datetime - result = _DATERANGE_REGEX.search(string) - if result: - try: - tmp = [int(m) for m in result.groups()] - syear, smonth, sday, eyear, emonth, ehour = tmp - start = datetime.date(syear, smonth, sday) - end = datetime.date(eyear, emonth, ehour) - return OrgTimeRange(True, start, end) - except BaseException: - return None - - # handle active datetime - result = _DATETIME_REGEX.search(string) - if result: - try: - year, month, day, hour, minutes = [int(m) for m in result.groups()] - return OrgDateTime(True, year, month, day, hour, minutes) - except BaseException: - return None - - # handle passive datetime - result = _DATETIME_PASSIVE_REGEX.search(string) - if result: - try: - year, month, day, hour, minutes = [int(m) for m in result.groups()] - return OrgDateTime(False, year, month, day, hour, minutes) - except BaseException: - return None - - # handle passive dates - result = _DATE_PASSIVE_REGEX.search(string) - if result: - try: - year, month, day = [int(m) for m in result.groups()] - return OrgDate(False, year, month, day) - except BaseException: - return None - - # handle active dates - result = _DATE_REGEX.search(string) - if result: - try: - year, month, day = [int(m) for m in result.groups()] - return OrgDate(True, year, month, day) - except BaseException: - return None - - -class OrgDate(datetime.date): - u""" - OrgDate represents a normal date like '2011-08-29 Mon'. - - OrgDates can be active or inactive. - - NOTE: date is immutable. Thats why there needs to be __new__(). - See: http://docs.python.org/reference/datamodel.html#object.__new__ - """ - def __init__(self, active, year, month, day): - self.active = active - pass - - def __new__(cls, active, year, month, day): - return datetime.date.__new__(cls, year, month, day) - - def __unicode__(self): - u""" - Return a string representation. - """ - if self.active: - return self.strftime(u'<%Y-%m-%d %a>') - else: - return self.strftime(u'[%Y-%m-%d %a]') - - def __str__(self): - return u_encode(self.__unicode__()) - - def strftime(self, fmt): - return u_decode(datetime.date.strftime(self, u_encode(fmt))) - - -class OrgDateTime(datetime.datetime): - u""" - OrgDateTime represents a normal date like '2011-08-29 Mon'. - - OrgDateTime can be active or inactive. - - NOTE: date is immutable. Thats why there needs to be __new__(). - See: http://docs.python.org/reference/datamodel.html#object.__new__ - """ - - def __init__(self, active, year, month, day, hour, mins): - self.active = active - - def __new__(cls, active, year, month, day, hour, minute): - return datetime.datetime.__new__(cls, year, month, day, hour, minute) - - def __unicode__(self): - u""" - Return a string representation. - """ - if self.active: - return self.strftime(u'<%Y-%m-%d %a %H:%M>') - else: - return self.strftime(u'[%Y-%m-%d %a %H:%M]') - - def __str__(self): - return u_encode(self.__unicode__()) - - def strftime(self, fmt): - return u_decode(datetime.datetime.strftime(self, u_encode(fmt))) - - -class OrgTimeRange(object): - u""" - OrgTimeRange objects have a start and an end. Start and ent can be date - or datetime. Start and end have to be the same type. - - OrgTimeRange objects look like this: - * <2011-09-07 Wed>--<2011-09-08 Fri> - * <2011-09-07 Wed 20:00>--<2011-09-08 Fri 10:00> - * <2011-09-07 Wed 10:00-13:00> - """ - - def __init__(self, active, start, end): - u""" - stat and end must be datetime.date or datetime.datetime (both of the - same type). - """ - super(OrgTimeRange, self).__init__() - self.start = start - self.end = end - self.active = active - - def __unicode__(self): - u""" - Return a string representation. - """ - # active - if self.active: - # datetime - if isinstance(self.start, datetime.datetime): - # if start and end are on same the day - if self.start.year == self.end.year and\ - self.start.month == self.end.month and\ - self.start.day == self.end.day: - return u"<%s-%s>" % ( - self.start.strftime(u'%Y-%m-%d %a %H:%M'), - self.end.strftime(u'%H:%M')) - else: - return u"<%s>--<%s>" % ( - self.start.strftime(u'%Y-%m-%d %a %H:%M'), - self.end.strftime(u'%Y-%m-%d %a %H:%M')) - # date - if isinstance(self.start, datetime.date): - return u"<%s>--<%s>" % ( - self.start.strftime(u'%Y-%m-%d %a'), - self.end.strftime(u'%Y-%m-%d %a')) - # inactive - else: - if isinstance(self.start, datetime.datetime): - # if start and end are on same the day - if self.start.year == self.end.year and\ - self.start.month == self.end.month and\ - self.start.day == self.end.day: - return u"[%s-%s]" % ( - self.start.strftime(u'%Y-%m-%d %a %H:%M'), - self.end.strftime(u'%H:%M')) - else: - return u"[%s]--[%s]" % ( - self.start.strftime(u'%Y-%m-%d %a %H:%M'), - self.end.strftime(u'%Y-%m-%d %a %H:%M')) - if isinstance(self.start, datetime.date): - return u"[%s]--[%s]" % ( - self.start.strftime(u'%Y-%m-%d %a'), - self.end.strftime(u'%Y-%m-%d %a')) - - def __str__(self): - return u_encode(self.__unicode__()) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/menu.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/menu.py deleted file mode 100644 index 9ff70d7..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/menu.py +++ /dev/null @@ -1,173 +0,0 @@ -# -*- coding: utf-8 -*- - -import vim - -from orgmode.keybinding import Command, Plug, Keybinding -from orgmode.keybinding import MODE_ALL, MODE_NORMAL, MODE_VISUAL, MODE_INSERT - -from orgmode.py3compat.encode_compatibility import * - -def register_menu(f): - def r(*args, **kwargs): - p = f(*args, **kwargs) - def create(entry): - if isinstance(entry, Submenu) or isinstance(entry, Separator) \ - or isinstance(entry, ActionEntry): - entry.create() - - if hasattr(p, u'menu'): - if isinstance(p.menu, list) or isinstance(p.menu, tuple): - for e in p.menu: - create(e) - else: - create(p.menu) - return p - return r - - -def add_cmd_mapping_menu(plugin, name, function, key_mapping, menu_desrc): - u"""A helper function to create a vim command and keybinding and add these - to the menu for a given plugin. - - :plugin: the plugin to operate on. - :name: the name of the vim command (and the name of the Plug) - :function: the actual python function which is called when executing the - vim command. - :key_mapping: the keymapping to execute the command. - :menu_desrc: the text which appears in the menu. - """ - cmd = Command(name, function) - keybinding = Keybinding(key_mapping, Plug(name, cmd)) - - plugin.commands.append(cmd) - plugin.keybindings.append(keybinding) - plugin.menu + ActionEntry(menu_desrc, keybinding) - - -class Submenu(object): - u""" Submenu entry """ - - def __init__(self, name, parent=None): - object.__init__(self) - self.name = name - self.parent = parent - self._children = [] - - def __add__(self, entry): - if entry not in self._children: - self._children.append(entry) - entry.parent = self - return entry - - def __sub__(self, entry): - if entry in self._children: - idx = self._children.index(entry) - del self._children[idx] - - @property - def children(self): - return self._children[:] - - def get_menu(self): - n = self.name.replace(u' ', u'\\ ') - if self.parent: - return u'%s.%s' % (self.parent.get_menu(), n) - return n - - def create(self): - for c in self.children: - c.create() - - def __str__(self): - res = self.name - for c in self.children: - res += str(c) - return res - -class Separator(object): - u""" Menu entry for a Separator """ - - def __init__(self, parent=None): - object.__init__(self) - self.parent = parent - - def __unicode__(self): - return u'-----' - - def __str__(self): - return u_encode(self.__unicode__()) - - def create(self): - if self.parent: - menu = self.parent.get_menu() - vim.command(u_encode(u'menu %s.-%s- :' % (menu, id(self)))) - -class ActionEntry(object): - u""" ActionEntry entry """ - - def __init__(self, lname, action, rname=None, mode=MODE_NORMAL, parent=None): - u""" - :lname: menu title on the left hand side of the menu entry - :action: could be a vim command sequence or an actual Keybinding - :rname: menu title that appears on the right hand side of the menu - entry. If action is a Keybinding this value ignored and is - taken from the Keybinding - :mode: defines when the menu entry/action is executable - :parent: the parent instance of this object. The only valid parent is Submenu - """ - object.__init__(self) - self._lname = lname - self._action = action - self._rname = rname - if mode not in (MODE_ALL, MODE_NORMAL, MODE_VISUAL, MODE_INSERT): - raise ValueError(u'Parameter mode not in MODE_ALL, MODE_NORMAL, MODE_VISUAL, MODE_INSERT') - self._mode = mode - self.parent = parent - - def __str__(self): - return u'%s\t%s' % (self.lname, self.rname) - - @property - def lname(self): - return self._lname.replace(u' ', u'\\ ') - - @property - def action(self): - if isinstance(self._action, Keybinding): - return self._action.action - return self._action - - @property - def rname(self): - if isinstance(self._action, Keybinding): - return self._action.key.replace(u'<Tab>', u'Tab') - return self._rname - - @property - def mode(self): - if isinstance(self._action, Keybinding): - return self._action.mode - return self._mode - - def create(self): - menucmd = u':%smenu ' % self.mode - menu = u'' - cmd = u'' - - if self.parent: - menu = self.parent.get_menu() - menu += u'.%s' % self.lname - - if self.rname: - cmd = u'%s %s<Tab>%s %s' % (menucmd, menu, self.rname, self.action) - else: - cmd = u'%s %s %s' % (menucmd, menu, self.action) - - vim.command(u_encode(cmd)) - - # keybindings should be stored in the plugin.keybindings property and be registered by the appropriate keybinding registrar - #if isinstance(self._action, Keybinding): - # self._action.create() - - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Agenda.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Agenda.py deleted file mode 100644 index 40e7c81..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Agenda.py +++ /dev/null @@ -1,314 +0,0 @@ -# -*- coding: utf-8 -*- - -from datetime import date -import os -import glob - -import vim - -from orgmode._vim import ORGMODE, get_bufnumber, get_bufname, echoe -from orgmode import settings -from orgmode.keybinding import Keybinding, Plug, Command -from orgmode.menu import Submenu, ActionEntry, add_cmd_mapping_menu - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.unicode_compatibility import * -from orgmode.py3compat.py_py3_string import * - -class Agenda(object): - u""" - The Agenda Plugin uses liborgmode.agenda to display the agenda views. - - The main task is to format the agenda from liborgmode.agenda. - Also all the mappings: jump from agenda to todo, etc are realized here. - """ - - def __init__(self): - u""" Initialize plugin """ - object.__init__(self) - # menu entries this plugin should create - self.menu = ORGMODE.orgmenu + Submenu(u'Agenda') - - # key bindings for this plugin - # key bindings are also registered through the menu so only additional - # bindings should be put in this variable - self.keybindings = [] - - # commands for this plugin - self.commands = [] - - @classmethod - def _switch_to(cls, bufname, vim_commands=None): - u""" - Swicht to the buffer with bufname. - - A list of vim.commands (if given) gets executed as well. - - TODO: this should be extracted and imporved to create an easy to use - way to create buffers/jump to buffers. Otherwise there are going to be - quite a few ways to open buffers in vimorgmode. - """ - cmds = [ - u'botright split org:%s' % bufname, - u'setlocal buftype=nofile', - u'setlocal modifiable', - u'setlocal nonumber', - # call opendoc() on enter the original todo item - u'nnoremap <silent> <buffer> <CR> :exec "%s ORGMODE.plugins[u\'Agenda\'].opendoc()"<CR>' % VIM_PY_CALL, - u'nnoremap <silent> <buffer> <TAB> :exec "%s ORGMODE.plugins[u\'Agenda\'].opendoc(switch=True)"<CR>' % VIM_PY_CALL, - u'nnoremap <silent> <buffer> <S-CR> :exec "%s ORGMODE.plugins[u\'Agenda\'].opendoc(split=True)"<CR>' % VIM_PY_CALL, - # statusline - u'setlocal statusline=Org\\ %s' % bufname] - if vim_commands: - cmds.extend(vim_commands) - for cmd in cmds: - vim.command(u_encode(cmd)) - - @classmethod - def _get_agendadocuments(self): - u""" - Return the org documents of the agenda files; return None if no - agenda documents are defined. - - TODO: maybe turn this into an decorator? - """ - # load org files of agenda - agenda_files = settings.get(u'org_agenda_files', u',') - if not agenda_files or agenda_files == ',': - echoe( - u"No org_agenda_files defined. Use :let " - u"g:org_agenda_files=['~/org/index.org'] to add " - u"files to the agenda view.") - return - return self._load_agendafiles(agenda_files) - - @classmethod - def _load_agendafiles(self, agenda_files): - # glob for files in agenda_files - resolved_files = [] - for f in agenda_files: - f = glob.glob(os.path.join( - os.path.expanduser(os.path.dirname(f)), - os.path.basename(f))) - resolved_files.extend(f) - - agenda_files = [os.path.realpath(f) for f in resolved_files] - - # load the agenda files into buffers - for agenda_file in agenda_files: - vim.command(u_encode(u'badd %s' % agenda_file.replace(" ", "\ "))) - - # determine the buffer nr of the agenda files - agenda_nums = [get_bufnumber(fn) for fn in agenda_files] - - # collect all documents of the agenda files and create the agenda - return [ORGMODE.get_document(i) for i in agenda_nums if i is not None] - - @classmethod - def opendoc(cls, split=False, switch=False): - u""" - If you are in the agenda view jump to the document the item in the - current line belongs to. cls.line2doc is used for that. - - :split: if True, open the document in a new split window. - :switch: if True, switch to another window and open the the document - there. - """ - row, _ = vim.current.window.cursor - try: - bufname, bufnr, destrow = cls.line2doc[row] - except: - return - - # reload source file if it is not loaded - if get_bufname(bufnr) is None: - vim.command(u_encode(u'badd %s' % bufname)) - bufnr = get_bufnumber(bufname) - tmp = cls.line2doc[row] - cls.line2doc[bufnr] = tmp - # delete old endry - del cls.line2doc[row] - - if split: - vim.command(u_encode(u"sbuffer %s" % bufnr)) - elif switch: - vim.command(u_encode(u"wincmd w")) - vim.command(u_encode(u"buffer %d" % bufnr)) - else: - vim.command(u_encode(u"buffer %s" % bufnr)) - vim.command(u_encode(u"normal! %dgg <CR>" % (destrow + 1))) - - @classmethod - def list_next_week(cls): - agenda_documents = cls._get_agendadocuments() - if not agenda_documents: - return - cls.list_next_week_for(agenda_documents) - - @classmethod - def list_next_week_for_buffer(cls): - agenda_documents = vim.current.buffer.name - loaded_agendafiles = cls._load_agendafiles([agenda_documents]) - cls.list_next_week_for(loaded_agendafiles) - - - @classmethod - def list_next_week_for(cls, agenda_documents): - raw_agenda = ORGMODE.agenda_manager.get_next_week_and_active_todo( - agenda_documents) - - # if raw_agenda is empty, return directly - if not raw_agenda: - vim.command('echom "All caught-up. No agenda or active todo next week."') - return - - # create buffer at bottom - cmd = [u'setlocal filetype=orgagenda', ] - cls._switch_to(u'AGENDA', cmd) - - # line2doc is a dic with the mapping: - # line in agenda buffer --> source document - # It's easy to jump to the right document this way - cls.line2doc = {} - # format text for agenda - last_date = raw_agenda[0].active_date - final_agenda = [u'Week Agenda:', unicode(last_date)] - for i, h in enumerate(raw_agenda): - # insert date information for every new date (not datetime) - if unicode(h.active_date)[1:11] != unicode(last_date)[1:11]: - today = date.today() - # insert additional "TODAY" string - if h.active_date.year == today.year and \ - h.active_date.month == today.month and \ - h.active_date.day == today.day: - section = unicode(h.active_date) + u" TODAY" - today_row = len(final_agenda) + 1 - else: - section = unicode(h.active_date) - final_agenda.append(section) - - # update last_date - last_date = h.active_date - - bufname = os.path.basename(vim.buffers[h.document.bufnr].name) - bufname = bufname[:-4] if bufname.endswith(u'.org') else bufname - formated = u" %(bufname)s (%(bufnr)d) %(todo)s %(title)s" % { - 'bufname': bufname, - 'bufnr': h.document.bufnr, - 'todo': h.todo, - 'title': h.title - } - final_agenda.append(formated) - cls.line2doc[len(final_agenda)] = (get_bufname(h.document.bufnr), h.document.bufnr, h.start) - - # show agenda - vim.current.buffer[:] = [u_encode(i) for i in final_agenda] - vim.command(u_encode(u'setlocal nomodifiable conceallevel=2 concealcursor=nc')) - # try to jump to the positon of today - try: - vim.command(u_encode(u'normal! %sgg<CR>' % today_row)) - except: - pass - - @classmethod - def list_all_todos(cls, current_buffer=False): - u""" List all todos in one buffer. - - Args: - current_buffer (bool): - False: all agenda files - True: current org_file - """ - if current_buffer: - agenda_documents = vim.current.buffer.name - loaded_agendafiles = cls._load_agendafiles([agenda_documents]) - else: - loaded_agendafiles = cls._get_agendadocuments() - if not loaded_agendafiles: - return - raw_agenda = ORGMODE.agenda_manager.get_todo(loaded_agendafiles) - - cls.line2doc = {} - # create buffer at bottom - cmd = [u'setlocal filetype=orgagenda'] - cls._switch_to(u'AGENDA', cmd) - - # format text of agenda - final_agenda = [] - for i, h in enumerate(raw_agenda): - tmp = u"%s %s" % (h.todo, h.title) - final_agenda.append(tmp) - cls.line2doc[len(final_agenda)] = (get_bufname(h.document.bufnr), h.document.bufnr, h.start) - - # show agenda - vim.current.buffer[:] = [u_encode(i) for i in final_agenda] - vim.command(u_encode(u'setlocal nomodifiable conceallevel=2 concealcursor=nc')) - - @classmethod - def list_timeline(cls): - """ - List a timeline of the current buffer to get an overview of the - current file. - """ - raw_agenda = ORGMODE.agenda_manager.get_timestamped_items( - [ORGMODE.get_document()]) - - # create buffer at bottom - cmd = [u'setlocal filetype=orgagenda'] - cls._switch_to(u'AGENDA', cmd) - - cls.line2doc = {} - # format text of agenda - final_agenda = [] - for i, h in enumerate(raw_agenda): - tmp = u"%s %s" % (h.todo, h.title) - final_agenda.append(tmp) - cls.line2doc[len(final_agenda)] = (get_bufname(h.document.bufnr), h.document.bufnr, h.start) - - # show agenda - vim.current.buffer[:] = [u_encode(i) for i in final_agenda] - vim.command(u_encode(u'setlocal nomodifiable conceallevel=2 concealcursor=nc')) - - def register(self): - u""" - Registration of the plugin. - - Key bindings and other initialization should be done here. - """ - add_cmd_mapping_menu( - self, - name=u"OrgAgendaTodo", - function=u'%s ORGMODE.plugins[u"Agenda"].list_all_todos()' % VIM_PY_CALL, - key_mapping=u'<localleader>cat', - menu_desrc=u'Agenda for all TODOs' - ) - add_cmd_mapping_menu( - self, - name=u"OrgBufferAgendaTodo", - function=u'%s ORGMODE.plugins[u"Agenda"].list_all_todos(current_buffer=True)' % VIM_PY_CALL, - key_mapping=u'<localleader>caT', - menu_desrc=u'Agenda for all TODOs based on current buffer' - ) - add_cmd_mapping_menu( - self, - name=u"OrgAgendaWeek", - function=u'%s ORGMODE.plugins[u"Agenda"].list_next_week()' % VIM_PY_CALL, - key_mapping=u'<localleader>caa', - menu_desrc=u'Agenda for the week' - ) - add_cmd_mapping_menu( - self, - name=u"OrgBufferAgendaWeek", - function=u'%s ORGMODE.plugins[u"Agenda"].list_next_week_for_buffer()' % VIM_PY_CALL, - key_mapping=u'<localleader>caA', - menu_desrc=u'Agenda for the week based on current buffer' - ) - add_cmd_mapping_menu( - self, - name=u'OrgAgendaTimeline', - function=u'%s ORGMODE.plugins[u"Agenda"].list_timeline()' % VIM_PY_CALL, - key_mapping=u'<localleader>caL', - menu_desrc=u'Timeline for this buffer' - ) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Date.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Date.py deleted file mode 100644 index 04a675e..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Date.py +++ /dev/null @@ -1,318 +0,0 @@ -# -*- coding: utf-8 -*- -import re -from datetime import timedelta, date, datetime - -import operator - -import vim - -from orgmode._vim import ORGMODE, echom, insert_at_cursor, get_user_input -from orgmode import settings -from orgmode.keybinding import Keybinding, Plug -from orgmode.menu import Submenu, ActionEntry, add_cmd_mapping_menu - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.unicode_compatibility import * -from orgmode.py3compat.py_py3_string import * - -class Date(object): - u""" - Handles all date and timestamp related tasks. - - TODO: extend functionality (calendar, repetitions, ranges). See - http://orgmode.org/guide/Dates-and-Times.html#Dates-and-Times - """ - - date_regex = r"\d\d\d\d-\d\d-\d\d" - datetime_regex = r"[A-Z]\w\w \d\d\d\d-\d\d-\d\d \d\d:\d\d>" - - month_mapping = { - u'jan': 1, u'feb': 2, u'mar': 3, u'apr': 4, u'may': 5, - u'jun': 6, u'jul': 7, u'aug': 8, u'sep': 9, u'oct': 10, u'nov': 11, - u'dec': 12} - - def __init__(self): - u""" Initialize plugin """ - object.__init__(self) - # menu entries this plugin should create - self.menu = ORGMODE.orgmenu + Submenu(u'Dates and Scheduling') - - # key bindings for this plugin - # key bindings are also registered through the menu so only additional - # bindings should be put in this variable - self.keybindings = [] - - # commands for this plugin - self.commands = [] - - # set speeddating format that is compatible with orgmode - try: - if int(vim.eval(u_encode(u'exists(":SpeedDatingFormat")'))) == 2: - vim.command(u_encode(u':1SpeedDatingFormat %Y-%m-%d %a')) - vim.command(u_encode(u':1SpeedDatingFormat %Y-%m-%d %a %H:%M')) - else: - echom(u'Speeddating plugin not installed. Please install it.') - except: - echom(u'Speeddating plugin not installed. Please install it.') - - @classmethod - def _modify_time(cls, startdate, modifier): - u"""Modify the given startdate according to modifier. Return the new - date or datetime. - - See http://orgmode.org/manual/The-date_002ftime-prompt.html - """ - if modifier is None or modifier == '' or modifier == '.': - return startdate - - # rm crap from modifier - modifier = modifier.strip() - - ops = {'-': operator.sub, '+': operator.add} - - # check real date - date_regex = r"(\d\d\d\d)-(\d\d)-(\d\d)" - match = re.search(date_regex, modifier) - if match: - year, month, day = match.groups() - newdate = date(int(year), int(month), int(day)) - - # check abbreviated date, seperated with '-' - date_regex = u"(\d{1,2})-(\d+)-(\d+)" - match = re.search(date_regex, modifier) - if match: - year, month, day = match.groups() - newdate = date(2000 + int(year), int(month), int(day)) - - # check abbreviated date, seperated with '/' - # month/day - date_regex = u"(\d{1,2})/(\d{1,2})" - match = re.search(date_regex, modifier) - if match: - month, day = match.groups() - newdate = date(startdate.year, int(month), int(day)) - # date should be always in the future - if newdate < startdate: - newdate = date(startdate.year + 1, int(month), int(day)) - - # check full date, seperated with 'space' - # month day year - # 'sep 12 9' --> 2009 9 12 - date_regex = u"(\w\w\w) (\d{1,2}) (\d{1,2})" - match = re.search(date_regex, modifier) - if match: - gr = match.groups() - day = int(gr[1]) - month = int(cls.month_mapping[gr[0]]) - year = 2000 + int(gr[2]) - newdate = date(year, int(month), int(day)) - - # check days as integers - date_regex = u"^(\d{1,2})$" - match = re.search(date_regex, modifier) - if match: - newday, = match.groups() - newday = int(newday) - if newday > startdate.day: - newdate = date(startdate.year, startdate.month, newday) - else: - # TODO: DIRTY, fix this - # this does NOT cover all edge cases - newdate = startdate + timedelta(days=28) - newdate = date(newdate.year, newdate.month, newday) - - # check for full days: Mon, Tue, Wed, Thu, Fri, Sat, Sun - modifier_lc = modifier.lower() - match = re.search(u'mon|tue|wed|thu|fri|sat|sun', modifier_lc) - if match: - weekday_mapping = { - u'mon': 0, u'tue': 1, u'wed': 2, u'thu': 3, - u'fri': 4, u'sat': 5, u'sun': 6} - diff = (weekday_mapping[modifier_lc] - startdate.weekday()) % 7 - # use next weeks weekday if current weekday is the same as modifier - if diff == 0: - diff = 7 - newdate = startdate + timedelta(days=diff) - - # check for days modifier with appended d - match = re.search(u'^(\+|-)(\d*)d', modifier) - if match: - op, days = match.groups() - newdate = ops[op](startdate, timedelta(days=int(days))) - - # check for days modifier without appended d - match = re.search(u'^(\+|-)(\d*) |^(\+|-)(\d*)$', modifier) - if match: - groups = match.groups() - try: - op = groups[0] - days = int(groups[1]) - except: - op = groups[2] - days = int(groups[3]) - newdate = ops[op](startdate, timedelta(days=days)) - - # check for week modifier - match = re.search(u'^(\+|-)(\d+)w', modifier) - if match: - op, weeks = match.groups() - newdate = ops[op](startdate, timedelta(weeks=int(weeks))) - - # check for month modifier - match = re.search(u'^(\+|-)(\d+)m', modifier) - if match: - op, months = match.groups() - newdate = date(startdate.year, ops[op](startdate.month, int(months)), - startdate.day) - - # check for year modifier - match = re.search(u'^(\+|-)(\d*)y', modifier) - if match: - op, years = match.groups() - newdate = date(ops[op](startdate.year, int(years)), startdate.month, - startdate.day) - - # check for month day - match = re.search( - u'(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec) (\d{1,2})', - modifier.lower()) - if match: - month = cls.month_mapping[match.groups()[0]] - day = int(match.groups()[1]) - newdate = date(startdate.year, int(month), int(day)) - # date should be always in the future - if newdate < startdate: - newdate = date(startdate.year + 1, int(month), int(day)) - - # check abbreviated date, seperated with '/' - # month/day/year - date_regex = u"(\d{1,2})/(\d+)/(\d+)" - match = re.search(date_regex, modifier) - if match: - month, day, year = match.groups() - newdate = date(2000 + int(year), int(month), int(day)) - - # check for month day year - # sep 12 2011 - match = re.search( - u'(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec) (\d{1,2}) (\d{1,4})', - modifier.lower()) - if match: - month = int(cls.month_mapping[match.groups()[0]]) - day = int(match.groups()[1]) - if len(match.groups()[2]) < 4: - year = 2000 + int(match.groups()[2]) - else: - year = int(match.groups()[2]) - newdate = date(year, month, day) - - # check for time: HH:MM - # '12:45' --> datetime(2006, 06, 13, 12, 45)) - match = re.search(u'(\d{1,2}):(\d\d)$', modifier) - if match: - try: - startdate = newdate - except: - pass - return datetime( - startdate.year, startdate.month, startdate.day, - int(match.groups()[0]), int(match.groups()[1])) - - try: - return newdate - except: - return startdate - - @classmethod - def insert_timestamp(cls, active=True): - u""" - Insert a timestamp at the cursor position. - - TODO: show fancy calendar to pick the date from. - TODO: add all modifier of orgmode. - """ - today = date.today() - msg = u''.join([ - u'Inserting ', - unicode(u_decode(today.strftime(u'%Y-%m-%d %a'))), - u' | Modify date']) - modifier = get_user_input(msg) - - # abort if the user canceled the input promt - if modifier is None: - return - - newdate = cls._modify_time(today, modifier) - - # format - if isinstance(newdate, datetime): - newdate = newdate.strftime( - u_decode(u_encode(u'%Y-%m-%d %a %H:%M'))) - else: - newdate = newdate.strftime( - u_decode(u_encode(u'%Y-%m-%d %a'))) - timestamp = u'<%s>' % newdate if active else u'[%s]' % newdate - - insert_at_cursor(timestamp) - - @classmethod - def insert_timestamp_with_calendar(cls, active=True): - u""" - Insert a timestamp at the cursor position. - Show fancy calendar to pick the date from. - - TODO: add all modifier of orgmode. - """ - if int(vim.eval(u_encode(u'exists(":CalendarH")'))) != 2: - vim.command("echo 'Please install plugin Calendar to enable this function'") - return - vim.command("CalendarH") - # backup calendar_action - calendar_action = vim.eval("g:calendar_action") - vim.command("let g:org_calendar_action_backup = '" + calendar_action + "'") - vim.command("let g:calendar_action = 'CalendarAction'") - - timestamp_template = u'<%s>' if active else u'[%s]' - # timestamp template - vim.command("let g:org_timestamp_template = '" + timestamp_template + "'") - - def register(self): - u""" - Registration of the plugin. - - Key bindings and other initialization should be done here. - """ - add_cmd_mapping_menu( - self, - name=u'OrgDateInsertTimestampActiveCmdLine', - key_mapping=u'<localleader>sa', - function=u'%s ORGMODE.plugins[u"Date"].insert_timestamp()' % VIM_PY_CALL, - menu_desrc=u'Timest&' - ) - add_cmd_mapping_menu( - self, - name=u'OrgDateInsertTimestampInactiveCmdLine', - key_mapping='<localleader>si', - function=u'%s ORGMODE.plugins[u"Date"].insert_timestamp(False)' % VIM_PY_CALL, - menu_desrc=u'Timestamp (&inactive)' - ) - add_cmd_mapping_menu( - self, - name=u'OrgDateInsertTimestampActiveWithCalendar', - key_mapping=u'<localleader>pa', - function=u'%s ORGMODE.plugins[u"Date"].insert_timestamp_with_calendar()' % VIM_PY_CALL, - menu_desrc=u'Timestamp with Calendar' - ) - add_cmd_mapping_menu( - self, - name=u'OrgDateInsertTimestampInactiveWithCalendar', - key_mapping=u'<localleader>pi', - function=u'%s ORGMODE.plugins[u"Date"].insert_timestamp_with_calendar(False)' % VIM_PY_CALL, - menu_desrc=u'Timestamp with Calendar(inactive)' - ) - - submenu = self.menu + Submenu(u'Change &Date') - submenu + ActionEntry(u'Day &Earlier', u'<C-x>', u'<C-x>') - submenu + ActionEntry(u'Day &Later', u'<C-a>', u'<C-a>') - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/EditCheckbox.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/EditCheckbox.py deleted file mode 100644 index bb93fc1..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/EditCheckbox.py +++ /dev/null @@ -1,330 +0,0 @@ -# -*- coding: utf-8 -*- - -import vim -from orgmode._vim import echo, echom, echoe, ORGMODE, apply_count, repeat, insert_at_cursor, indent_orgmode -from orgmode import settings -from orgmode.menu import Submenu, Separator, ActionEntry, add_cmd_mapping_menu -from orgmode.keybinding import Keybinding, Plug, Command -from orgmode.liborgmode.checkboxes import Checkbox -from orgmode.liborgmode.dom_obj import OrderListType - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.py_py3_string import * -from orgmode.py3compat.unicode_compatibility import * - -class EditCheckbox(object): - u""" - Checkbox plugin. - """ - - def __init__(self): - u""" Initialize plugin """ - object.__init__(self) - # menu entries this plugin should create - self.menu = ORGMODE.orgmenu + Submenu(u'Edit Checkbox') - - # key bindings for this plugin - # key bindings are also registered through the menu so only additional - # bindings should be put in this variable - self.keybindings = [] - - # commands for this plugin - self.commands = [] - - @classmethod - def new_checkbox(cls, below=None, plain=None): - ''' - if below is: - True -> create new list below current line - False/None -> create new list above current line - if plain is: - True -> create a plainlist item - False/None -> create an empty checkbox - ''' - d = ORGMODE.get_document() - h = d.current_heading() - if h is None: - return - # init checkboxes for current heading - h.init_checkboxes() - c = h.current_checkbox() - - nc = Checkbox() - nc._heading = h - - # default checkbox level - level = h.level + 1 - start = vim.current.window.cursor[0] - 1 - # if no checkbox is found, insert at current line with indent level=1 - if c is None: - h.checkboxes.append(nc) - else: - l = c.get_parent_list() - idx = c.get_index_in_parent_list() - if l is not None and idx is not None: - l.insert(idx + (1 if below else 0), nc) - # workaround for broken associations, Issue #165 - nc._parent = c.parent - if below: - if c.next_sibling: - c.next_sibling._previous_sibling = nc - nc._next_sibling = c.next_sibling - c._next_sibling = nc - nc._previous_sibling = c - else: - if c.previous_sibling: - c.previous_sibling._next_sibling = nc - nc._next_sibling = c - nc._previous_sibling = c.previous_sibling - c._previous_sibling = nc - - t = c.type - # increase key for ordered lists - if t[-1] in OrderListType: - try: - num = int(t[:-1]) + (1 if below else -1) - if num < 0: - # don't decrease to numbers below zero - echom(u"Can't decrement further than '0'") - return - t = '%d%s' % (num, t[-1]) - except ValueError: - try: - char = ord(t[:-1]) + (1 if below else -1) - if below: - if char == 91: - # stop incrementing at Z (90) - echom(u"Can't increment further than 'Z'") - return - elif char == 123: - # increment from z (122) to A - char = 65 - else: - if char == 96: - # stop decrementing at a (97) - echom(u"Can't decrement further than 'a'") - return - elif char == 64: - # decrement from A (65) to z - char = 122 - t = u'%s%s' % (chr(char), t[-1]) - except ValueError: - pass - nc.type = t - level = c.level - - if below: - start = c.end_of_last_child - else: - start = c.start - - if plain: # only create plainlist item when requested - nc.status = None - nc.level = level - - if below: - start += 1 - # vim's buffer behave just opposite to Python's list when inserting a - # new item. The new entry is appended in vim put prepended in Python! - vim.current.buffer.append("") # workaround for neovim - vim.current.buffer[start:start] = [unicode(nc)] - del vim.current.buffer[-1] # restore from workaround for neovim - - # update checkboxes status - cls.update_checkboxes_status() - - # do not start insert upon adding new checkbox, Issue #211 - if int(settings.get(u'org_prefer_insert_mode', u'1')): - vim.command(u_encode(u'exe "normal %dgg"|startinsert!' % (start + 1, ))) - else: - vim.command(u_encode(u'exe "normal %dgg$"' % (start + 1, ))) - - @classmethod - def toggle(cls, checkbox=None): - u""" - Toggle the checkbox given in the parameter. - If the checkbox is not given, it will toggle the current checkbox. - """ - d = ORGMODE.get_document() - current_heading = d.current_heading() - # init checkboxes for current heading - if current_heading is None: - return - current_heading = current_heading.init_checkboxes() - - if checkbox is None: - # get current_checkbox - c = current_heading.current_checkbox() - # no checkbox found - if c is None: - cls.update_checkboxes_status() - return - else: - c = checkbox - - if c.status == Checkbox.STATUS_OFF or c.status is None: - # set checkbox status on if all children are on - if c.all_children_status()[0] == 0 or c.are_children_all(Checkbox.STATUS_ON): - c.toggle() - d.write_checkbox(c) - elif c.status is None: - c.status = Checkbox.STATUS_OFF - d.write_checkbox(c) - - elif c.status == Checkbox.STATUS_ON: - if c.all_children_status()[0] == 0 or c.is_child_one(Checkbox.STATUS_OFF): - c.toggle() - d.write_checkbox(c) - - elif c.status == Checkbox.STATUS_INT: - # can't toggle intermediate state directly according to emacs orgmode - pass - # update checkboxes status - cls.update_checkboxes_status() - - @classmethod - def _update_subtasks(cls): - d = ORGMODE.get_document() - h = d.current_heading() - # init checkboxes for current heading - h.init_checkboxes() - # update heading subtask info - c = h.first_checkbox - if c is None: - return - total, on = c.all_siblings_status() - h.update_subtasks(total, on) - # update all checkboxes under current heading - cls._update_checkboxes_subtasks(c) - - @classmethod - def _update_checkboxes_subtasks(cls, checkbox): - # update checkboxes - for c in checkbox.all_siblings(): - if c.children: - total, on = c.first_child.all_siblings_status() - c.update_subtasks(total, on) - cls._update_checkboxes_subtasks(c.first_child) - - @classmethod - def update_checkboxes_status(cls): - d = ORGMODE.get_document() - h = d.current_heading() - if h is None: - return - # init checkboxes for current heading - h.init_checkboxes() - - cls._update_checkboxes_status(h.first_checkbox) - cls._update_subtasks() - - @classmethod - def _update_checkboxes_status(cls, checkbox=None): - u""" helper function for update checkboxes status - :checkbox: The first checkbox of this indent level - :return: The status of the parent checkbox - """ - if checkbox is None: - return - - status_off, status_on, status_int, total = 0, 0, 0, 0 - # update all top level checkboxes' status - for c in checkbox.all_siblings(): - current_status = c.status - # if this checkbox is not leaf, its status should determine by all its children - if c.all_children_status()[0] > 0: - current_status = cls._update_checkboxes_status(c.first_child) - - # don't update status if the checkbox has no status - if c.status is None: - current_status = None - # the checkbox needs to have status - else: - total += 1 - - # count number of status in this checkbox level - if current_status == Checkbox.STATUS_OFF: - status_off += 1 - elif current_status == Checkbox.STATUS_ON: - status_on += 1 - elif current_status == Checkbox.STATUS_INT: - status_int += 1 - - # write status if any update - if current_status is not None and c.status != current_status: - c.status = current_status - d = ORGMODE.get_document() - d.write_checkbox(c) - - parent_status = Checkbox.STATUS_INT - # all silbing checkboxes are off status - if total == 0: - pass - elif status_off == total: - parent_status = Checkbox.STATUS_OFF - # all silbing checkboxes are on status - elif status_on == total: - parent_status = Checkbox.STATUS_ON - # one silbing checkbox is on or int status - elif status_on != 0 or status_int != 0: - parent_status = Checkbox.STATUS_INT - # other cases - else: - parent_status = None - - return parent_status - - def register(self): - u""" - Registration of the plugin. - - Key bindings and other initialization should be done here. - """ -# default setting if it is not already set. - -# checkbox related operation - add_cmd_mapping_menu( - self, - name=u'OrgCheckBoxNewAbove', - function=u'%s ORGMODE.plugins[u"EditCheckbox"].new_checkbox()<CR>' % VIM_PY_CALL, - key_mapping=u'<localleader>cN', - menu_desrc=u'New CheckBox Above' - ) - add_cmd_mapping_menu( - self, - name=u'OrgCheckBoxNewBelow', - function=u'%s ORGMODE.plugins[u"EditCheckbox"].new_checkbox(below=True)<CR>' % VIM_PY_CALL, - key_mapping=u'<localleader>cn', - menu_desrc=u'New CheckBox Below' - ) - add_cmd_mapping_menu( - self, - name=u'OrgCheckBoxToggle', - function=u':silent! %s ORGMODE.plugins[u"EditCheckbox"].toggle()<CR>' % VIM_PY_CALL, - key_mapping=u'<localleader>cc', - menu_desrc=u'Toggle Checkbox' - ) - add_cmd_mapping_menu( - self, - name=u'OrgCheckBoxUpdate', - function=u':silent! %s ORGMODE.plugins[u"EditCheckbox"].update_checkboxes_status()<CR>' % VIM_PY_CALL, - key_mapping=u'<localleader>c#', - menu_desrc=u'Update Subtasks' - ) -# plainlist related operation - add_cmd_mapping_menu( - self, - name=u'OrgPlainListItemNewAbove', - function=u'%s ORGMODE.plugins[u"EditCheckbox"].new_checkbox(plain=True)<CR>' % VIM_PY_CALL, - key_mapping=u'<localleader>cL', - menu_desrc=u'New PlainList Item Above' - ) - add_cmd_mapping_menu( - self, - name=u'OrgPlainListItemNewBelow', - function=u'%s ORGMODE.plugins[u"EditCheckbox"].new_checkbox(below=True, plain=True)<CR>' % VIM_PY_CALL, - key_mapping=u'<localleader>cl', - menu_desrc=u'New PlainList Item Below' - ) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/EditStructure.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/EditStructure.py deleted file mode 100644 index 61a94b4..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/EditStructure.py +++ /dev/null @@ -1,430 +0,0 @@ -# -*- coding: utf-8 -*- - -import vim - -from orgmode._vim import ORGMODE, apply_count, repeat, realign_tags -from orgmode import settings -from orgmode.exceptions import HeadingDomError -from orgmode.keybinding import Keybinding, Plug, MODE_INSERT, MODE_NORMAL -from orgmode.menu import Submenu, Separator, ActionEntry -from orgmode.liborgmode.base import Direction -from orgmode.liborgmode.headings import Heading - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.py_py3_string import * - - -class EditStructure(object): - u""" EditStructure plugin """ - - def __init__(self): - u""" Initialize plugin """ - object.__init__(self) - # menu entries this plugin should create - self.menu = ORGMODE.orgmenu + Submenu(u'&Edit Structure') - - # key bindings for this plugin - # key bindings are also registered through the menu so only additional - # bindings should be put in this variable - self.keybindings = [] - - @classmethod - def new_heading(cls, below=None, insert_mode=False, end_of_last_child=False): - u""" - :below: True, insert heading below current heading, False, - insert heading above current heading, None, special - behavior for insert mode, use the current text as - heading - :insert_mode: True, if action is performed in insert mode - :end_of_last_child: True, insert heading at the end of last child, - otherwise the newly created heading will "take - over" the current heading's children - """ - d = ORGMODE.get_document() - current_heading = d.current_heading() - cursor = vim.current.window.cursor[:] - if not current_heading: - # the user is in meta data region - pos = cursor[0] - 1 - heading = Heading(title=d.meta_information[pos], body=d.meta_information[pos + 1:]) - d.headings.insert(0, heading) - del d.meta_information[pos:] - d.write() - vim.command(u_encode(u'exe "normal %dgg"|startinsert!' % (heading.start_vim, ))) - return heading - - # check for plain list(checkbox) - current_heading.init_checkboxes() - c = current_heading.current_checkbox() - if c is not None: - ORGMODE.plugins[u"EditCheckbox"].new_checkbox(below, not c.status) - return - - heading = Heading(level=current_heading.level) - - # it's weird but this is the behavior of original orgmode - if below is None: - below = cursor[1] != 0 or end_of_last_child - - # insert newly created heading - l = current_heading.get_parent_list() - idx = current_heading.get_index_in_parent_list() - if l is not None and idx is not None: - l.insert(idx + (1 if below else 0), heading) - else: - raise HeadingDomError(u'Current heading is not properly linked in DOM') - - if below and not end_of_last_child: - # append heading at the end of current heading and also take - # over the children of current heading - for child in current_heading.children: - heading.children.append(child, taint=False) - current_heading.children.remove_slice( - 0, len(current_heading.children), - taint=False) - - # if cursor is currently on a heading, insert parts of it into the - # newly created heading - if insert_mode and cursor[1] != 0 and cursor[0] == current_heading.start_vim: - offset = cursor[1] - current_heading.level - 1 - ( - len(current_heading.todo) + 1 if current_heading.todo else 0) - if offset < 0: - offset = 0 - if int(settings.get(u'org_improve_split_heading', u'1')) and \ - offset > 0 and len(current_heading.title) == offset + 1 \ - and current_heading.title[offset - 1] not in (u' ', u'\t'): - offset += 1 - heading.title = current_heading.title[offset:] - current_heading.title = current_heading.title[:offset] - heading.body = current_heading.body[:] - current_heading.body = [] - - d.write() - # do not start insert upon adding new headings, unless already in insert mode. Issue #211 - if int(settings.get(u'org_prefer_insert_mode', u'1')) or insert_mode: - vim.command(u_encode(u'exe "normal %dgg"|startinsert!' % (heading.start_vim, ))) - else: - vim.command(u_encode(u'exe "normal %dgg$"' % (heading.start_vim, ))) - - # return newly created heading - return heading - - @classmethod - def _append_heading(cls, heading, parent): - if heading.level <= parent.level: - raise ValueError('Heading level not is lower than parent level: %d ! > %d' % (heading.level, parent.level)) - - if parent.children and parent.children[-1].level < heading.level: - cls._append_heading(heading, parent.children[-1]) - else: - parent.children.append(heading, taint=False) - - @classmethod - def _change_heading_level(cls, level, including_children=True, on_heading=False, insert_mode=False): - u""" - Change level of heading realtively with or without including children. - - :level: the number of levels to promote/demote heading - :including_children: True if should should be included in promoting/demoting - :on_heading: True if promoting/demoting should only happen when the cursor is on the heading - :insert_mode: True if vim is in insert mode - """ - # TODO : current promote and demote works for only headings. Since - # checkboxes also have tree structure. We should think of - # expanding the functionality of promoting and demoting to - # checkboxes as well - d = ORGMODE.get_document() - current_heading = d.current_heading() - if not current_heading or on_heading and current_heading.start_vim != vim.current.window.cursor[0]: - # TODO figure out the actually pressed keybinding and feed these - # keys instead of making keys up like this - if level > 0: - if insert_mode: - vim.eval(u_encode(u'feedkeys("\<C-t>", "n")')) - elif including_children: - vim.eval(u_encode(u'feedkeys(">]]", "n")')) - elif on_heading: - vim.eval(u_encode(u'feedkeys(">>", "n")')) - else: - vim.eval(u_encode(u'feedkeys(">}", "n")')) - else: - if insert_mode: - vim.eval(u_encode(u'feedkeys("\<C-d>", "n")')) - elif including_children: - vim.eval(u_encode(u'feedkeys("<]]", "n")')) - elif on_heading: - vim.eval(u_encode(u'feedkeys("<<", "n")')) - else: - vim.eval(u_encode(u'feedkeys("<}", "n")')) - # return True because otherwise apply_count will not work - return True - - # don't allow demotion below level 1 - if current_heading.level == 1 and level < 1: - return False - - # reduce level of demotion to a minimum heading level of 1 - if (current_heading.level + level) < 1: - level = 1 - - def indent(heading, ic): - if not heading: - return - heading.level += level - - if ic: - for child in heading.children: - indent(child, ic) - - # save cursor position - c = vim.current.window.cursor[:] - - # indent the promoted/demoted heading - indent_end_vim = current_heading.end_of_last_child_vim if including_children else current_heading.end_vim - indent(current_heading, including_children) - - # when changing the level of a heading, its position in the DOM - # needs to be updated. It's likely that the heading gets a new - # parent and new children when demoted or promoted - - # find new parent - p = current_heading.parent - pl = current_heading.get_parent_list() - ps = current_heading.previous_sibling - nhl = current_heading.level - - if level > 0: - # demotion - # subheading or top level heading - if ps and nhl > ps.level: - pl.remove(current_heading, taint=False) - # find heading that is the new parent heading - oh = ps - h = ps - while nhl > h.level: - oh = h - if h.children: - h = h.children[-1] - else: - break - np = h if nhl > h.level else oh - - # append current heading to new heading - np.children.append(current_heading, taint=False) - - # if children are not included, distribute them among the - # parent heading and it's siblings - if not including_children: - for h in current_heading.children[:]: - if h and h.level <= nhl: - cls._append_heading(h, np) - current_heading.children.remove(h, taint=False) - else: - # promotion - if p and nhl <= p.level: - idx = current_heading.get_index_in_parent_list() + 1 - # find the new parent heading - oh = p - h = p - while nhl <= h.level: - # append new children to current heading - for child in h.children[idx:]: - cls._append_heading(child, current_heading) - h.children.remove_slice(idx, len(h.children), taint=False) - idx = h.get_index_in_parent_list() + 1 - if h.parent: - h = h.parent - else: - break - ns = oh.next_sibling - while ns and ns.level > current_heading.level: - nns = ns.next_sibling - cls._append_heading(ns, current_heading) - ns = nns - - # append current heading to new parent heading / document - pl.remove(current_heading, taint=False) - if nhl > h.level: - h.children.insert(idx, current_heading, taint=False) - else: - d.headings.insert(idx, current_heading, taint=False) - - d.write() - - # restore cursor position - vim.current.window.cursor = (c[0], c[1] + level) - - return True - - @classmethod - @realign_tags - @repeat - @apply_count - def demote_heading(cls, including_children=True, on_heading=False, insert_mode=False): - if cls._change_heading_level(1, including_children=including_children, on_heading=on_heading, insert_mode=insert_mode): - if including_children: - return u'OrgDemoteSubtree' - return u'OrgDemoteHeading' - - @classmethod - @realign_tags - @repeat - @apply_count - def promote_heading(cls, including_children=True, on_heading=False, insert_mode=False): - if cls._change_heading_level(-1, including_children=including_children, on_heading=on_heading, insert_mode=insert_mode): - if including_children: - return u'OrgPromoteSubtreeNormal' - return u'OrgPromoteHeadingNormal' - - @classmethod - def _move_heading(cls, direction=Direction.FORWARD, including_children=True): - u""" Move heading up or down - - :returns: heading or None - """ - d = ORGMODE.get_document() - current_heading = d.current_heading() - if not current_heading or \ - (direction == Direction.FORWARD and not current_heading.next_sibling) or \ - (direction == Direction.BACKWARD and not current_heading.previous_sibling): - return None - - cursor_offset = vim.current.window.cursor[0] - (current_heading._orig_start + 1) - l = current_heading.get_parent_list() - if l is None: - raise HeadingDomError(u'Current heading is not properly linked in DOM') - - if not including_children: - if current_heading.previous_sibling: - npl = current_heading.previous_sibling.children - for child in current_heading.children: - npl.append(child, taint=False) - elif current_heading.parent: - # if the current heading doesn't have a previous sibling it - # must be the first heading - np = current_heading.parent - for child in current_heading.children: - cls._append_heading(child, np) - else: - # if the current heading doesn't have a parent, its children - # must be added as top level headings to the document - npl = l - for child in current_heading.children[::-1]: - npl.insert(0, child, taint=False) - current_heading.children.remove_slice(0, len(current_heading.children), taint=False) - - idx = current_heading.get_index_in_parent_list() - if idx is None: - raise HeadingDomError(u'Current heading is not properly linked in DOM') - - offset = 1 if direction == Direction.FORWARD else -1 - del l[idx] - l.insert(idx + offset, current_heading) - - d.write() - - vim.current.window.cursor = ( - current_heading.start_vim + cursor_offset, - vim.current.window.cursor[1]) - - return True - - @classmethod - @repeat - @apply_count - def move_heading_upward(cls, including_children=True): - if cls._move_heading(direction=Direction.BACKWARD, including_children=including_children): - if including_children: - return u'OrgMoveSubtreeUpward' - return u'OrgMoveHeadingUpward' - - @classmethod - @repeat - @apply_count - def move_heading_downward(cls, including_children=True): - if cls._move_heading(direction=Direction.FORWARD, including_children=including_children): - if including_children: - return u'OrgMoveSubtreeDownward' - return u'OrgMoveHeadingDownward' - - def register(self): - u""" - Registration of plugin. Key bindings and other initialization should be done. - """ -# EditStructure related default settings - settings.set(u'org_improve_split_heading', u'1') -# EditStructure related keybindings - self.keybindings.append(Keybinding(u'<C-S-CR>', - Plug(u'OrgNewHeadingAboveNormal', u':silent! %s ORGMODE.plugins[u"EditStructure"].new_heading(below=False)<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'New Heading &above', self.keybindings[-1]) - self.keybindings.append(Keybinding(u'<localleader>hN', u'<Plug>OrgNewHeadingAboveNormal', mode=MODE_NORMAL)) - self.keybindings.append(Keybinding(u'<localleader><CR>', u'<Plug>OrgNewHeadingAboveNormal', mode=MODE_NORMAL)) - - self.keybindings.append(Keybinding(u'<S-CR>', - Plug(u'OrgNewHeadingBelowNormal', u':silent! %s ORGMODE.plugins[u"EditStructure"].new_heading(below=True)<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'New Heading &below', self.keybindings[-1]) - self.keybindings.append(Keybinding(u'<localleader>hh', u'<Plug>OrgNewHeadingBelowNormal', mode=MODE_NORMAL)) - self.keybindings.append(Keybinding(u'<leader><CR>', u'<Plug>OrgNewHeadingBelowNormal', mode=MODE_NORMAL)) - - self.keybindings.append(Keybinding(u'<C-CR>', Plug(u'OrgNewHeadingBelowAfterChildrenNormal', u':silent! %s ORGMODE.plugins[u"EditStructure"].new_heading(below=True, end_of_last_child=True)<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'New Heading below, after &children', self.keybindings[-1]) - self.keybindings.append(Keybinding(u'<localleader>hn', u'<Plug>OrgNewHeadingBelowAfterChildrenNormal', mode=MODE_NORMAL)) - self.keybindings.append(Keybinding(u'<CR>', u'<Plug>OrgNewHeadingBelowAfterChildrenNormal', mode=MODE_NORMAL)) - - self.keybindings.append(Keybinding(u'<C-S-CR>', Plug(u'OrgNewHeadingAboveInsert', u'<C-o>:<C-u>silent! %s ORGMODE.plugins[u"EditStructure"].new_heading(below=False, insert_mode=True)<CR>' % VIM_PY_CALL, mode=MODE_INSERT))) - self.keybindings.append(Keybinding(u'<S-CR>', Plug(u'OrgNewHeadingBelowInsert', u'<C-o>:<C-u>silent! %s ORGMODE.plugins[u"EditStructure"].new_heading(below=True, insert_mode=True)<CR>' % VIM_PY_CALL, mode=MODE_INSERT))) - self.keybindings.append(Keybinding(u'<C-CR>', Plug(u'OrgNewHeadingBelowAfterChildrenInsert', u'<C-o>:<C-u>silent! %s ORGMODE.plugins[u"EditStructure"].new_heading(insert_mode=True, end_of_last_child=True)<CR>' % VIM_PY_CALL, mode=MODE_INSERT))) - - self.menu + Separator() - - self.keybindings.append(Keybinding(u'm{', Plug(u'OrgMoveHeadingUpward', - u'%s ORGMODE.plugins[u"EditStructure"].move_heading_upward(including_children=False)<CR>' % VIM_PY_CALL))) - self.keybindings.append(Keybinding(u'm[[', - Plug(u'OrgMoveSubtreeUpward', u'%s ORGMODE.plugins[u"EditStructure"].move_heading_upward()<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'Move Subtree &Up', self.keybindings[-1]) - self.keybindings.append(Keybinding(u'm}', - Plug(u'OrgMoveHeadingDownward', u'%s ORGMODE.plugins[u"EditStructure"].move_heading_downward(including_children=False)<CR>' % VIM_PY_CALL))) - self.keybindings.append(Keybinding(u'm]]', - Plug(u'OrgMoveSubtreeDownward', u'%s ORGMODE.plugins[u"EditStructure"].move_heading_downward()<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'Move Subtree &Down', self.keybindings[-1]) - - self.menu + Separator() - - self.menu + ActionEntry(u'&Copy Heading', u'yah', u'yah') - self.menu + ActionEntry(u'C&ut Heading', u'dah', u'dah') - - self.menu + Separator() - - self.menu + ActionEntry(u'&Copy Subtree', u'yar', u'yar') - self.menu + ActionEntry(u'C&ut Subtree', u'dar', u'dar') - self.menu + ActionEntry(u'&Paste Subtree', u'p', u'p') - - self.menu + Separator() - - self.keybindings.append(Keybinding(u'<ah', Plug(u'OrgPromoteHeadingNormal', u':silent! %s ORGMODE.plugins[u"EditStructure"].promote_heading(including_children=False)<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'&Promote Heading', self.keybindings[-1]) - self.keybindings.append(Keybinding(u'<<', Plug(u'OrgPromoteOnHeadingNormal', u':silent! %s ORGMODE.plugins[u"EditStructure"].promote_heading(including_children=False, on_heading=True)<CR>' % VIM_PY_CALL))) - self.keybindings.append(Keybinding(u'<{', u'<Plug>OrgPromoteHeadingNormal', mode=MODE_NORMAL)) - self.keybindings.append(Keybinding(u'<ih', u'<Plug>OrgPromoteHeadingNormal', mode=MODE_NORMAL)) - - self.keybindings.append(Keybinding(u'<ar', Plug(u'OrgPromoteSubtreeNormal', u':silent! %s ORGMODE.plugins[u"EditStructure"].promote_heading()<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'&Promote Subtree', self.keybindings[-1]) - self.keybindings.append(Keybinding(u'<[[', u'<Plug>OrgPromoteSubtreeNormal', mode=MODE_NORMAL)) - self.keybindings.append(Keybinding(u'<ir', u'<Plug>OrgPromoteSubtreeNormal', mode=MODE_NORMAL)) - - self.keybindings.append(Keybinding(u'>ah', Plug(u'OrgDemoteHeadingNormal', u':silent! %s ORGMODE.plugins[u"EditStructure"].demote_heading(including_children=False)<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'&Demote Heading', self.keybindings[-1]) - self.keybindings.append(Keybinding(u'>>', Plug(u'OrgDemoteOnHeadingNormal', u':silent! %s ORGMODE.plugins[u"EditStructure"].demote_heading(including_children=False, on_heading=True)<CR>' % VIM_PY_CALL))) - self.keybindings.append(Keybinding(u'>}', u'<Plug>OrgDemoteHeadingNormal', mode=MODE_NORMAL)) - self.keybindings.append(Keybinding(u'>ih', u'<Plug>OrgDemoteHeadingNormal', mode=MODE_NORMAL)) - - self.keybindings.append(Keybinding(u'>ar', Plug(u'OrgDemoteSubtreeNormal', u':silent! %s ORGMODE.plugins[u"EditStructure"].demote_heading()<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'&Demote Subtree', self.keybindings[-1]) - self.keybindings.append(Keybinding(u'>]]', u'<Plug>OrgDemoteSubtreeNormal', mode=MODE_NORMAL)) - self.keybindings.append(Keybinding(u'>ir', u'<Plug>OrgDemoteSubtreeNormal', mode=MODE_NORMAL)) - - # other keybindings - self.keybindings.append(Keybinding(u'<C-d>', Plug(u'OrgPromoteOnHeadingInsert', u'<C-o>:silent! %s ORGMODE.plugins[u"EditStructure"].promote_heading(including_children=False, on_heading=True, insert_mode=True)<CR>' % VIM_PY_CALL, mode=MODE_INSERT))) - self.keybindings.append(Keybinding(u'<C-t>', Plug(u'OrgDemoteOnHeadingInsert', u'<C-o>:silent! %s ORGMODE.plugins[u"EditStructure"].demote_heading(including_children=False, on_heading=True, insert_mode=True)<CR>' % VIM_PY_CALL, mode=MODE_INSERT))) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Export.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Export.py deleted file mode 100644 index d18f415..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Export.py +++ /dev/null @@ -1,183 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import subprocess - -import vim - -from orgmode._vim import ORGMODE, echoe, echom -from orgmode.menu import Submenu, ActionEntry, add_cmd_mapping_menu -from orgmode.keybinding import Keybinding, Plug, Command -from orgmode import settings - -from orgmode.py3compat.py_py3_string import * - -class Export(object): - u""" - Export a orgmode file using emacs orgmode. - - This is a *very simple* wrapper of the emacs/orgmode export. emacs and - orgmode need to be installed. We simply call emacs with some options to - export the .org. - - TODO: Offer export options in vim. Don't use the menu. - TODO: Maybe use a native implementation. - """ - - def __init__(self): - u""" Initialize plugin """ - object.__init__(self) - # menu entries this plugin should create - self.menu = ORGMODE.orgmenu + Submenu(u'Export') - - # key bindings for this plugin - # key bindings are also registered through the menu so only additional - # bindings should be put in this variable - self.keybindings = [] - - # commands for this plugin - self.commands = [] - - @classmethod - def _get_init_script(cls): - init_script = settings.get(u'org_export_init_script', u'') - if init_script: - init_script = os.path.expandvars(os.path.expanduser(init_script)) - if os.path.exists(init_script): - return init_script - else: - echoe(u'Unable to find init script %s' % init_script) - - @classmethod - def _export(cls, format_): - """Export current file to format. - - Args: - format_: pdf or html - - Returns: - return code - """ - emacsbin = os.path.expandvars(os.path.expanduser( - settings.get(u'org_export_emacs', u'/usr/bin/emacs'))) - if not os.path.exists(emacsbin): - echoe(u'Unable to find emacs binary %s' % emacsbin) - - # build the export command - cmd = [ - emacsbin, - u'-nw', - u'--batch', - u'--visit=%s' % vim.eval(u'expand("%:p")'), - u'--funcall=%s' % format_ - ] - # source init script as well - init_script = cls._get_init_script() - if init_script: - cmd.extend(['--script', init_script]) - - # export - p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - p.wait() - - if p.returncode != 0 or settings.get(u'org_export_verbose') == 1: - echom('\n'.join(p.communicate())) - return p.returncode - - @classmethod - def topdf(cls): - u"""Export the current buffer as pdf using emacs orgmode.""" - ret = cls._export(u'org-latex-export-to-pdf') - if ret != 0: - echoe(u'PDF export failed.') - else: - echom(u'Export successful: %s.%s' % (vim.eval(u'expand("%:r")'), 'pdf')) - - @classmethod - def tobeamer(cls): - u"""Export the current buffer as beamer pdf using emacs orgmode.""" - ret = cls._export(u'org-beamer-export-to-pdf') - if ret != 0: - echoe(u'PDF export failed.') - else: - echom(u'Export successful: %s.%s' % (vim.eval(u'expand("%:r")'), 'pdf')) - - @classmethod - def tohtml(cls): - u"""Export the current buffer as html using emacs orgmode.""" - ret = cls._export(u'org-html-export-to-html') - if ret != 0: - echoe(u'HTML export failed.') - else: - echom(u'Export successful: %s.%s' % (vim.eval(u'expand("%:r")'), 'html')) - - @classmethod - def tolatex(cls): - u"""Export the current buffer as latex using emacs orgmode.""" - ret = cls._export(u'org-latex-export-to-latex') - if ret != 0: - echoe(u'latex export failed.') - else: - echom(u'Export successful: %s.%s' % (vim.eval(u'expand("%:r")'), 'tex')) - - @classmethod - def tomarkdown(cls): - u"""Export the current buffer as markdown using emacs orgmode.""" - ret = cls._export(u'org-md-export-to-markdown') - if ret != 0: - echoe('Markdown export failed. Make sure org-md-export-to-markdown is loaded in emacs, see the manual for details.') - else: - echom(u'Export successful: %s.%s' % (vim.eval(u'expand("%:r")'), 'md')) - - def register(self): - u"""Registration and keybindings.""" - - # path to emacs executable - settings.set(u'org_export_emacs', u'/usr/bin/emacs') - # verbose output for export - settings.set(u'org_export_verbose', 0) - # allow the user to define an initialization script - settings.set(u'org_export_init_script', u'') - - # to PDF - add_cmd_mapping_menu( - self, - name=u'OrgExportToPDF', - function=u':%s ORGMODE.plugins[u"Export"].topdf()<CR>' % VIM_PY_CALL, - key_mapping=u'<localleader>ep', - menu_desrc=u'To PDF (via Emacs)' - ) - # to Beamer PDF - add_cmd_mapping_menu( - self, - name=u'OrgExportToBeamerPDF', - function=u':%s ORGMODE.plugins[u"Export"].tobeamer()<CR>' % VIM_PY_CALL, - key_mapping=u'<localleader>eb', - menu_desrc=u'To Beamer PDF (via Emacs)' - ) - # to latex - add_cmd_mapping_menu( - self, - name=u'OrgExportToLaTeX', - function=u':%s ORGMODE.plugins[u"Export"].tolatex()<CR>' % VIM_PY_CALL, - key_mapping=u'<localleader>el', - menu_desrc=u'To LaTeX (via Emacs)' - ) - # to HTML - add_cmd_mapping_menu( - self, - name=u'OrgExportToHTML', - function=u':%s ORGMODE.plugins[u"Export"].tohtml()<CR>' % VIM_PY_CALL, - key_mapping=u'<localleader>eh', - menu_desrc=u'To HTML (via Emacs)' - ) - # to Markdown - add_cmd_mapping_menu( - self, - name=u'OrgExportToMarkdown', - function=u':%s ORGMODE.plugins[u"Export"].tomarkdown()<CR>' % VIM_PY_CALL, - key_mapping=u'<localleader>em', - menu_desrc=u'To Markdown (via Emacs)' - ) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Hyperlinks.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Hyperlinks.py deleted file mode 100644 index dd4ce04..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Hyperlinks.py +++ /dev/null @@ -1,221 +0,0 @@ -# -*- coding: utf-8 -*- - -import re - -import vim - -from orgmode._vim import echom, ORGMODE, realign_tags -from orgmode.menu import Submenu, Separator, ActionEntry -from orgmode.keybinding import Keybinding, Plug, Command - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.py_py3_string import * - -class Hyperlinks(object): - u""" Hyperlinks plugin """ - - def __init__(self): - u""" Initialize plugin """ - object.__init__(self) - # menu entries this plugin should create - self.menu = ORGMODE.orgmenu + Submenu(u'Hyperlinks') - - # key bindings for this plugin - # key bindings are also registered through the menu so only additional - # bindings should be put in this variable - self.keybindings = [] - - # commands for this plugin - self.commands = [] - - uri_match = re.compile( - r'^\[{2}(?P<uri>[^][]*)(\]\[(?P<description>[^][]*))?\]{2}') - - @classmethod - def _get_link(cls, cursor=None): - u""" - Get the link the cursor is on and return it's URI and description - - :cursor: None or (Line, Column) - :returns: None if no link was found, otherwise {uri:URI, - description:DESCRIPTION, line:LINE, start:START, end:END} - or uri and description could be None if not set - """ - cursor = cursor if cursor else vim.current.window.cursor - line = u_decode(vim.current.buffer[cursor[0] - 1]) - - # if the cursor is on the last bracket, it's not recognized as a hyperlink - start = line.rfind(u'[[', 0, cursor[1]) - if start == -1: - start = line.rfind(u'[[', 0, cursor[1] + 2) - end = line.find(u']]', cursor[1]) - if end == -1: - end = line.find(u']]', cursor[1] - 1) - - # extract link - if start != -1 and end != -1: - end += 2 - match = Hyperlinks.uri_match.match(line[start:end]) - - res = { - u'line': line, - u'start': start, - u'end': end, - u'uri': None, - u'description': None} - if match: - res.update(match.groupdict()) - # reverse character escaping(partly done due to matching) - res[u'uri'] = res[u'uri'].replace(u'\\\\', u'\\') - return res - - @classmethod - def follow(cls, action=u'openLink', visual=u''): - u""" Follow hyperlink. If called on a regular string UTL determines the - outcome. Normally a file with that name will be opened. - - :action: "copy" if the link should be copied to clipboard, otherwise - the link will be opened - :visual: "visual" if Universal Text Linking should be triggered in - visual mode - - :returns: URI or None - """ - if not int(vim.eval(u'exists(":Utl")')): - echom(u'Universal Text Linking plugin not installed, unable to proceed.') - return - - action = u'copyLink' \ - if (action and action.startswith(u'copy')) \ - else u'openLink' - visual = u'visual' if visual and visual.startswith(u'visual') else u'' - - link = Hyperlinks._get_link() - - if link and link[u'uri'] is not None: - # call UTL with the URI - vim.command(u_encode(u'Utl %s %s %s' % (action, visual, link[u'uri']))) - return link[u'uri'] - else: - # call UTL and let it decide what to do - vim.command(u_encode(u'Utl %s %s' % (action, visual))) - - @classmethod - @realign_tags - def insert(cls, uri=None, description=None): - u""" Inserts a hyperlink. If no arguments are provided, an interactive - query will be started. - - :uri: The URI that will be opened - :description: An optional description that will be displayed instead of - the URI - - :returns: (URI, description) - """ - link = Hyperlinks._get_link() - if link: - if uri is None and link[u'uri'] is not None: - uri = link[u'uri'] - if description is None and link[u'description'] is not None: - description = link[u'description'] - - if uri is None: - uri = vim.eval(u'input("Link: ", "", "file")') - elif link: - uri = vim.eval(u'input("Link: ", "%s", "file")' % link[u'uri']) - if uri is None: - return - else: - uri = u_decode(uri) - - # character escaping - uri = uri.replace(u'\\', u'\\\\\\\\') - uri = uri.replace(u' ', u'\ ') - - if description is None: - description = u_decode(vim.eval(u'input("Description: ")')) - elif link: - description = vim.eval( - u'input("Description: ", "%s")' % - u_decode(link[u'description'])) - if description is None: - return - - cursor = vim.current.window.cursor - cl = u_decode(vim.current.buffer[cursor[0] - 1]) - head = cl[:cursor[1] + 1] if not link else cl[:link[u'start']] - tail = cl[cursor[1] + 1:] if not link else cl[link[u'end']:] - - separator = u'' - if description: - separator = u'][' - - if uri or description: - vim.current.buffer[cursor[0] - 1] = \ - u_encode(u''.join((head, u'[[%s%s%s]]' % (uri, separator, description), tail))) - elif link: - vim.current.buffer[cursor[0] - 1] = \ - u_encode(u''.join((head, tail))) - - def register(self): - u""" - Registration of plugin. Key bindings and other initialization should be done. - """ - cmd = Command( - u'OrgHyperlinkFollow', - u'%s ORGMODE.plugins[u"Hyperlinks"].follow()' % VIM_PY_CALL) - self.commands.append(cmd) - self.keybindings.append( - Keybinding(u'gl', Plug(u'OrgHyperlinkFollow', self.commands[-1]))) - self.menu + ActionEntry(u'&Follow Link', self.keybindings[-1]) - - cmd = Command( - u'OrgHyperlinkCopy', - u'%s ORGMODE.plugins[u"Hyperlinks"].follow(action=u"copy")' % VIM_PY_CALL) - self.commands.append(cmd) - self.keybindings.append( - Keybinding(u'gyl', Plug(u'OrgHyperlinkCopy', self.commands[-1]))) - self.menu + ActionEntry(u'&Copy Link', self.keybindings[-1]) - - cmd = Command( - u'OrgHyperlinkInsert', - u'%s ORGMODE.plugins[u"Hyperlinks"].insert(<f-args>)' % VIM_PY_CALL, - arguments=u'*') - self.commands.append(cmd) - self.keybindings.append( - Keybinding(u'gil', Plug(u'OrgHyperlinkInsert', self.commands[-1]))) - self.menu + ActionEntry(u'&Insert Link', self.keybindings[-1]) - - self.menu + Separator() - - # find next link - cmd = Command( - u'OrgHyperlinkNextLink', - u":if search('\[\{2}\zs[^][]*\(\]\[[^][]*\)\?\ze\]\{2}', 's') == 0 | echo 'No further link found.' | endif") - self.commands.append(cmd) - self.keybindings.append( - Keybinding(u'gn', Plug(u'OrgHyperlinkNextLink', self.commands[-1]))) - self.menu + ActionEntry(u'&Next Link', self.keybindings[-1]) - - # find previous link - cmd = Command( - u'OrgHyperlinkPreviousLink', - u":if search('\[\{2}\zs[^][]*\(\]\[[^][]*\)\?\ze\]\{2}', 'bs') == 0 | echo 'No further link found.' | endif") - self.commands.append(cmd) - self.keybindings.append( - Keybinding(u'go', Plug(u'OrgHyperlinkPreviousLink', self.commands[-1]))) - self.menu + ActionEntry(u'&Previous Link', self.keybindings[-1]) - - self.menu + Separator() - - # Descriptive Links - cmd = Command(u'OrgHyperlinkDescriptiveLinks', u':setlocal cole=2') - self.commands.append(cmd) - self.menu + ActionEntry(u'&Descriptive Links', self.commands[-1]) - - # Literal Links - cmd = Command(u'OrgHyperlinkLiteralLinks', u':setlocal cole=0') - self.commands.append(cmd) - self.menu + ActionEntry(u'&Literal Links', self.commands[-1]) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/LoggingWork.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/LoggingWork.py deleted file mode 100644 index 1767984..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/LoggingWork.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- - -import vim - -from orgmode._vim import echo, echom, echoe, ORGMODE, apply_count, repeat -from orgmode.menu import Submenu, Separator, ActionEntry -from orgmode.keybinding import Keybinding, Plug, Command - -from orgmode.py3compat.py_py3_string import * - -class LoggingWork(object): - u""" LoggingWork plugin """ - - def __init__(self): - u""" Initialize plugin """ - object.__init__(self) - # menu entries this plugin should create - self.menu = ORGMODE.orgmenu + Submenu(u'&Logging work') - - # key bindings for this plugin - # key bindings are also registered through the menu so only additional - # bindings should be put in this variable - self.keybindings = [] - - # commands for this plugin - self.commands = [] - - @classmethod - def action(cls): - u""" Some kind of action - - :returns: TODO - """ - pass - - def register(self): - u""" - Registration of plugin. Key bindings and other initialization should be done. - """ - # an Action menu entry which binds "keybinding" to action ":action" - self.commands.append(Command(u'OrgLoggingRecordDoneTime', u'%s ORGMODE.plugins[u"LoggingWork"].action()' % VIM_PY_CALL)) - self.menu + ActionEntry(u'&Record DONE time', self.commands[-1]) diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Misc.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Misc.py deleted file mode 100644 index 3bbb8d9..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Misc.py +++ /dev/null @@ -1,173 +0,0 @@ -# -*- coding: utf-8 -*- - -import vim - -from orgmode._vim import ORGMODE, apply_count -from orgmode.menu import Submenu -from orgmode.keybinding import Keybinding, Plug, MODE_VISUAL, MODE_OPERATOR - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.py_py3_string import * - -class Misc(object): - u""" Miscellaneous functionality """ - - def __init__(self): - u""" Initialize plugin """ - object.__init__(self) - # menu entries this plugin should create - self.menu = ORGMODE.orgmenu + Submenu(u'Misc') - - # key bindings for this plugin - # key bindings are also registered through the menu so only additional - # bindings should be put in this variable - self.keybindings = [] - - @classmethod - def jump_to_first_character(cls): - heading = ORGMODE.get_document().current_heading() - if not heading or heading.start_vim != vim.current.window.cursor[0]: - vim.eval(u_encode(u'feedkeys("^", "n")')) - return - - vim.current.window.cursor = (vim.current.window.cursor[0], heading.level + 1) - - @classmethod - def edit_at_first_character(cls): - heading = ORGMODE.get_document().current_heading() - if not heading or heading.start_vim != vim.current.window.cursor[0]: - vim.eval(u_encode(u'feedkeys("I", "n")')) - return - - vim.current.window.cursor = (vim.current.window.cursor[0], heading.level + 1) - vim.command(u_encode(u'startinsert')) - - # @repeat - @classmethod - @apply_count - def i_heading(cls, mode=u'visual', selection=u'inner', skip_children=False): - u""" - inner heading text object - """ - heading = ORGMODE.get_document().current_heading() - if heading: - if selection != u'inner': - heading = heading if not heading.parent else heading.parent - - line_start, col_start = [int(i) for i in vim.eval(u_encode(u'getpos("\'<")'))[1:3]] - line_end, col_end = [int(i) for i in vim.eval(u_encode(u'getpos("\'>")'))[1:3]] - - if mode != u'visual': - line_start = vim.current.window.cursor[0] - line_end = line_start - - start = line_start - end = line_end - move_one_character_back = u'' if mode == u'visual' else u'h' - - if heading.start_vim < line_start: - start = heading.start_vim - if heading.end_vim > line_end and not skip_children: - end = heading.end_vim - elif heading.end_of_last_child_vim > line_end and skip_children: - end = heading.end_of_last_child_vim - - if mode != u'visual' and not vim.current.buffer[end - 1]: - end -= 1 - move_one_character_back = u'' - - swap_cursor = u'o' if vim.current.window.cursor[0] == line_start else u'' - - if selection == u'inner' and vim.current.window.cursor[0] != line_start: - h = ORGMODE.get_document().current_heading() - if h: - heading = h - - visualmode = u_decode(vim.eval(u'visualmode()')) if mode == u'visual' else u'v' - - if line_start == start and line_start != heading.start_vim: - if col_start in (0, 1): - vim.command(u_encode(u'normal! %dgg0%s%dgg$%s%s' % (start, visualmode, end, move_one_character_back, swap_cursor))) - else: - vim.command(u_encode(u'normal! %dgg0%dl%s%dgg$%s%s' % (start, col_start - 1, visualmode, end, move_one_character_back, swap_cursor))) - else: - vim.command(u_encode(u'normal! %dgg0%dl%s%dgg$%s%s' % (start, heading.level + 1, visualmode, end, move_one_character_back, swap_cursor))) - - if selection == u'inner': - if mode == u'visual': - return u'OrgInnerHeadingVisual' if not skip_children else u'OrgInnerTreeVisual' - else: - return u'OrgInnerHeadingOperator' if not skip_children else u'OrgInnerTreeOperator' - else: - if mode == u'visual': - return u'OrgOuterHeadingVisual' if not skip_children else u'OrgOuterTreeVisual' - else: - return u'OrgOuterHeadingOperator' if not skip_children else u'OrgOuterTreeOperator' - elif mode == u'visual': - vim.command(u_encode(u'normal! gv')) - - # @repeat - @classmethod - @apply_count - def a_heading(cls, selection=u'inner', skip_children=False): - u""" - a heading text object - """ - heading = ORGMODE.get_document().current_heading() - if heading: - if selection != u'inner': - heading = heading if not heading.parent else heading.parent - - line_start, col_start = [int(i) for i in vim.eval(u_encode(u'getpos("\'<")'))[1:3]] - line_end, col_end = [int(i) for i in vim.eval(u_encode(u'getpos("\'>")'))[1:3]] - - start = line_start - end = line_end - - if heading.start_vim < line_start: - start = heading.start_vim - if heading.end_vim > line_end and not skip_children: - end = heading.end_vim - elif heading.end_of_last_child_vim > line_end and skip_children: - end = heading.end_of_last_child_vim - - swap_cursor = u'o' if vim.current.window.cursor[0] == line_start else u'' - - vim.command(u_encode(u'normal! %dgg%s%dgg$%s' % (start, vim.eval(u_encode(u'visualmode()')), end, swap_cursor))) - if selection == u'inner': - return u'OrgAInnerHeadingVisual' if not skip_children else u'OrgAInnerTreeVisual' - else: - return u'OrgAOuterHeadingVisual' if not skip_children else u'OrgAOuterTreeVisual' - else: - vim.command(u_encode(u'normal! gv')) - - def register(self): - u""" - Registration of plugin. Key bindings and other initialization should be done. - """ - self.keybindings.append(Keybinding(u'^', - Plug(u'OrgJumpToFirstCharacter', u'%s ORGMODE.plugins[u"Misc"].jump_to_first_character()<CR>' % VIM_PY_CALL))) - self.keybindings.append(Keybinding(u'I', - Plug(u'OrgEditAtFirstCharacter', u'%s ORGMODE.plugins[u"Misc"].edit_at_first_character()<CR>' % VIM_PY_CALL))) - - self.keybindings.append(Keybinding(u'ih', Plug(u'OrgInnerHeadingVisual', u':<C-u>%s ORGMODE.plugins[u"Misc"].i_heading()<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - self.keybindings.append(Keybinding(u'ah', Plug(u'OrgAInnerHeadingVisual', u':<C-u>%s ORGMODE.plugins[u"Misc"].a_heading()<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - self.keybindings.append(Keybinding(u'Oh', Plug(u'OrgOuterHeadingVisual', u':<C-u>%s ORGMODE.plugins[u"Misc"].i_heading(selection=u"outer")<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - self.keybindings.append(Keybinding(u'OH', Plug(u'OrgAOuterHeadingVisual', u':<C-u>%s ORGMODE.plugins[u"Misc"].a_heading(selection=u"outer")<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - - self.keybindings.append(Keybinding(u'ih', Plug(u'OrgInnerHeadingOperator', u':<C-u>%s ORGMODE.plugins[u"Misc"].i_heading(mode=u"operator")<CR>' % VIM_PY_CALL, mode=MODE_OPERATOR))) - self.keybindings.append(Keybinding(u'ah', u':normal Vah<CR>', mode=MODE_OPERATOR)) - self.keybindings.append(Keybinding(u'Oh', Plug(u'OrgOuterHeadingOperator', ':<C-u>%s ORGMODE.plugins[u"Misc"].i_heading(mode=u"operator", selection=u"outer")<CR>' % VIM_PY_CALL, mode=MODE_OPERATOR))) - self.keybindings.append(Keybinding(u'OH', u':normal VOH<CR>', mode=MODE_OPERATOR)) - - self.keybindings.append(Keybinding(u'ir', Plug(u'OrgInnerTreeVisual', u':<C-u>%s ORGMODE.plugins[u"Misc"].i_heading(skip_children=True)<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - self.keybindings.append(Keybinding(u'ar', Plug(u'OrgAInnerTreeVisual', u':<C-u>%s ORGMODE.plugins[u"Misc"].a_heading(skip_children=True)<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - self.keybindings.append(Keybinding(u'Or', Plug(u'OrgOuterTreeVisual', u'<:<C-u>%s ORGMODE.plugins[u"Misc"].i_heading(selection=u"outer", skip_children=True)<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - self.keybindings.append(Keybinding(u'OR', Plug(u'OrgAOuterTreeVisual', u':<C-u>%s ORGMODE.plugins[u"Misc"].a_heading(selection=u"outer", skip_children=True)<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - - self.keybindings.append(Keybinding(u'ir', Plug(u'OrgInnerTreeOperator', u':<C-u>%s ORGMODE.plugins[u"Misc"].i_heading(mode=u"operator", skip_children=True)<CR>' % VIM_PY_CALL, mode=MODE_OPERATOR))) - self.keybindings.append(Keybinding(u'ar', u':normal Var<CR>', mode=MODE_OPERATOR)) - self.keybindings.append(Keybinding(u'Or', Plug(u'OrgOuterTreeOperator', u':<C-u>%s ORGMODE.plugins[u"Misc"].i_heading(mode=u"operator", selection=u"outer", skip_children=True)<CR>' % VIM_PY_CALL, mode=MODE_OPERATOR))) - self.keybindings.append(Keybinding(u'OR', u':normal VOR<CR>', mode=MODE_OPERATOR)) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Navigator.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Navigator.py deleted file mode 100644 index 2ae5741..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Navigator.py +++ /dev/null @@ -1,326 +0,0 @@ -# -*- coding: utf-8 -*- - -import vim - -from orgmode._vim import echo, ORGMODE, apply_count -from orgmode.menu import Submenu, ActionEntry -from orgmode.keybinding import Keybinding, MODE_VISUAL, MODE_OPERATOR, Plug -from orgmode.liborgmode.documents import Direction - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.py_py3_string import * - -class Navigator(object): - u""" Implement navigation in org-mode documents """ - - def __init__(self): - object.__init__(self) - self.menu = ORGMODE.orgmenu + Submenu(u'&Navigate Headings') - self.keybindings = [] - - @classmethod - @apply_count - def parent(cls, mode): - u""" - Focus parent heading - - :returns: parent heading or None - """ - heading = ORGMODE.get_document().current_heading() - if not heading: - if mode == u'visual': - vim.command(u_encode(u'normal! gv')) - else: - echo(u'No heading found') - return - - if not heading.parent: - if mode == u'visual': - vim.command(u_encode(u'normal! gv')) - else: - echo(u'No parent heading found') - return - - p = heading.parent - - if mode == u'visual': - cls._change_visual_selection(heading, p, direction=Direction.BACKWARD, parent=True) - else: - vim.current.window.cursor = (p.start_vim, p.level + 1) - return p - - @classmethod - @apply_count - def parent_next_sibling(cls, mode): - u""" - Focus the parent's next sibling - - :returns: parent's next sibling heading or None - """ - heading = ORGMODE.get_document().current_heading() - if not heading: - if mode == u'visual': - vim.command(u_encode(u'normal! gv')) - else: - echo(u'No heading found') - return - - if not heading.parent or not heading.parent.next_sibling: - if mode == u'visual': - vim.command(u_encode(u'normal! gv')) - else: - echo(u'No parent heading found') - return - - ns = heading.parent.next_sibling - - if mode == u'visual': - cls._change_visual_selection(heading, ns, direction=Direction.FORWARD, parent=False) - elif mode == u'operator': - vim.current.window.cursor = (ns.start_vim, 0) - else: - vim.current.window.cursor = (ns.start_vim, ns.level + 1) - return ns - - @classmethod - def _change_visual_selection(cls, current_heading, heading, direction=Direction.FORWARD, noheadingfound=False, parent=False): - current = vim.current.window.cursor[0] - line_start, col_start = [int(i) for i in vim.eval(u_encode(u'getpos("\'<")'))[1:3]] - line_end, col_end = [int(i) for i in vim.eval(u_encode(u'getpos("\'>")'))[1:3]] - - f_start = heading.start_vim - f_end = heading.end_vim - swap_cursor = True - - # << |visual start - # selection end >> - if current == line_start: - if (direction == Direction.FORWARD and line_end < f_start) or noheadingfound and not direction == Direction.BACKWARD: - swap_cursor = False - - # focus heading HERE - # << |visual start - # selection end >> - - # << |visual start - # focus heading HERE - # selection end >> - if f_start < line_start and direction == Direction.BACKWARD: - if current_heading.start_vim < line_start and not parent: - line_start = current_heading.start_vim - else: - line_start = f_start - - elif (f_start < line_start or f_start < line_end) and not noheadingfound: - line_start = f_start - - # << |visual start - # selection end >> - # focus heading HERE - else: - if direction == Direction.FORWARD: - if line_end < f_start and not line_start == f_start - 1 and current_heading: - # focus end of previous heading instead of beginning of next heading - line_start = line_end - line_end = f_start - 1 - else: - # focus end of next heading - line_start = line_end - line_end = f_end - elif direction == Direction.BACKWARD: - if line_end < f_end: - pass - else: - line_start = line_end - line_end = f_end - - # << visual start - # selection end| >> - else: - # focus heading HERE - # << visual start - # selection end| >> - if line_start > f_start and line_end > f_end and not parent: - line_end = f_end - swap_cursor = False - - elif (line_start > f_start or line_start == f_start) and \ - line_end <= f_end and direction == Direction.BACKWARD: - line_end = line_start - line_start = f_start - - # << visual start - # selection end and focus heading end HERE| >> - - # << visual start - # focus heading HERE - # selection end| >> - - # << visual start - # selection end| >> - # focus heading HERE - else: - if direction == Direction.FORWARD: - if line_end < f_start - 1: - # focus end of previous heading instead of beginning of next heading - line_end = f_start - 1 - else: - # focus end of next heading - line_end = f_end - else: - line_end = f_end - swap_cursor = False - - move_col_start = u'%dl' % (col_start - 1) if (col_start - 1) > 0 and (col_start - 1) < 2000000000 else u'' - move_col_end = u'%dl' % (col_end - 1) if (col_end - 1) > 0 and (col_end - 1) < 2000000000 else u'' - swap = u'o' if swap_cursor else u'' - - vim.command(u_encode(u'normal! %dgg%s%s%dgg%s%s' % (line_start, move_col_start, vim.eval(u_encode(u'visualmode()')), line_end, move_col_end, swap))) - - @classmethod - def _focus_heading(cls, mode, direction=Direction.FORWARD, skip_children=False): - u""" - Focus next or previous heading in the given direction - - :direction: True for next heading, False for previous heading - :returns: next heading or None - """ - d = ORGMODE.get_document() - current_heading = d.current_heading() - heading = current_heading - focus_heading = None - # FIXME this is just a piece of really ugly and unmaintainable code. It - # should be rewritten - if not heading: - if direction == Direction.FORWARD and d.headings \ - and vim.current.window.cursor[0] < d.headings[0].start_vim: - # the cursor is in the meta information are, therefore focus - # first heading - focus_heading = d.headings[0] - if not (heading or focus_heading): - if mode == u'visual': - # restore visual selection when no heading was found - vim.command(u_encode(u'normal! gv')) - else: - echo(u'No heading found') - return - elif direction == Direction.BACKWARD: - if vim.current.window.cursor[0] != heading.start_vim: - # the cursor is in the body of the current heading, therefore - # the current heading will be focused - if mode == u'visual': - line_start, col_start = [int(i) for i in - vim.eval(u_encode(u'getpos("\'<")'))[1:3]] - line_end, col_end = [int(i) for i in vim.eval(u_encode(u'getpos("\'>")'))[1:3]] - if line_start >= heading.start_vim and line_end > heading.start_vim: - focus_heading = heading - else: - focus_heading = heading - - # so far no heading has been found that the next focus should be on - if not focus_heading: - if not skip_children and direction == Direction.FORWARD and heading.children: - focus_heading = heading.children[0] - elif direction == Direction.FORWARD and heading.next_sibling: - focus_heading = heading.next_sibling - elif direction == Direction.BACKWARD and heading.previous_sibling: - focus_heading = heading.previous_sibling - if not skip_children: - while focus_heading.children: - focus_heading = focus_heading.children[-1] - else: - if direction == Direction.FORWARD: - focus_heading = current_heading.next_heading - else: - focus_heading = current_heading.previous_heading - - noheadingfound = False - if not focus_heading: - if mode in (u'visual', u'operator'): - # the cursor seems to be on the last or first heading of this - # document and performes another next/previous operation - focus_heading = heading - noheadingfound = True - else: - if direction == Direction.FORWARD: - echo(u'Already focussing last heading') - else: - echo(u'Already focussing first heading') - return - - if mode == u'visual': - cls._change_visual_selection(current_heading, focus_heading, direction=direction, noheadingfound=noheadingfound) - elif mode == u'operator': - if direction == Direction.FORWARD and vim.current.window.cursor[0] >= focus_heading.start_vim: - vim.current.window.cursor = (focus_heading.end_vim, len(u_decode(vim.current.buffer[focus_heading.end]))) - else: - vim.current.window.cursor = (focus_heading.start_vim, 0) - else: - vim.current.window.cursor = (focus_heading.start_vim, focus_heading.level + 1) - if noheadingfound: - return - return focus_heading - - @classmethod - @apply_count - def previous(cls, mode, skip_children=False): - u""" - Focus previous heading - """ - return cls._focus_heading(mode, direction=Direction.BACKWARD, skip_children=skip_children) - - @classmethod - @apply_count - def next(cls, mode, skip_children=False): - u""" - Focus next heading - """ - return cls._focus_heading(mode, direction=Direction.FORWARD, skip_children=skip_children) - - def register(self): - # normal mode - self.keybindings.append(Keybinding(u'g{', Plug('OrgJumpToParentNormal', - u'%s ORGMODE.plugins[u"Navigator"].parent(mode=u"normal")<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'&Up', self.keybindings[-1]) - self.keybindings.append(Keybinding(u'g}', - Plug('OrgJumpToParentsSiblingNormal', u'%s ORGMODE.plugins[u"Navigator"].parent_next_sibling(mode=u"normal")<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'&Down', self.keybindings[-1]) - self.keybindings.append(Keybinding(u'{', - Plug(u'OrgJumpToPreviousNormal', u'%s ORGMODE.plugins[u"Navigator"].previous(mode=u"normal")<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'&Previous', self.keybindings[-1]) - self.keybindings.append(Keybinding(u'}', Plug(u'OrgJumpToNextNormal', - u'%s ORGMODE.plugins[u"Navigator"].next(mode=u"normal")<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'&Next', self.keybindings[-1]) - - # visual mode - self.keybindings.append(Keybinding(u'g{', Plug(u'OrgJumpToParentVisual', u'<Esc>:<C-u>%s ORGMODE.plugins[u"Navigator"].parent(mode=u"visual")<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - self.keybindings.append(Keybinding(u'g}', Plug('OrgJumpToParentsSiblingVisual', u'<Esc>:<C-u>%s ORGMODE.plugins[u"Navigator"].parent_next_sibling(mode=u"visual")<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - self.keybindings.append(Keybinding(u'{', Plug(u'OrgJumpToPreviousVisual', u'<Esc>:<C-u>%s ORGMODE.plugins[u"Navigator"].previous(mode=u"visual")<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - self.keybindings.append(Keybinding(u'}', Plug(u'OrgJumpToNextVisual', u'<Esc>:<C-u>%s ORGMODE.plugins[u"Navigator"].next(mode=u"visual")<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - - # operator-pending mode - self.keybindings.append(Keybinding(u'g{', Plug(u'OrgJumpToParentOperator', u':<C-u>%s ORGMODE.plugins[u"Navigator"].parent(mode=u"operator")<CR>' % VIM_PY_CALL, mode=MODE_OPERATOR))) - self.keybindings.append(Keybinding(u'g}', Plug('OrgJumpToParentsSiblingOperator', u':<C-u>%s ORGMODE.plugins[u"Navigator"].parent_next_sibling(mode=u"operator")<CR>' % VIM_PY_CALL, mode=MODE_OPERATOR))) - self.keybindings.append(Keybinding(u'{', Plug(u'OrgJumpToPreviousOperator', u':<C-u>%s ORGMODE.plugins[u"Navigator"].previous(mode=u"operator")<CR>' % VIM_PY_CALL, mode=MODE_OPERATOR))) - self.keybindings.append(Keybinding(u'}', Plug(u'OrgJumpToNextOperator', u':<C-u>%s ORGMODE.plugins[u"Navigator"].next(mode=u"operator")<CR>' % VIM_PY_CALL, mode=MODE_OPERATOR))) - - # section wise movement (skip children) - # normal mode - self.keybindings.append(Keybinding(u'[[', - Plug(u'OrgJumpToPreviousSkipChildrenNormal', - u'%s ORGMODE.plugins[u"Navigator"].previous(mode=u"normal", skip_children=True)<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'Ne&xt Same Level', self.keybindings[-1]) - self.keybindings.append(Keybinding(u']]', - Plug(u'OrgJumpToNextSkipChildrenNormal', - u'%s ORGMODE.plugins[u"Navigator"].next(mode=u"normal", skip_children=True)<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'Pre&vious Same Level', self.keybindings[-1]) - - # visual mode - self.keybindings.append(Keybinding(u'[[', Plug(u'OrgJumpToPreviousSkipChildrenVisual', u'<Esc>:<C-u>%s ORGMODE.plugins[u"Navigator"].previous(mode=u"visual", skip_children=True)<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - self.keybindings.append(Keybinding(u']]', Plug(u'OrgJumpToNextSkipChildrenVisual', u'<Esc>:<C-u>%s ORGMODE.plugins[u"Navigator"].next(mode=u"visual", skip_children=True)<CR>' % VIM_PY_CALL, mode=MODE_VISUAL))) - - # operator-pending mode - self.keybindings.append(Keybinding(u'[[', Plug(u'OrgJumpToPreviousSkipChildrenOperator', u':<C-u>%s ORGMODE.plugins[u"Navigator"].previous(mode=u"operator", skip_children=True)<CR>' % VIM_PY_CALL, mode=MODE_OPERATOR))) - self.keybindings.append(Keybinding(u']]', Plug(u'OrgJumpToNextSkipChildrenOperator', u':<C-u>%s ORGMODE.plugins[u"Navigator"].next(mode=u"operator", skip_children=True)<CR>' % VIM_PY_CALL, mode=MODE_OPERATOR))) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/ShowHide.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/ShowHide.py deleted file mode 100644 index 5ae67a1..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/ShowHide.py +++ /dev/null @@ -1,181 +0,0 @@ -# -*- coding: utf-8 -*- - -import vim - -from orgmode.liborgmode.headings import Heading -from orgmode._vim import ORGMODE, apply_count -from orgmode import settings -from orgmode.menu import Submenu, ActionEntry -from orgmode.keybinding import Keybinding, Plug, MODE_NORMAL - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.xrange_compatibility import * -from orgmode.py3compat.py_py3_string import * - -class ShowHide(object): - u""" Show Hide plugin """ - - def __init__(self): - u""" Initialize plugin """ - object.__init__(self) - # menu entries this plugin should create - self.menu = ORGMODE.orgmenu + Submenu(u'&Show Hide') - - # key bindings for this plugin - # key bindings are also registered through the menu so only additional - # bindings should be put in this variable - self.keybindings = [] - - @classmethod - def _fold_depth(cls, h): - """ Find the deepest level of open folds - - :h: Heading - :returns: Tuple (int - level of open folds, boolean - found fold) or None if h is not a Heading - """ - if not isinstance(h, Heading): - return - - if int(vim.eval(u_encode(u'foldclosed(%d)' % h.start_vim))) != -1: - return (h.number_of_parents, True) - - res = [h.number_of_parents + 1] - found = False - for c in h.children: - d, f = cls._fold_depth(c) - res.append(d) - found |= f - - return (max(res), found) - - @classmethod - @apply_count - def toggle_folding(cls, reverse=False): - u""" Toggle folding similar to the way orgmode does - - This is just a convenience function, don't hesitate to use the z* - keybindings vim offers to deal with folding! - - :reverse: If False open folding by one level otherwise close it by one. - """ - d = ORGMODE.get_document() - heading = d.current_heading() - if not heading: - vim.eval(u_encode(u'feedkeys("<Tab>", "n")')) - return - - cursor = vim.current.window.cursor[:] - - if int(vim.eval(u_encode(u'foldclosed(%d)' % heading.start_vim))) != -1: - if not reverse: - # open closed fold - p = heading.number_of_parents - if not p: - p = heading.level - vim.command(u_encode(u'normal! %dzo' % p)) - else: - # reverse folding opens all folds under the cursor - vim.command(u_encode(u'%d,%dfoldopen!' % (heading.start_vim, heading.end_of_last_child_vim))) - vim.current.window.cursor = cursor - return heading - - def open_fold(h): - if h.number_of_parents <= open_depth: - vim.command(u_encode(u'normal! %dgg%dzo' % (h.start_vim, open_depth))) - for c in h.children: - open_fold(c) - - def close_fold(h): - for c in h.children: - close_fold(c) - if h.number_of_parents >= open_depth - 1 and \ - int(vim.eval(u_encode(u'foldclosed(%d)' % h.start_vim))) == -1: - vim.command(u_encode(u'normal! %dggzc' % (h.start_vim, ))) - - # find deepest fold - open_depth, found_fold = cls._fold_depth(heading) - - if not reverse: - # recursively open folds - if found_fold: - for child in heading.children: - open_fold(child) - else: - vim.command(u_encode(u'%d,%dfoldclose!' % (heading.start_vim, heading.end_of_last_child_vim))) - - if heading.number_of_parents: - # restore cursor position, it might have been changed by open_fold - vim.current.window.cursor = cursor - - p = heading.number_of_parents - if not p: - p = heading.level - # reopen fold again beacause the former closing of the fold closed all levels, including parents! - vim.command(u_encode(u'normal! %dzo' % (p, ))) - else: - # close the last level of folds - close_fold(heading) - - # restore cursor position - vim.current.window.cursor = cursor - return heading - - @classmethod - @apply_count - def global_toggle_folding(cls, reverse=False): - """ Toggle folding globally - - :reverse: If False open folding by one level otherwise close it by one. - """ - d = ORGMODE.get_document() - if reverse: - foldlevel = int(vim.eval(u_encode(u'&foldlevel'))) - if foldlevel == 0: - # open all folds because the user tries to close folds beyound 0 - vim.eval(u_encode(u'feedkeys("zR", "n")')) - else: - # vim can reduce the foldlevel on its own - vim.eval(u_encode(u'feedkeys("zm", "n")')) - else: - found = False - for h in d.headings: - res = cls._fold_depth(h) - if res: - found = res[1] - if found: - break - if not found: - # no fold found and the user tries to advance the fold level - # beyond maximum so close everything - vim.eval(u_encode(u'feedkeys("zM", "n")')) - else: - # fold found, vim can increase the foldlevel on its own - vim.eval(u_encode(u'feedkeys("zr", "n")')) - - return d - - def register(self): - u""" - Registration of plugin. Key bindings and other initialization should be done. - """ - # register plug - - self.keybindings.append(Keybinding(u'<Tab>', - Plug(u'OrgToggleFoldingNormal', u'%s ORGMODE.plugins[u"ShowHide"].toggle_folding()<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'&Cycle Visibility', self.keybindings[-1]) - - self.keybindings.append(Keybinding(u'<S-Tab>', - Plug(u'OrgToggleFoldingReverse', u'%s ORGMODE.plugins[u"ShowHide"].toggle_folding(reverse=True)<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'Cycle Visibility &Reverse', self.keybindings[-1]) - - self.keybindings.append(Keybinding(u'<localleader>.', - Plug(u'OrgGlobalToggleFoldingNormal', u'%s ORGMODE.plugins[u"ShowHide"].global_toggle_folding()<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'Cycle Visibility &Globally', self.keybindings[-1]) - - self.keybindings.append(Keybinding(u'<localleader>,', - Plug(u'OrgGlobalToggleFoldingReverse', - u'%s ORGMODE.plugins[u"ShowHide"].global_toggle_folding(reverse=True)<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'Cycle Visibility Reverse G&lobally', self.keybindings[-1]) - - for i in range(0, 10): - self.keybindings.append(Keybinding(u'<localleader>%d' % (i, ), u'zM:set fdl=%d<CR>' % i, mode=MODE_NORMAL)) diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/TagsProperties.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/TagsProperties.py deleted file mode 100644 index 95aba90..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/TagsProperties.py +++ /dev/null @@ -1,215 +0,0 @@ -# -*- coding: utf-8 -*- - -import vim - -from orgmode._vim import ORGMODE, repeat -from orgmode.menu import Submenu, ActionEntry -from orgmode.keybinding import Keybinding, Plug, Command -from orgmode import settings - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.py_py3_string import * - -class TagsProperties(object): - u""" TagsProperties plugin """ - - def __init__(self): - u""" Initialize plugin """ - object.__init__(self) - # menu entries this plugin should create - self.menu = ORGMODE.orgmenu + Submenu(u'&TAGS and Properties') - - # key bindings for this plugin - # key bindings are also registered through the menu so only additional - # bindings should be put in this variable - self.keybindings = [] - - # commands for this plugin - self.commands = [] - - @classmethod - def complete_tags(cls): - u""" build a list of tags and store it in variable b:org_tag_completion - """ - d = ORGMODE.get_document() - heading = d.current_heading() - if not heading: - return - - leading_portion = u_decode(vim.eval(u'a:ArgLead')) - cursor = int(vim.eval(u'a:CursorPos')) - - # extract currently completed tag - idx_orig = leading_portion.rfind(u':', 0, cursor) - if idx_orig == -1: - idx = 0 - else: - idx = idx_orig - - current_tag = leading_portion[idx: cursor].lstrip(u':') - head = leading_portion[:idx + 1] - if idx_orig == -1: - head = u'' - tail = leading_portion[cursor:] - - # extract all tags of the current file - all_tags = set() - for h in d.all_headings(): - for t in h.tags: - all_tags.add(t) - - ignorecase = bool(int(settings.get(u'org_tag_completion_ignorecase', int(vim.eval(u'&ignorecase'))))) - possible_tags = [] - # TODO current tags never used... - current_tags = heading.tags - for t in all_tags: - if ignorecase: - if t.lower().startswith(current_tag.lower()): - possible_tags.append(t) - elif t.startswith(current_tag): - possible_tags.append(t) - - vim.command(u_encode(u'let b:org_complete_tags = [%s]' % u', '.join([u'"%s%s:%s"' % (head, i, tail) for i in possible_tags]))) - - @classmethod - @repeat - def set_tags(cls): - u""" Set tags for current heading - """ - d = ORGMODE.get_document() - heading = d.current_heading() - if not heading: - return - - # retrieve tags - res = None - if heading.tags: - res = vim.eval(u'input("Tags: ", ":%s:", "customlist,Org_complete_tags")' % u':'.join(heading.tags)) - else: - res = vim.eval(u'input("Tags: ", "", "customlist,Org_complete_tags")') - - if res is None: - # user pressed <Esc> abort any further processing - return - - # remove empty tags - heading.tags = [x for x in u_decode(res).strip().strip(u':').split(u':') if x.strip() != u''] - - d.write() - - return u'OrgSetTags' - - @classmethod - def find_tags(cls): - """ Find tags in current file - """ - tags = vim.eval(u'input("Find Tags: ", "", "customlist,Org_complete_tags")') - if tags is None: - # user pressed <Esc> abort any further processing - return - - tags = [x for x in u_decode(tags).strip().strip(u':').split(u':') if x.strip() != u''] - if tags: - searchstring = u'\\(' - first = True - for t1 in tags: - if first: - first = False - searchstring += u'%s' % t1 - else: - searchstring += u'\\|%s' % t1 - - for t2 in tags: - if t1 == t2: - continue - searchstring += u'\\(:[a-zA-Z:]*\\)\?:%s' % t2 - searchstring += u'\\)' - - vim.command(u'/\\zs:%s:\\ze' % searchstring) - return u'OrgFindTags' - - @classmethod - def realign_tags(cls): - u""" - Updates tags when user finished editing a heading - """ - d = ORGMODE.get_document(allow_dirty=True) - heading = d.find_current_heading() - if not heading: - return - - if vim.current.window.cursor[0] == heading.start_vim: - heading.set_dirty_heading() - d.write_heading(heading, including_children=False) - - @classmethod - def realign_all_tags(cls): - u""" - Updates tags when user finishes editing a heading - """ - d = ORGMODE.get_document() - for heading in d.all_headings(): - heading.set_dirty_heading() - - d.write() - - def register(self): - u""" - Registration of plugin. Key bindings and other initialization should be done. - """ - # an Action menu entry which binds "keybinding" to action ":action" - settings.set(u'org_tag_column', vim.eval(u'&textwidth')) - settings.set(u'org_tag_completion_ignorecase', int(vim.eval(u'&ignorecase'))) - - cmd = Command( - u'OrgSetTags', - u'%s ORGMODE.plugins[u"TagsProperties"].set_tags()' % VIM_PY_CALL) - self.commands.append(cmd) - keybinding = Keybinding( - u'<localleader>st', - Plug(u'OrgSetTags', cmd)) - self.keybindings.append(keybinding) - self.menu + ActionEntry(u'Set &Tags', keybinding) - - cmd = Command( - u'OrgFindTags', - u'%s ORGMODE.plugins[u"TagsProperties"].find_tags()' % VIM_PY_CALL) - self.commands.append(cmd) - keybinding = Keybinding( - u'<localleader>ft', - Plug(u'OrgFindTags', cmd)) - self.keybindings.append(keybinding) - self.menu + ActionEntry(u'&Find Tags', keybinding) - - cmd = Command( - u'OrgTagsRealign', - u"%s ORGMODE.plugins[u'TagsProperties'].realign_all_tags()" % VIM_PY_CALL) - self.commands.append(cmd) - - # workaround to align tags when user is leaving insert mode - vim.command(u_encode(u"""function Org_complete_tags(ArgLead, CmdLine, CursorPos) -python << EOF -ORGMODE.plugins[u'TagsProperties'].complete_tags() -EOF -if exists('b:org_complete_tags') - let tmp = b:org_complete_tags - unlet b:org_complete_tags - return tmp -else - return [] -endif -endfunction""")) - - vim.command(u_encode(u"""function Org_realign_tags_on_insert_leave() -if !exists('b:org_complete_tag_on_insertleave_au') - :au orgmode InsertLeave <buffer> %s ORGMODE.plugins[u'TagsProperties'].realign_tags() - let b:org_complete_tag_on_insertleave_au = 1 -endif -endfunction""" % VIM_PY_CALL)) - - # this is for all org files opened after this file - vim.command(u_encode(u"au orgmode FileType org call Org_realign_tags_on_insert_leave()")) - # this is for the current file - vim.command(u_encode(u"call Org_realign_tags_on_insert_leave()")) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Todo.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Todo.py deleted file mode 100644 index ad1a1a0..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/Todo.py +++ /dev/null @@ -1,345 +0,0 @@ -# -*- coding: utf-8 -*- - -import vim -import itertools as it - -from orgmode._vim import echom, ORGMODE, apply_count, repeat, realign_tags -from orgmode import settings -from orgmode.liborgmode.base import Direction -from orgmode.menu import Submenu, ActionEntry -from orgmode.keybinding import Keybinding, Plug -from orgmode.exceptions import PluginError - -# temporary todo states for differnent orgmode buffers -ORGTODOSTATES = {} - -from orgmode.py3compat.xrange_compatibility import * -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.unicode_compatibility import * -from orgmode.py3compat.py_py3_string import * - - -def split_access_key(t, sub=None): - u""" Split access key - - Args: - t (str): Todo state - sub: A value that will be returned instead of access key if there was - not access key - - Returns: - tuple: Todo state and access key separated (TODO, ACCESS_KEY) - - Example: - >>> split_access_key('TODO(t)') - >>> ('TODO', '(t)') - >>> split_access_key('WANT', sub='(hi)') - >>> ('WANT', '(hi)') - """ - if type(t) != unicode: - echom("String must be unicode") - return (None, None) - - idx = t.find(u'(') - - v, k = (t, sub) - if idx != -1 and t[idx + 1:-1]: - v, k = (t[:idx], t[idx + 1:-1]) - return (v, k) - - -class Todo(object): - u""" - Todo plugin. - - Description taken from orgmode.org: - - You can use TODO keywords to indicate different sequential states in the - process of working on an item, for example: - - ["TODO", "FEEDBACK", "VERIFY", "|", "DONE", "DELEGATED"] - - The vertical bar separates the TODO keywords (states that need action) from - the DONE states (which need no further action). If you don't provide the - separator bar, the last state is used as the DONE state. With this setup, - the command ``,d`` will cycle an entry from TODO to FEEDBACK, then to - VERIFY, and finally to DONE and DELEGATED. - """ - - def __init__(self): - u""" Initialize plugin """ - object.__init__(self) - # menu entries this plugin should create - self.menu = ORGMODE.orgmenu + Submenu(u'&TODO Lists') - - # key bindings for this plugin - # key bindings are also registered through the menu so only additional - # bindings should be put in this variable - self.keybindings = [] - - @classmethod - def _process_all_states(cls, all_states): - u""" verify if states defined by user is valid. - Return cleaned_todo and flattened if is. Raise Exception if not. - Valid checking: - * no two state share a same name - """ - # TODO Write tests. -- Ron89 - cleaned_todos = [[ - split_access_key(todo)[0] for todo in it.chain.from_iterable(x)] - for x in all_states] + [[None]] - - flattened_todos = list(it.chain.from_iterable(cleaned_todos)) - if len(flattened_todos) != len(set(flattened_todos)): - raise PluginError(u"Duplicate names detected in TODO keyword list. Please examine `g/b:org_todo_keywords`") - # TODO This is the case when there are 2 todo states with the same - # name. It should be handled by making a simple class to hold TODO - # states, which would avoid mixing 2 todo states with the same name - # since they would have a different reference (but same content), - # albeit this can fail because python optimizes short strings (i.e. - # they hold the same ref) so care should be taken in implementation - return (cleaned_todos, flattened_todos) - - @classmethod - def _get_next_state( - cls, current_state, all_states, direction=Direction.FORWARD, - next_set=False): - u""" Get the next todo state - - Args: - current_state (str): The current todo state - all_states (list): A list containing all todo states within - sublists. The todo states may contain access keys - direction: Direction of state or keyword set change (forward or - backward) - next_set: Advance to the next keyword set in defined direction. - - Returns: - str or None: next todo state, or None if there is no next state. - - Note: all_states should have the form of: - [(['TODO(t)'], ['DONE(d)']), - (['REPORT(r)', 'BUG(b)', 'KNOWNCAUSE(k)'], ['FIXED(f)']), - ([], ['CANCELED(c)'])] - """ - cleaned_todos, flattened_todos = cls._process_all_states(all_states) - - # backward direction should really be -1 not 2 - next_dir = -1 if direction == Direction.BACKWARD else 1 - # work only with top level index - if next_set: - top_set = next(( - todo_set[0] for todo_set in enumerate(cleaned_todos) - if current_state in todo_set[1]), -1) - ind = (top_set + next_dir) % len(cleaned_todos) - if ind != len(cleaned_todos) - 1: - echom("Using set: %s" % str(all_states[ind])) - else: - echom("Keyword removed.") - return cleaned_todos[ind][0] - # No next set, cycle around everything - else: - ind = next(( - todo_iter[0] for todo_iter in enumerate(flattened_todos) - if todo_iter[1] == current_state), -1) - return flattened_todos[(ind + next_dir) % len(flattened_todos)] - - @classmethod - @realign_tags - @repeat - @apply_count - def toggle_todo_state( - cls, direction=Direction.FORWARD, interactive=False, next_set=False): - u""" Toggle state of TODO item - - :returns: The changed heading - """ - d = ORGMODE.get_document(allow_dirty=True) - - # get heading - heading = d.find_current_heading() - if not heading: - vim.eval(u'feedkeys("^", "n")') - return - - todo_states = d.get_todo_states(strip_access_key=False) - # get todo states - if not todo_states: - echom(u'No todo keywords configured.') - return - - current_state = heading.todo - - # get new state interactively - if interactive: - # determine position of the interactive prompt - prompt_pos = settings.get(u'org_todo_prompt_position', u'botright') - if prompt_pos not in [u'botright', u'topleft']: - prompt_pos = u'botright' - - # pass todo states to new window - ORGTODOSTATES[d.bufnr] = todo_states - settings.set( - u'org_current_state_%d' % d.bufnr, - current_state if current_state is not None else u'', overwrite=True) - todo_buffer_exists = bool(int(vim.eval(u_encode( - u'bufexists("org:todo/%d")' % (d.bufnr, ))))) - if todo_buffer_exists: - # if the buffer already exists, reuse it - vim.command(u_encode( - u'%s sbuffer org:todo/%d' % (prompt_pos, d.bufnr, ))) - else: - # create a new window - vim.command(u_encode( - u'keepalt %s %dsplit org:todo/%d' % (prompt_pos, len(todo_states), d.bufnr))) - else: - new_state = Todo._get_next_state( - current_state, todo_states, direction=direction, - next_set=next_set) - - cls.set_todo_state(new_state) - - # plug - plug = u'OrgTodoForward' - if direction == Direction.BACKWARD: - plug = u'OrgTodoBackward' - - return plug - - @classmethod - def set_todo_state(cls, state): - u""" Set todo state for buffer. - - :bufnr: Number of buffer the todo state should be updated for - :state: The new todo state - """ - lineno, colno = vim.current.window.cursor - d = ORGMODE.get_document(allow_dirty=True) - heading = d.find_current_heading() - - if not heading: - return - - current_state = heading.todo - - # set new headline - heading.todo = state - d.write_heading(heading) - - # move cursor along with the inserted state only when current position - # is in the heading; otherwite do nothing - if heading.start_vim == lineno and colno > heading.level: - if current_state is not None and \ - colno <= heading.level + len(current_state): - # the cursor is actually on the todo keyword - # move it back to the beginning of the keyword in that case - vim.current.window.cursor = (lineno, heading.level + 1) - else: - # the cursor is somewhere in the text, move it along - if current_state is None and state is None: - offset = 0 - elif current_state is None and state is not None: - offset = len(state) + 1 - elif current_state is not None and state is None: - offset = -len(current_state) - 1 - else: - offset = len(state) - len(current_state) - vim.current.window.cursor = (lineno, colno + offset) - - @classmethod - def init_org_todo(cls): - u""" Initialize org todo selection window. - """ - bufnr = int(vim.current.buffer.name.split('/')[-1]) - all_states = ORGTODOSTATES.get(bufnr, None) - - vim_commands = [ - u'let g:org_sav_timeoutlen=&timeoutlen', - u'au orgmode BufEnter <buffer> :if ! exists("g:org_sav_timeoutlen")|let g:org_sav_timeoutlen=&timeoutlen|set timeoutlen=1|endif', - u'au orgmode BufLeave <buffer> :if exists("g:org_sav_timeoutlen")|let &timeoutlen=g:org_sav_timeoutlen|unlet g:org_sav_timeoutlen|endif', - u'setlocal nolist tabstop=16 buftype=nofile timeout timeoutlen=1 winfixheight', - u'setlocal statusline=Org\\ todo\\ (%s)' % vim.eval(u_encode(u'fnameescape(fnamemodify(bufname(%d), ":t"))' % bufnr)), - u'nnoremap <silent> <buffer> <Esc> :%sbw<CR>' % vim.eval(u_encode(u'bufnr("%")')), - u'nnoremap <silent> <buffer> <CR> :let g:org_state = fnameescape(expand("<cword>"))<Bar>bw<Bar>exec "%s ORGMODE.plugins[u\'Todo\'].set_todo_state(\'".g:org_state."\')"<Bar>unlet! g:org_state<CR>' % VIM_PY_CALL, - ] - # because timeoutlen can only be set globally it needs to be stored and - # restored later - # make window a scratch window and set the statusline differently - for cmd in vim_commands: - vim.command(u_encode(cmd)) - - if all_states is None: - vim.command(u_encode(u'bw')) - echom(u'No todo states avaiable for buffer %s' % vim.current.buffer.name) - - for idx, state in enumerate(all_states): - pairs = [split_access_key(x, sub=u' ') for x in it.chain(*state)] - line = u'\t'.join(u''.join((u'[%s] ' % x[1], x[0])) for x in pairs) - vim.current.buffer.append(u_encode(line)) - for todo, key in pairs: - # FIXME if double key is used for access modified this doesn't work - vim.command(u_encode(u'nnoremap <silent> <buffer> %s :bw<CR><c-w><c-p>%s ORGMODE.plugins[u"Todo"].set_todo_state("%s")<CR>' % (key, VIM_PY_CALL, u_decode(todo)))) - - # position the cursor of the current todo item - vim.command(u_encode(u'normal! G')) - current_state = settings.unset(u'org_current_state_%d' % bufnr) - if current_state is not None and current_state != '': - for i, buf in enumerate(vim.current.buffer): - idx = buf.find(current_state) - if idx != -1: - vim.current.window.cursor = (i + 1, idx) - break - else: - vim.current.window.cursor = (2, 4) - - # finally make buffer non modifiable - vim.command(u_encode(u'setfiletype orgtodo')) - vim.command(u_encode(u'setlocal nomodifiable')) - - # remove temporary todo states for the current buffer - del ORGTODOSTATES[bufnr] - - def register(self): - u""" - Registration of plugin. Key bindings and other initialization should be done. - """ - self.keybindings.append(Keybinding(u'<localleader>ct', Plug( - u'OrgTodoToggleNonInteractive', - u'%s ORGMODE.plugins[u"Todo"].toggle_todo_state(interactive=False)<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'&TODO/DONE/-', self.keybindings[-1]) - - self.keybindings.append(Keybinding(u'<localleader>d', Plug( - u'OrgTodoToggleInteractive', - u'%s ORGMODE.plugins[u"Todo"].toggle_todo_state(interactive=True)<CR>' % VIM_PY_CALL))) - self.menu + ActionEntry(u'&TODO/DONE/- (interactiv)', self.keybindings[-1]) - - # add submenu - submenu = self.menu + Submenu(u'Select &keyword') - - self.keybindings.append(Keybinding(u'<S-Right>', Plug( - u'OrgTodoForward', - u'%s ORGMODE.plugins[u"Todo"].toggle_todo_state()<CR>' % VIM_PY_CALL))) - submenu + ActionEntry(u'&Next keyword', self.keybindings[-1]) - - self.keybindings.append(Keybinding(u'<S-Left>', Plug( - u'OrgTodoBackward', - u'%s ORGMODE.plugins[u"Todo"].toggle_todo_state(direction=2)<CR>' % VIM_PY_CALL))) - submenu + ActionEntry(u'&Previous keyword', self.keybindings[-1]) - - self.keybindings.append(Keybinding(u'<C-S-Right>', Plug( - u'OrgTodoSetForward', - u'%s ORGMODE.plugins[u"Todo"].toggle_todo_state(next_set=True)<CR>' % VIM_PY_CALL))) - submenu + ActionEntry(u'Next keyword &set', self.keybindings[-1]) - - self.keybindings.append(Keybinding(u'<C-S-Left>', Plug( - u'OrgTodoSetBackward', - u'%s ORGMODE.plugins[u"Todo"].toggle_todo_state(direction=2, next_set=True)<CR>' % VIM_PY_CALL))) - submenu + ActionEntry(u'Previous &keyword set', self.keybindings[-1]) - - settings.set(u'org_todo_keywords', [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')]) - - settings.set(u'org_todo_prompt_position', u'botright') - - vim.command(u_encode(u'au orgmode BufReadCmd org:todo/* %s ORGMODE.plugins[u"Todo"].init_org_todo()' % VIM_PY_CALL)) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/__init__.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/__init__.py deleted file mode 100644 index 40a96af..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/plugins/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/__init__.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/__init__.py deleted file mode 100644 index 40a96af..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/encode_compatibility.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/encode_compatibility.py deleted file mode 100644 index 50ba796..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/encode_compatibility.py +++ /dev/null @@ -1,11 +0,0 @@ -import sys -if sys.version_info < (3,): - def u_encode(string): - return string.encode('utf8') - def u_decode(string): - return string.decode('utf8') -else: - def u_encode(string): - return string - def u_decode(string): - return string diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/py_py3_string.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/py_py3_string.py deleted file mode 100644 index 4ab11ab..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/py_py3_string.py +++ /dev/null @@ -1,7 +0,0 @@ -import sys - -if sys.version_info < (3,): - VIM_PY_CALL = u':py' -else: - VIM_PY_CALL = u':py3' - diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/unicode_compatibility.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/unicode_compatibility.py deleted file mode 100644 index c0d2684..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/unicode_compatibility.py +++ /dev/null @@ -1,4 +0,0 @@ -try: - unicode -except NameError: - basestring = unicode = str diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/xrange_compatibility.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/xrange_compatibility.py deleted file mode 100644 index 2f0e442..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/py3compat/xrange_compatibility.py +++ /dev/null @@ -1,4 +0,0 @@ -try: - from __builtin__ import xrange as range -except: - pass diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/settings.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/settings.py deleted file mode 100644 index 5d61512..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/settings.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding: utf-8 -*- - -import vim - -import sys -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.unicode_compatibility import * - -SCOPE_ALL = 1 - -# for all vim-orgmode buffers -SCOPE_GLOBAL = 2 - -# just for the current buffer - has priority before the global settings -SCOPE_BUFFER = 4 - -VARIABLE_LEADER = {SCOPE_GLOBAL: u'g', SCOPE_BUFFER: u'b'} - -u""" Evaluate and store settings """ - - -def get(setting, default=None, scope=SCOPE_ALL): - u""" Evaluate setting in scope of the current buffer, - globally and also from the contents of the current buffer - - WARNING: Only string values are converted to unicode. If a different value - is received, e.g. a list or dict, no conversion is done. - - :setting: name of the variable to evaluate - :default: default value in case the variable is empty - - :returns: variable value - """ - # TODO first read setting from org file which take precedence over vim - # variable settings - if (scope & SCOPE_ALL | SCOPE_BUFFER) and \ - int(vim.eval(u_encode(u'exists("b:%s")' % setting))): - res = vim.eval(u_encode(u"b:%s" % setting)) - if type(res) in (unicode, str): - return u_decode(res) - return res - - elif (scope & SCOPE_ALL | SCOPE_GLOBAL) and \ - int(vim.eval(u_encode(u'exists("g:%s")' % setting))): - res = vim.eval(u_encode(u"g:%s" % setting)) - if type(res) in (unicode, str): - return u_decode(res) - return res - return default - - -def set(setting, value, scope=SCOPE_GLOBAL, overwrite=False): - u""" Store setting in the defined scope - - WARNING: For the return value, only string are converted to unicode. If a - different value is received by vim.eval, e.g. a list or dict, no conversion - is done. - - :setting: name of the setting - :value: the actual value, repr is called on the value to create a string - representation - :scope: the scope o the setting/variable - :overwrite: overwrite existing settings (probably user defined settings) - - :returns: the new value in case of overwrite==False the current value - """ - if (not overwrite) and ( - int(vim.eval(u_encode(u'exists("%s:%s")' % \ - (VARIABLE_LEADER[scope], setting))))): - res = vim.eval( - u_encode(u'%s:%s' % (VARIABLE_LEADER[scope], setting))) - if type(res) in (unicode, str): - return u_decode(res) - return res - v = repr(value) - if type(value) == unicode and sys.version_info < (3,): - # strip leading u of unicode string representations - v = v[1:] - - cmd = u'let %s:%s = %s' % (VARIABLE_LEADER[scope], setting, v) - vim.command(u_encode(cmd)) - return value - - -def unset(setting, scope=SCOPE_GLOBAL): - u""" Unset setting in the defined scope - :setting: name of the setting - :scope: the scope o the setting/variable - - :returns: last value of setting - """ - value = get(setting, scope=scope) - cmd = u'unlet! %s:%s' % (VARIABLE_LEADER[scope], setting) - vim.command(u_encode(cmd)) - return value - - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/ftplugin/orgmode/vimbuffer.py b/pack/acp/start/vim-orgmode/ftplugin/orgmode/vimbuffer.py deleted file mode 100644 index b4760fb..0000000 --- a/pack/acp/start/vim-orgmode/ftplugin/orgmode/vimbuffer.py +++ /dev/null @@ -1,503 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - vimbuffer - ~~~~~~~~~~ - - VimBuffer and VimBufferContent are the interface between liborgmode and - vim. - - VimBuffer extends the liborgmode.document.Document(). - Document() is just a general implementation for loading an org file. It - has no interface to an actual file or vim buffer. This is the task of - vimbuffer.VimBuffer(). It is the interfaces to vim. The main tasks for - VimBuffer are to provide read and write access to a real vim buffer. - - VimBufferContent is a helper class for VimBuffer. Basically, it hides the - details of encoding - everything read from or written to VimBufferContent - is UTF-8. -""" - -try: - from collections import UserList -except: - from UserList import UserList - -import vim - -from orgmode import settings -from orgmode.exceptions import BufferNotFound, BufferNotInSync -from orgmode.liborgmode.documents import Document, MultiPurposeList, Direction -from orgmode.liborgmode.headings import Heading - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.unicode_compatibility import * - - -class VimBuffer(Document): - def __init__(self, bufnr=0): - u""" - :bufnr: 0: current buffer, every other number refers to another buffer - """ - Document.__init__(self) - self._bufnr = vim.current.buffer.number if bufnr == 0 else bufnr - self._changedtick = -1 - self._cached_heading = None - if self._bufnr == vim.current.buffer.number: - self._content = VimBufferContent(vim.current.buffer) - else: - _buffer = None - for b in vim.buffers: - if self._bufnr == b.number: - _buffer = b - break - - if not _buffer: - raise BufferNotFound(u'Unable to locate buffer number #%d' % self._bufnr) - self._content = VimBufferContent(_buffer) - - self.update_changedtick() - self._orig_changedtick = self._changedtick - - @property - def tabstop(self): - return int(vim.eval(u_encode(u'&ts'))) - - @property - def tag_column(self): - return int(settings.get(u'org_tag_column', u'77')) - - @property - def is_insync(self): - if self._changedtick == self._orig_changedtick: - self.update_changedtick() - return self._changedtick == self._orig_changedtick - - @property - def bufnr(self): - u""" - :returns: The buffer's number for the current document - """ - return self._bufnr - - @property - def changedtick(self): - u""" Number of changes in vimbuffer """ - return self._changedtick - - @changedtick.setter - def changedtick(self, value): - self._changedtick = value - - def get_todo_states(self, strip_access_key=True): - u""" Returns a list containing a tuple of two lists of allowed todo - states split by todo and done states. Multiple todo-done state - sequences can be defined. - - :returns: [([todo states], [done states]), ..] - """ - states = settings.get(u'org_todo_keywords', []) - # TODO this function gets called too many times when change of state of - # one todo is triggered, check with: - # print(states) - # this should be changed by saving todo states into some var and only - # if new states are set hook should be called to register them again - # into a property - # TODO move this to documents.py, it is all tangled up like this, no - # structure... - if type(states) not in (list, tuple): - return [] - - def parse_states(s, stop=0): - res = [] - if not s: - return res - if type(s[0]) in (unicode, str): - r = [] - for i in s: - _i = i - if type(_i) == str: - _i = u_decode(_i) - if type(_i) == unicode and _i: - if strip_access_key and u'(' in _i: - _i = _i[:_i.index(u'(')] - if _i: - r.append(_i) - else: - r.append(_i) - if not u'|' in r: - if not stop: - res.append((r[:-1], [r[-1]])) - else: - res = (r[:-1], [r[-1]]) - else: - seperator_pos = r.index(u'|') - if not stop: - res.append((r[0:seperator_pos], r[seperator_pos + 1:])) - else: - res = (r[0:seperator_pos], r[seperator_pos + 1:]) - elif type(s) in (list, tuple) and not stop: - for i in s: - r = parse_states(i, stop=1) - if r: - res.append(r) - return res - - return parse_states(states) - - def update_changedtick(self): - if self.bufnr == vim.current.buffer.number: - self._changedtick = int(vim.eval(u_encode(u'b:changedtick'))) - else: - vim.command(u_encode(u'unlet! g:org_changedtick | let g:org_lz = &lz | let g:org_hidden = &hidden | set lz hidden')) - # TODO is this likely to fail? maybe some error hangling should be added - vim.command(u_encode(u'keepalt buffer %d | let g:org_changedtick = b:changedtick | buffer %d' % \ - (self.bufnr, vim.current.buffer.number))) - vim.command(u_encode(u'let &lz = g:org_lz | let &hidden = g:org_hidden | unlet! g:org_lz g:org_hidden | redraw')) - self._changedtick = int(vim.eval(u_encode(u'g:org_changedtick'))) - - def write(self): - u""" write the changes to the vim buffer - - :returns: True if something was written, otherwise False - """ - if not self.is_dirty: - return False - - self.update_changedtick() - if not self.is_insync: - raise BufferNotInSync(u'Buffer is not in sync with vim!') - - # write meta information - if self.is_dirty_meta_information: - meta_end = 0 if self._orig_meta_information_len is None else self._orig_meta_information_len - self._content[:meta_end] = self.meta_information - self._orig_meta_information_len = len(self.meta_information) - - # remove deleted headings - already_deleted = [] - for h in sorted(self._deleted_headings, key=lambda x: x._orig_start, reverse=True): - if h._orig_start is not None and h._orig_start not in already_deleted: - # this is a heading that actually exists on the buffer and it - # needs to be removed - del self._content[h._orig_start:h._orig_start + h._orig_len] - already_deleted.append(h._orig_start) - del self._deleted_headings[:] - del already_deleted - - # update changed headings and add new headings - for h in self.all_headings(): - if h.is_dirty: - vim.current.buffer.append("") # workaround for neovim bug - if h._orig_start is not None: - # this is a heading that existed before and was changed. It - # needs to be replaced - if h.is_dirty_heading: - self._content[h.start:h.start + 1] = [unicode(h)] - if h.is_dirty_body: - self._content[h.start + 1:h.start + h._orig_len] = h.body - else: - # this is a new heading. It needs to be inserted - self._content[h.start:h.start] = [unicode(h)] + h.body - del vim.current.buffer[-1] # restore workaround for neovim bug - h._dirty_heading = False - h._dirty_body = False - # for all headings the length and start offset needs to be updated - h._orig_start = h.start - h._orig_len = len(h) - - self._dirty_meta_information = False - self._dirty_document = False - - self.update_changedtick() - self._orig_changedtick = self._changedtick - return True - - def write_heading(self, heading, including_children=True): - """ WARNING: use this function only when you know what you are doing! - This function writes a heading to the vim buffer. It offers performance - advantages over the regular write() function. This advantage is - combined with no sanity checks! Whenever you use this function, make - sure the heading you are writing contains the right offsets - (Heading._orig_start, Heading._orig_len). - - Usage example: - # Retrieve a potentially dirty document - d = ORGMODE.get_document(allow_dirty=True) - # Don't rely on the DOM, retrieve the heading afresh - h = d.find_heading(direction=Direction.FORWARD, position=100) - # Update tags - h.tags = ['tag1', 'tag2'] - # Write the heading - d.write_heading(h) - - This function can't be used to delete a heading! - - :heading: Write this heading with to the vim buffer - :including_children: Also include children in the update - - :returns The written heading - """ - if including_children and heading.children: - for child in heading.children[::-1]: - self.write_heading(child, including_children) - - if heading.is_dirty: - if heading._orig_start is not None: - # this is a heading that existed before and was changed. It - # needs to be replaced - if heading.is_dirty_heading: - self._content[heading._orig_start:heading._orig_start + 1] = [unicode(heading)] - if heading.is_dirty_body: - self._content[heading._orig_start + 1:heading._orig_start + heading._orig_len] = heading.body - else: - # this is a new heading. It needs to be inserted - raise ValueError('Heading must contain the attribute _orig_start! %s' % heading) - heading._dirty_heading = False - heading._dirty_body = False - # for all headings the length offset needs to be updated - heading._orig_len = len(heading) - - return heading - - def write_checkbox(self, checkbox, including_children=True): - if including_children and checkbox.children: - for child in checkbox.children[::-1]: - self.write_checkbox(child, including_children) - - if checkbox.is_dirty: - if checkbox._orig_start is not None: - # this is a heading that existed before and was changed. It - # needs to be replaced - # print "checkbox is dirty? " + str(checkbox.is_dirty_checkbox) - # print checkbox - if checkbox.is_dirty_checkbox: - self._content[checkbox._orig_start:checkbox._orig_start + 1] = [unicode(checkbox)] - if checkbox.is_dirty_body: - self._content[checkbox._orig_start + 1:checkbox._orig_start + checkbox._orig_len] = checkbox.body - else: - # this is a new checkbox. It needs to be inserted - raise ValueError('Checkbox must contain the attribute _orig_start! %s' % checkbox) - checkbox._dirty_checkbox = False - checkbox._dirty_body = False - # for all headings the length offset needs to be updated - checkbox._orig_len = len(checkbox) - - return checkbox - - def write_checkboxes(self, checkboxes): - pass - - def previous_heading(self, position=None): - u""" Find the next heading (search forward) and return the related object - :returns: Heading object or None - """ - h = self.current_heading(position=position) - if h: - return h.previous_heading - - def current_heading(self, position=None): - u""" Find the current heading (search backward) and return the related object - :returns: Heading object or None - """ - if position is None: - position = vim.current.window.cursor[0] - 1 - - if not self.headings: - return - - def binaryFindInDocument(): - hi = len(self.headings) - lo = 0 - while lo < hi: - mid = (lo+hi)//2 - h = self.headings[mid] - if h.end_of_last_child < position: - lo = mid + 1 - elif h.start > position: - hi = mid - else: - return binaryFindHeading(h) - - def binaryFindHeading(heading): - if not heading.children or heading.end >= position: - return heading - - hi = len(heading.children) - lo = 0 - while lo < hi: - mid = (lo+hi)//2 - h = heading.children[mid] - if h.end_of_last_child < position: - lo = mid + 1 - elif h.start > position: - hi = mid - else: - return binaryFindHeading(h) - - # look at the cache to find the heading - h_tmp = self._cached_heading - if h_tmp is not None: - if h_tmp.end_of_last_child > position and \ - h_tmp.start < position: - if h_tmp.end < position: - self._cached_heading = binaryFindHeading(h_tmp) - return self._cached_heading - - self._cached_heading = binaryFindInDocument() - return self._cached_heading - - def next_heading(self, position=None): - u""" Find the next heading (search forward) and return the related object - :returns: Heading object or None - """ - h = self.current_heading(position=position) - if h: - return h.next_heading - - def find_current_heading(self, position=None, heading=Heading): - u""" Find the next heading backwards from the position of the cursor. - The difference to the function current_heading is that the returned - object is not built into the DOM. In case the DOM doesn't exist or is - out of sync this function is much faster in fetching the current - heading. - - :position: The position to start the search from - - :heading: The base class for the returned heading - - :returns: Heading object or None - """ - return self.find_heading(vim.current.window.cursor[0] - 1 \ - if position is None else position, \ - direction=Direction.BACKWARD, heading=heading, \ - connect_with_document=False) - - -class VimBufferContent(MultiPurposeList): - u""" Vim Buffer Content is a UTF-8 wrapper around a vim buffer. When - retrieving or setting items in the buffer an automatic conversion is - performed. - - This ensures UTF-8 usage on the side of liborgmode and the vim plugin - vim-orgmode. - """ - - def __init__(self, vimbuffer, on_change=None): - MultiPurposeList.__init__(self, on_change=on_change) - - # replace data with vimbuffer to make operations change the actual - # buffer - self.data = vimbuffer - - def __contains__(self, item): - i = item - if type(i) is unicode: - i = u_encode(item) - return MultiPurposeList.__contains__(self, i) - - def __getitem__(self, i): - if isinstance(i, slice): - return [u_decode(item) if type(item) is str else item \ - for item in MultiPurposeList.__getitem__(self, i)] - else: - item = MultiPurposeList.__getitem__(self, i) - if type(item) is str: - return u_decode(item) - return item - - def __setitem__(self, i, item): - if isinstance(i, slice): - o = [] - o_tmp = item - if type(o_tmp) not in (list, tuple) and not isinstance(o_tmp, UserList): - o_tmp = list(o_tmp) - for item in o_tmp: - if type(item) == unicode: - o.append(u_encode(item)) - else: - o.append(item) - MultiPurposeList.__setitem__(self, i, o) - else: - _i = item - if type(_i) is unicode: - _i = u_encode(item) - - # TODO: fix this bug properly, it is really strange that it fails on - # python3 without it. Problem is that when _i = ['* '] it fails in - # UserList.__setitem__() but if it is changed in debuggr in __setitem__ - # like item[0] = '* ' it works, hence this is some quirk with unicode - # stuff but very likely vim 7.4 BUG too. - if isinstance(_i, UserList) and sys.version_info > (3, ): - _i = [s.encode('utf8').decode('utf8') for s in _i] - - MultiPurposeList.__setitem__(self, i, _i) - - def __add__(self, other): - raise NotImplementedError() - # TODO: implement me - if isinstance(other, UserList): - return self.__class__(self.data + other.data) - elif isinstance(other, type(self.data)): - return self.__class__(self.data + other) - else: - return self.__class__(self.data + list(other)) - - def __radd__(self, other): - raise NotImplementedError() - # TODO: implement me - if isinstance(other, UserList): - return self.__class__(other.data + self.data) - elif isinstance(other, type(self.data)): - return self.__class__(other + self.data) - else: - return self.__class__(list(other) + self.data) - - def __iadd__(self, other): - o = [] - o_tmp = other - if type(o_tmp) not in (list, tuple) and not isinstance(o_tmp, UserList): - o_tmp = list(o_tmp) - for i in o_tmp: - if type(i) is unicode: - o.append(u_encode(i)) - else: - o.append(i) - - return MultiPurposeList.__iadd__(self, o) - - def append(self, item): - i = item - if type(item) is str: - i = u_encode(item) - MultiPurposeList.append(self, i) - - def insert(self, i, item): - _i = item - if type(_i) is str: - _i = u_encode(item) - MultiPurposeList.insert(self, i, _i) - - def index(self, item, *args): - i = item - if type(i) is unicode: - i = u_encode(item) - MultiPurposeList.index(self, i, *args) - - def pop(self, i=-1): - return u_decode(MultiPurposeList.pop(self, i)) - - def extend(self, other): - o = [] - o_tmp = other - if type(o_tmp) not in (list, tuple) and not isinstance(o_tmp, UserList): - o_tmp = list(o_tmp) - for i in o_tmp: - if type(i) is unicode: - o.append(u_encode(i)) - else: - o.append(i) - MultiPurposeList.extend(self, o) - - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/indent/org.vim b/pack/acp/start/vim-orgmode/indent/org.vim deleted file mode 100644 index 8cfc1a9..0000000 --- a/pack/acp/start/vim-orgmode/indent/org.vim +++ /dev/null @@ -1,133 +0,0 @@ -" Delete the next line to avoid the special indention of items -if !exists("g:org_indent") - let g:org_indent = 0 -endif - -setlocal foldtext=GetOrgFoldtext() -setlocal fillchars-=fold:- -setlocal fillchars+=fold:\ -setlocal foldexpr=GetOrgFolding() -setlocal foldmethod=expr -setlocal indentexpr=GetOrgIndent() -setlocal nolisp -setlocal nosmartindent -setlocal autoindent - -if has('python3') - let s:py_env = 'python3 << EOF' -else - let s:py_env = 'python << EOF' -endif - -function! GetOrgIndent() - if g:org_indent == 0 - return -1 - endif - -exe s:py_env -from orgmode._vim import indent_orgmode -indent_orgmode() -EOF - - if exists('b:indent_level') - let l:tmp = b:indent_level - unlet b:indent_level - return l:tmp - else - return -1 - endif -endfunction - -function! GetOrgFolding() - let l:mode = mode() - if l:mode == 'i' - " the cache size is limited to 3, because vim queries the current and - " both surrounding lines when the user is typing in insert mode. The - " cache is shared between GetOrgFolding and GetOrgFoldtext - if ! exists('b:org_folding_cache') - let b:org_folding_cache = {} - endif - - if has_key(b:org_folding_cache, v:lnum) - if match(b:org_folding_cache[v:lnum], '^>') == 0 && - \ match(getline(v:lnum), '^\*\+\s') != 0 - " when the user pastes text or presses enter, it happens that - " the cache starts to confuse vim's folding abilities - " these entries can safely be removed - unlet b:org_folding_cache[v:lnum] - - " the fold text cache is probably also damaged, delete it as - " well - unlet! b:org_foldtext_cache - else - return b:org_folding_cache[v:lnum] - endif - endif - - exe s:py_env -from orgmode._vim import fold_orgmode -fold_orgmode(allow_dirty=True) -EOF - else - - exe s:py_env -from orgmode._vim import fold_orgmode -fold_orgmode() -EOF - endif - - if exists('b:fold_expr') - let l:tmp = b:fold_expr - unlet b:fold_expr - if l:mode == 'i' - if ! has_key(b:org_folding_cache, v:lnum) - if len(b:org_folding_cache) > 3 - let b:org_folding_cache = {} - endif - let b:org_folding_cache[v:lnum] = l:tmp - endif - endif - return l:tmp - else - return -1 - endif -endfunction - -function! SetOrgFoldtext(text) - let b:foldtext = a:text -endfunction - -function! GetOrgFoldtext() - let l:mode = mode() - if l:mode == 'i' - " add a separate cache for fold text - if ! exists('b:org_foldtext_cache') || - \ ! has_key(b:org_foldtext_cache, 'timestamp') || - \ b:org_foldtext_cache['timestamp'] > (localtime() + 10) - let b:org_foldtext_cache = {'timestamp': localtime()} - endif - - if has_key(b:org_foldtext_cache, v:foldstart) - return b:org_foldtext_cache[v:foldstart] - endif - exe s:py_env -from orgmode._vim import fold_text -fold_text(allow_dirty=True) -EOF - else - unlet! b:org_foldtext_cache - exec s:py_env -from orgmode._vim import fold_text -fold_text() -EOF - endif - - if exists('b:foldtext') - let l:tmp = b:foldtext - unlet b:foldtext - if l:mode == 'i' - let b:org_foldtext_cache[v:foldstart] = l:tmp - endif - return l:tmp - endif -endfunction diff --git a/pack/acp/start/vim-orgmode/install_vba.vim b/pack/acp/start/vim-orgmode/install_vba.vim deleted file mode 100644 index 7bc4825..0000000 --- a/pack/acp/start/vim-orgmode/install_vba.vim +++ /dev/null @@ -1,3 +0,0 @@ -:exec 'set rtp='.g:installdir -:so orgmode.vba -:q! diff --git a/pack/acp/start/vim-orgmode/install_vmb.vim b/pack/acp/start/vim-orgmode/install_vmb.vim deleted file mode 100644 index 874ca0e..0000000 --- a/pack/acp/start/vim-orgmode/install_vmb.vim +++ /dev/null @@ -1,3 +0,0 @@ -:exec 'set rtp='.g:installdir -:so orgmode.vmb -:q! diff --git a/pack/acp/start/vim-orgmode/org b/pack/acp/start/vim-orgmode/org deleted file mode 100755 index 5d44b5f..0000000 --- a/pack/acp/start/vim-orgmode/org +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python2 -# -*- coding: utf-8 -*- - -# org -# Command line utility for working with orgmode documents -# -# Depends: python-liborgmode -# -# Copyright (C) 2012 Jan Christoph Ebersbach -# -# http://www.e-jc.de/ -# -# All rights reserved. -# -# The source code of this program is made available -# under the terms of the GNU Affero General Public License version 3 -# (GNU AGPL V3) as published by the Free Software Foundation. -# -# Binary versions of this program provided by Univention to you as -# well as other copyrighted, protected or trademarked materials like -# Logos, graphics, fonts, specific documentations and configurations, -# cryptographic keys etc. are subject to a license agreement between -# you and Univention and not subject to the GNU AGPL V3. -# -# In the case you use this program under the terms of the GNU AGPL V3, -# the program is provided in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public -# License with the Debian GNU/Linux or Univention distribution in file -# /usr/share/common-licenses/AGPL-3; if not, see -# <http://www.gnu.org/licenses/>. - -import sys -sys.path.append('ftplugin') - -from orgmode.liborgmode.documents import Document - - -class OrgFile(Document): - def __init__(self, filename): - u""" - :filename: Name of the file that shall be opened - """ - Document.__init__(self) - with file(filename) as f: - self._content = [line.decode(u'utf-8') for line in f.readlines()] - -if __name__ == '__main__': - import cProfile - for filename in sys.argv[1:]: - cProfile.run('OrgFile(filename).init_dom()') diff --git a/pack/acp/start/vim-orgmode/syntax/org.vim b/pack/acp/start/vim-orgmode/syntax/org.vim deleted file mode 100644 index 2acb407..0000000 --- a/pack/acp/start/vim-orgmode/syntax/org.vim +++ /dev/null @@ -1,383 +0,0 @@ -" Support org authoring markup as closely as possible -" (we're adding two markdown-like variants for =code= and blockquotes) -" ----------------------------------------------------------------------------- -" -" Do we use aggresive conceal? -if exists("b:org_aggressive_conceal") - let s:conceal_aggressively=b:org_aggressive_conceal -elseif exists("g:org_aggressive_conceal") - let s:conceal_aggressively=g:org_aggressive_conceal -else - let s:conceal_aggressively=0 -endif - -" Inline markup {{{1 -" *bold*, /italic/, _underline_, +strike-through+, =code=, ~verbatim~ -" Note: -" - /italic/ is rendered as reverse in most terms (works fine in gVim, though) -" - +strike-through+ doesn't work on Vim / gVim -" - the non-standard `code' markup is also supported -" - =code= and ~verbatim~ are also supported as block-level markup, see below. -" Ref: http://orgmode.org/manual/Emphasis-and-monospace.html -"syntax match org_bold /\*[^ ]*\*/ - -" FIXME: Always make org_bold syntax define before org_heading syntax -" to make sure that org_heading syntax got higher priority(help :syn-priority) than org_bold. -" If there is any other good solution, please help fix it. -" \\\\*sinuate* -if (s:conceal_aggressively == 1) - syntax region org_bold matchgroup=org_border_bold start="[^ \\]\zs\*\|\(\(^\|[^\\]\)\zs\(\\\\\)\+\)\zs\*\|\(^\|[^\\]\)\@<=\*\S\@=" end="[^ \\]\zs\*\|\(\(^\|[^\\]\)\zs\(\\\\\)\+\)\zs\*\|[^\\]\zs\*\S\@=" concealends oneline - syntax region org_italic matchgroup=org_border_ital start="[^ \\]\zs\/\|\(\(^\|[^\\]\)\zs\(\\\\\)\+\)\zs\/\|\(^\|[^\\]\)\@<=\/\S\@=" end="[^ \\]\zs\/\|\(\(^\|[^\\]\)\zs\(\\\\\)\+\)\zs\/\|[^\\]\zs\/\S\@=" concealends oneline - syntax region org_underline matchgroup=org_border_undl start="[^ \\]\zs_\|\(\(^\|[^\\]\)\zs\(\\\\\)\+\)\zs_\|\(^\|[^\\]\)\@<=_\S\@=" end="[^ \\]\zs_\|\(\(^\|[^\\]\)\zs\(\\\\\)\+\)\zs_\|[^\\]\zs_\S\@=" concealends oneline - syntax region org_code matchgroup=org_border_code start="[^ \\]\zs=\|\(\(^\|[^\\]\)\zs\(\\\\\)\+\)\zs=\|\(^\|[^\\]\)\@<==\S\@=" end="[^ \\]\zs=\|\(\(^\|[^\\]\)\zs\(\\\\\)\+\)\zs=\|[^\\]\zs=\S\@=" concealends oneline - syntax region org_code matchgroup=org_border_code start="[^ \\]\zs`\|\(\(^\|[^\\]\)\zs\(\\\\\)\+\)\zs`\|\(^\|[^\\]\)\@<=`\S\@=" end="[^ \\]\zs'\|\(\(^\|[^\\]\)\zs\(\\\\\)\+\)\zs'\|[^\\]\zs'\S\@=" concealends oneline - syntax region org_verbatim matchgroup=org_border_verb start="[^ \\]\zs\~\|\(\(^\|[^\\]\)\zs\(\\\\\)\+\)\zs\~\|\(^\|[^\\]\)\@<=\~\S\@=" end="[^ \\]\zs\~\|\(\(^\|[^\\]\)\zs\(\\\\\)\+\)\zs\~\|[^\\]\zs\~\S\@=" concealends oneline -else - syntax region org_bold start="\S\zs\*\|\*\S\@=" end="\S\zs\*\|\*\S\@=" keepend oneline - syntax region org_italic start="\S\zs\/\|\/\S\@=" end="\S\zs\/\|\/\S\@=" keepend oneline - syntax region org_underline start="\S\zs_\|_\S\@=" end="\S\zs_\|_\S\@=" keepend oneline - syntax region org_code start="\S\zs=\|=\S\@=" end="\S\zs=\|=\S\@=" keepend oneline - syntax region org_code start="\S\zs`\|`\S\@=" end="\S\zs'\|'\S\@=" keepend oneline - syntax region org_verbatim start="\S\zs\~\|\~\S\@=" end="\S\zs\~\|\~\S\@=" keepend oneline -endif - -hi def org_bold term=bold cterm=bold gui=bold -hi def org_italic term=italic cterm=italic gui=italic -hi def org_underline term=underline cterm=underline gui=underline - -if (s:conceal_aggressively == 1) - hi link org_border_bold org_bold - hi link org_border_ital org_italic - hi link org_border_undl org_underline -endif - -" Headings: {{{1 -" Load Settings: {{{2 -if !exists('g:org_heading_highlight_colors') - let g:org_heading_highlight_colors = ['Title', 'Constant', 'Identifier', 'Statement', 'PreProc', 'Type', 'Special'] -endif - -if !exists('g:org_heading_highlight_levels') - let g:org_heading_highlight_levels = len(g:org_heading_highlight_colors) -endif - -if !exists('g:org_heading_shade_leading_stars') - let g:org_heading_shade_leading_stars = 1 -endif - -" Enable Syntax HL: {{{2 -unlet! s:i s:j s:contains -let s:i = 1 -let s:j = len(g:org_heading_highlight_colors) -let s:contains = ' contains=org_timestamp,org_timestamp_inactive,org_subtask_percent,org_subtask_number,org_subtask_percent_100,org_subtask_number_all,org_list_checkbox,org_bold,org_italic,org_underline,org_code,org_verbatim' -if g:org_heading_shade_leading_stars == 1 - let s:contains = s:contains . ',org_shade_stars' - syntax match org_shade_stars /^\*\{2,\}/me=e-1 contained - hi def link org_shade_stars Ignore -else - hi clear org_shade_stars -endif - -while s:i <= g:org_heading_highlight_levels - exec 'syntax match org_heading' . s:i . ' /^\*\{' . s:i . '\}\s.*/' . s:contains - exec 'hi def link org_heading' . s:i . ' ' . g:org_heading_highlight_colors[(s:i - 1) % s:j] - let s:i += 1 -endwhile -unlet! s:i s:j s:contains - -" Todo Keywords: {{{1 -" Load Settings: {{{2 -if !exists('g:org_todo_keywords') - let g:org_todo_keywords = ['TODO', '|', 'DONE'] -endif - -if !exists('g:org_todo_keyword_faces') - let g:org_todo_keyword_faces = [] -endif - -" Enable Syntax HL: {{{2 -let s:todo_headings = '' -let s:i = 1 -while s:i <= g:org_heading_highlight_levels - if s:todo_headings == '' - let s:todo_headings = 'containedin=org_heading' . s:i - else - let s:todo_headings = s:todo_headings . ',org_heading' . s:i - endif - let s:i += 1 -endwhile -unlet! s:i - -if !exists('g:loaded_org_syntax') - let g:loaded_org_syntax = 1 - - function! OrgExtendHighlightingGroup(base_group, new_group, settings) - let l:base_hi = '' - redir => l:base_hi - silent execute 'highlight ' . a:base_group - redir END - let l:group_hi = substitute(split(l:base_hi, '\n')[0], '^' . a:base_group . '\s\+xxx', '', '') - execute 'highlight ' . a:new_group . l:group_hi . ' ' . a:settings - endfunction - - function! OrgInterpretFaces(faces) - let l:res_faces = '' - if type(a:faces) == 3 - let l:style = [] - for l:f in a:faces - let l:_f = [l:f] - if type(l:f) == 3 - let l:_f = l:f - endif - for l:g in l:_f - if type(l:g) == 1 && l:g =~ '^:' - if l:g !~ '[\t ]' - continue - endif - let l:k_v = split(l:g) - if l:k_v[0] == ':foreground' - let l:gui_color = '' - let l:found_gui_color = 0 - for l:color in split(l:k_v[1], ',') - if l:color =~ '^#' - let l:found_gui_color = 1 - let l:res_faces = l:res_faces . ' guifg=' . l:color - elseif l:color != '' - let l:gui_color = l:color - let l:res_faces = l:res_faces . ' ctermfg=' . l:color - endif - endfor - if ! l:found_gui_color && l:gui_color != '' - let l:res_faces = l:res_faces . ' guifg=' . l:gui_color - endif - elseif l:k_v[0] == ':background' - let l:gui_color = '' - let l:found_gui_color = 0 - for l:color in split(l:k_v[1], ',') - if l:color =~ '^#' - let l:found_gui_color = 1 - let l:res_faces = l:res_faces . ' guibg=' . l:color - elseif l:color != '' - let l:gui_color = l:color - let l:res_faces = l:res_faces . ' ctermbg=' . l:color - endif - endfor - if ! l:found_gui_color && l:gui_color != '' - let l:res_faces = l:res_faces . ' guibg=' . l:gui_color - endif - elseif l:k_v[0] == ':weight' || l:k_v[0] == ':slant' || l:k_v[0] == ':decoration' - if index(l:style, l:k_v[1]) == -1 - call add(l:style, l:k_v[1]) - endif - endif - elseif type(l:g) == 1 - " TODO emacs interprets the color and automatically determines - " whether it should be set as foreground or background color - let l:res_faces = l:res_faces . ' ctermfg=' . l:k_v[1] . ' guifg=' . l:k_v[1] - endif - endfor - endfor - let l:s = '' - for l:i in l:style - if l:s == '' - let l:s = l:i - else - let l:s = l:s . ','. l:i - endif - endfor - if l:s != '' - let l:res_faces = l:res_faces . ' term=' . l:s . ' cterm=' . l:s . ' gui=' . l:s - endif - elseif type(a:faces) == 1 - " TODO emacs interprets the color and automatically determines - " whether it should be set as foreground or background color - let l:res_faces = l:res_faces . ' ctermfg=' . a:faces . ' guifg=' . a:faces - endif - return l:res_faces - endfunction - - function! s:ReadTodoKeywords(keywords, todo_headings) - let l:default_group = 'Todo' - for l:i in a:keywords - if type(l:i) == 3 - call s:ReadTodoKeywords(l:i, a:todo_headings) - continue - endif - if l:i == '|' - let l:default_group = 'Question' - continue - endif - " strip access key - let l:_i = substitute(l:i, "\(.*$", "", "") - - let l:group = l:default_group - for l:j in g:org_todo_keyword_faces - if l:j[0] == l:_i - let l:group = 'org_todo_keyword_face_' . l:_i - call OrgExtendHighlightingGroup(l:default_group, l:group, OrgInterpretFaces(l:j[1])) - break - endif - endfor - silent! exec 'syntax match org_todo_keyword_' . l:_i . ' /\*\{1,\}\s\{1,\}\zs' . l:_i .'\(\s\|$\)/ ' . a:todo_headings - silent! exec 'hi def link org_todo_keyword_' . l:_i . ' ' . l:group - endfor - endfunction -endif - -call s:ReadTodoKeywords(g:org_todo_keywords, s:todo_headings) -unlet! s:todo_headings - -" Timestamps: {{{1 -"<2003-09-16 Tue> -"<2003-09-16 Sáb> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k>\)/ -"<2003-09-16 Tue 12:00> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d>\)/ -"<2003-09-16 Tue 12:00-12:30> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d-\d\d:\d\d>\)/ - -"<2003-09-16 Tue>--<2003-09-16 Tue> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k>--<\d\d\d\d-\d\d-\d\d \k\k\k>\)/ -"<2003-09-16 Tue 12:00>--<2003-09-16 Tue 12:00> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d>--<\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d>\)/ - -syn match org_timestamp /\(<%%(diary-float.\+>\)/ - -"[2003-09-16 Tue] -syn match org_timestamp_inactive /\(\[\d\d\d\d-\d\d-\d\d \k\k\k\]\)/ -"[2003-09-16 Tue 12:00] -syn match org_timestamp_inactive /\(\[\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d\]\)/ - -"[2003-09-16 Tue]--[2003-09-16 Tue] -syn match org_timestamp_inactive /\(\[\d\d\d\d-\d\d-\d\d \k\k\k\]--\[\d\d\d\d-\d\d-\d\d \k\k\k\]\)/ -"[2003-09-16 Tue 12:00]--[2003-09-16 Tue 12:00] -syn match org_timestamp_inactive /\(\[\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d\]--\[\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d\]\)/ - -syn match org_timestamp_inactive /\(\[%%(diary-float.\+\]\)/ - -hi def link org_timestamp PreProc -hi def link org_timestamp_inactive Comment - -" Deadline And Schedule: {{{1 -syn match org_deadline_scheduled /^\s*\(DEADLINE\|SCHEDULED\):/ -hi def link org_deadline_scheduled PreProc - -" Tables: {{{1 -syn match org_table /^\s*|.*/ contains=org_timestamp,org_timestamp_inactive,hyperlink,org_table_separator,org_table_horizontal_line -syn match org_table_separator /\(^\s*|[-+]\+|\?\||\)/ contained -hi def link org_table_separator Type - -" Hyperlinks: {{{1 -syntax match hyperlink "\[\{2}[^][]*\(\]\[[^][]*\)\?\]\{2}" contains=hyperlinkBracketsLeft,hyperlinkURL,hyperlinkBracketsRight containedin=ALL -if (s:conceal_aggressively == 1) - syntax match hyperlinkBracketsLeft contained "\[\{2}#\?" conceal -else - syntax match hyperlinkBracketsLeft contained "\[\{2}" conceal -endif -syntax match hyperlinkURL contained "[^][]*\]\[" conceal -syntax match hyperlinkBracketsRight contained "\]\{2}" conceal -hi def link hyperlink Underlined - -" Comments: {{{1 -syntax match org_comment /^#.*/ -hi def link org_comment Comment - -" Bullet Lists: {{{1 -" Ordered Lists: -" 1. list item -" 1) list item -" a. list item -" a) list item -syn match org_list_ordered "^\s*\(\a\|\d\+\)[.)]\(\s\|$\)" nextgroup=org_list_item -hi def link org_list_ordered Identifier - -" Unordered Lists: -" - list item -" * list item -" + list item -" + and - don't need a whitespace prefix -syn match org_list_unordered "^\(\s*[-+]\|\s\+\*\)\(\s\|$\)" nextgroup=org_list_item -hi def link org_list_unordered Identifier - -" Definition Lists: -" - Term :: expl. -" 1) Term :: expl. -syntax match org_list_def /.*\s\+::/ contained -hi def link org_list_def PreProc - -syntax match org_list_item /.*$/ contained contains=org_subtask_percent,org_subtask_number,org_subtask_percent_100,org_subtask_number_all,org_list_checkbox,org_bold,org_italic,org_underline,org_code,org_verbatim,org_timestamp,org_timestamp_inactive,org_list_def -syntax match org_list_checkbox /\[[ X-]]/ contained -hi def link org_list_bullet Identifier -hi def link org_list_checkbox PreProc - -" Block Delimiters: {{{1 -syntax case ignore -syntax match org_block_delimiter /^#+BEGIN_.*/ -syntax match org_block_delimiter /^#+END_.*/ -syntax match org_key_identifier /^#+[^ ]*:/ -syntax match org_title /^#+TITLE:.*/ contains=org_key_identifier -hi def link org_block_delimiter Comment -hi def link org_key_identifier Comment -hi def link org_title Title - -" Block Markup: {{{1 -" we consider all BEGIN/END sections as 'verbatim' blocks (inc. 'quote', 'verse', 'center') -" except 'example' and 'src' which are treated as 'code' blocks. -" Note: the non-standard '>' prefix is supported for quotation lines. -" Note: the '^:.*" rule must be defined before the ':PROPERTIES:' one below. -" TODO: http://vim.wikia.com/wiki/Different_syntax_highlighting_within_regions_of_a_file -syntax match org_verbatim /^\s*>.*/ -syntax match org_code /^\s*:.*/ - -syntax region org_verbatim start="^\s*#+BEGIN_.*" end="^\s*#+END_.*" keepend contains=org_block_delimiter -syntax region org_code start="^\s*#+BEGIN_SRC" end="^\s*#+END_SRC" keepend contains=org_block_delimiter -syntax region org_code start="^\s*#+BEGIN_EXAMPLE" end="^\s*#+END_EXAMPLE" keepend contains=org_block_delimiter - -hi def link org_code String -hi def link org_verbatim String - -if (s:conceal_aggressively==1) - hi link org_border_code org_code - hi link org_border_verb org_verbatim -endif - -" Properties: {{{1 -syn region Error matchgroup=org_properties_delimiter start=/^\s*:PROPERTIES:\s*$/ end=/^\s*:END:\s*$/ contains=org_property keepend -syn match org_property /^\s*:[^\t :]\+:\s\+[^\t ]/ contained contains=org_property_value -syn match org_property_value /:\s\zs.*/ contained -hi def link org_properties_delimiter PreProc -hi def link org_property Statement -hi def link org_property_value Constant -" Break down subtasks -syntax match org_subtask_number /\[\d*\/\d*]/ contained -syntax match org_subtask_percent /\[\d*%\]/ contained -syntax match org_subtask_number_all /\[\(\d\+\)\/\1\]/ contained -syntax match org_subtask_percent_100 /\[100%\]/ contained - -hi def link org_subtask_number String -hi def link org_subtask_percent String -hi def link org_subtask_percent_100 Identifier -hi def link org_subtask_number_all Identifier - -" Plugin SyntaxRange: {{{1 -" This only works if you have SyntaxRange installed: -" https://github.com/vim-scripts/SyntaxRange - -" BEGIN_SRC -if exists('g:loaded_SyntaxRange') - call SyntaxRange#Include('#+BEGIN_SRC vim', '#+END_SRC', 'vim', 'comment') - call SyntaxRange#Include('#+BEGIN_SRC python', '#+END_SRC', 'python', 'comment') - call SyntaxRange#Include('#+BEGIN_SRC c', '#+END_SRC', 'c', 'comment') - " cpp must be below c, otherwise you get c syntax hl for cpp files - call SyntaxRange#Include('#+BEGIN_SRC cpp', '#+END_SRC', 'cpp', 'comment') - call SyntaxRange#Include('#+BEGIN_SRC ruby', '#+END_SRC', 'ruby', 'comment') - " call SyntaxRange#Include('#+BEGIN_SRC lua', '#+END_SRC', 'lua', 'comment') - " call SyntaxRange#Include('#+BEGIN_SRC lisp', '#+END_SRC', 'lisp', 'comment') - - " LaTeX - call SyntaxRange#Include('\\begin[.*]{.*}', '\\end{.*}', 'tex') - call SyntaxRange#Include('\\begin{.*}', '\\end{.*}', 'tex') - call SyntaxRange#Include('\\\[', '\\\]', 'tex') -endif - -" vi: ft=vim:tw=80:sw=4:ts=4:fdm=marker diff --git a/pack/acp/start/vim-orgmode/syntax/orgagenda.vim b/pack/acp/start/vim-orgmode/syntax/orgagenda.vim deleted file mode 100644 index 3ea4fad..0000000 --- a/pack/acp/start/vim-orgmode/syntax/orgagenda.vim +++ /dev/null @@ -1,79 +0,0 @@ -" TODO do we really need a separate syntax file for the agenda? -" - Most of the stuff here is also in syntax.org -" - DRY! - -syn match org_todo_key /\[\zs[^]]*\ze\]/ -hi def link org_todo_key Identifier - -let s:todo_headings = '' -let s:i = 1 -while s:i <= g:org_heading_highlight_levels - if s:todo_headings == '' - let s:todo_headings = 'containedin=org_heading' . s:i - else - let s:todo_headings = s:todo_headings . ',org_heading' . s:i - endif - let s:i += 1 -endwhile -unlet! s:i - -if !exists('g:loaded_orgagenda_syntax') - let g:loaded_orgagenda_syntax = 1 - function! s:ReadTodoKeywords(keywords, todo_headings) - let l:default_group = 'Todo' - for l:i in a:keywords - if type(l:i) == 3 - call s:ReadTodoKeywords(l:i, a:todo_headings) - continue - endif - if l:i == '|' - let l:default_group = 'Question' - continue - endif - " strip access key - let l:_i = substitute(l:i, "\(.*$", "", "") - - let l:group = l:default_group - for l:j in g:org_todo_keyword_faces - if l:j[0] == l:_i - let l:group = 'orgtodo_todo_keyword_face_' . l:_i - call OrgExtendHighlightingGroup(l:default_group, l:group, OrgInterpretFaces(l:j[1])) - break - endif - endfor - silent! exec 'syntax match orgtodo_todo_keyword_' . l:_i . ' /' . l:_i .'/ ' . a:todo_headings - silent! exec 'hi def link orgtodo_todo_keyword_' . l:_i . ' ' . l:group - endfor - endfunction -endif - -call s:ReadTodoKeywords(g:org_todo_keywords, s:todo_headings) -unlet! s:todo_headings - -" Timestamps -"<2003-09-16 Tue> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k>\)/ -"<2003-09-16 Tue 12:00> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d>\)/ -"<2003-09-16 Tue 12:00-12:30> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d-\d\d:\d\d>\)/ -"<2003-09-16 Tue>--<2003-09-16 Tue> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k>--<\d\d\d\d-\d\d-\d\d \k\k\k>\)/ -"<2003-09-16 Tue 12:00>--<2003-09-16 Tue 12:00> -syn match org_timestamp /\(<\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d>--<\d\d\d\d-\d\d-\d\d \k\k\k \d\d:\d\d>\)/ -syn match org_timestamp /\(<%%(diary-float.\+>\)/ -hi def link org_timestamp PreProc - -" special words -syn match today /TODAY$/ -hi def link today PreProc - -syn match week_agenda /^Week Agenda:$/ -hi def link week_agenda PreProc - -" Hyperlinks -syntax match hyperlink "\[\{2}[^][]*\(\]\[[^][]*\)\?\]\{2}" contains=hyperlinkBracketsLeft,hyperlinkURL,hyperlinkBracketsRight containedin=ALL -syntax match hyperlinkBracketsLeft contained "\[\{2}" conceal -syntax match hyperlinkURL contained "[^][]*\]\[" conceal -syntax match hyperlinkBracketsRight contained "\]\{2}" conceal -hi def link hyperlink Underlined diff --git a/pack/acp/start/vim-orgmode/syntax/orgtodo.vim b/pack/acp/start/vim-orgmode/syntax/orgtodo.vim deleted file mode 100644 index 77c9aa6..0000000 --- a/pack/acp/start/vim-orgmode/syntax/orgtodo.vim +++ /dev/null @@ -1,47 +0,0 @@ -syn match org_todo_key /\[\zs[^]]*\ze\]/ -hi def link org_todo_key Identifier - -let s:todo_headings = '' -let s:i = 1 -while s:i <= g:org_heading_highlight_levels - if s:todo_headings == '' - let s:todo_headings = 'containedin=org_heading' . s:i - else - let s:todo_headings = s:todo_headings . ',org_heading' . s:i - endif - let s:i += 1 -endwhile -unlet! s:i - -if !exists('g:loaded_orgtodo_syntax') - let g:loaded_orgtodo_syntax = 1 - function! s:ReadTodoKeywords(keywords, todo_headings) - let l:default_group = 'Todo' - for l:i in a:keywords - if type(l:i) == 3 - call s:ReadTodoKeywords(l:i, a:todo_headings) - continue - endif - if l:i == '|' - let l:default_group = 'Question' - continue - endif - " strip access key - let l:_i = substitute(l:i, "\(.*$", "", "") - - let l:group = l:default_group - for l:j in g:org_todo_keyword_faces - if l:j[0] == l:_i - let l:group = 'orgtodo_todo_keyword_face_' . l:_i - call OrgExtendHighlightingGroup(l:default_group, l:group, OrgInterpretFaces(l:j[1])) - break - endif - endfor - silent! exec 'syntax match orgtodo_todo_keyword_' . l:_i . ' /' . l:_i .'/ ' . a:todo_headings - silent! exec 'hi def link orgtodo_todo_keyword_' . l:_i . ' ' . l:group - endfor - endfunction -endif - -call s:ReadTodoKeywords(g:org_todo_keywords, s:todo_headings) -unlet! s:todo_headings diff --git a/pack/acp/start/vim-orgmode/tests/orgmode_testfile.org b/pack/acp/start/vim-orgmode/tests/orgmode_testfile.org deleted file mode 100644 index 7eda72f..0000000 --- a/pack/acp/start/vim-orgmode/tests/orgmode_testfile.org +++ /dev/null @@ -1,37 +0,0 @@ - -* bold, italics and underline syntax matching -** Should match: - -*foo* *foo* -*Really, quite long sentence*. -_foo_ _foo_ -_really, quite long sentence._. - - *Übermensch á* *eä* *ý€* - _Ÿ ï_ - - *sdf l.* - *sdfsdf ,.* - *foo_ sdf /* - /sdf sdf sdf ./ - - /google.com/ - - *[sdf]* -*a* /a/ =b= ~b~ `d` - -*abc* /abc/ =bde= ~bde~ `def` - *=*a*=* -** Should not match -http://google.com/ - //google.com/ - * sdf* _ sdf_ - *sdfsdf sdf,* - *foo * - foo_not underlined_bar - - *.sdf*[ - [*.sdf* - [*sdf*] - *=*a*= - diff --git a/pack/acp/start/vim-orgmode/tests/run_tests.py b/pack/acp/start/vim-orgmode/tests/run_tests.py deleted file mode 100755 index 6b31816..0000000 --- a/pack/acp/start/vim-orgmode/tests/run_tests.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import test_vimbuffer - -import test_libagendafilter -import test_libcheckbox -import test_libbase -import test_libheading -import test_liborgdate -import test_liborgdate_utf8 -import test_liborgdate_parsing -import test_liborgdatetime -import test_liborgtimerange - -import test_plugin_date -import test_plugin_edit_structure -import test_plugin_edit_checkbox -import test_plugin_misc -import test_plugin_navigator -import test_plugin_show_hide -import test_plugin_tags_properties -import test_plugin_todo -import test_plugin_mappings - -import unittest - - -if __name__ == '__main__': - tests = unittest.TestSuite() - - tests.addTests(test_vimbuffer.suite()) - - # lib - tests.addTests(test_libbase.suite()) - tests.addTests(test_libcheckbox.suite()) - tests.addTests(test_libagendafilter.suite()) - tests.addTests(test_libheading.suite()) - tests.addTests(test_liborgdate.suite()) - tests.addTests(test_liborgdate_utf8.suite()) - tests.addTests(test_liborgdate_parsing.suite()) - tests.addTests(test_liborgdatetime.suite()) - tests.addTests(test_liborgtimerange.suite()) - - # plugins - tests.addTests(test_plugin_date.suite()) - tests.addTests(test_plugin_edit_structure.suite()) - tests.addTests(test_plugin_edit_checkbox.suite()) - tests.addTests(test_plugin_misc.suite()) - tests.addTests(test_plugin_navigator.suite()) - tests.addTests(test_plugin_show_hide.suite()) - tests.addTests(test_plugin_tags_properties.suite()) - tests.addTests(test_plugin_todo.suite()) - tests.addTests(test_plugin_mappings.suite()) - - runner = unittest.TextTestRunner() - runner.run(tests) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/tests/test_libagendafilter.py b/pack/acp/start/vim-orgmode/tests/test_libagendafilter.py deleted file mode 100644 index e594333..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_libagendafilter.py +++ /dev/null @@ -1,171 +0,0 @@ -# -*- coding: utf-8 -*- - - -import sys -sys.path.append(u'../ftplugin') - -import unittest -from datetime import date -from datetime import timedelta - -from orgmode.liborgmode.headings import Heading -from orgmode.liborgmode.orgdate import OrgDate -from orgmode.liborgmode.agendafilter import contains_active_todo -from orgmode.liborgmode.agendafilter import contains_active_date -from orgmode.liborgmode.orgdate import OrgDateTime -from orgmode.liborgmode.agendafilter import is_within_week -from orgmode.liborgmode.agendafilter import is_within_week_and_active_todo -from orgmode.liborgmode.agendafilter import filter_items - -import vim - -from orgmode.py3compat.encode_compatibility import * - -counter = 0 - -class AgendaFilterTestCase(unittest.TestCase): - u"""Tests all the functionality of the Agenda filter module.""" - - def setUp(self): - global counter - counter += 1 - - vim.EVALHISTORY = [] - vim.EVALRESULTS = { - # no org_todo_keywords for b - u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'), - # global values for org_todo_keywords - u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'), - u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')], - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("b:org_debug")'): u_encode(u'0'), - u_encode(u'exists("*repeat#set()")'): u_encode(u'0'), - u_encode(u'b:changedtick'): u_encode(u'%d' % counter), - u_encode(u"v:count"): u_encode(u'0') - } - vim.current.buffer[:] = [u_encode(i) for i in u""" -* TODO Heading 1 - some text -""".split(u'\n')] - - def test_contains_active_todo(self): - heading = Heading(title=u'Refactor the code', todo='TODO') - self.assertTrue(contains_active_todo(heading)) - - heading = Heading(title=u'Refactor the code', todo='DONE') - self.assertFalse(contains_active_todo(heading)) - - heading = Heading(title=u'Refactor the code', todo=None) - self.assertFalse(contains_active_todo(heading)) - - def test_contains_active_date(self): - heading = Heading(title=u'Refactor the code', active_date=None) - self.assertFalse(contains_active_date(heading)) - - odate = OrgDate(True, 2011, 11, 1) - heading = Heading(title=u'Refactor the code', active_date=odate) - self.assertTrue(contains_active_date(heading)) - - def test_is_within_week_with_orgdate(self): - # to far in the future - tmpdate = date.today() + timedelta(days=8) - odate = OrgDate(True, tmpdate.year, tmpdate.month, tmpdate.day) - heading = Heading(title=u'Refactor the code', active_date=odate) - self.assertFalse(is_within_week(heading)) - - # within a week - tmpdate = date.today() + timedelta(days=5) - odate = OrgDate(True, tmpdate.year, tmpdate.month, tmpdate.day) - heading = Heading(title=u'Refactor the code', active_date=odate) - self.assertTrue(is_within_week(heading)) - - # in the past - tmpdate = date.today() - timedelta(days=105) - odate = OrgDate(True, tmpdate.year, tmpdate.month, tmpdate.day) - heading = Heading(title=u'Refactor the code', active_date=odate) - self.assertTrue(is_within_week(heading)) - - def test_is_within_week_with_orgdatetime(self): - # to far in the future - tmp = date.today() + timedelta(days=1000) - odate = OrgDateTime(True, tmp.year, tmp.month, tmp.day, 10, 10) - heading = Heading(title=u'Refactor the code', active_date=odate) - self.assertFalse(is_within_week(heading)) - - # within a week - tmpdate = date.today() + timedelta(days=5) - odate = OrgDateTime(True, tmpdate.year, tmpdate.month, tmpdate.day, 1, 0) - heading = Heading(title=u'Refactor the code', active_date=odate) - self.assertTrue(is_within_week(heading)) - - # in the past - tmpdate = date.today() - timedelta(days=5) - odate = OrgDateTime(True, tmpdate.year, tmpdate.month, tmpdate.day, 1, 0) - heading = Heading(title=u'Refactor the code', active_date=odate) - self.assertTrue(is_within_week(heading)) - - def test_filter_items(self): - # only headings with date and todo should be returned - vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = \ - [u_encode(u'TODO'), u_encode(u'STARTED'), u_encode(u'|'), u_encode(u'DONE')] - tmpdate = date.today() - odate = OrgDate(True, tmpdate.year, tmpdate.month, tmpdate.day) - tmp_head = Heading(title=u'Refactor the code', todo=u'TODO', active_date=odate) - tmp_head_01 = Heading(title=u'Refactor the code', todo=u'STARTED', active_date=odate) - # TODO add more tests - headings = [tmp_head, tmp_head_01] - filtered = list(filter_items(headings, - [contains_active_date, contains_active_todo])) - - self.assertEqual(len(filtered), 2) - self.assertEqual(filtered, headings) - - # try a longer list - headings = headings * 3 - filtered = list(filter_items(headings, - [contains_active_date, contains_active_todo])) - - self.assertEqual(len(filtered), 6) - self.assertEqual(filtered, headings) - - # date does not contain all needed fields thus gets ignored - tmpdate = date.today() - odate = OrgDate(True, tmpdate.year, tmpdate.month, tmpdate.day) - tmp_head = Heading(title=u'Refactor the code', active_date=odate) - headings = [tmp_head] - filtered = list(filter_items(headings, [contains_active_date, - contains_active_todo])) - self.assertEqual([], filtered) - - def test_filter_items_with_some_todos_and_dates(self): - u""" - Only the headings with todo and dates should be retunrned. - """ - tmp = [u"* TODO OrgMode Demo und Tests" - u"<2011-08-22 Mon>"] - headings = [Heading.parse_heading_from_data(tmp, [u'TODO'])] - filtered = list(filter_items(headings, - [is_within_week_and_active_todo])) - self.assertEqual(len(filtered), 1) - self.assertEqual(headings, filtered) - - tmp = [Heading.parse_heading_from_data([u"** DONE something <2011-08-10 Wed>"], [u'TODO']), - Heading.parse_heading_from_data([u"*** TODO rsitenaoritns more <2011-08-25 Thu>"], [u'TODO']), - Heading.parse_heading_from_data([u"*** DONE some more <2011-08-25 Thu>"], [u'TODO']), - Heading.parse_heading_from_data([u"*** TODO some more <2011-08-25 Thu>"], [u'TODO']), - Heading.parse_heading_from_data([u"** DONE something2 <2011-08-10 Wed>"], [u'TODO']) - ] - for h in tmp: - headings.append(h) - - filtered = list(filter_items(headings, - [is_within_week_and_active_todo])) - self.assertEqual(len(filtered), 3) - self.assertEqual(filtered, [headings[0], headings[2], headings[4]]) - - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(AgendaFilterTestCase) - - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/tests/test_libbase.py b/pack/acp/start/vim-orgmode/tests/test_libbase.py deleted file mode 100644 index b27ecfd..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_libbase.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest -import sys -sys.path.append(u'../ftplugin') - -from orgmode.liborgmode.base import Direction, get_domobj_range -from orgmode.liborgmode.headings import Heading - - -class LibBaseTestCase(unittest.TestCase): - - def setUp(self): - self.case1 = """ -* head1 - heading body - for testing -* head2 -** head3 - """.split("\n") - - def test_base_functions(self): - # direction FORWARD - (start, end) = get_domobj_range(content=self.case1, position=1, identify_fun=Heading.identify_heading) - self.assertEqual((start, end), (1, 3)) - (start, end) = get_domobj_range(content=self.case1, position=3, direction=Direction.BACKWARD, \ - identify_fun=Heading.identify_heading) - self.assertEqual((start, end), (1, 3)) - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase( - LibBaseTestCase) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/tests/test_libcheckbox.py b/pack/acp/start/vim-orgmode/tests/test_libcheckbox.py deleted file mode 100644 index b2f485d..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_libcheckbox.py +++ /dev/null @@ -1,132 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest -import sys -sys.path.append(u'../ftplugin') - -import vim -from orgmode.liborgmode.checkboxes import Checkbox -from orgmode._vim import ORGMODE - -from orgmode.py3compat.encode_compatibility import * - -def set_vim_buffer(buf=None, cursor=(2, 0), bufnr=0): - if buf is None: - buf = [] - vim.current.buffer[:] = buf - vim.current.window.cursor = cursor - vim.current.buffer.number = bufnr - - -class CheckboxTestCase(unittest.TestCase): - - def setUp(self): - counter = 0 - vim.CMDHISTORY = [] - vim.CMDRESULTS = {} - vim.EVALHISTORY = [] - vim.EVALRESULTS = { - # no org_todo_keywords for b - u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'), - # global values for org_todo_keywords - u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'), - u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')], - u_encode(u'exists("g:org_improve_split_heading")'): u_encode(u'0'), - u_encode(u'exists("b:org_improve_split_heading")'): u_encode(u'0'), - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("b:org_debug")'): u_encode(u'0'), - u_encode(u'exists("*repeat#set()")'): u_encode(u'0'), - u_encode(u'b:changedtick'): u_encode(u'%d' % counter), - u_encode(u'&ts'): u_encode(u'8'), - u_encode(u'exists("g:org_tag_column")'): u_encode(u'0'), - u_encode(u'exists("b:org_tag_column")'): u_encode(u'0'), - u_encode(u"v:count"): u_encode(u'0')} - - self.c1 = """ -* heading1 [/] - - [-] checkbox1 [%] - - [X] checkbox2 - - [ ] checkbox3 - - [X] checkbox4 -""".split("\n") - - self.c2 = """ -* heading1 - - [ ] checkbox1 - - [ ] checkbox2 - - [ ] checkbox3 - - [ ] checkbox4 - - [ ] checkbox5 - - [ ] checkbox6 -""".split("\n") - - def test_init(self): - # test initialize Checkbox - c = Checkbox(level=1, title="checkbox1") - self.assertEqual(str(c), " - [ ] checkbox1") - c = Checkbox(level=3, title="checkbox2", status="[X]") - self.assertEqual(str(c), " - [X] checkbox2") - - def test_basic(self): - bufnr = 1 - set_vim_buffer(buf=self.c1, bufnr=bufnr) - h = ORGMODE.get_document(bufnr=bufnr).current_heading() - h.init_checkboxes() - - c = h.current_checkbox(position=2) - self.assertEqual(str(c), self.c1[2]) - self.assertFalse(c.are_children_all(Checkbox.STATUS_ON)) - self.assertTrue(c.is_child_one(Checkbox.STATUS_OFF)) - self.assertFalse(c.are_siblings_all(Checkbox.STATUS_ON)) - - for child in c.all_children(): - pass - for sibling in c.all_siblings(): - pass - c = h.current_checkbox(position=3) - new_checkbox = c.copy() - self.assertEqual(str(c), self.c1[3]) - c.get_parent_list() - c.get_index_in_parent_list() - - def test_identify(self): - # test identify_checkbox - self.assertEqual(Checkbox.identify_checkbox(self.c1[2]), 2) - self.assertEqual(Checkbox.identify_checkbox(self.c1[3]), 8) - # check for corner case - self.assertEqual(Checkbox.identify_checkbox(" - [ ]"), 1) - - def test_toggle(self): - bufnr = 2 - # test init_checkboxes - set_vim_buffer(buf=self.c1, bufnr=bufnr) - h = ORGMODE.get_document(bufnr=bufnr).current_heading() - h.init_checkboxes() - - # toggle checkbox - c = h.current_checkbox(position=4) - c.toggle() - self.assertEqual(str(c), " - [X] checkbox3") - c.toggle() - self.assertEqual(str(c), " - [ ] checkbox3") - - (total, on) = c.all_siblings_status() - self.assertEqual((total, on), (2, 1)) - - def test_subtasks(self): - bufnr = 3 - set_vim_buffer(buf=self.c1, bufnr=bufnr) - h = ORGMODE.get_document(bufnr=bufnr).current_heading() - h.init_checkboxes() - c = h.current_checkbox(position=3) - c.toggle() - c = h.current_checkbox(position=2) - (total, on) = c.all_siblings_status() - c.update_subtasks(total=total, on=on) - self.assertEqual(str(c), " - [-] checkbox1 [50%]") - - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(CheckboxTestCase) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/tests/test_libheading.py b/pack/acp/start/vim-orgmode/tests/test_libheading.py deleted file mode 100644 index 335b8dc..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_libheading.py +++ /dev/null @@ -1,156 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest -import sys -sys.path.append(u'../ftplugin') - -from orgmode.liborgmode.headings import Heading -from orgmode.liborgmode.orgdate import OrgDate -from orgmode.liborgmode.orgdate import OrgDateTime - - -class TestHeadingRecognizeDatesInHeading(unittest.TestCase): - - def setUp(self): - self.allowed_todo_states = ["TODO"] - - tmp = ["* This heading is earlier <2011-08-24 Wed>"] - self.h1 = Heading.parse_heading_from_data(tmp, self.allowed_todo_states) - - tmp = ["* This heading is later <2011-08-25 Thu>"] - self.h2 = Heading.parse_heading_from_data(tmp, self.allowed_todo_states) - - tmp = ["* This heading is later <2011-08-25 Thu 10:20>"] - self.h2_datetime = Heading.parse_heading_from_data(tmp, self.allowed_todo_states) - - tmp = ["* This heading is later <2011-08-26 Fri 10:20>"] - self.h3 = Heading.parse_heading_from_data(tmp, self.allowed_todo_states) - - tmp = ["* This heading has no date and should be later than the rest"] - self.h_no_date = Heading.parse_heading_from_data(tmp, - self.allowed_todo_states) - - def test_heading_parsing_no_date(self): - """"" - 'text' doesn't contain any valid date. - """ - text = ["* TODO This is a test :hallo:"] - h = Heading.parse_heading_from_data(text, self.allowed_todo_states) - self.assertEqual(None, h.active_date) - - text = ["* TODO This is a test <2011-08-25>"] - h = Heading.parse_heading_from_data(text, self.allowed_todo_states) - self.assertEqual(None, h.active_date) - - text = ["* TODO This is a test <2011-08-25 Wednesday>"] - h = Heading.parse_heading_from_data(text, self.allowed_todo_states) - self.assertEqual(None, h.active_date) - - text = ["* TODO This is a test <20110825>"] - h = Heading.parse_heading_from_data(text, self.allowed_todo_states) - self.assertEqual(None, h.active_date) - - def test_heading_parsing_with_date(self): - """"" - 'text' does contain valid dates. - """ - # orgdate - text = ["* TODO This is a test <2011-08-24 Wed> :hallo:"] - odate = OrgDate(True, 2011, 8, 24) - h = Heading.parse_heading_from_data(text, self.allowed_todo_states) - self.assertEqual(odate, h.active_date) - - # orgdatetime - text = ["* TODO This is a test <2011-08-25 Thu 10:10> :hallo:"] - odate = OrgDateTime(True, 2011, 8, 25, 10, 10) - h = Heading.parse_heading_from_data(text, self.allowed_todo_states) - self.assertEqual(odate, h.active_date) - - def test_heading_parsing_with_date_and_body(self): - """"" - 'text' contains valid dates (in the body). - """ - # orgdatetime - text = ["* TODO This is a test <2011-08-25 Thu 10:10> :hallo:", - "some body text", - "some body text"] - h = Heading.parse_heading_from_data(text, self.allowed_todo_states) - self.assertTrue(isinstance(h.active_date, OrgDateTime)) - self.assertEqual("<2011-08-25 Thu 10:10>", str(h.active_date)) - - text = ["* TODO This is a test :hallo:", - "some body text", - "some body text<2011-08-25 Thu 10:10>"] - h = Heading.parse_heading_from_data(text, self.allowed_todo_states) - self.assertTrue(isinstance(h.active_date, OrgDateTime)) - self.assertEqual("<2011-08-25 Thu 10:10>", str(h.active_date)) - - text = ["* TODO This is a test :hallo:", - "some body text <2011-08-24 Wed>", - "some body text<2011-08-25 Thu 10:10>"] - h = Heading.parse_heading_from_data(text, self.allowed_todo_states) - odate = OrgDate(True, 2011, 8, 24) - self.assertEqual(odate, h.active_date) - - def test_less_than_for_dates_in_heading(self): - self.assertTrue(self.h1 < self.h2) - self.assertTrue(self.h1 < self.h3) - self.assertTrue(self.h1 < self.h_no_date) - self.assertTrue(self.h2 < self.h_no_date) - self.assertTrue(self.h2 < self.h3) - self.assertTrue(self.h3 < self.h_no_date) - - self.assertFalse(self.h2 < self.h1) - self.assertFalse(self.h3 < self.h2) - - def test_less_equal_for_dates_in_heading(self): - self.assertTrue(self.h1 <= self.h2) - self.assertTrue(self.h1 <= self.h_no_date) - self.assertTrue(self.h2 <= self.h_no_date) - self.assertTrue(self.h2 <= self.h2_datetime) - self.assertTrue(self.h2 <= self.h3) - - def test_greate_than_for_dates_in_heading(self): - self.assertTrue(self.h2 > self.h1) - self.assertTrue(self.h_no_date > self.h1) - self.assertTrue(self.h_no_date > self.h2) - - self.assertFalse(self.h2 > self.h2_datetime) - - def test_greate_equal_for_dates_in_heading(self): - self.assertTrue(self.h2 >= self.h1) - self.assertTrue(self.h_no_date >= self.h1) - self.assertTrue(self.h_no_date >= self.h2) - self.assertTrue(self.h2 >= self.h2_datetime) - - def test_sorting_of_headings(self): - """Headings should be sortable.""" - self.assertEqual([self.h1, self.h2], sorted([self.h2, self.h1])) - - self.assertEqual([self.h1, self.h2_datetime], - sorted([self.h2_datetime, self.h1])) - - self.assertEqual([self.h2_datetime, self.h2], - sorted([self.h2_datetime, self.h2])) - - self.assertEqual([self.h1, self.h2], sorted([self.h1, self.h2])) - - self.assertEqual([self.h1, self.h_no_date], - sorted([self.h1, self.h_no_date])) - - self.assertEqual([self.h1, self.h_no_date], - sorted([self.h_no_date, self.h1])) - - self.assertEqual([self.h1, self.h2, self.h_no_date], - sorted([self.h2, self.h_no_date, self.h1])) - - self.assertEqual( - [self.h1, self.h2_datetime, self.h2, self.h3, self.h_no_date], - sorted([self.h2_datetime, self.h3, self.h2, self.h_no_date, self.h1])) - - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase( - TestHeadingRecognizeDatesInHeading) - -# vim: set noexpandtab: diff --git a/pack/acp/start/vim-orgmode/tests/test_liborgdate.py b/pack/acp/start/vim-orgmode/tests/test_liborgdate.py deleted file mode 100644 index 1b37351..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_liborgdate.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- - - -import sys -import unittest -from datetime import date - -sys.path.append(u'../ftplugin') -from orgmode.liborgmode.orgdate import OrgDate - -from orgmode.py3compat.unicode_compatibility import * - -class OrgDateTestCase(unittest.TestCase): - u""" - Tests all the functionality of the OrgDate - """ - - def setUp(self): - self.date = date(2011, 8, 29) - self.year = 2011 - self.month = 8 - self.day = 29 - self.text = u'<2011-08-29 Mon>' - self.textinactive = u'[2011-08-29 Mon]' - - def test_OrgDate_ctor_active(self): - u"""OrdDate should be created.""" - today = date.today() - od = OrgDate(True, today.year, today.month, today.day) - self.assertTrue(isinstance(od, OrgDate)) - self.assertTrue(od.active) - - def test_OrgDate_ctor_inactive(self): - u"""OrdDate should be created.""" - today = date.today() - od = OrgDate(False, today.year, today.month, today.day) - self.assertTrue(isinstance(od, OrgDate)) - self.assertFalse(od.active) - - def test_OrdDate_str_active(self): - u"""Representation of OrgDates""" - od = OrgDate(True, self.year, self.month, self.day) - self.assertEqual(self.text, unicode(od)) - - def test_OrdDate_str_inactive(self): - od = OrgDate(False, self.year, self.month, self.day) - self.assertEqual(self.textinactive, unicode(od)) - - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(OrgDateTestCase) - -# vi: noexpandtab diff --git a/pack/acp/start/vim-orgmode/tests/test_liborgdate_parsing.py b/pack/acp/start/vim-orgmode/tests/test_liborgdate_parsing.py deleted file mode 100644 index ae49f0d..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_liborgdate_parsing.py +++ /dev/null @@ -1,248 +0,0 @@ -# -*- coding: utf-8 -*- - - -import sys -import unittest - -sys.path.append(u'../ftplugin') -from orgmode.liborgmode.orgdate import get_orgdate -from orgmode.liborgmode.orgdate import OrgDate -from orgmode.liborgmode.orgdate import OrgDateTime -from orgmode.liborgmode.orgdate import OrgTimeRange - -from orgmode.py3compat.unicode_compatibility import * - -class OrgDateParsingTestCase(unittest.TestCase): - u""" - Tests the functionality of the parsing function of OrgDate. - - Mostly function get_orgdate(). - """ - - def setUp(self): - self.text = u'<2011-08-29 Mon>' - self.textinactive = u'[2011-08-29 Mon]' - - def test_get_orgdate_parsing_active(self): - u""" - get_orgdate should recognize all orgdates in a given text - """ - result = get_orgdate(self.text) - self.assertNotEqual(result, None) - self.assertTrue(isinstance(result, OrgDate)) - self.assertTrue(isinstance(get_orgdate(u"<2011-08-30 Tue>"), OrgDate)) - self.assertEqual(get_orgdate(u"<2011-08-30 Tue>").year, 2011) - self.assertEqual(get_orgdate(u"<2011-08-30 Tue>").month, 8) - self.assertEqual(get_orgdate(u"<2011-08-30 Tue>").day, 30) - self.assertTrue(get_orgdate(u"<2011-08-30 Tue>").active) - - datestr = u"This date <2011-08-30 Tue> is embedded" - self.assertTrue(isinstance(get_orgdate(datestr), OrgDate)) - - - def test_get_orgdatetime_parsing_active(self): - u""" - get_orgdate should recognize all orgdatetimes in a given text - """ - result = get_orgdate(u"<2011-09-12 Mon 10:20>") - self.assertNotEqual(result, None) - self.assertTrue(isinstance(result, OrgDateTime)) - self.assertEqual(result.year, 2011) - self.assertEqual(result.month, 9) - self.assertEqual(result.day, 12) - self.assertEqual(result.hour, 10) - self.assertEqual(result.minute, 20) - self.assertTrue(result.active) - - result = get_orgdate(u"some datetime <2011-09-12 Mon 10:20> stuff") - self.assertTrue(isinstance(result, OrgDateTime)) - - - def test_get_orgtimerange_parsing_active(self): - u""" - get_orgdate should recognize all orgtimeranges in a given text - """ - daterangestr = u"<2011-09-12 Mon>--<2011-09-13 Tue>" - result = get_orgdate(daterangestr) - self.assertNotEqual(result, None) - self.assertTrue(isinstance(result, OrgTimeRange)) - self.assertEqual(unicode(result), daterangestr) - self.assertTrue(result.active) - - daterangestr = u"<2011-09-12 Mon 10:20>--<2011-09-13 Tue 13:20>" - result = get_orgdate(daterangestr) - self.assertNotEqual(result, None) - self.assertTrue(isinstance(result, OrgTimeRange)) - self.assertEqual(unicode(result), daterangestr) - self.assertTrue(result.active) - - daterangestr = u"<2011-09-12 Mon 10:20-13:20>" - result = get_orgdate(daterangestr) - self.assertNotEqual(result, None) - self.assertTrue(isinstance(result, OrgTimeRange)) - self.assertEqual(unicode(result), daterangestr) - self.assertTrue(result.active) - - def test_get_orgdate_parsing_inactive(self): - u""" - get_orgdate should recognize all inactive orgdates in a given text - """ - result = get_orgdate(self.textinactive) - self.assertNotEqual(result, None) - self.assertTrue(isinstance(result, OrgDate)) - self.assertTrue(isinstance(get_orgdate(u"[2011-08-30 Tue]"), OrgDate)) - self.assertEqual(get_orgdate(u"[2011-08-30 Tue]").year, 2011) - self.assertEqual(get_orgdate(u"[2011-08-30 Tue]").month, 8) - self.assertEqual(get_orgdate(u"[2011-08-30 Tue]").day, 30) - self.assertFalse(get_orgdate(u"[2011-08-30 Tue]").active) - - datestr = u"This date [2011-08-30 Tue] is embedded" - self.assertTrue(isinstance(get_orgdate(datestr), OrgDate)) - - def test_get_orgdatetime_parsing_passive(self): - u""" - get_orgdate should recognize all orgdatetimes in a given text - """ - result = get_orgdate(u"[2011-09-12 Mon 10:20]") - self.assertNotEqual(result, None) - self.assertTrue(isinstance(result, OrgDateTime)) - self.assertEqual(result.year, 2011) - self.assertEqual(result.month, 9) - self.assertEqual(result.day, 12) - self.assertEqual(result.hour, 10) - self.assertEqual(result.minute, 20) - self.assertFalse(result.active) - - result = get_orgdate(u"some datetime [2011-09-12 Mon 10:20] stuff") - self.assertTrue(isinstance(result, OrgDateTime)) - - def test_get_orgdate_parsing_with_list_of_texts(self): - u""" - get_orgdate should return the first date in the list. - """ - datelist = [u"<2011-08-29 Mon>"] - result = get_orgdate(datelist) - self.assertNotEquals(result, None) - self.assertTrue(isinstance(result, OrgDate)) - self.assertEqual(result.year, 2011) - self.assertEqual(result.month, 8) - self.assertEqual(result.day, 29) - - datelist = [u"<2011-08-29 Mon>", - u"<2012-03-30 Fri>"] - result = get_orgdate(datelist) - self.assertNotEquals(result, None) - self.assertTrue(isinstance(result, OrgDate)) - self.assertEqual(result.year, 2011) - self.assertEqual(result.month, 8) - self.assertEqual(result.day, 29) - - datelist = [u"some <2011-08-29 Mon>text", - u"<2012-03-30 Fri> is here"] - result = get_orgdate(datelist) - self.assertNotEquals(result, None) - self.assertTrue(isinstance(result, OrgDate)) - self.assertEqual(result.year, 2011) - self.assertEqual(result.month, 8) - self.assertEqual(result.day, 29) - - datelist = [u"here is no date", - u"some <2011-08-29 Mon>text", - u"<2012-03-30 Fri> is here"] - result = get_orgdate(datelist) - self.assertNotEquals(result, None) - self.assertTrue(isinstance(result, OrgDate)) - self.assertEqual(result.year, 2011) - self.assertEqual(result.month, 8) - self.assertEqual(result.day, 29) - - datelist = [u"here is no date", - u"some <2011-08-29 Mon 20:10> text", - u"<2012-03-30 Fri> is here"] - result = get_orgdate(datelist) - self.assertNotEquals(result, None) - self.assertTrue(isinstance(result, OrgDateTime)) - self.assertEqual(result.year, 2011) - self.assertEqual(result.month, 8) - self.assertEqual(result.day, 29) - self.assertEqual(result.hour, 20) - self.assertEqual(result.minute, 10) - - def test_get_orgdate_parsing_with_invalid_input(self): - self.assertEquals(get_orgdate(u"NONSENSE"), None) - self.assertEquals(get_orgdate(u"No D<2011- Date 08-29 Mon>"), None) - self.assertEquals(get_orgdate(u"2011-08-r9 Mon]"), None) - self.assertEquals(get_orgdate(u"<2011-08-29 Mon"), None) - self.assertEquals(get_orgdate(u"<2011-08-29 Mon]"), None) - self.assertEquals(get_orgdate(u"2011-08-29 Mon"), None) - self.assertEquals(get_orgdate(u"2011-08-29"), None) - self.assertEquals(get_orgdate(u"2011-08-29 mon"), None) - self.assertEquals(get_orgdate(u"<2011-08-29 mon>"), None) - - self.assertEquals(get_orgdate(u"wrong date embedded <2011-08-29 mon>"), None) - self.assertEquals(get_orgdate(u"wrong date <2011-08-29 mon>embedded "), None) - - def test_get_orgdate_parsing_with_invalid_dates(self): - u""" - Something like <2011-14-29 Mon> (invalid dates, they don't exist) - should not be parsed - """ - datestr = u"<2011-14-30 Tue>" - self.assertEqual(get_orgdate(datestr), None) - - datestr = u"<2012-03-40 Tue>" - self.assertEqual(get_orgdate(datestr), None) - - datestr = u"<2012-03-40 Tue 24:70>" - self.assertEqual(get_orgdate(datestr), None) - - def test_get_orgdate_parsing_with_utf8(self): - u""" - get_orgdate should recognize all orgdates within a given utf-8 text - """ - result = get_orgdate(u'<2016-05-07 Sáb>') - self.assertNotEqual(result, None) - self.assertTrue(isinstance(result, OrgDate)) - self.assertEqual(result.year, 2016) - self.assertEqual(result.month, 5) - self.assertEqual(result.day, 7) - self.assertTrue(result.active) - - datestr = u"This date <2016-05-07 Sáb> is embedded" - self.assertTrue(isinstance(get_orgdate(datestr), OrgDate)) - - result = get_orgdate(u'[2016-05-07 Sáb]') - self.assertFalse(result.active) - - datestr = u"This date [2016-05-07 Sáb] is embedded" - self.assertTrue(isinstance(get_orgdate(datestr), OrgDate)) - - def test_get_orgdatetime_parsing_with_utf8(self): - u""" - get_orgdate should recognize all orgdatetimes in a given utf-8 text - """ - result = get_orgdate(u"<2016-05-07 Sáb 10:20>") - self.assertNotEqual(result, None) - self.assertTrue(isinstance(result, OrgDateTime)) - self.assertEqual(result.year, 2016) - self.assertEqual(result.month, 5) - self.assertEqual(result.day, 7) - self.assertEqual(result.hour, 10) - self.assertEqual(result.minute, 20) - self.assertTrue(result.active) - - result = get_orgdate(u"some datetime <2016-05-07 Sáb 10:20> stuff") - self.assertTrue(isinstance(result, OrgDateTime)) - - result = get_orgdate(u"[2016-05-07 Sáb 10:20]") - self.assertFalse(result.active) - - result = get_orgdate(u"some datetime [2016-05-07 Sáb 10:20] stuff") - self.assertTrue(isinstance(result, OrgDateTime)) - - - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(OrgDateParsingTestCase) - -# vim: noexpandtab diff --git a/pack/acp/start/vim-orgmode/tests/test_liborgdate_utf8.py b/pack/acp/start/vim-orgmode/tests/test_liborgdate_utf8.py deleted file mode 100644 index 079d788..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_liborgdate_utf8.py +++ /dev/null @@ -1,52 +0,0 @@ -# -*- coding: utf-8 -*- - -import sys -import unittest -import locale -import threading - -from datetime import date -from contextlib import contextmanager - -from orgmode.py3compat.unicode_compatibility import * - -sys.path.append(u'../ftplugin') -from orgmode.liborgmode.orgdate import OrgDate - -class OrgDateUtf8TestCase(unittest.TestCase): - u""" - Tests OrgDate with utf-8 enabled locales - """ - LOCALE_LOCK = threading.Lock() - UTF8_LOCALE = "pt_BR.utf-8" - - @contextmanager - def setlocale(self, name): - with self.LOCALE_LOCK: - saved = locale.setlocale(locale.LC_ALL) - try: - yield locale.setlocale(locale.LC_ALL, name) - finally: - locale.setlocale(locale.LC_ALL, saved) - - def setUp(self): - self.year = 2016 - self.month = 5 - self.day = 7 - self.text = u'<2016-05-07 Sáb>' - self.textinactive = u'[2016-05-07 Sáb]' - - def test_OrdDate_str_unicode_active(self): - with self.setlocale(self.UTF8_LOCALE): - od = OrgDate(True, self.year, self.month, self.day) - self.assertEqual(self.text, unicode(od)) - - def test_OrdDate_str_unicode_inactive(self): - with self.setlocale(self.UTF8_LOCALE): - od = OrgDate(False, self.year, self.month, self.day) - self.assertEqual(self.textinactive, unicode(od)) - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(OrgDateUtf8TestCase) - -# vi: noexpandtab diff --git a/pack/acp/start/vim-orgmode/tests/test_liborgdatetime.py b/pack/acp/start/vim-orgmode/tests/test_liborgdatetime.py deleted file mode 100644 index 315dfe0..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_liborgdatetime.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- - -import sys -import unittest -from datetime import datetime - -sys.path.append(u'../ftplugin') -from orgmode.liborgmode.orgdate import OrgDateTime - -from orgmode.py3compat.unicode_compatibility import * - -class OrgDateTimeTestCase(unittest.TestCase): - u""" - Tests all the functionality of the OrgDateTime - """ - - def test_OrgDateTime_ctor_active(self): - u"""OrdDateTime should be created.""" - today = datetime.today() - odt = OrgDateTime(True, today.year, today.month, today.day, today.hour, - today.minute) - self.assertTrue(isinstance(odt, OrgDateTime)) - self.assertTrue(odt.active) - - def test_OrgDateTime_ctor_inactive(self): - u"""OrdDateTime should be created.""" - today = datetime.today() - odt = OrgDateTime(False, today.year, today.month, today.day, today.hour, - today.minute) - self.assertTrue(isinstance(odt, OrgDateTime)) - self.assertFalse(odt.active) - - def test_OrdDateTime_str_active(self): - u"""Representation of OrgDateTime""" - t = 2011, 9, 8, 10, 20 - odt = OrgDateTime(False, t[0], t[1], t[2], t[3], t[4]) - self.assertEqual(u"[2011-09-08 Thu 10:20]", unicode(odt)) - - def test_OrdDateTime_str_inactive(self): - u"""Representation of OrgDateTime""" - t = 2011, 9, 8, 10, 20 - odt = OrgDateTime(True, t[0], t[1], t[2], t[3], t[4]) - self.assertEqual(u"<2011-09-08 Thu 10:20>", unicode(odt)) - - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(OrgDateTimeTestCase) - - -# vim: noexpandtab diff --git a/pack/acp/start/vim-orgmode/tests/test_liborgtimerange.py b/pack/acp/start/vim-orgmode/tests/test_liborgtimerange.py deleted file mode 100644 index 5439c82..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_liborgtimerange.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding: utf-8 -*- - - -import sys -import unittest -from datetime import date -from datetime import datetime - -sys.path.append(u'../ftplugin') -from orgmode.liborgmode.orgdate import OrgTimeRange - - -class OrgTimeRangeTestCase(unittest.TestCase): - - def setUp(self): - self.date = date(2011, 8, 29) - self.year = 2011 - self.month = 8 - self.day = 29 - self.text = '<2011-08-29 Mon>' - self.textinactive = '[2011-08-29 Mon]' - - def test_OrgTimeRange_ctor_active(self): - u""" - timerange should be created. - """ - start = date(2011, 9 , 12) - end = date(2011, 9 , 13) - timerange = OrgTimeRange(True, start, end) - self.assertTrue(isinstance(timerange, OrgTimeRange)) - self.assertTrue(timerange.active) - - def test_OrgTimeRange_ctor_inactive(self): - u""" - timerange should be created. - """ - start = date(2011, 9 , 12) - end = date(2011, 9 , 13) - timerange = OrgTimeRange(False, start, end) - self.assertTrue(isinstance(timerange, OrgTimeRange)) - self.assertFalse(timerange.active) - - def test_OrdDate_str_active(self): - u"""Representation of OrgDates""" - start = date(2011, 9 , 12) - end = date(2011, 9 , 13) - timerange = OrgTimeRange(True, start, end) - expected = "<2011-09-12 Mon>--<2011-09-13 Tue>" - self.assertEqual(str(timerange), expected) - - start = datetime(2011, 9 , 12, 20, 00) - end = datetime(2011, 9 , 13, 21, 59) - timerange = OrgTimeRange(True, start, end) - expected = "<2011-09-12 Mon 20:00>--<2011-09-13 Tue 21:59>" - self.assertEqual(str(timerange), expected) - - start = datetime(2011, 9 , 12, 20, 00) - end = datetime(2011, 9 , 12, 21, 00) - timerange = OrgTimeRange(True, start, end) - expected = "<2011-09-12 Mon 20:00-21:00>" - self.assertEqual(str(timerange), expected) - - def test_OrdDate_str_inactive(self): - u"""Representation of OrgDates""" - start = date(2011, 9 , 12) - end = date(2011, 9 , 13) - timerange = OrgTimeRange(False, start, end) - expected = "[2011-09-12 Mon]--[2011-09-13 Tue]" - self.assertEqual(str(timerange), expected) - - start = datetime(2011, 9 , 12, 20, 00) - end = datetime(2011, 9 , 13, 21, 59) - timerange = OrgTimeRange(False, start, end) - expected = "[2011-09-12 Mon 20:00]--[2011-09-13 Tue 21:59]" - self.assertEqual(str(timerange), expected) - - start = datetime(2011, 9 , 12, 20, 00) - end = datetime(2011, 9 , 12, 21, 00) - timerange = OrgTimeRange(False, start, end) - expected = "[2011-09-12 Mon 20:00-21:00]" - self.assertEqual(str(timerange), expected) - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(OrgTimeRangeTestCase) - -# vim: noexpandtab diff --git a/pack/acp/start/vim-orgmode/tests/test_plugin_date.py b/pack/acp/start/vim-orgmode/tests/test_plugin_date.py deleted file mode 100644 index 86b1838..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_plugin_date.py +++ /dev/null @@ -1,174 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import print_function - -import unittest -import sys -sys.path.append(u'../ftplugin') - -from datetime import date -from datetime import datetime - -from orgmode.plugins.Date import Date - - -class DateTestCase(unittest.TestCase): - u"""Tests all the functionality of the Date plugin. - - Also see: - http://orgmode.org/manual/The-date_002ftime-prompt.html#The-date_002ftime-prompt - """ - - def setUp(self): - self.d = date(2011, 5, 22) - - def test_modify_time_with_None(self): - # no modification should happen - res = Date._modify_time(self.d, None) - self.assertEquals(self.d, res) - - def test_modify_time_with_dot(self): - # no modification should happen - res = Date._modify_time(self.d, u'.') - self.assertEquals(self.d, res) - - def test_modify_time_with_given_relative_days(self): - # modifier and expected result - test_data = [(u'+0d', self.d), - (u'+1d', date(2011, 5, 23)), - (u'+2d', date(2011, 5, 24)), - (u'+7d', date(2011, 5, 29)), - (u'+9d', date(2011, 5, 31)), - (u'+10d', date(2011, 6, 1)), - (u'7d', self.d)] # wrong format: plus is missing - - for modifier, expected in test_data: - self.assertEquals(expected, Date._modify_time(self.d, modifier)) - - def test_modify_time_with_given_relative_days_without_d(self): - # modifier and expected result - test_data = [(u'+0', self.d), - (u'+1', date(2011, 5, 23)), - (u'+2', date(2011, 5, 24)), - (u'+7', date(2011, 5, 29)), - (u'+9', date(2011, 5, 31)), - (u'+10', date(2011, 6, 1))] - - for modifier, expected in test_data: - result = Date._modify_time(self.d, modifier) - self.assertEquals(expected, result) - - def test_modify_time_with_given_relative_weeks(self): - # modifier and expected result - test_data = [(u'+1w', date(2011, 5, 29)), - (u'+2w', date(2011, 6, 5)), - (u'+3w', date(2011, 6, 12)), - (u'+3w', date(2011, 6, 12)), - (u'+0w', self.d), - (u'3w', self.d), # wrong format - (u'+w', self.d)] # wrong format - - for modifier, expected in test_data: - self.assertEquals(expected, Date._modify_time(self.d, modifier)) - - def test_modify_time_with_given_relative_months(self): - test_data = [(u'+0m', self.d), - (u'+1m', date(2011, 6, 22)), - (u'+2m', date(2011, 7, 22))] - - for modifier, expected in test_data: - self.assertEquals(expected, Date._modify_time(self.d, modifier)) - - def test_modify_time_with_given_relative_years(self): - test_data = [(u'+1y', date(2012, 5, 22)), - (u'+10y', date(2021, 5, 22)), - (u'+0y', self.d)] - - for modifier, expected in test_data: - self.assertEquals(expected, Date._modify_time(self.d, modifier)) - - - def test_modify_time_with_given_weekday(self): - # use custom day instead of self.d to ease testing - cust_day = date(2011, 5, 25) # it's a Wednesday - #print(cust_day.weekday()) # 2 - test_data = [(u'Thu', date(2011, 5, 26)), - (u'thu', date(2011, 5, 26)), - (u'tHU', date(2011, 5, 26)), - (u'THU', date(2011, 5, 26)), - (u'Fri', date(2011, 5, 27)), - (u'sat', date(2011, 5, 28)), - (u'sun', date(2011, 5, 29)), - (u'mon', date(2011, 5, 30)), - (u'tue', date(2011, 5, 31)), - (u'wed', date(2011, 6, 1))] - - for modifier, expected in test_data: - self.assertEquals(expected, Date._modify_time(cust_day, modifier)) - - def test_modify_time_with_month_and_day(self): - cust_date = date(2006, 6, 13) - test_data = [(u'sep 15', date(2006, 9, 15)), - (u'Sep 15', date(2006, 9, 15)), - (u'SEP 15', date(2006, 9, 15)), - (u'feb 15', date(2007, 2, 15)), - (u'jan 1', date(2007, 1, 1)), - (u'7/5', date(2006, 7, 5)), - (u'2/5', date(2007, 2, 5)),] - - for modifier, expected in test_data: - self.assertEquals(expected, Date._modify_time(cust_date, modifier)) - - def test_modify_time_with_time(self): - cust_date = date(2006, 6, 13) - test_data = [(u'12:45', datetime(2006, 6, 13, 12, 45)), - (u'1:45', datetime(2006, 6, 13, 1, 45)), - (u'1:05', datetime(2006, 6, 13, 1, 5)),] - - for modifier, expected in test_data: - res = Date._modify_time(cust_date, modifier) - self.assertTrue(isinstance(res, datetime)) - self.assertEquals(expected, res) - - def test_modify_time_with_full_dates(self): - result = Date._modify_time(self.d, u'2011-01-12') - expected = date(2011, 1, 12) - self.assertEquals(expected, result) - - reults = Date._modify_time(self.d, u'2015-03-12') - expected = date(2015, 3, 12) - self.assertEquals(expected, reults) - - cust_date = date(2006, 6, 13) - test_data = [(u'3-2-5', date(2003, 2, 5)), - (u'12-2-28', date(2012, 2, 28)), - (u'2/5/3', date(2003, 2, 5)), - (u'sep 12 9', date(2009, 9, 12)), - (u'jan 2 99', date(2099, 1, 2)),] - - for modifier, expected in test_data: - self.assertEquals(expected, Date._modify_time(cust_date, modifier)) - - def test_modify_time_with_only_days(self): - cust_date = date(2006, 6, 13) - test_data = [(u'14', date(2006, 6, 14)), - (u'12', date(2006, 7, 12)), - (u'1', date(2006, 7, 1)), - (u'29', date(2006, 6, 29)),] - for modifier, expected in test_data: - self.assertEquals(expected, Date._modify_time(cust_date, modifier)) - - def test_modify_time_with_day_and_time(self): - cust_date = date(2006, 6, 13) - test_data = [(u'+1 10:20', datetime(2006, 6, 14, 10, 20)), - (u'+1w 10:20', datetime(2006, 6, 20, 10, 20)), - (u'+2 10:30', datetime(2006, 6, 15, 10, 30)), - (u'+2d 10:30', datetime(2006, 6, 15, 10, 30))] - for modifier, expected in test_data: - result = Date._modify_time(cust_date, modifier) - self.assertEquals(expected, result) - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(DateTestCase) - -# vi: noexpandtab diff --git a/pack/acp/start/vim-orgmode/tests/test_plugin_edit_checkbox.py b/pack/acp/start/vim-orgmode/tests/test_plugin_edit_checkbox.py deleted file mode 100644 index 1c94a98..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_plugin_edit_checkbox.py +++ /dev/null @@ -1,241 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest -import sys -sys.path.append(u'../ftplugin') - -import vim - -from orgmode._vim import ORGMODE - -from orgmode.py3compat.encode_compatibility import * - -PLUGIN_NAME = u'EditCheckbox' - -bufnr = 10 - -def set_vim_buffer(buf=None, cursor=(2, 0), bufnr=0): - if buf is None: - buf = [] - vim.current.buffer[:] = buf - vim.current.window.cursor = cursor - vim.current.buffer.number = bufnr - - -counter = 0 -class EditCheckboxTestCase(unittest.TestCase): - def setUp(self): - if PLUGIN_NAME not in ORGMODE.plugins: - ORGMODE.register_plugin(PLUGIN_NAME) - self.editcheckbox = ORGMODE.plugins[PLUGIN_NAME] - vim.EVALRESULTS = { - # no org_todo_keywords for b - u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'), - # global values for org_todo_keywords - u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'), - u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')], - u_encode(u'exists("g:org_improve_split_heading")'): u_encode(u'0'), - u_encode(u'exists("b:org_improve_split_heading")'): u_encode(u'0'), - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("b:org_debug")'): u_encode(u'0'), - u_encode(u'exists("*repeat#set()")'): u_encode(u'0'), - u_encode(u'b:changedtick'): u_encode(u'%d' % counter), - u_encode(u'&ts'): u_encode(u'8'), - u_encode(u'exists("g:org_tag_column")'): u_encode(u'0'), - u_encode(u'exists("b:org_tag_column")'): u_encode(u'0'), - u_encode(u"v:count"): u_encode(u'0'), - # jump to insert mode after adding heading/checkbox - u_encode(u'exists("g:org_prefer_insert_mode")'): u_encode(u'0'), - u_encode(u'exists("b:org_prefer_insert_mode")'): u_encode(u'0')} - - self.c1 = u""" -* heading1 [%] - - [ ] checkbox1 [/] - - [ ] checkbox2 - - [ ] checkbox3 - - [ ] checkbox4 - - [ ] checkbox5 - - [ ] checkbox6 - - [ ] checkbox7 - - [ ] checkbox8 -""".split(u'\n') - - self.c2 = u""" -* a checkbox list [%] - - checkbox [0%] - - [ ] test1 - - [ ] test2 - - [ ] test3 -""".split(u'\n') - - self.c3 = u""" -* heading - 1. [ ] another main task [%] - - [ ] sub task 1 - - [ ] sub task 2 - 2. [ ] another main task -""".split(u'\n') - - self.c4 = u""" -* heading -""".split(u'\n') - - self.c5 = u""" -* heading1 - 1. item - 9. item - }. item - a. item - z. item - A. item - Z. item - aa. item -""".split("\n") - - def test_toggle(self): - global bufnr - bufnr += 1 - # test on self.c1 - set_vim_buffer(buf=self.c1, cursor=(6, 0), bufnr=bufnr) - # update_checkboxes_status - self.editcheckbox.update_checkboxes_status() - self.assertEqual(vim.current.buffer[1], u"* heading1 [0%]") - # toggle - self.editcheckbox.toggle() - self.assertEqual(vim.current.buffer[5], u" - [X] checkbox4") - - bufnr += 1 - set_vim_buffer(buf=self.c1, cursor=(9, 0), bufnr=bufnr) - # toggle and check checkbox status - self.editcheckbox.toggle() - self.assertEqual(vim.current.buffer[8], u" - [X] checkbox7") - self.assertEqual(vim.current.buffer[7], u" - [-] checkbox6") - self.assertEqual(vim.current.buffer[6], u" - [-] checkbox5") - - # new_checkbox - bufnr += 1 - set_vim_buffer(buf=self.c1, cursor=(9, 0), bufnr=bufnr) - vim.current.window.cursor = (9, 0) - self.assertEqual(vim.current.buffer[9], u' - [ ] checkbox8') - self.editcheckbox.new_checkbox(below=True) - # vim's buffer behave just opposite to Python's list when inserting a - # new item. The new entry is appended in vim put prepended in Python! - self.assertEqual(vim.current.buffer[10], u' - [ ] checkbox8') - self.assertEqual(vim.current.buffer[9], u' - [ ] ') - self.editcheckbox.update_checkboxes_status() - - def test_no_status_checkbox(self): - global bufnr - bufnr += 1 - # test on self.c2 - set_vim_buffer(buf=self.c2, bufnr=bufnr) - self.assertEqual(vim.current.buffer[2], u" - checkbox [0%]") - # toggle - vim.current.window.cursor = (4, 0) - self.editcheckbox.toggle() - self.assertEqual(vim.current.buffer[3], u" - [X] test1") - - # self.editcheckbox.update_checkboxes_status() - # see if the no status checkbox update its status - self.assertEqual(vim.current.buffer[2], u" - checkbox [33%]") - - def test_number_list(self): - global bufnr - bufnr += 1 - set_vim_buffer(buf=self.c3, bufnr=bufnr) - vim.current.window.cursor = (6, 0) - self.editcheckbox.toggle() - self.assertEqual(vim.current.buffer[5], u" 2. [X] another main task") - - def test_new_checkbox(self): - global bufnr - bufnr += 1 - set_vim_buffer(buf=self.c4, bufnr=bufnr) - vim.current.window.cursor = (2, 1) - self.editcheckbox.new_checkbox(below=True) - self.assertEqual(vim.current.buffer[2], u" - [ ] ") - - def test_item_decrement(self): - global bufnr - bufnr += 1 - set_vim_buffer(buf=self.c5, bufnr=bufnr) - - vim.current.window.cursor = (3, 1) - self.editcheckbox.new_checkbox(below=False, plain=True) - self.assertEqual(vim.current.buffer[2], u" 0. ") - self.assertEqual(vim.current.buffer[3], u" 1. item") - - vim.current.window.cursor = (3, 1) - self.editcheckbox.new_checkbox(below=False, plain=True) - self.assertEqual(vim.current.buffer[1], u"* heading1") - self.assertEqual(vim.current.buffer[2], u" 0. ") - self.assertEqual(vim.current.buffer[3], u" 1. item") - - vim.current.window.cursor = (5, 1) - self.editcheckbox.new_checkbox(below=False, plain=True) - self.assertEqual(vim.current.buffer[4], u" 8. ") - self.assertEqual(vim.current.buffer[5], u" 9. item") - - vim.current.window.cursor = (8, 1) - self.editcheckbox.new_checkbox(below=False, plain=True) - # no further decrement than a - self.assertEqual(vim.current.buffer[6], u" }. item") - self.assertEqual(vim.current.buffer[7], u" a. item") - self.assertEqual(vim.current.buffer[8], u" z. item") - - def test_item_decrementA(self): - global bufnr - bufnr += 1 - set_vim_buffer(buf=self.c5, bufnr=bufnr) - vim.current.window.cursor = (8, 1) - self.editcheckbox.new_checkbox(below=False, plain=True) - # decrement from A to z - self.assertEqual(vim.current.buffer[7], u" z. ") - self.assertEqual(vim.current.buffer[8], u" A. item") - - def test_item_increment(self): - global bufnr - bufnr += 1 - set_vim_buffer(buf=self.c5, bufnr=bufnr) - - vim.current.window.cursor = (3, 1) - self.editcheckbox.new_checkbox(below=True, plain=True) - self.assertEqual(vim.current.buffer[2], u" 1. item") - self.assertEqual(vim.current.buffer[3], u" 2. ") - - vim.current.window.cursor = (5, 1) - self.editcheckbox.new_checkbox(below=True, plain=True) - self.assertEqual(vim.current.buffer[4], u" 9. item") - self.assertEqual(vim.current.buffer[5], u" }. item") - self.assertEqual(vim.current.buffer[6], u" 10. ") - - def test_item_incrementz(self): - global bufnr - bufnr += 1 - set_vim_buffer(buf=self.c5, bufnr=bufnr) - - vim.current.window.cursor = (6, 1) - self.editcheckbox.new_checkbox(below=True, plain=True) - self.assertEqual(vim.current.buffer[5], u" a. item") - self.assertEqual(vim.current.buffer[6], u" b. ") - - vim.current.window.cursor = (8, 1) - self.editcheckbox.new_checkbox(below=True, plain=True) - self.assertEqual(vim.current.buffer[7], u" z. item") - self.assertEqual(vim.current.buffer[8], u" A. ") - - vim.current.window.cursor = (11, 1) - self.editcheckbox.new_checkbox(below=True, plain=True) - self.assertEqual(vim.current.buffer[10], u" Z. item") - self.assertEqual(vim.current.buffer[11], u" aa. item") - self.assertEqual(vim.current.buffer[12], u"") - - vim.current.window.cursor = (12, 1) - self.editcheckbox.new_checkbox(below=True, plain=True) - self.assertEqual(vim.current.buffer[11], u" aa. item") - self.assertEqual(vim.current.buffer[12], u"") - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(EditCheckboxTestCase) - -# vim: set noexpandtab diff --git a/pack/acp/start/vim-orgmode/tests/test_plugin_edit_structure.py b/pack/acp/start/vim-orgmode/tests/test_plugin_edit_structure.py deleted file mode 100644 index 64a9338..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_plugin_edit_structure.py +++ /dev/null @@ -1,387 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest -import sys -sys.path.append(u'../ftplugin') - -import vim - -from orgmode._vim import ORGMODE - -from orgmode.py3compat.encode_compatibility import * - -counter = 0 -class EditStructureTestCase(unittest.TestCase): - def setUp(self): - global counter - counter += 1 - vim.CMDHISTORY = [] - vim.CMDRESULTS = {} - vim.EVALHISTORY = [] - vim.EVALRESULTS = { - # no org_todo_keywords for b - u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'), - # global values for org_todo_keywords - u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'), - u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')], - u_encode(u'exists("g:org_improve_split_heading")'): u_encode(u'0'), - u_encode(u'exists("b:org_improve_split_heading")'): u_encode(u'0'), - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("b:org_debug")'): u_encode(u'0'), - u_encode(u'exists("*repeat#set()")'): u_encode(u'0'), - u_encode(u'b:changedtick'): u_encode(u'%d' % counter), - u_encode(u'&ts'): u_encode(u'8'), - u_encode(u'exists("g:org_tag_column")'): u_encode(u'0'), - u_encode(u'exists("b:org_tag_column")'): u_encode(u'0'), - u_encode(u"v:count"): u_encode(u'0'), - # jump to insert mode after adding heading/checkbox - u_encode(u'exists("g:org_prefer_insert_mode")'): u_encode(u'0'), - u_encode(u'exists("b:org_prefer_insert_mode")'): u_encode(u'0')} - if not u'EditStructure' in ORGMODE.plugins: - ORGMODE.register_plugin(u'EditStructure') - self.editstructure = ORGMODE.plugins[u'EditStructure'] - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* Überschrift 1 -Text 1 - -Bla bla -** Überschrift 1.1 -Text 2 - -Bla Bla bla -** Überschrift 1.2 -Text 3 - -**** Überschrift 1.2.1.falsch - -Bla Bla bla bla -*** Überschrift 1.2.1 -* Überschrift 2 -* Überschrift 3 - asdf sdf -""".split(u'\n')] - - def test_new_heading_below_normal_behavior(self): - vim.current.window.cursor = (1, 0) - self.assertNotEqual(self.editstructure.new_heading(below=True), None) - self.assertEqual(vim.current.buffer[0], u_encode(u'* ')) - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1')) - - def test_new_heading_above_normal_behavior(self): - vim.current.window.cursor = (1, 1) - self.assertNotEqual(self.editstructure.new_heading(below=False), None) - self.assertEqual(vim.current.buffer[0], u_encode(u'* ')) - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1')) - - def test_new_heading_below(self): - vim.current.window.cursor = (2, 0) - vim.current.buffer[5] = u_encode(u'** Überschrift 1.1 :Tag:') - self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=False), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 6gg"|startinsert!')) - self.assertEqual(vim.current.buffer[4], u_encode(u'Bla bla')) - self.assertEqual(vim.current.buffer[5], u_encode(u'* ')) - self.assertEqual(vim.current.buffer[6], u_encode(u'** Überschrift 1.1 :Tag:')) - self.assertEqual(vim.current.buffer[10], u_encode(u'** Überschrift 1.2')) - self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1')) - self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2')) - - def test_new_heading_below_insert_mode(self): - vim.current.window.cursor = (2, 1) - self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 3gg"|startinsert!')) - self.assertEqual(vim.current.buffer[2], u_encode(u'* Überschrift 1')) - self.assertEqual(vim.current.buffer[5], u_encode(u'Bla bla')) - self.assertEqual(vim.current.buffer[6], u_encode(u'** Überschrift 1.1')) - self.assertEqual(vim.current.buffer[10], u_encode(u'** Überschrift 1.2')) - self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1')) - self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2')) - - def test_new_heading_below_split_text_at_the_end(self): - vim.current.buffer[1] = u_encode(u'* Überschriftx1') - vim.current.window.cursor = (2, 14) - self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 3gg"|startinsert!')) - self.assertEqual(vim.current.buffer[2], u_encode(u'* ')) - self.assertEqual(vim.current.buffer[5], u_encode(u'Bla bla')) - self.assertEqual(vim.current.buffer[6], u_encode(u'** Überschrift 1.1')) - self.assertEqual(vim.current.buffer[10], u_encode(u'** Überschrift 1.2')) - self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1')) - self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2')) - - def test_new_heading_below_split_text_at_the_end_insert_parts(self): - vim.current.window.cursor = (2, 14) - self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 3gg"|startinsert!')) - self.assertEqual(vim.current.buffer[2], u_encode(u'* 1')) - self.assertEqual(vim.current.buffer[5], u_encode(u'Bla bla')) - self.assertEqual(vim.current.buffer[6], u_encode(u'** Überschrift 1.1')) - self.assertEqual(vim.current.buffer[10], u_encode(u'** Überschrift 1.2')) - self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1')) - self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2')) - - def test_new_heading_below_in_the_middle(self): - vim.current.window.cursor = (10, 0) - self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 13gg"|startinsert!')) - self.assertEqual(vim.current.buffer[11], u_encode(u'')) - self.assertEqual(vim.current.buffer[12], u_encode(u'** ')) - self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch')) - - def test_new_heading_below_in_the_middle2(self): - vim.current.window.cursor = (13, 0) - self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 16gg"|startinsert!')) - self.assertEqual(vim.current.buffer[14], u_encode(u'Bla Bla bla bla')) - self.assertEqual(vim.current.buffer[15], u_encode(u'**** ')) - self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1')) - - def test_new_heading_below_in_the_middle3(self): - vim.current.window.cursor = (16, 0) - self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 17gg"|startinsert!')) - self.assertEqual(vim.current.buffer[15], u_encode(u'*** Überschrift 1.2.1')) - self.assertEqual(vim.current.buffer[16], u_encode(u'*** ')) - self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2')) - - def test_new_heading_below_at_the_end(self): - vim.current.window.cursor = (18, 0) - self.assertNotEqual(self.editstructure.new_heading(below=True, insert_mode=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 21gg"|startinsert!')) - self.assertEqual(vim.current.buffer[19], u_encode(u'')) - self.assertEqual(vim.current.buffer[20], u_encode(u'* ')) - self.assertEqual(len(vim.current.buffer), 21) - - def test_new_heading_above(self): - vim.current.window.cursor = (2, 0) - self.assertNotEqual(self.editstructure.new_heading(below=False, insert_mode=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 2gg"|startinsert!')) - self.assertEqual(vim.current.buffer[0], u_encode(u'')) - self.assertEqual(vim.current.buffer[1], u_encode(u'* ')) - self.assertEqual(vim.current.buffer[2], u_encode(u'* Überschrift 1')) - - def test_new_heading_above_in_the_middle(self): - vim.current.window.cursor = (10, 0) - self.assertNotEqual(self.editstructure.new_heading(below=False, insert_mode=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 10gg"|startinsert!')) - self.assertEqual(vim.current.buffer[8], u_encode(u'Bla Bla bla')) - self.assertEqual(vim.current.buffer[9], u_encode(u'** ')) - self.assertEqual(vim.current.buffer[10], u_encode(u'** Überschrift 1.2')) - - def test_new_heading_above_in_the_middle2(self): - vim.current.window.cursor = (13, 0) - self.assertNotEqual(self.editstructure.new_heading(below=False, insert_mode=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 13gg"|startinsert!')) - self.assertEqual(vim.current.buffer[11], u_encode(u'')) - self.assertEqual(vim.current.buffer[12], u_encode(u'**** ')) - self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch')) - - def test_new_heading_above_in_the_middle3(self): - vim.current.window.cursor = (16, 0) - self.assertNotEqual(self.editstructure.new_heading(below=False, insert_mode=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 16gg"|startinsert!')) - self.assertEqual(vim.current.buffer[14], u_encode(u'Bla Bla bla bla')) - self.assertEqual(vim.current.buffer[15], u_encode(u'*** ')) - self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1')) - - def test_new_heading_above_at_the_end(self): - vim.current.window.cursor = (18, 0) - self.assertNotEqual(self.editstructure.new_heading(below=False, insert_mode=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 18gg"|startinsert!')) - self.assertEqual(vim.current.buffer[16], u_encode(u'* Überschrift 2')) - self.assertEqual(vim.current.buffer[17], u_encode(u'* ')) - self.assertEqual(vim.current.buffer[18], u_encode(u'* Überschrift 3')) - - def test_new_heading_below_split_heading_title(self): - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* Überschrift 1 :Tag: -Text 1 - -Bla bla -** Überschrift 1.1 -Text 2 - -Bla Bla bla -** Überschrift 1.2 -Text 3 - -**** Überschrift 1.2.1.falsch - -Bla Bla bla bla -*** Überschrift 1.2.1 -* Überschrift 2 -* Überschrift 3 - asdf sdf -""".split(u'\n')] - vim.current.window.cursor = (2, 6) - self.assertNotEqual(self.editstructure.new_heading(insert_mode=True), None) - self.assertEqual(vim.current.buffer[0], u_encode(u'')) - self.assertEqual(vim.current.buffer[1], u_encode(u'* Über :Tag:')) - self.assertEqual(vim.current.buffer[2], u_encode(u'* schrift 1')) - self.assertEqual(vim.current.buffer[3], u_encode(u'Text 1')) - - def test_new_heading_below_split_heading_title_with_todo(self): - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* TODO Überschrift 1 :Tag: -Text 1 - -Bla bla -** Überschrift 1.1 -Text 2 - -Bla Bla bla -** Überschrift 1.2 -Text 3 - -**** Überschrift 1.2.1.falsch - -Bla Bla bla bla -*** Überschrift 1.2.1 -* Überschrift 2 -* Überschrift 3 - asdf sdf -""".split(u'\n')] - vim.current.window.cursor = (2, 5) - self.assertNotEqual(self.editstructure.new_heading(insert_mode=True), None) - self.assertEqual(vim.current.buffer[0], u_encode(u'')) - self.assertEqual(vim.current.buffer[1], u_encode(u'* TODO :Tag:')) - self.assertEqual(vim.current.buffer[2], u_encode(u'* Überschrift 1')) - self.assertEqual(vim.current.buffer[3], u_encode(u'Text 1')) - - def test_demote_heading(self): - vim.current.window.cursor = (13, 0) - self.assertNotEqual(self.editstructure.demote_heading(), None) - self.assertEqual(vim.current.buffer[10], u_encode(u'Text 3')) - self.assertEqual(vim.current.buffer[11], u_encode(u'')) - self.assertEqual(vim.current.buffer[12], u_encode(u'***** Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[13], u_encode(u'')) - # actually the indentation comes through vim, just the heading is updated - self.assertEqual(vim.current.buffer[14], u_encode(u'Bla Bla bla bla')) - self.assertEqual(vim.current.buffer[15], u_encode(u'*** Überschrift 1.2.1')) - self.assertEqual(vim.current.window.cursor, (13, 1)) - - def test_demote_newly_created_level_one_heading(self): - vim.current.window.cursor = (2, 0) - self.assertNotEqual(self.editstructure.new_heading(below=True), None) - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1')) - self.assertEqual(vim.current.buffer[5], u_encode(u'* ')) - self.assertEqual(vim.current.buffer[6], u_encode(u'** Überschrift 1.1')) - self.assertEqual(vim.current.buffer[10], u_encode(u'** Überschrift 1.2')) - self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1')) - self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2')) - - vim.current.window.cursor = (6, 2) - self.assertNotEqual(self.editstructure.demote_heading(), None) - self.assertEqual(vim.current.buffer[5], u_encode(u'** ')) - self.assertEqual(vim.current.buffer[6], u_encode(u'*** Überschrift 1.1')) - self.assertEqual(vim.current.buffer[10], u_encode(u'*** Überschrift 1.2')) - self.assertEqual(vim.current.buffer[13], u_encode(u'***** Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[16], u_encode(u'**** Überschrift 1.2.1')) - self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2')) - - def test_demote_newly_created_level_two_heading(self): - vim.current.window.cursor = (10, 0) - self.assertNotEqual(self.editstructure.new_heading(below=True), None) - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1')) - self.assertEqual(vim.current.buffer[5], u_encode(u'** Überschrift 1.1')) - self.assertEqual(vim.current.buffer[9], u_encode(u'** Überschrift 1.2')) - self.assertEqual(vim.current.buffer[12], u_encode(u'** ')) - self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1')) - self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2')) - - vim.current.window.cursor = (13, 3) - self.assertNotEqual(self.editstructure.demote_heading(including_children=False, on_heading=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'exe "normal 13gg"|startinsert!')) - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1')) - self.assertEqual(vim.current.buffer[5], u_encode(u'** Überschrift 1.1')) - self.assertEqual(vim.current.buffer[9], u_encode(u'** Überschrift 1.2')) - self.assertEqual(vim.current.buffer[12], u_encode(u'*** ')) - self.assertEqual(vim.current.buffer[13], u_encode(u'**** Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[16], u_encode(u'*** Überschrift 1.2.1')) - self.assertEqual(vim.current.buffer[17], u_encode(u'* Überschrift 2')) - - def test_demote_last_heading(self): - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* Überschrift 2 -* Überschrift 3""".split('\n')] - vim.current.window.cursor = (3, 0) - h = ORGMODE.get_document().current_heading() - self.assertNotEqual(self.editstructure.demote_heading(), None) - self.assertEqual(h.end, 2) - self.assertFalse(vim.CMDHISTORY) - self.assertEqual(vim.current.buffer[2], u_encode(u'** Überschrift 3')) - self.assertEqual(vim.current.window.cursor, (3, 1)) - - def test_promote_heading(self): - vim.current.window.cursor = (13, 0) - self.assertNotEqual(self.editstructure.promote_heading(), None) - self.assertEqual(vim.current.buffer[10], u_encode(u'Text 3')) - self.assertEqual(vim.current.buffer[11], u_encode(u'')) - self.assertEqual(vim.current.buffer[12], u_encode(u'*** Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[13], u_encode(u'')) - # actually the indentation comes through vim, just the heading is updated - self.assertEqual(vim.current.buffer[14], u_encode(u'Bla Bla bla bla')) - self.assertEqual(vim.current.buffer[15], u_encode(u'*** Überschrift 1.2.1')) - self.assertEqual(vim.current.window.cursor, (13, -1)) - - def test_promote_level_one_heading(self): - vim.current.window.cursor = (2, 0) - self.assertEqual(self.editstructure.promote_heading(), None) - self.assertEqual(len(vim.CMDHISTORY), 0) - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_demote_parent_heading(self): - vim.current.window.cursor = (2, 0) - self.assertNotEqual(self.editstructure.demote_heading(), None) - self.assertEqual(vim.current.buffer[1], u_encode(u'** Überschrift 1')) - self.assertEqual(vim.current.buffer[5], u_encode(u'*** Überschrift 1.1')) - self.assertEqual(vim.current.buffer[9], u_encode(u'*** Überschrift 1.2')) - self.assertEqual(vim.current.buffer[12], u_encode(u'***** Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[15], u_encode(u'**** Überschrift 1.2.1')) - self.assertEqual(vim.current.buffer[16], u_encode(u'* Überschrift 2')) - self.assertEqual(vim.current.window.cursor, (2, 1)) - - def test_promote_parent_heading(self): - vim.current.window.cursor = (10, 0) - self.assertNotEqual(self.editstructure.promote_heading(), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal 10ggV16gg=')) - self.assertEqual(vim.current.buffer[5], u_encode(u'** Überschrift 1.1')) - self.assertEqual(vim.current.buffer[9], u_encode(u'* Überschrift 1.2')) - self.assertEqual(vim.current.buffer[12], u_encode(u'*** Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[15], u_encode(u'** Überschrift 1.2.1')) - self.assertEqual(vim.current.buffer[16], u_encode(u'* Überschrift 2')) - self.assertEqual(vim.current.window.cursor, (10, -1)) - - # run tests with count - def test_demote_parent_heading_count(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u"v:count"] = u_encode(u'3') - self.assertNotEqual(self.editstructure.demote_heading(), None) - self.assertEqual(vim.current.buffer[1], u_encode(u'**** Überschrift 1')) - self.assertEqual(vim.current.buffer[5], u_encode(u'***** Überschrift 1.1')) - self.assertEqual(vim.current.buffer[9], u_encode(u'***** Überschrift 1.2')) - self.assertEqual(vim.current.buffer[12], u_encode(u'******* Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[15], u_encode(u'****** Überschrift 1.2.1')) - self.assertEqual(vim.current.buffer[16], u_encode(u'* Überschrift 2')) - self.assertEqual(vim.current.buffer[16], u_encode(u'* Überschrift 2')) - self.assertEqual(vim.current.window.cursor, (2, 3)) - - def test_promote_parent_heading(self): - vim.current.window.cursor = (13, 0) - vim.EVALRESULTS[u"v:count"] = u_encode(u'3') - self.assertNotEqual(self.editstructure.promote_heading(), None) - self.assertEqual(vim.current.buffer[5], u_encode(u'** Überschrift 1.1')) - self.assertEqual(vim.current.buffer[9], u_encode(u'** Überschrift 1.2')) - self.assertEqual(vim.current.buffer[12], u_encode(u'* Überschrift 1.2.1.falsch')) - self.assertEqual(vim.current.buffer[15], u_encode(u'** Überschrift 1.2.1')) - self.assertEqual(vim.current.buffer[16], u_encode(u'* Überschrift 2')) - self.assertEqual(vim.current.window.cursor, (13, -3)) - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(EditStructureTestCase) diff --git a/pack/acp/start/vim-orgmode/tests/test_plugin_mappings.py b/pack/acp/start/vim-orgmode/tests/test_plugin_mappings.py deleted file mode 100644 index fc16da4..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_plugin_mappings.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import print_function - -import sys -sys.path.append(u'../ftplugin') - -import unittest -import orgmode.settings -from orgmode.exceptions import PluginError -from orgmode._vim import ORGMODE -from orgmode.keybinding import MODE_ALL, Plug - -import vim - -from orgmode.py3compat.encode_compatibility import * - -ORG_PLUGINS = ['ShowHide', '|', 'Navigator', 'EditStructure', '|', 'Hyperlinks', '|', 'Todo', 'TagsProperties', 'Date', 'Agenda', 'Misc', '|', 'Export'] - - -class MappingTestCase(unittest.TestCase): - u"""Tests all plugins for overlapping mappings.""" - def test_non_overlapping_plug_mappings(self): - def find_overlapping_mappings(kb, all_keybindings): - found_overlapping_mapping = False - for tkb in all_keybindings: - if kb.mode == tkb.mode or MODE_ALL in (kb.mode, tkb.mode): - if isinstance(kb._action, Plug) and isinstance(tkb._action, Plug): - akb = kb.action - atkb = tkb.action - if (akb.startswith(atkb) or atkb.startswith(akb)) and akb != atkb: - print(u'\nERROR: Found overlapping mapping: %s (%s), %s (%s)' % (kb.key, akb, tkb.key, atkb)) - found_overlapping_mapping = True - - if all_keybindings: - res = find_overlapping_mappings(all_keybindings[0], all_keybindings[1:]) - if not found_overlapping_mapping: - return res - return found_overlapping_mapping - - if self.keybindings: - self.assertFalse(find_overlapping_mappings(self.keybindings[0], self.keybindings[1:])) - - def setUp(self): - self.keybindings = [] - - vim.EVALRESULTS = { - u'exists("g:org_debug")': 0, - u'exists("b:org_debug")': 0, - u'exists("*repeat#set()")': 0, - u'b:changedtick': 0, - u_encode(u'exists("b:org_plugins")'): 0, - u_encode(u'exists("g:org_plugins")'): 1, - u_encode(u'g:org_plugins'): ORG_PLUGINS, - } - for plugin in filter(lambda p: p != '|', ORG_PLUGINS): - try: - ORGMODE.register_plugin(plugin) - except PluginError: - pass - if plugin in ORGMODE._plugins: - self.keybindings.extend(ORGMODE._plugins[plugin].keybindings) - - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(MappingTestCase) - -# vi: noexpandtab diff --git a/pack/acp/start/vim-orgmode/tests/test_plugin_misc.py b/pack/acp/start/vim-orgmode/tests/test_plugin_misc.py deleted file mode 100644 index 53e5cb0..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_plugin_misc.py +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import unittest -import sys -sys.path.append(u'../ftplugin') - -import vim - -from orgmode._vim import indent_orgmode, fold_orgmode, ORGMODE - -from orgmode.py3compat.encode_compatibility import * - -ORGMODE.debug = True - -START = True -END = False - -counter = 0 -class MiscTestCase(unittest.TestCase): - def setUp(self): - global counter - counter += 1 - vim.CMDHISTORY = [] - vim.CMDRESULTS = {} - vim.EVALHISTORY = [] - vim.EVALRESULTS = { - # no org_todo_keywords for b - u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'), - # global values for org_todo_keywords - u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'), - u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')], - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("*repeat#set()")'): u_encode(u'0'), - u_encode(u"v:count"): u_encode(u'0'), - u_encode(u'b:changedtick'): u_encode(u'%d' % counter), - u_encode(u"v:lnum"): u_encode(u'0')} - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* Überschrift 1 -Text 1 - -Bla bla -** Überschrift 1.1 -Text 2 - -Bla Bla bla -** Überschrift 1.2 -Text 3 - -**** Überschrift 1.2.1.falsch - -Bla Bla bla bla -*** Überschrift 1.2.1 -* Überschrift 2 -* Überschrift 3 - asdf sdf -""".split(u'\n') ] - - def test_indent_noheading(self): - # test first heading - vim.current.window.cursor = (1, 0) - vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'1') - indent_orgmode() - self.assertEqual(len(vim.CMDHISTORY), 0) - - def test_indent_heading(self): - # test first heading - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'2') - indent_orgmode() - self.assertEqual(len(vim.CMDHISTORY), 0) - - def test_indent_heading_middle(self): - # test first heading - vim.current.window.cursor = (3, 0) - vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'3') - indent_orgmode() - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:indent_level = 2')) - - def test_indent_heading_middle2(self): - # test first heading - vim.current.window.cursor = (4, 0) - vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'4') - indent_orgmode() - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:indent_level = 2')) - - def test_indent_heading_end(self): - # test first heading - vim.current.window.cursor = (5, 0) - vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'5') - indent_orgmode() - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:indent_level = 2')) - - def test_fold_heading_start(self): - # test first heading - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'2') - fold_orgmode() - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = ">1"')) - - def test_fold_heading_middle(self): - # test first heading - vim.current.window.cursor = (3, 0) - vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'3') - fold_orgmode() - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = 1')) - - def test_fold_heading_end(self): - # test first heading - vim.current.window.cursor = (5, 0) - vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'5') - fold_orgmode() - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = 1')) - - def test_fold_heading_end_of_last_child(self): - # test first heading - vim.current.window.cursor = (16, 0) - vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'16') - fold_orgmode() - self.assertEqual(len(vim.CMDHISTORY), 1) - # which is also end of the parent heading <1 - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = ">3"')) - - def test_fold_heading_end_of_last_child_next_heading(self): - # test first heading - vim.current.window.cursor = (17, 0) - vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'17') - fold_orgmode() - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = ">1"')) - - def test_fold_middle_subheading(self): - # test first heading - vim.current.window.cursor = (13, 0) - vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'13') - fold_orgmode() - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = ">4"')) - - def test_fold_middle_subheading2(self): - # test first heading - vim.current.window.cursor = (14, 0) - vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'14') - fold_orgmode() - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = 4')) - - def test_fold_middle_subheading3(self): - # test first heading - vim.current.window.cursor = (15, 0) - vim.EVALRESULTS[u_encode(u'v:lnum')] = u_encode(u'15') - fold_orgmode() - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'let b:fold_expr = 4')) - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(MiscTestCase) diff --git a/pack/acp/start/vim-orgmode/tests/test_plugin_navigator.py b/pack/acp/start/vim-orgmode/tests/test_plugin_navigator.py deleted file mode 100644 index bb3bcca..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_plugin_navigator.py +++ /dev/null @@ -1,633 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest -import sys -sys.path.append(u'../ftplugin') - -import vim - -from orgmode._vim import ORGMODE - -from orgmode.py3compat.encode_compatibility import * - -START = True -END = False - -def set_visual_selection(visualmode, line_start, line_end, col_start=1, - col_end=1, cursor_pos=START): - - if visualmode not in (u'', u'V', u'v'): - raise ValueError(u'Illegal value for visualmode, must be in , V, v') - - vim.EVALRESULTS['visualmode()'] = visualmode - - # getpos results [bufnum, lnum, col, off] - vim.EVALRESULTS['getpos("\'<")'] = ('', '%d' % line_start, '%d' % - col_start, '') - vim.EVALRESULTS['getpos("\'>")'] = ('', '%d' % line_end, '%d' % - col_end, '') - if cursor_pos == START: - vim.current.window.cursor = (line_start, col_start) - else: - vim.current.window.cursor = (line_end, col_end) - - -counter = 0 -class NavigatorTestCase(unittest.TestCase): - def setUp(self): - global counter - counter += 1 - vim.CMDHISTORY = [] - vim.CMDRESULTS = {} - vim.EVALHISTORY = [] - vim.EVALRESULTS = { - # no org_todo_keywords for b - u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'), - # global values for org_todo_keywords - u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'), - u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')], - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("*repeat#set()")'): u_encode(u'0'), - u_encode(u'b:changedtick'): u_encode(u'%d' % counter), - u_encode(u"v:count"): u_encode(u'0'), - } - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* Überschrift 1 -Text 1 - -Bla bla -** Überschrift 1.1 -Text 2 - -Bla Bla bla -** Überschrift 1.2 -Text 3 - -**** Überschrift 1.2.1.falsch - -Bla Bla bla bla -*** Überschrift 1.2.1 -* Überschrift 2 -* Überschrift 3 - asdf sdf -""".split(u'\n') ] - - if not u'Navigator' in ORGMODE.plugins: - ORGMODE.register_plugin(u'Navigator') - self.navigator = ORGMODE.plugins[u'Navigator'] - - def test_movement(self): - # test movement outside any heading - vim.current.window.cursor = (1, 0) - self.navigator.previous(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (1, 0)) - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (2, 2)) - - def test_forward_movement(self): - # test forward movement - vim.current.window.cursor = (2, 0) - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (6, 3)) - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (10, 3)) - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (13, 5)) - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (16, 4)) - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (17, 2)) - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (18, 2)) - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (18, 2)) - - ## don't move cursor if last heading is already focussed - vim.current.window.cursor = (19, 6) - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (19, 6)) - - ## test movement with count - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'-1') - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (6, 3)) - - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'0') - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (6, 3)) - - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'1') - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (6, 3)) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'3') - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (16, 4)) - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (18, 2)) - self.navigator.next(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (18, 2)) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'0') - - def test_backward_movement(self): - # test backward movement - vim.current.window.cursor = (19, 6) - self.navigator.previous(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (18, 2)) - self.navigator.previous(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (17, 2)) - self.navigator.previous(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (16, 4)) - self.navigator.previous(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (13, 5)) - self.navigator.previous(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (10, 3)) - self.navigator.previous(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (6, 3)) - self.navigator.previous(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (2, 2)) - - ## test movement with count - vim.current.window.cursor = (19, 6) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'-1') - self.navigator.previous(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (18, 2)) - - vim.current.window.cursor = (19, 6) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'0') - self.navigator.previous(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (18, 2)) - - vim.current.window.cursor = (19, 6) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'3') - self.navigator.previous(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (16, 4)) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'4') - self.navigator.previous(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (2, 2)) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'4') - self.navigator.previous(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (2, 2)) - - def test_parent_movement(self): - # test movement to parent - vim.current.window.cursor = (2, 0) - self.assertEqual(self.navigator.parent(mode=u'normal'), None) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - vim.current.window.cursor = (3, 4) - self.navigator.parent(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (3, 4)) - - vim.current.window.cursor = (16, 4) - self.navigator.parent(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (10, 3)) - self.navigator.parent(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (2, 2)) - - vim.current.window.cursor = (15, 6) - self.navigator.parent(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (10, 3)) - self.navigator.parent(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (2, 2)) - - ## test movement with count - vim.current.window.cursor = (16, 4) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'-1') - self.navigator.parent(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (10, 3)) - - vim.current.window.cursor = (16, 4) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'0') - self.navigator.parent(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (10, 3)) - - vim.current.window.cursor = (16, 4) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'1') - self.navigator.parent(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (10, 3)) - - vim.current.window.cursor = (16, 4) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'2') - self.navigator.parent(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (2, 2)) - - vim.current.window.cursor = (16, 4) - vim.EVALRESULTS[u_encode(u"v:count")] = u_encode(u'3') - self.navigator.parent(mode=u'normal') - self.assertEqual(vim.current.window.cursor, (2, 2)) - - def test_next_parent_movement(self): - # test movement to parent - vim.current.window.cursor = (6, 0) - self.assertNotEqual(self.navigator.parent_next_sibling(mode=u'normal'), None) - self.assertEqual(vim.current.window.cursor, (17, 2)) - - def test_forward_movement_visual(self): - # selection start: << - # selection end: >> - # cursor poistion: | - - # << text - # text| >> - # text - # heading - set_visual_selection(u'V', 2, 4, cursor_pos=END) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV5gg')) - - # << text - # text - # text| >> - # heading - set_visual_selection(u'V', 2, 5, cursor_pos=END) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV9gg')) - - # << text - # x. heading - # text| >> - # heading - set_visual_selection(u'V', 12, 14, cursor_pos=END) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV15gg')) - - set_visual_selection(u'V', 12, 15, cursor_pos=END) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV16gg')) - - set_visual_selection(u'V', 12, 16, cursor_pos=END) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV17gg')) - - # << text - # text - # text| >> - # heading - # EOF - set_visual_selection(u'V', 15, 17, cursor_pos=END) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 15ggV20gg')) - - # << text >> - # heading - set_visual_selection(u'V', 1, 1, cursor_pos=START) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 1ggV5gg')) - - # << heading >> - # text - # heading - set_visual_selection(u'V', 2, 2, cursor_pos=START) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV5gg')) - - # << text >> - # heading - set_visual_selection(u'V', 1, 1, cursor_pos=END) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 1ggV5gg')) - - # << |text - # heading - # text - # heading - # text >> - set_visual_selection(u'V', 1, 8, cursor_pos=START) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV8ggo')) - - # << |heading - # text - # heading - # text >> - set_visual_selection(u'V', 2, 8, cursor_pos=START) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 6ggV8ggo')) - - # << |heading - # text >> - # heading - set_visual_selection(u'V', 6, 8, cursor_pos=START) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 8ggV9gg')) - - # << |x. heading - # text >> - # heading - set_visual_selection(u'V', 13, 15, cursor_pos=START) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 15ggV15gg')) - - set_visual_selection(u'V', 13, 16, cursor_pos=START) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16ggV16ggo')) - - set_visual_selection(u'V', 16, 16, cursor_pos=START) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16ggV17gg')) - - # << |x. heading - # text >> - # heading - # EOF - set_visual_selection(u'V', 17, 17, cursor_pos=START) - self.assertNotEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 17ggV20gg')) - - # << |heading - # text>> - # text - # EOF - set_visual_selection(u'V', 18, 19, cursor_pos=START) - self.assertEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 19ggV20gg')) - - # << heading - # text|>> - # text - # EOF - set_visual_selection(u'V', 18, 19, cursor_pos=END) - self.assertEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 18ggV20gg')) - - # << heading - # text|>> - # EOF - set_visual_selection(u'V', 18, 20, cursor_pos=END) - self.assertEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 18ggV20gg')) - - # << |heading - # text>> - # EOF - set_visual_selection(u'V', 20, 20, cursor_pos=START) - self.assertEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 20ggV20gg')) - - def test_forward_movement_visual_to_the_end_of_the_file(self): - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* Überschrift 1 -Text 1 - -Bla bla -** Überschrift 1.1 -Text 2 - -Bla Bla bla -** Überschrift 1.2 -Text 3 - -**** Überschrift 1.2.1.falsch - -Bla Bla bla bla -test -""".split(u'\n') ] - # << |heading - # text>> - # EOF - set_visual_selection(u'V', 15, 15, cursor_pos=START) - self.assertEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 15ggV17gg')) - - set_visual_selection(u'V', 15, 17, cursor_pos=END) - self.assertEqual(self.navigator.next(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 15ggV17gg')) - - def test_backward_movement_visual(self): - # selection start: << - # selection end: >> - # cursor poistion: | - - # << text | >> - # text - # heading - set_visual_selection(u'V', 1, 1, cursor_pos=START) - self.assertEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! gv')) - - set_visual_selection(u'V', 1, 1, cursor_pos=END) - self.assertEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! gv')) - - # << heading| >> - # text - # heading - set_visual_selection(u'V', 2, 2, cursor_pos=START) - self.assertEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV2ggo')) - - set_visual_selection(u'V', 2, 2, cursor_pos=END) - self.assertEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV2ggo')) - - # heading - # text - # << |text - # text >> - set_visual_selection(u'V', 3, 5, cursor_pos=START) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV5ggo')) - - # heading - # text - # << text - # text| >> - set_visual_selection(u'V', 3, 5, cursor_pos=END) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV3ggo')) - - # heading - # text - # << text - # text| >> - set_visual_selection(u'V', 8, 9, cursor_pos=END) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 6ggV8ggo')) - - # heading - # << text - # x. heading - # text| >> - set_visual_selection(u'V', 12, 14, cursor_pos=END) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV12gg')) - - set_visual_selection(u'V', 12, 15, cursor_pos=END) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV12gg')) - - # heading - # << |text - # x. heading - # text >> - set_visual_selection(u'V', 12, 15, cursor_pos=START) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 10ggV15ggo')) - - # heading - # << text - # x. heading| >> - set_visual_selection(u'V', 12, 13, cursor_pos=END) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV12gg')) - - # heading - # << text - # heading - # text - # x. heading| >> - set_visual_selection(u'V', 12, 16, cursor_pos=END) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV15gg')) - - # << text - # heading - # text - # heading| >> - set_visual_selection(u'V', 15, 17, cursor_pos=END) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 15ggV16gg')) - - # heading - # << |text - # text - # heading - # text >> - set_visual_selection(u'V', 4, 8, cursor_pos=START) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV8ggo')) - - # heading - # << text - # text - # heading - # text| >> - set_visual_selection(u'V', 4, 8, cursor_pos=END) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 4ggV5gg')) - - # heading - # << text - # text - # heading - # text| >> - set_visual_selection(u'V', 4, 5, cursor_pos=END) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV4ggo')) - - # BOF - # << |heading - # text - # heading - # text >> - set_visual_selection(u'V', 2, 8, cursor_pos=START) - self.assertEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV8ggo')) - - # BOF - # heading - # << text - # text| >> - set_visual_selection(u'V', 3, 4, cursor_pos=END) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV3ggo')) - - # BOF - # << heading - # text - # text| >> - set_visual_selection(u'V', 2, 4, cursor_pos=END) - self.assertNotEqual(self.navigator.previous(mode=u'visual'), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV2ggo')) - - # << text - # heading - # text - # x. heading - # text| >> - set_visual_selection(u'V', 8, 14, cursor_pos=END) - self.navigator.previous(mode=u'visual') - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 8ggV12gg')) - - def test_parent_movement_visual(self): - # selection start: << - # selection end: >> - # cursor poistion: | - - # heading - # << text| - # text - # text >> - set_visual_selection(u'V', 4, 8, cursor_pos=START) - self.navigator.parent(mode=u'visual') - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! gv')) - - # heading - # << text| - # text - # text >> - set_visual_selection(u'V', 6, 8, cursor_pos=START) - self.navigator.parent(mode=u'visual') - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV8ggo')) - - # heading - # << text - # text - # text| >> - set_visual_selection(u'V', 6, 8, cursor_pos=END) - self.navigator.parent(mode=u'visual') - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 6ggV5gg')) - - # << |heading - # text - # text - # text >> - set_visual_selection(u'V', 2, 8, cursor_pos=START) - self.assertEqual(self.navigator.parent(mode=u'visual'), None) - - # << heading - # text - # heading - # text| >> - set_visual_selection(u'V', 2, 8, cursor_pos=END) - self.navigator.parent(mode=u'visual') - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV5gg')) - - set_visual_selection(u'V', 7, 8, cursor_pos=START) - self.navigator.parent(mode=u'visual') - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV8ggo')) - - # heading - # heading - # << text - # text| >> - set_visual_selection(u'V', 12, 13, cursor_pos=END) - self.navigator.parent(mode=u'visual') - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 12ggV12gg')) - - set_visual_selection(u'V', 10, 12, cursor_pos=START) - self.navigator.parent(mode=u'visual') - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggV12ggo')) - - # heading - # << text - # text - # heading| >> - set_visual_selection(u'V', 11, 17, cursor_pos=END) - self.assertEqual(self.navigator.parent(mode=u'visual'), None) - - # << text - # heading - # text - # x. heading - # text| >> - set_visual_selection(u'V', 8, 14, cursor_pos=END) - self.navigator.parent(mode=u'visual') - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 8ggV12gg')) - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(NavigatorTestCase) diff --git a/pack/acp/start/vim-orgmode/tests/test_plugin_show_hide.py b/pack/acp/start/vim-orgmode/tests/test_plugin_show_hide.py deleted file mode 100644 index 05dd640..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_plugin_show_hide.py +++ /dev/null @@ -1,385 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest -import sys -sys.path.append(u'../ftplugin') - -import vim - -from orgmode._vim import ORGMODE - -from orgmode.py3compat.encode_compatibility import * - -counter = 0 -class ShowHideTestCase(unittest.TestCase): - def setUp(self): - global counter - counter += 1 - vim.CMDHISTORY = [] - vim.CMDRESULTS = {} - vim.EVALHISTORY = [] - vim.EVALRESULTS = { - # no org_todo_keywords for b - u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'), - # global values for org_todo_keywords - u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'), - u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')], - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("b:org_debug")'): u_encode(u'0'), - u_encode(u'exists("*repeat#set()")'): u_encode(u'0'), - u_encode(u'b:changedtick'): u_encode(u'%d' % counter), - u_encode(u"v:count"): u_encode(u'0')} - if not u'ShowHide' in ORGMODE.plugins: - ORGMODE.register_plugin(u'ShowHide') - self.showhide = ORGMODE.plugins[u'ShowHide'] - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* Überschrift 1 -Text 1 - -Bla bla -** Überschrift 1.1 -Text 2 - -Bla Bla bla -** Überschrift 1.2 -Text 3 - -**** Überschrift 1.2.1.falsch - -Bla Bla bla bla -*** Überschrift 1.2.1 -* Überschrift 2 -* Überschrift 3 - asdf sdf -""".split(u'\n') ] - - def test_no_heading_toggle_folding(self): - vim.current.window.cursor = (1, 0) - self.assertEqual(self.showhide.toggle_folding(), None) - self.assertEqual(vim.EVALHISTORY[-1], u_encode(u'feedkeys("<Tab>", "n")')) - self.assertEqual(vim.current.window.cursor, (1, 0)) - - def test_toggle_folding_first_heading_with_no_children(self): - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* Überschrift 1 -Text 1 - -Bla bla -* Überschrift 2 -* Überschrift 3 - asdf sdf -""".split(u'\n') ] - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'2'), - u_encode(u'foldclosed(6)'): u_encode(u'-1'), - u_encode(u'foldclosed(7)'): u_encode(u'-1'), - }) - vim.current.window.cursor = (2, 0) - - self.assertNotEqual(self.showhide.toggle_folding(), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 1zo')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_close_one(self): - vim.current.window.cursor = (13, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(13)'): u_encode(u'-1'), - }) - self.assertNotEqual(self.showhide.toggle_folding(), None) - self.assertEqual(len(vim.CMDHISTORY), 2) - self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'13,15foldclose!')) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2zo')) - self.assertEqual(vim.current.window.cursor, (13, 0)) - - def test_toggle_folding_open_one(self): - vim.current.window.cursor = (10, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(10)'): u_encode(u'10'), - }) - self.assertNotEqual(self.showhide.toggle_folding(), None) - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 1zo')) - self.assertEqual(vim.current.window.cursor, (10, 0)) - - def test_toggle_folding_close_multiple_all_open(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'-1'), - u_encode(u'foldclosed(10)'): u_encode(u'-1'), - u_encode(u'foldclosed(13)'): u_encode(u'-1'), - u_encode(u'foldclosed(16)'): u_encode(u'-1'), - }) - self.assertNotEqual(self.showhide.toggle_folding(), None) - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'2,16foldclose!')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_all_closed(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'2'), - }) - self.assertNotEqual(self.showhide.toggle_folding(), None) - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 1zo')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_first_level_open(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'6'), - u_encode(u'foldclosed(10)'): u_encode(u'10'), - u_encode(u'foldclosed(13)'): u_encode(u'13'), - u_encode(u'foldclosed(16)'): u_encode(u'16'), - }) - self.assertNotEqual(self.showhide.toggle_folding(), None) - self.assertEqual(len(vim.CMDHISTORY), 2) - self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 6gg1zo')) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 10gg1zo')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_second_level_half_open(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'-1'), - u_encode(u'foldclosed(10)'): u_encode(u'10'), - u_encode(u'foldclosed(13)'): u_encode(u'13'), - u_encode(u'foldclosed(16)'): u_encode(u'16'), - }) - self.assertNotEqual(self.showhide.toggle_folding(), None) - self.assertEqual(len(vim.CMDHISTORY), 4) - self.assertEqual(vim.CMDHISTORY[-4], u_encode(u'normal! 6gg2zo')) - self.assertEqual(vim.CMDHISTORY[-3], u_encode(u'normal! 10gg2zo')) - self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 13gg2zo')) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16gg2zo')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_other_second_level_half_open(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'6'), - u_encode(u'foldclosed(10)'): u_encode(u'-1'), - u_encode(u'foldclosed(13)'): u_encode(u'13'), - u_encode(u'foldclosed(16)'): u_encode(u'16'), - }) - self.assertNotEqual(self.showhide.toggle_folding(), None) - self.assertEqual(len(vim.CMDHISTORY), 4) - self.assertEqual(vim.CMDHISTORY[-4], u_encode(u'normal! 6gg2zo')) - self.assertEqual(vim.CMDHISTORY[-3], u_encode(u'normal! 10gg2zo')) - self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 13gg2zo')) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16gg2zo')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_third_level_half_open(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'-1'), - u_encode(u'foldclosed(10)'): u_encode(u'-1'), - u_encode(u'foldclosed(13)'): u_encode(u'-1'), - u_encode(u'foldclosed(16)'): u_encode(u'16'), - }) - self.assertNotEqual(self.showhide.toggle_folding(), None) - self.assertEqual(len(vim.CMDHISTORY), 4) - self.assertEqual(vim.CMDHISTORY[-4], u_encode(u'normal! 6gg3zo')) - self.assertEqual(vim.CMDHISTORY[-3], u_encode(u'normal! 10gg3zo')) - self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 13gg3zo')) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16gg3zo')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_other_third_level_half_open(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'-1'), - u_encode(u'foldclosed(10)'): u_encode(u'-1'), - u_encode(u'foldclosed(13)'): u_encode(u'13'), - u_encode(u'foldclosed(16)'): u_encode(u'-1'), - }) - self.assertNotEqual(self.showhide.toggle_folding(), None) - self.assertEqual(len(vim.CMDHISTORY), 4) - self.assertEqual(vim.CMDHISTORY[-4], u_encode(u'normal! 6gg3zo')) - self.assertEqual(vim.CMDHISTORY[-3], u_encode(u'normal! 10gg3zo')) - self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 13gg3zo')) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16gg3zo')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_other_third_level_half_open_second_level_half_closed(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'6'), - u_encode(u'foldclosed(10)'): u_encode(u'-1'), - u_encode(u'foldclosed(13)'): u_encode(u'13'), - u_encode(u'foldclosed(16)'): u_encode(u'-1'), - }) - self.assertNotEqual(self.showhide.toggle_folding(), None) - self.assertEqual(len(vim.CMDHISTORY), 4) - self.assertEqual(vim.CMDHISTORY[-4], u_encode(u'normal! 6gg3zo')) - self.assertEqual(vim.CMDHISTORY[-3], u_encode(u'normal! 10gg3zo')) - self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 13gg3zo')) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16gg3zo')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_no_heading_toggle_folding_reverse(self): - vim.current.window.cursor = (1, 0) - self.assertEqual(self.showhide.toggle_folding(reverse=True), None) - self.assertEqual(vim.EVALHISTORY[-1], u_encode(u'feedkeys("<Tab>", "n")')) - self.assertEqual(vim.current.window.cursor, (1, 0)) - - def test_toggle_folding_first_heading_with_no_children_reverse(self): - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* Überschrift 1 -Text 1 - -Bla bla -* Überschrift 2 -* Überschrift 3 - asdf sdf -""".split(u'\n') ] - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'2'), - u_encode(u'foldclosed(6)'): u_encode(u'-1'), - u_encode(u'foldclosed(7)'): u_encode(u'-1'), - }) - vim.current.window.cursor = (2, 0) - - self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'2,5foldopen!')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_close_one_reverse(self): - vim.current.window.cursor = (13, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(13)'): u_encode(u'-1'), - }) - self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None) - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 13ggzc')) - self.assertEqual(vim.current.window.cursor, (13, 0)) - - def test_toggle_folding_open_one_reverse(self): - vim.current.window.cursor = (10, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(10)'): u_encode(u'10'), - }) - self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None) - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'10,16foldopen!')) - self.assertEqual(vim.current.window.cursor, (10, 0)) - - def test_toggle_folding_close_multiple_all_open_reverse(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'-1'), - u_encode(u'foldclosed(10)'): u_encode(u'-1'), - u_encode(u'foldclosed(13)'): u_encode(u'-1'), - u_encode(u'foldclosed(16)'): u_encode(u'-1'), - }) - self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None) - self.assertEqual(len(vim.CMDHISTORY), 2) - self.assertEqual(vim.CMDHISTORY[-2], u_encode(u'normal! 13ggzc')) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16ggzc')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_all_closed_reverse(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'2'), - }) - self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None) - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'2,16foldopen!')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_first_level_open_reverse(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'6'), - u_encode(u'foldclosed(10)'): u_encode(u'10'), - u_encode(u'foldclosed(13)'): u_encode(u'13'), - u_encode(u'foldclosed(16)'): u_encode(u'16'), - }) - self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None) - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 2ggzc')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_second_level_half_open_reverse(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'-1'), - u_encode(u'foldclosed(10)'): u_encode(u'10'), - u_encode(u'foldclosed(13)'): u_encode(u'13'), - u_encode(u'foldclosed(16)'): u_encode(u'16'), - }) - self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None) - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 6ggzc')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_other_second_level_half_open_reverse(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'6'), - u_encode(u'foldclosed(10)'): u_encode(u'-1'), - u_encode(u'foldclosed(13)'): u_encode(u'13'), - u_encode(u'foldclosed(16)'): u_encode(u'16'), - }) - self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None) - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 10ggzc')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_third_level_half_open_reverse(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'-1'), - u_encode(u'foldclosed(10)'): u_encode(u'-1'), - u_encode(u'foldclosed(13)'): u_encode(u'-1'), - u_encode(u'foldclosed(16)'): u_encode(u'16'), - }) - self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None) - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 13ggzc')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_other_third_level_half_open_reverse(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'-1'), - u_encode(u'foldclosed(10)'): u_encode(u'-1'), - u_encode(u'foldclosed(13)'): u_encode(u'13'), - u_encode(u'foldclosed(16)'): u_encode(u'-1'), - }) - self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None) - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16ggzc')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - - def test_toggle_folding_open_multiple_other_third_level_half_open_second_level_half_closed_reverse(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS.update({ - u_encode(u'foldclosed(2)'): u_encode(u'-1'), - u_encode(u'foldclosed(6)'): u_encode(u'6'), - u_encode(u'foldclosed(10)'): u_encode(u'-1'), - u_encode(u'foldclosed(13)'): u_encode(u'13'), - u_encode(u'foldclosed(16)'): u_encode(u'-1'), - }) - self.assertNotEqual(self.showhide.toggle_folding(reverse=True), None) - self.assertEqual(len(vim.CMDHISTORY), 1) - self.assertEqual(vim.CMDHISTORY[-1], u_encode(u'normal! 16ggzc')) - self.assertEqual(vim.current.window.cursor, (2, 0)) - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(ShowHideTestCase) diff --git a/pack/acp/start/vim-orgmode/tests/test_plugin_tags_properties.py b/pack/acp/start/vim-orgmode/tests/test_plugin_tags_properties.py deleted file mode 100644 index 8929ba2..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_plugin_tags_properties.py +++ /dev/null @@ -1,177 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import unittest -import sys -sys.path.append(u'../ftplugin') - -import vim - -from orgmode._vim import indent_orgmode, fold_orgmode, ORGMODE - -from orgmode.py3compat.encode_compatibility import * - -ORGMODE.debug = True - -START = True -END = False - -counter = 0 -class TagsPropertiesTestCase(unittest.TestCase): - def setUp(self): - global counter - counter += 1 - vim.CMDHISTORY = [] - vim.CMDRESULTS = {} - vim.EVALHISTORY = [] - vim.EVALRESULTS = { - # no org_todo_keywords for b - u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'), - # global values for org_todo_keywords - u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'), - u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')], - u_encode(u'&ts'): u_encode(u'6'), - u_encode(u'exists("b:org_tag_column")'): u_encode(u'0'), - u_encode(u'exists("g:org_tag_column")'): u_encode(u'0'), - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("b:org_debug")'): u_encode(u'0'), - u_encode(u'exists("*repeat#set()")'): u_encode(u'0'), - u_encode(u'b:changedtick'): (u_encode(u'%d' % counter)), - u_encode(u"v:count"): u_encode(u'0')} - if not u'TagsProperties' in ORGMODE.plugins: - ORGMODE.register_plugin(u'TagsProperties') - self.tagsproperties = ORGMODE.plugins[u'TagsProperties'] - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* Überschrift 1 -Text 1 - -Bla bla -** Überschrift 1.1 -Text 2 - -Bla Bla bla -** Überschrift 1.2 -Text 3 - -**** Überschrift 1.2.1.falsch - -Bla Bla bla bla -*** Überschrift 1.2.1 -* Überschrift 2 -* Überschrift 3 - asdf sdf -""".split(u'\n') ] - - def test_new_property(self): - u""" TODO: Docstring for test_new_property - - :returns: TODO - """ - pass - - def test_set_tags(self): - # set first tag - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u':hello:') - self.tagsproperties.set_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t\t :hello:')) - - # set second tag - vim.EVALRESULTS[u_encode(u'input("Tags: ", ":hello:", "customlist,Org_complete_tags")')] = u_encode(u':hello:world:') - self.tagsproperties.set_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:')) - - def test_parse_tags_no_colons_single_tag(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u'hello') - self.tagsproperties.set_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t\t :hello:')) - - def test_parse_tags_no_colons_multiple_tags(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u'hello:world') - self.tagsproperties.set_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:')) - - def test_parse_tags_single_colon_left_single_tag(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u':hello') - self.tagsproperties.set_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t\t :hello:')) - - def test_parse_tags_single_colon_left_multiple_tags(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u':hello:world') - self.tagsproperties.set_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:')) - - def test_parse_tags_single_colon_right_single_tag(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u'hello:') - self.tagsproperties.set_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t\t :hello:')) - - def test_parse_tags_single_colon_right_multiple_tags(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u'hello:world:') - self.tagsproperties.set_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:')) - - def test_filter_empty_tags(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u'::hello::') - self.tagsproperties.set_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t\t :hello:')) - - def test_delete_tags(self): - # set up - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u':hello:world:') - self.tagsproperties.set_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:')) - - # delete second of two tags - vim.EVALRESULTS[u_encode(u'input("Tags: ", ":hello:world:", "customlist,Org_complete_tags")')] = u_encode(u':hello:') - self.tagsproperties.set_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t\t :hello:')) - - # delete last tag - vim.EVALRESULTS[u_encode(u'input("Tags: ", ":hello:", "customlist,Org_complete_tags")')] = u_encode(u'') - self.tagsproperties.set_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1')) - - def test_realign_tags_noop(self): - vim.current.window.cursor = (2, 0) - self.tagsproperties.realign_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1')) - - def test_realign_tags_remove_spaces(self): - # remove spaces in multiple locations - vim.current.buffer[1] = u_encode(u'* Überschrift 1 ') - vim.current.window.cursor = (2, 0) - self.tagsproperties.realign_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1')) - - # remove tabs and spaces in multiple locations - vim.current.buffer[1] = u_encode(u'*\t \tÜberschrift 1 \t') - vim.current.window.cursor = (2, 0) - self.tagsproperties.realign_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1')) - - def test_realign_tags(self): - vim.current.window.cursor = (2, 0) - vim.EVALRESULTS[u_encode(u'input("Tags: ", "", "customlist,Org_complete_tags")')] = u_encode(u':hello:world:') - self.tagsproperties.set_tags() - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:')) - - d = ORGMODE.get_document() - heading = d.find_current_heading() - self.assertEqual(str(heading), u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:')) - self.tagsproperties.realign_tags() - heading = d.find_current_heading() - self.assertEqual(str(heading), u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:')) - self.assertEqual(vim.current.buffer[1], u_encode(u'* Überschrift 1\t\t\t\t\t\t\t\t :hello:world:')) - - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(TagsPropertiesTestCase) diff --git a/pack/acp/start/vim-orgmode/tests/test_plugin_todo.py b/pack/acp/start/vim-orgmode/tests/test_plugin_todo.py deleted file mode 100644 index 5cbd020..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_plugin_todo.py +++ /dev/null @@ -1,424 +0,0 @@ -# -*- coding: utf-8 -*- - - -import sys -sys.path.append(u'../ftplugin') - -import unittest -from orgmode.liborgmode.base import Direction -from orgmode.vimbuffer import VimBuffer -from orgmode.plugins.Todo import Todo - -import vim - -from orgmode.py3compat.encode_compatibility import * - -counter = 0 - -class TodoTestCase(unittest.TestCase): - u"""Tests all the functionality of the TODO module.""" - - def setUp(self): - # set content of the buffer - global counter - counter += 1 - vim.EVALHISTORY = [] - vim.EVALRESULTS = { - # no org_todo_keywords for b - u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'), - # global values for org_todo_keywords - u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'), - u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')], - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("b:org_debug")'): u_encode(u'0'), - u_encode(u'exists("*repeat#set()")'): u_encode(u'0'), - u_encode(u'b:changedtick'): u_encode(u'%d' % counter), - u_encode(u"v:count"): u_encode(u'0') - } - - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* Heading 1 -** Text 1 -*** Text 2 -* Text 1 -** Text 1 - some text that is - no heading - -""".split(u'\n') ] - - # toggle - def test_toggle_todo_with_no_heading(self): - # nothing should happen - vim.current.window.cursor = (1, 0) - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[0], u'') - # and repeat it -> it should not change - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[0], u'') - - def test_todo_toggle_NOTODO(self): - vim.current.window.cursor = (2, 0) - vim.current.buffer[1] = u_encode(u'** NOTODO Überschrift 1.1') - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[1], u_encode(u'** TODO NOTODO Überschrift 1.1')) - - def test_toggle_todo_in_heading_with_no_todo_state_different_levels(self): - # level 1 - vim.current.window.cursor = (2, 0) - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[1], u'* TODO Heading 1') - self.assertEqual((2, 0), vim.current.window.cursor) - - # level 2 - vim.current.window.cursor = (3, 0) - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[2], u'** TODO Text 1') - - # level 2 - vim.current.window.cursor = (4, 4) - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[3], u'*** TODO Text 2') - self.assertEqual((4, 9), vim.current.window.cursor) - - def test_circle_through_todo_states(self): - # * Heading 1 --> - # * TODO Heading 1 --> - # * DONE Heading 1 --> - # * Heading 1 --> - # * TODO Heading 1 --> - # * DONE Heading 1 - vim.current.window.cursor = (2, 6) - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[1], u'* TODO Heading 1') - self.assertEqual((2, 11), vim.current.window.cursor) - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[1], u'* DONE Heading 1') - self.assertEqual((2, 11), vim.current.window.cursor) - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[1], u'* Heading 1') - self.assertEqual((2, 6), vim.current.window.cursor) - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[1], u'* TODO Heading 1') - self.assertEqual((2, 11), vim.current.window.cursor) - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[1], u'* DONE Heading 1') - self.assertEqual((2, 11), vim.current.window.cursor) - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[1], u'* Heading 1') - self.assertEqual((2, 6), vim.current.window.cursor) - - def test_circle_through_todo_states_with_more_states(self): - # * Heading 1 --> - # * TODO Heading 1 --> - # * STARTED Heading 1 --> - # * DONE Heading 1 --> - # * Heading 1 --> - vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'STARTED'), u_encode(u'DONE'), - u_encode(u'|')] - vim.current.window.cursor = (2, 0) - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[1], u'* TODO Heading 1') - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[1], u'* STARTED Heading 1') - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[1], u'* DONE Heading 1') - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[1], u'* Heading 1') - - def test_toggle_todo_with_cursor_in_text_not_heading(self): - # nothing should happen - vim.current.window.cursor = (7, 0) - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[5], u'** TODO Text 1') - self.assertEqual(vim.current.window.cursor, (7, 0)) - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[5], u'** DONE Text 1') - self.assertEqual(vim.current.window.cursor, (7, 0)) - - Todo.toggle_todo_state() - self.assertEqual(vim.current.buffer[5], u'** Text 1') - self.assertEqual(vim.current.window.cursor, (7, 0)) - - # get_states - def test_get_states_without_seperator(self): - u"""The last element in the todostates shouold be used as DONE-state when no sperator is given""" - vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'DONE')] - states_todo, states_done = VimBuffer().get_todo_states()[0] - expected_todo, expected_done = [u'TODO'], [u'DONE'] - self.assertEqual(states_todo, expected_todo) - self.assertEqual(states_done, expected_done) - - vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'INPROGRESS'), u_encode(u'DONE')] - states_todo, states_done = VimBuffer().get_todo_states()[0] - expected_todo = [u'TODO', u'INPROGRESS'] - expected_done = [u'DONE'] - self.assertEqual(states_todo, expected_todo) - self.assertEqual(states_done, expected_done) - - vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'INPROGRESS'), - u_encode(u'DUMMY'), u_encode(u'DONE')] - states_todo, states_done = VimBuffer().get_todo_states()[0] - expected_todo = [u'TODO', u'INPROGRESS', u'DUMMY'] - expected_done = [u'DONE'] - self.assertEqual(states_todo, expected_todo) - self.assertEqual(states_done, expected_done) - - def test_get_states_with_seperator(self): - vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONE')] - states_todo, states_done = VimBuffer().get_todo_states()[0] - expected_todo = [u'TODO'] - expected_done = [u'DONE'] - self.assertEqual(states_todo, expected_todo) - self.assertEqual(states_done, expected_done) - - vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'INPROGRESS'), u_encode(u'|'), - u_encode(u'DONE')] - states_todo, states_done = VimBuffer().get_todo_states()[0] - expected_todo = [u'TODO', u'INPROGRESS'] - expected_done = [u'DONE'] - self.assertEqual(states_todo, expected_todo) - self.assertEqual(states_done, expected_done) - - vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'INPROGRESS'), - u_encode(u'DUMMY'), u_encode(u'|'), u_encode(u'DONE')] - states_todo, states_done = VimBuffer().get_todo_states()[0] - expected_todo = [u'TODO', u'INPROGRESS', u'DUMMY'] - expected_done = [u'DONE'] - self.assertEqual(states_todo, expected_todo) - self.assertEqual(states_done, expected_done) - - vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'INPROGRESS'), - u_encode(u'DUMMY'), u_encode(u'|'), u_encode(u'DELEGATED'), u_encode(u'DONE')] - states_todo, states_done = VimBuffer().get_todo_states()[0] - expected_todo =[u'TODO', u'INPROGRESS', u'DUMMY'] - expected_done = [u'DELEGATED', u'DONE'] - self.assertEqual(states_todo, expected_todo) - self.assertEqual(states_done, expected_done) - - vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [u_encode(u'TODO'), u_encode(u'|'), u_encode(u'DONEX'), - u_encode(u'DUMMY'), u_encode(u'DELEGATED'), u_encode(u'DONE')] - states_todo, states_done = VimBuffer().get_todo_states()[0] - expected_todo = [u'TODO'] - expected_done = [u'DONEX', u'DUMMY', u'DELEGATED', u'DONE'] - self.assertEqual(states_todo, expected_todo) - self.assertEqual(states_done, expected_done) - - vim.EVALRESULTS[u_encode(u'g:org_todo_keywords')] = [[u_encode(u'TODO(t)'), u_encode(u'|'), u_encode(u'DONEX')], - [u_encode(u'DUMMY'), u_encode(u'DELEGATED'), u_encode(u'DONE')]] - states_todo, states_done = VimBuffer().get_todo_states()[0] - expected_todo = [u'TODO'] - expected_done = [u'DONEX'] - self.assertEqual(states_todo, expected_todo) - self.assertEqual(states_done, expected_done) - - # get_next_state - def test_get_next_state_with_no_current_state(self): - states = [((u'TODO', ), (u'DONE', ))] - current_state = u'' - self.assertEquals(Todo._get_next_state(current_state, states), u'TODO') - - states = [((u'TODO', u'NEXT'), (u'DELEGATED', u'DONE'))] - self.assertEquals(Todo._get_next_state(current_state, states), u'TODO') - - states = [((u'NEXT', ), (u'DELEGATED', u'DONE'))] - self.assertEquals(Todo._get_next_state(current_state, states), u'NEXT') - - def test_get_next_state_backward_with_no_current_state(self): - states = [((u'TODO', ), (u'DONE', ))] - current_state = u'' - self.assertEquals(Todo._get_next_state(current_state, states, - Direction.BACKWARD), u'DONE') - - states = [((u'TODO', u'NEXT'), (u'DELEGATED', u'DONE'))] - self.assertEquals(Todo._get_next_state(current_state, states, - Direction.BACKWARD), u'DONE') - - states = [((u'NEXT', ), (u'DELEGATED', u'DONE'))] - self.assertEquals(Todo._get_next_state(current_state, states, - Direction.BACKWARD), u'DONE') - - def test_get_next_state_with_invalid_current_state(self): - states = [((u'TODO', ), (u'DONE', ))] - current_state = u'STI' - self.assertEquals(Todo._get_next_state(current_state, states), u'TODO') - - states = [((u'TODO', u'NEXT'), (u'DELEGATED', u'DONE'))] - self.assertEquals(Todo._get_next_state(current_state, states), u'TODO') - - states = [((u'NEXT', ), (u'DELEGATED', u'DONE'))] - self.assertEquals(Todo._get_next_state(current_state, states), u'NEXT') - - def test_get_next_state_backward_with_invalid_current_state(self): - states = [((u'TODO', ), (u'DONE', ))] - current_state = u'STI' - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD) - self.assertEquals(result, u'DONE') - - states = [((u'TODO', u'NEXT'), (u'DELEGATED', u'DONE'))] - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD) - self.assertEquals(result, u'DONE') - - states = [((u'NEXT', ), (u'DELEGATED', u'DONE'))] - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD) - self.assertEquals(result, u'DONE') - - def test_get_next_state_with_current_state_equals_todo_state(self): - states = [((u'TODO', u'NEXT', u'NOW'), (u'DELEGATED', u'DONE'))] - current_state = u'TODO' - self.assertEquals(Todo._get_next_state(current_state, states), u'NEXT') - - current_state = u'NEXT' - self.assertEquals(Todo._get_next_state(current_state, states), u'NOW') - - def test_get_next_state_backward_with_current_state_equals_todo_state(self): - states = [((u'TODO', u'NEXT', u'NOW'), (u'DELEGATED', u'DONE'))] - current_state = u'TODO' - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD) - self.assertEquals(result, None) - - def test_get_next_state_backward_misc(self): - states = [((u'TODO', u'NEXT', u'NOW'), (u'DELEGATED', u'DONE'))] - current_state = u'DONE' - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD) - self.assertEquals(result, u'DELEGATED') - - current_state = u'DELEGATED' - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD) - self.assertEquals(result, u'NOW') - - current_state = u'NOW' - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD) - self.assertEquals(result, u'NEXT') - - current_state = u'NEXT' - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD) - self.assertEquals(result, u'TODO') - - current_state = u'TODO' - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD) - self.assertEquals(result, None) - - current_state = None - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD) - self.assertEquals(result, u'DONE') - - def test_get_next_state_with_jump_from_todo_to_done(self): - states = [((u'TODO', u'NEXT', u'NOW'), (u'DELEGATED', u'DONE'))] - current_state = u'NOW' - self.assertEquals(Todo._get_next_state(current_state, states), u'DELEGATED') - - def test_get_next_state_with_jump_from_done_to_todo(self): - states = [((u'TODO', u'NEXT', u'NOW'), (u'DELEGATED', u'DONE'))] - current_state = u'DONE' - self.assertEquals(Todo._get_next_state(current_state, states), None) - - def test_get_next_state_in_current_sequence(self): - states = [((u'TODO', u'NEXT', u'NOW'), (u'DELEGATED', u'DONE')), ((u'QA', ), (u'RELEASED', ))] - current_state = u'QA' - result = Todo._get_next_state(current_state, states, - Direction.FORWARD) - self.assertEquals(result, u'RELEASED') - - def test_get_next_state_in_current_sequence_with_access_keys(self): - states = [((u'TODO(t)', u'NEXT(n)', u'NOW(w)'), (u'DELEGATED(g)', u'DONE(d)')), ((u'QA(q)', ), (u'RELEASED(r)', ))] - current_state = u'QA' - result = Todo._get_next_state(current_state, states, - Direction.FORWARD) - self.assertEquals(result, u'RELEASED') - - current_state = u'NEXT' - result = Todo._get_next_state(current_state, states, - Direction.FORWARD) - self.assertEquals(result, u'NOW') - - current_state = u'TODO' - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD) - self.assertEquals(result, None) - - current_state = None - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD) - self.assertEquals(result, u'RELEASED') - - def test_get_next_keyword_sequence(self): - states = [((u'TODO(t)', u'NEXT(n)', u'NOW(w)'), (u'DELEGATED(g)', u'DONE(d)')), ((u'QA(q)', ), (u'RELEASED(r)', ))] - current_state = None - result = Todo._get_next_state(current_state, states, - Direction.FORWARD, next_set=True) - self.assertEquals(result, u'TODO') - - current_state = None - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD, next_set=True) - self.assertEquals(result, u'QA') - - current_state = u'TODO' - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD, next_set=True) - self.assertEquals(result, None) - - current_state = u'TODO' - result = Todo._get_next_state(current_state, states, - Direction.FORWARD, next_set=True) - self.assertEquals(result, u'QA') - - current_state = u'NOW' - result = Todo._get_next_state(current_state, states, - Direction.FORWARD, next_set=True) - self.assertEquals(result, u'QA') - - current_state = u'DELEGATED' - result = Todo._get_next_state(current_state, states, - Direction.FORWARD, next_set=True) - self.assertEquals(result, u'QA') - - current_state = u'QA' - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD, next_set=True) - self.assertEquals(result, u'TODO') - - current_state = u'QA' - result = Todo._get_next_state(current_state, states, - Direction.FORWARD, next_set=True) - self.assertEquals(result, None) - - current_state = u'RELEASED' - result = Todo._get_next_state(current_state, states, - Direction.FORWARD, next_set=True) - self.assertEquals(result, None) - - current_state = u'RELEASED' - result = Todo._get_next_state(current_state, states, - Direction.BACKWARD, next_set=True) - self.assertEquals(result, u'TODO') - - -def suite(): - return unittest.TestLoader().loadTestsFromTestCase(TodoTestCase) - -# vi: noexpandtab diff --git a/pack/acp/start/vim-orgmode/tests/test_vimbuffer.py b/pack/acp/start/vim-orgmode/tests/test_vimbuffer.py deleted file mode 100644 index 423276d..0000000 --- a/pack/acp/start/vim-orgmode/tests/test_vimbuffer.py +++ /dev/null @@ -1,1257 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest -import sys -sys.path.append(u'../ftplugin') - -import vim - -from orgmode.liborgmode.headings import Heading -from orgmode.vimbuffer import VimBuffer - -from orgmode.py3compat.encode_compatibility import * -from orgmode.py3compat.unicode_compatibility import * - -counter = 0 -class VimBufferTestCase(unittest.TestCase): - def setUp(self): - global counter - counter += 1 - vim.CMDHISTORY = [] - vim.CMDRESULTS = {} - vim.EVALHISTORY = [] - vim.EVALRESULTS = { - # no org_todo_keywords for b - u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'), - # global values for org_todo_keywords - u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'), - u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), - u_encode(u'DONE'), u_encode(u'|')], - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("*repeat#set()")'): u_encode(u'0'), - u_encode(u'b:changedtick'): u_encode(u'%d' % counter), - u_encode(u'&ts'): u_encode(u'8'), - u_encode(u'exists("g:org_tag_column")'): u_encode(u'0'), - u_encode(u'exists("b:org_tag_column")'): u_encode(u'0'), - u_encode(u"v:count"): u_encode(u'0')} - vim.current.buffer[:] = [u_encode(i) for i in u"""#Meta information -#more meta information -* Überschrift 1 -Text 1 - -Bla bla -** Überschrift 1.1 -Text 2 - -Bla Bla bla -** Überschrift 1.2 -Text 3 - -**** Überschrift 1.2.1.falsch - -Bla Bla bla bla -*** Überschrift 1.2.1 -* Überschrift 2 -* Überschrift 3 - asdf sdf -""".split(u'\n') ] - self.document = VimBuffer().init_dom() - - def test_write_heading_tags(self): - self.assertEqual(self.document.is_dirty, False) - h = self.document.find_heading() - self.assertEqual(h._orig_start, 2) - self.assertEqual(h.title, u'Überschrift 1') - h.tags = [u'test', u'tag'] - self.assertEqual(h.tags[0], u'test') - self.document.write_heading(h) - - # sanity check - d = VimBuffer().init_dom() - h2 = self.document.find_heading() - self.assertEqual(d.headings[0].title, u'Überschrift 1') - self.assertEqual(len(d.headings[0].tags), 2) - self.assertEqual(d.headings[0].tags[0], u'test') - self.assertEqual(d.headings[0]._orig_start, 2) - self.assertEqual(d.headings[0].children[0]._orig_start, 6) - - def test_write_multi_heading_bodies(self): - self.assertEqual(self.document.is_dirty, False) - h = self.document.headings[0].copy() - self.assertEqual(h._orig_start, 2) - self.assertEqual(h.title, u'Überschrift 1') - h.body.append(u'test') - h.children[0].body.append(u'another line') - self.document.write_heading(h) - - # sanity check - d = VimBuffer().init_dom() - h2 = self.document.find_heading() - self.assertEqual(len(d.headings[0].body), 4) - self.assertEqual(d.headings[0]._orig_start, 2) - self.assertEqual(d.headings[0].children[0]._orig_start, 7) - self.assertEqual(d.headings[0].children[0].title, u'Überschrift 1.1') - self.assertEqual(len(d.headings[0].children[0].body), 4) - self.assertEqual(d.headings[0].children[1]._orig_start, 12) - self.assertEqual(d.headings[0].children[1].title, u'Überschrift 1.2') - self.assertEqual(len(d.headings[0].children[1].body), 2) - - def test_meta_information_assign_directly(self): - # read meta information from document - self.assertEqual(u'\n'.join(self.document.meta_information), u'#Meta information\n#more meta information') - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].start, 2) - - # assign meta information directly to an element in array - self.document.meta_information[0] = u'#More or less meta information' - self.assertEqual(u'\n'.join(self.document.meta_information), u'#More or less meta information\n#more meta information') - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.is_dirty_meta_information, True) - self.assertEqual(self.document.headings[0].start, 2) - - def test_meta_information_assign_string(self): - # assign a single line string - self.document.meta_information = u'#Less meta information' - self.assertEqual('\n'.join(self.document.meta_information), u'#Less meta information') - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.is_dirty_meta_information, True) - self.assertEqual(self.document.headings[0].start, 1) - - def test_meta_information_assign_multi_line_string(self): - # assign a multi line string - self.document.meta_information = u'#Less meta information\n#lesser information' - self.assertEqual(u'\n'.join(self.document.meta_information), u'#Less meta information\n#lesser information') - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.is_dirty_meta_information, True) - self.assertEqual(self.document.headings[0].start, 2) - - def test_meta_information_assign_one_element_array(self): - # assign a single element array of strings - self.document.meta_information = u'#More or less meta information'.split(u'\n') - self.assertEqual(u'\n'.join(self.document.meta_information), u'#More or less meta information') - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.is_dirty_meta_information, True) - self.assertEqual(self.document.headings[0].start, 1) - - def test_meta_information_assign_multi_element_array(self): - # assign a multi element array of strings - self.document.meta_information = u'#More or less meta information\n#lesser information'.split(u'\n') - self.assertEqual(u'\n'.join(self.document.meta_information), u'#More or less meta information\n#lesser information') - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.is_dirty_meta_information, True) - self.assertEqual(self.document.headings[0].start, 2) - - def test_meta_information_read_no_meta_information(self): - vim.current.buffer[:] = [ u_encode(i) for i in u"""* Überschrift 1 -Text 1 - -Bla bla -** Überschrift 1.1 -Text 2 - -Bla Bla bla -** Überschrift 1.2 -Text 3 - -**** Überschrift 1.2.1.falsch - -Bla Bla bla bla -*** Überschrift 1.2.1 -* Überschrift 2 -* Überschrift 3 - asdf sdf -""".split(u'\n') ] - self.document = VimBuffer().init_dom() - - # read no meta information from document - self.assertEqual(self.document.meta_information, []) - self.assertEqual(self.document.headings[0].start, 0) - self.assertEqual(self.document.is_dirty, False) - - # assign meta information to a former empty field - self.document.meta_information = u'#More or less meta information\n#lesser information'.split('\n') - self.assertEqual(u'\n'.join(self.document.meta_information), u'#More or less meta information\n#lesser information') - self.assertEqual(self.document.headings[0].start, 2) - self.assertEqual(self.document.is_dirty, True) - - def test_meta_information_assign_empty_array(self): - # assign an empty array as meta information - self.document.meta_information = [] - self.assertEqual(self.document.meta_information, []) - self.assertEqual(self.document.headings[0].start, 0) - self.assertEqual(self.document.is_dirty, True) - - def test_meta_information_assign_empty_string(self): - # assign an empty string as meta information - self.document.meta_information = u'' - self.assertEqual(self.document.meta_information, [u'']) - self.assertEqual(self.document.headings[0].start, 1) - self.assertEqual(self.document.is_dirty, True) - - def test_bufnr(self): - self.assertEqual(self.document.bufnr, vim.current.buffer.number) - # TODO add more tests as soon as multi buffer support has been implemented - - def test_write_meta_information(self): - # write nothing - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.write(), False) - self.assertEqual(u'\n'.join(self.document.meta_information), u'#Meta information\n#more meta information') - - # write changed meta information - self.assertEqual(self.document.is_dirty, False) - self.document.meta_information = u'#More or less meta information\n#lesser information'.split('\n') - self.assertEqual(u'\n'.join(self.document.meta_information), u'#More or less meta information\n#lesser information') - self.assertEqual(self.document.headings[0].start, 2) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].start, 2) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(u'\n'.join(VimBuffer().init_dom().meta_information), u'#More or less meta information\n#lesser information') - - # shorten meta information - self.assertEqual(self.document.is_dirty, False) - self.document.meta_information = u'!More or less meta information'.split(u'\n') - self.assertEqual(u'\n'.join(self.document.meta_information), u'!More or less meta information') - self.assertEqual(self.document.headings[0].start, 1) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].start, 1) - self.assertEqual(self.document.headings[0]._orig_start, 1) - self.assertEqual(u'\n'.join(VimBuffer().init_dom().meta_information), u'!More or less meta information') - - # lengthen meta information - self.assertEqual(self.document.is_dirty, False) - self.document.meta_information = u'!More or less meta information\ntest\ntest' - self.assertEqual(u'\n'.join(self.document.meta_information), u'!More or less meta information\ntest\ntest') - self.assertEqual(self.document.headings[0].start, 3) - self.assertEqual(self.document.headings[0]._orig_start, 1) - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].start, 3) - self.assertEqual(self.document.headings[0]._orig_start, 3) - self.assertEqual(u'\n'.join(VimBuffer().init_dom().meta_information), u'!More or less meta information\ntest\ntest') - - # write empty meta information - self.assertEqual(self.document.is_dirty, False) - self.document.meta_information = [] - self.assertEqual(self.document.meta_information, []) - self.assertEqual(self.document.headings[0].start, 0) - self.assertEqual(self.document.headings[0]._orig_start, 3) - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].start, 0) - self.assertEqual(self.document.headings[0]._orig_start, 0) - self.assertEqual(VimBuffer().init_dom().meta_information, []) - - def test_write_changed_title(self): - # write a changed title - self.document.headings[0].title = u'Heading 1' - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.is_dirty_meta_information, False) - self.assertEqual(self.document.headings[0].is_dirty_body, False) - self.assertEqual(self.document.headings[0].is_dirty_heading, True) - self.assertEqual(self.document.headings[0].title, u'Heading 1') - self.assertEqual(self.document.headings[0].end, 5) - self.assertEqual(len(self.document.headings[0]), 4) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0]._orig_len, 4) - self.assertEqual(self.document.headings[0].children[0].start, 6) - self.assertEqual(self.document.headings[0].children[0]._orig_start, 6) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].end, 5) - self.assertEqual(len(self.document.headings[0]), 4) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0]._orig_len, 4) - self.assertEqual(self.document.headings[0].children[0].start, 6) - self.assertEqual(self.document.headings[0].children[0]._orig_start, 6) - self.assertEqual(VimBuffer().init_dom().headings[0].title, u'Heading 1') - - def test_write_changed_body(self): - # write a changed body - self.assertEqual(self.document.headings[0].end, 5) - self.document.headings[0].body[0] = u'Another text' - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.is_dirty_meta_information, False) - self.assertEqual(self.document.headings[0].is_dirty_body, True) - self.assertEqual(self.document.headings[0].is_dirty_heading, False) - self.assertEqual(self.document.headings[0].end, 5) - self.assertEqual(len(self.document.headings[0]), 4) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0]._orig_len, 4) - self.assertEqual(self.document.headings[0].children[0].start, 6) - self.assertEqual(self.document.headings[0].children[0]._orig_start, 6) - self.assertEqual(self.document.headings[0].body, [u'Another text', u'', u'Bla bla']) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].end, 5) - self.assertEqual(len(self.document.headings[0]), 4) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0]._orig_len, 4) - self.assertEqual(self.document.headings[0].children[0].start, 6) - self.assertEqual(self.document.headings[0].children[0]._orig_start, 6) - self.assertEqual(VimBuffer().init_dom().headings[0].body, [u'Another text', u'', u'Bla bla']) - - def test_write_shortened_body(self): - # write a shortened body - self.document.headings[0].body = u'Another text' - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.is_dirty_meta_information, False) - self.assertEqual(self.document.headings[0].is_dirty_body, True) - self.assertEqual(self.document.headings[0].is_dirty_heading, False) - self.assertEqual(self.document.headings[0].end, 3) - self.assertEqual(len(self.document.headings[0]), 2) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0]._orig_len, 4) - self.assertEqual(self.document.headings[0].children[0].start, 4) - self.assertEqual(self.document.headings[0].children[0]._orig_start, 6) - self.assertEqual(self.document.headings[0].body, [u'Another text']) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].end, 3) - self.assertEqual(len(self.document.headings[0]), 2) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0]._orig_len, 2) - self.assertEqual(self.document.headings[0].children[0].start, 4) - self.assertEqual(self.document.headings[0].children[0]._orig_start, 4) - self.assertEqual(VimBuffer().init_dom().headings[0].body, [u'Another text']) - - def test_write_lengthened_body(self): - # write a lengthened body - self.document.headings[0].body = [u'Another text', u'more', u'and more', u'and more'] - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.is_dirty_meta_information, False) - self.assertEqual(self.document.headings[0].is_dirty_body, True) - self.assertEqual(self.document.headings[0].is_dirty_heading, False) - self.assertEqual(self.document.headings[0].end, 6) - self.assertEqual(len(self.document.headings[0]), 5) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0]._orig_len, 4) - self.assertEqual(self.document.headings[0].children[0].start, 7) - self.assertEqual(self.document.headings[0].children[0]._orig_start, 6) - self.assertEqual(self.document.headings[0].body, [u'Another text', u'more', u'and more', u'and more']) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].end, 6) - self.assertEqual(len(self.document.headings[0]), 5) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0]._orig_len, 5) - self.assertEqual(self.document.headings[0].children[0].start, 7) - self.assertEqual(self.document.headings[0].children[0]._orig_start, 7) - self.assertEqual(VimBuffer().init_dom().headings[0].body, [u'Another text', u'more', u'and more', u'and more']) - - def test_write_delete_heading(self): - # delete a heading - self.assertEqual(len(self.document.headings[0].children), 2) - del self.document.headings[0].children[0] - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(len(self.document.headings[0].children), 1) - self.assertEqual(self.document.headings[0].end, 5) - self.assertEqual(len(self.document.headings[0]), 4) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0]._orig_len, 4) - self.assertEqual(self.document.headings[0].children[0].start, 6) - self.assertEqual(self.document.headings[0].children[0]._orig_start, 10) - self.assertEqual(self.document.headings[0].children[0]._orig_len, 3) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].end, 5) - self.assertEqual(len(self.document.headings[0]), 4) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0]._orig_len, 4) - self.assertEqual(self.document.headings[0].children[0].start, 6) - self.assertEqual(self.document.headings[0].children[0]._orig_start, 6) - self.assertEqual(self.document.headings[0].children[0]._orig_len, 3) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(len(self.document.headings[0].children), 1) - self.assertEqual(self.document.headings[0].end, 5) - self.assertEqual(d.headings[0].end, 5) - self.assertEqual(len(d.headings[0]), 4) - self.assertEqual(d.headings[0]._orig_start, 2) - self.assertEqual(d.headings[0]._orig_len, 4) - self.assertEqual(d.headings[0].children[0].start, 6) - self.assertEqual(d.headings[0].children[0]._orig_start, 6) - self.assertEqual(d.headings[0].children[0]._orig_len, 3) - - def test_write_delete_first_heading(self): - # delete the first heading - self.assertEqual(len(self.document.headings), 3) - del self.document.headings[0] - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(len(self.document.headings), 2) - self.assertEqual(self.document.headings[0].end, 2) - self.assertEqual(len(self.document.headings[0]), 1) - self.assertEqual(self.document.headings[0]._orig_start, 17) - self.assertEqual(self.document.headings[0]._orig_len, 1) - self.assertEqual(self.document.headings[1].start, 3) - self.assertEqual(self.document.headings[1]._orig_start, 18) - self.assertEqual(self.document.headings[1]._orig_len, 3) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].end, 2) - self.assertEqual(len(self.document.headings[0]), 1) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0]._orig_len, 1) - self.assertEqual(self.document.headings[1].start, 3) - self.assertEqual(self.document.headings[1]._orig_start, 3) - self.assertEqual(self.document.headings[1]._orig_len, 3) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(len(self.document.headings), 2) - self.assertEqual(d.headings[0].end, 2) - self.assertEqual(len(d.headings[0]), 1) - self.assertEqual(d.headings[0]._orig_start, 2) - self.assertEqual(d.headings[0]._orig_len, 1) - self.assertEqual(d.headings[1].start, 3) - self.assertEqual(d.headings[1]._orig_start, 3) - self.assertEqual(d.headings[1]._orig_len, 3) - - def test_write_delete_last_heading(self): - # delete the last heading - self.assertEqual(len(self.document.headings), 3) - del self.document.headings[-1] - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(len(self.document.headings), 2) - self.assertEqual(self.document.headings[0].end, 5) - self.assertEqual(self.document.headings[0].end_of_last_child, 16) - self.assertEqual(len(self.document.headings[0]), 4) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0]._orig_len, 4) - self.assertEqual(self.document.headings[-1].start, 17) - self.assertEqual(self.document.headings[-1]._orig_start, 17) - self.assertEqual(self.document.headings[-1]._orig_len, 1) - self.assertEqual(self.document.headings[-1].end, 17) - self.assertEqual(self.document.headings[-1].end_of_last_child, 17) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].end, 5) - self.assertEqual(self.document.headings[0].end_of_last_child, 16) - self.assertEqual(len(self.document.headings[0]), 4) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0]._orig_len, 4) - self.assertEqual(self.document.headings[-1].start, 17) - self.assertEqual(self.document.headings[-1]._orig_start, 17) - self.assertEqual(self.document.headings[-1]._orig_len, 1) - self.assertEqual(self.document.headings[-1].end, 17) - self.assertEqual(self.document.headings[-1].end_of_last_child, 17) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(len(self.document.headings), 2) - self.assertEqual(d.headings[0].end, 5) - self.assertEqual(d.headings[0].end_of_last_child, 16) - self.assertEqual(len(d.headings[0]), 4) - self.assertEqual(d.headings[0]._orig_start, 2) - self.assertEqual(d.headings[0]._orig_len, 4) - self.assertEqual(d.headings[-1].start, 17) - self.assertEqual(d.headings[-1]._orig_start, 17) - self.assertEqual(d.headings[-1]._orig_len, 1) - self.assertEqual(d.headings[-1].end, 17) - self.assertEqual(d.headings[-1].end_of_last_child, 17) - - def test_write_delete_multiple_headings(self): - # delete multiple headings - self.assertEqual(len(self.document.headings), 3) - del self.document.headings[1] - del self.document.headings[0].children[1].children[0] - del self.document.headings[0].children[0] - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(len(self.document.headings), 2) - self.assertEqual(len(self.document.headings[0].children), 1) - self.assertEqual(len(self.document.headings[0].children[0].children), 1) - self.assertEqual(self.document.headings[0].end, 5) - self.assertEqual(self.document.headings[0].end_of_last_child, 9) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0].children[0]._orig_start, 10) - self.assertEqual(self.document.headings[0].children[0].children[0]._orig_start, 16) - self.assertEqual(self.document.headings[-1]._orig_start, 18) - self.assertEqual(self.document.headings[0].start, 2) - self.assertEqual(self.document.headings[0].children[0].start, 6) - self.assertEqual(self.document.headings[0].children[0].children[0].start, 9) - self.assertEqual(self.document.headings[-1].start, 10) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].end, 5) - self.assertEqual(self.document.headings[0].end_of_last_child, 9) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(self.document.headings[0].children[0]._orig_start, 6) - self.assertEqual(self.document.headings[0].children[0].children[0]._orig_start, 9) - self.assertEqual(self.document.headings[-1]._orig_start, 10) - self.assertEqual(self.document.headings[0].start, 2) - self.assertEqual(self.document.headings[0].children[0].start, 6) - self.assertEqual(self.document.headings[0].children[0].children[0].start, 9) - self.assertEqual(self.document.headings[-1].start, 10) - self.assertEqual(self.document.headings[0].title, u'Überschrift 1') - self.assertEqual(self.document.headings[0].children[0].title, u'Überschrift 1.2') - self.assertEqual(self.document.headings[0].children[0].children[0].title, u'Überschrift 1.2.1') - self.assertEqual(self.document.headings[-1].title, u'Überschrift 3') - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(len(self.document.headings), 2) - self.assertEqual(len(self.document.headings[0].children), 1) - self.assertEqual(len(self.document.headings[0].children[0].children), 1) - self.assertEqual(d.headings[0].end, 5) - self.assertEqual(d.headings[0].end_of_last_child, 9) - self.assertEqual(d.headings[0]._orig_start, 2) - self.assertEqual(d.headings[0].children[0]._orig_start, 6) - self.assertEqual(d.headings[0].children[0].children[0]._orig_start, 9) - self.assertEqual(d.headings[-1]._orig_start, 10) - self.assertEqual(d.headings[0].start, 2) - self.assertEqual(d.headings[0].children[0].start, 6) - self.assertEqual(d.headings[0].children[0].children[0].start, 9) - self.assertEqual(d.headings[-1].start, 10) - self.assertEqual(d.headings[0].title, u'Überschrift 1') - self.assertEqual(d.headings[0].children[0].title, u'Überschrift 1.2') - self.assertEqual(d.headings[0].children[0].children[0].title, u'Überschrift 1.2.1') - self.assertEqual(d.headings[-1].title, u'Überschrift 3') - - - def test_write_add_heading(self): - # add a heading - self.assertEqual(len(self.document.headings), 3) - self.assertEqual(len(self.document.headings[0].children), 2) - h = Heading() - h.title = u'Test heading' - h.level = 2 - h.body = u'Text, text\nmore text' - self.document.headings[0].children.append(h) - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(len(self.document.headings[0].children), 3) - self.assertEqual(self.document.headings[0].children[-1].title, u'Test heading') - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(len(self.document.headings[0].children), 3) - self.assertEqual(self.document.headings[0].children[-1].title, u'Test heading') - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(len(d.headings[0].children), 3) - self.assertEqual(d.headings[0].children[-1].title, u'Test heading') - - def test_write_add_heading_before_first_heading(self): - # add a heading before the first heading - self.assertEqual(len(self.document.headings), 3) - h = Heading() - h.title = u'Test heading' - h.level = 2 - h.body = u'Text, text\nmore text' - self.assertEqual(h.start, None) - self.document.headings[0:0] = h - self.assertEqual(h.start, 2) - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(len(self.document.headings), 4) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].title, u'Test heading') - self.assertEqual(self.document.headings[0].start, 2) - self.assertEqual(self.document.headings[0]._orig_start, 2) - self.assertEqual(len(self.document.headings[0]), 3) - self.assertEqual(self.document.headings[1].title, u'Überschrift 1') - self.assertEqual(self.document.headings[1].start, 5) - self.assertEqual(len(self.document.headings[1]), 4) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(len(d.headings), 4) - self.assertEqual(d.headings[0].title, u'Test heading') - self.assertEqual(d.headings[0].start, 2) - self.assertEqual(d.headings[0]._orig_start, 2) - self.assertEqual(len(d.headings[0]), 3) - self.assertEqual(d.headings[1].title, u'Überschrift 1') - self.assertEqual(d.headings[1].start, 5) - self.assertEqual(len(d.headings[1]), 4) - - def test_write_add_heading_after_last_heading_toplevel(self): - # add a heading after the last heading (top level heading) - self.assertEqual(len(self.document.headings), 3) - h = Heading() - h.title = u'Test heading' - h.body = u'Text, text\nmore text' - self.assertEqual(h.start, None) - #self.document.headings += h - self.document.headings.append(h) - self.assertEqual(h.start, 21) - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(len(self.document.headings), 4) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[-1].title, u'Test heading') - self.assertEqual(self.document.headings[-1].start, 21) - self.assertEqual(self.document.headings[-1]._orig_start, 21) - self.assertEqual(len(self.document.headings[-1]), 3) - self.assertEqual(self.document.headings[-2].title, u'Überschrift 3') - self.assertEqual(self.document.headings[-2].start, 18) - self.assertEqual(len(self.document.headings[-2]), 3) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(len(d.headings), 4) - self.assertEqual(d.headings[-1].title, u'Test heading') - self.assertEqual(d.headings[-1].start, 21) - self.assertEqual(d.headings[-1]._orig_start, 21) - self.assertEqual(len(d.headings[-1]), 3) - self.assertEqual(d.headings[-2].title, u'Überschrift 3') - self.assertEqual(d.headings[-2].start, 18) - self.assertEqual(len(d.headings[-2]), 3) - - def test_write_add_heading_after_last_heading_subheading(self): - # add a heading after the last heading (subheading) - self.assertEqual(len(self.document.headings), 3) - h = Heading() - h.title = u'Test heading' - h.level = 2 - h.body = u'Text, text\nmore text' - self.assertEqual(h.start, None) - # TODO make it work with += operator so far it works with append and - # extend so it seems that there is a problem in __iadd__ method in - # UserList from collection in python3 - #self.document.headings[-1].children += h - #self.document.headings[-1].children.extend([h]) - self.document.headings[-1].children.append(h) - self.assertEqual(h.start, 21) - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(len(self.document.headings), 3) - self.assertEqual(len(self.document.headings[-1]), 3) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[-1].children[-1].title, u'Test heading') - self.assertEqual(self.document.headings[-1].children[-1].start, 21) - self.assertEqual(self.document.headings[-1].children[-1]._orig_start, 21) - self.assertEqual(len(self.document.headings[-1].children[-1]), 3) - self.assertEqual(self.document.headings[-1].title, u'Überschrift 3') - self.assertEqual(self.document.headings[-1].start, 18) - self.assertEqual(len(self.document.headings[-1]), 3) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(len(d.headings), 3) - self.assertEqual(len(d.headings[-1]), 3) - self.assertEqual(d.headings[-1].children[-1].title, u'Test heading') - self.assertEqual(d.headings[-1].children[-1].start, 21) - self.assertEqual(d.headings[-1].children[-1]._orig_start, 21) - self.assertEqual(len(d.headings[-1].children[-1]), 3) - self.assertEqual(d.headings[-1].title, u'Überschrift 3') - self.assertEqual(d.headings[-1].start, 18) - self.assertEqual(len(d.headings[-1]), 3) - - def test_write_replace_one_heading(self): - # replace subheadings by a list of newly created headings (one item) - self.assertEqual(len(self.document.headings), 3) - h = Heading() - h.title = u'Test heading' - h.level = 3 - h.body = u'Text, text\nmore text\nanother text' - self.assertEqual(h.start, None) - self.document.headings[0].children[1].children[0] = h - self.assertEqual(h.start, 13) - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(len(self.document.headings), 3) - self.assertEqual(len(self.document.headings[0].children[1].children), 2) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].children[1].children[0].title, u'Test heading') - self.assertEqual(self.document.headings[0].children[1].children[0].start, 13) - self.assertEqual(self.document.headings[0].children[1].children[0]._orig_start, 13) - self.assertEqual(len(self.document.headings[0].children[1].children[0]), 4) - self.assertEqual(len(self.document.headings[0].children[1].children[0].children), 0) - self.assertEqual(len(self.document.headings[0].children[1]), 3) - self.assertEqual(len(self.document.headings[0].children[0].children), 0) - self.assertEqual(len(self.document.headings[1].children), 0) - self.assertEqual(self.document.headings[0].children[1].children[-1].title, u'Überschrift 1.2.1') - self.assertEqual(self.document.headings[0].children[1].children[-1].start, 17) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(len(d.headings), 3) - self.assertEqual(len(d.headings[0].children[1].children), 2) - self.assertEqual(d.headings[0].children[1].children[0].title, u'Test heading') - self.assertEqual(d.headings[0].children[1].children[0].start, 13) - self.assertEqual(d.headings[0].children[1].children[0]._orig_start, 13) - self.assertEqual(len(d.headings[0].children[1].children[0]), 4) - self.assertEqual(len(d.headings[0].children[1].children[0].children), 0) - self.assertEqual(len(d.headings[0].children[1]), 3) - self.assertEqual(len(d.headings[0].children[0].children), 0) - self.assertEqual(len(d.headings[1].children), 0) - self.assertEqual(d.headings[0].children[1].children[-1].title, u'Überschrift 1.2.1') - self.assertEqual(d.headings[0].children[1].children[-1].start, 17) - - def test_write_replace_multiple_headings_with_one_heading(self): - # replace subheadings by a list of newly created headings (one item) - self.assertEqual(len(self.document.headings), 3) - h = Heading() - h.title = u'Test heading' - h.level = 3 - h.body = u'Text, text\nmore text\nanother text' - - self.assertEqual(h.start, None) - self.assertEqual(len(self.document.headings[0].children[1].children), 2) - self.document.headings[0].children[1].children[:] = h - self.assertEqual(h.start, 13) - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.headings[0].children[1].is_dirty, False) - self.assertEqual(len(self.document.headings), 3) - self.assertEqual(len(self.document.headings[0].children[1].children), 1) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].children[1].title, u'Überschrift 1.2') - self.assertEqual(self.document.headings[0].children[1].children[0].title, u'Test heading') - self.assertEqual(self.document.headings[0].children[1].children[0].start, 13) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(len(d.headings[0].children[1].children), 1) - self.assertEqual(d.headings[0].children[1].title, u'Überschrift 1.2') - self.assertEqual(d.headings[0].children[1].children[0].title, u'Test heading') - self.assertEqual(d.headings[0].children[1].children[0].start, 13) - - def test_write_replace_multiple_headings_with_a_multiple_heading_structure(self): - # replace subheadings by a list of newly created headings (multiple items) - self.assertEqual(len(self.document.headings), 3) - h = Heading() - h.title = u'Test heading' - h.level = 3 - h.body = u'Text, text\nmore text\nanother text' - h1 = Heading() - h1.title = u'another heading' - h1.level = 4 - h1.body = u'This\nIs\nJust more\ntext' - h.children.append(h1) - h2 = Heading() - h2.title = u'yet another heading' - h2.level = 3 - h2.body = u'This\nis less text' - - self.assertEqual(h.start, None) - self.document.headings[0].children[1].children[:] = (h, h2) - self.assertEqual(h.start, 13) - self.assertEqual(h1.start, 17) - self.assertEqual(h2.start, 22) - self.assertEqual(self.document.is_dirty, True) - self.assertEqual(self.document.headings[0].children[1].is_dirty, False) - self.assertEqual(len(self.document.headings), 3) - self.assertEqual(len(self.document.headings[0].children[1].children), 2) - self.assertEqual(len(self.document.headings[0].children[1].children[0].children), 1) - self.assertEqual(len(self.document.headings[0].children[1].children[1].children), 0) - - self.assertEqual(self.document.write(), True) - self.assertEqual(self.document.is_dirty, False) - self.assertEqual(self.document.headings[0].children[1].title, u'Überschrift 1.2') - self.assertEqual(self.document.headings[0].children[1].children[0].title, u'Test heading') - self.assertEqual(self.document.headings[0].children[1].children[0].children[0].title, u'another heading') - self.assertEqual(self.document.headings[0].children[1].children[1].title, u'yet another heading') - self.assertEqual(self.document.headings[0].children[1].children[0].start, 13) - self.assertEqual(self.document.headings[0].children[1].children[0].children[0].start, 17) - self.assertEqual(self.document.headings[0].children[1].children[1].start, 22) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(d.headings[0].children[1].title, u'Überschrift 1.2') - self.assertEqual(d.headings[0].children[1].children[0].title, u'Test heading') - self.assertEqual(d.headings[0].children[1].children[0].children[0].title, u'another heading') - self.assertEqual(d.headings[0].children[1].children[1].title, u'yet another heading') - self.assertEqual(d.headings[0].children[1].children[0].start, 13) - self.assertEqual(d.headings[0].children[1].children[0].children[0].start, 17) - self.assertEqual(d.headings[0].children[1].children[1].start, 22) - - def test_dom(self): - self.assertEqual(len(self.document.headings), 3) - for h in self.document.headings: - self.assertEqual(h.level, 1) - self.assertEqual(len(self.document.headings[0].children), 2) - self.assertEqual(len(self.document.headings[0].children[0].children), 0) - self.assertEqual(len(self.document.headings[0].children[1].children), 2) - self.assertEqual(len(self.document.headings[0].children[1].children[0].children), 0) - self.assertEqual(len(self.document.headings[0].children[1].children[1].children), 0) - self.assertEqual(len(self.document.headings[1].children), 0) - self.assertEqual(len(self.document.headings[2].children), 0) - - # test no heading - vim.current.window.cursor = (1, 0) - h = self.document.current_heading() - self.assertEqual(h, None) - - def test_index_boundaries(self): - # test index boundaries - vim.current.window.cursor = (-1, 0) - h = self.document.current_heading() - self.assertEqual(h, None) - - vim.current.window.cursor = (21, 0) - h = self.document.current_heading() - self.assertNotEqual(h, None) - self.assertEqual(h.level, 1) - self.assertEqual(h.start, 18) - self.assertNotEqual(h.previous_sibling, None) - self.assertEqual(h.previous_sibling.level, 1) - self.assertEqual(h.parent, None) - self.assertEqual(h.next_sibling, None) - self.assertEqual(len(h.children), 0) - - vim.current.window.cursor = (999, 0) - h = self.document.current_heading() - self.assertEqual(h, None) - - def test_heading_start_and_end(self): - # test heading start and end - vim.current.window.cursor = (3, 0) - h = self.document.current_heading() - self.assertNotEqual(h, None) - self.assertEqual(h.start, 2) - self.assertEqual(h.end, 5) - self.assertEqual(h.end_of_last_child, 16) - - vim.current.window.cursor = (12, 0) - h = self.document.current_heading() - self.assertNotEqual(h, None) - self.assertEqual(h.start, 10) - self.assertEqual(h.end, 12) - self.assertEqual(h.end_of_last_child, 16) - - vim.current.window.cursor = (19, 0) - h = self.document.current_heading() - self.assertNotEqual(h, None) - self.assertEqual(h.start, 18) - self.assertEqual(h.end, 20) - self.assertEqual(h.end_of_last_child, 20) - - vim.current.buffer[:] = [ u_encode(i) for i in u""" -** Überschrift 1.2 -Text 3 - -**** Überschrift 1.2.1.falsch - -Bla Bla bla bla -*** Überschrift 1.2.1 -* Überschrift 2 -* Überschrift 3 - asdf sdf -""".split(u'\n') ] - self.document = VimBuffer().init_dom() - vim.current.window.cursor = (3, 0) - h = self.document.current_heading() - self.assertNotEqual(h, None) - self.assertEqual(h.parent, None) - self.assertEqual(h.level, 2) - self.assertEqual(h.title, u'Überschrift 1.2') - self.assertEqual(len(h.children), 2) - self.assertEqual(h.children[1].start, 7) - self.assertEqual(h.children[1].children, []) - self.assertEqual(h.children[1].next_sibling, None) - self.assertEqual(h.children[1].end, 7) - self.assertEqual(h.start, 1) - self.assertEqual(h.end, 3) - self.assertEqual(h.end_of_last_child, 7) - - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* Überschrift 2 -* Überschrift 3""".split(u'\n') ] - self.document = VimBuffer().init_dom() - vim.current.window.cursor = (3, 0) - h = self.document.current_heading() - self.assertNotEqual(h, None) - self.assertEqual(h.end, 2) - self.assertEqual(h.end_of_last_child, 2) - self.assertEqual(h.title, u'Überschrift 3') - - def test_first_heading(self): - # test first heading - vim.current.window.cursor = (3, 0) - h = self.document.current_heading() - - self.assertNotEqual(h, None) - self.assertEqual(h.parent, None) - self.assertEqual(h.level, 1) - self.assertEqual(len(h.children), 2) - self.assertEqual(h.previous_sibling, None) - - self.assertEqual(h.children[0].level, 2) - self.assertEqual(h.children[0].children, []) - self.assertEqual(h.children[1].level, 2) - self.assertEqual(len(h.children[1].children), 2) - self.assertEqual(h.children[1].children[0].level, 4) - self.assertEqual(h.children[1].children[1].level, 3) - - self.assertEqual(h.next_sibling.level, 1) - - self.assertEqual(h.next_sibling.next_sibling.level, 1) - - self.assertEqual(h.next_sibling.next_sibling.next_sibling, None) - self.assertEqual(h.next_sibling.next_sibling.parent, None) - - def test_heading_in_the_middle(self): - # test heading in the middle of the file - vim.current.window.cursor = (14, 0) - h = self.document.current_heading() - - self.assertNotEqual(h, None) - self.assertEqual(h.level, 4) - self.assertEqual(h.parent.level, 2) - self.assertNotEqual(h.next_sibling, None) - self.assertNotEqual(h.next_sibling.previous_sibling, None) - self.assertEqual(h.next_sibling.level, 3) - self.assertEqual(h.previous_sibling, None) - - def test_previous_headings(self): - # test previous headings - vim.current.window.cursor = (17, 0) - h = self.document.current_heading() - - self.assertNotEqual(h, None) - self.assertEqual(h.level, 3) - self.assertNotEqual(h.previous_sibling, None) - self.assertEqual(h.parent.level, 2) - self.assertNotEqual(h.parent.previous_sibling, None) - self.assertNotEqual(h.previous_sibling.parent, None) - self.assertEqual(h.previous_sibling.parent.start, 10) - - vim.current.window.cursor = (14, 0) - h = self.document.current_heading() - self.assertNotEqual(h.parent, None) - self.assertEqual(h.parent.start, 10) - - vim.current.window.cursor = (21, 0) - h = self.document.current_heading() - self.assertNotEqual(h, None) - self.assertEqual(h.level, 1) - self.assertNotEqual(h.previous_sibling, None) - self.assertEqual(h.previous_sibling.level, 1) - self.assertNotEqual(h.previous_sibling.previous_sibling, None) - self.assertEqual(h.previous_sibling.previous_sibling.level, 1) - self.assertEqual(h.previous_sibling.previous_sibling.previous_sibling, - None) - - vim.current.window.cursor = (77, 0) - h = self.document.current_heading() - self.assertEqual(h, None) - -class VimBufferTagsTestCase(unittest.TestCase): - def setUp(self): - global counter - counter += 1 - vim.CMDHISTORY = [] - vim.CMDRESULTS = {} - vim.EVALHISTORY = [] - vim.EVALRESULTS = { - # no org_todo_keywords for b - u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'), - # global values for org_todo_keywords - u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'), - u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), - u_encode(u'DONE'), u_encode(u'|')], - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("*repeat#set()")'): u_encode(u'0'), - u_encode(u'b:changedtick'): u_encode(u'0'), - u_encode(u'&ts'): u_encode(u'8'), - u_encode(u'exists("g:org_tag_column")'): u_encode(u'0'), - u_encode(u'exists("b:org_tag_column")'): u_encode(u'0'), - u_encode(u"v:count"): u_encode(u'0')} - vim.current.buffer[:] = [ u_encode(i) for i in u"""#Meta information -#more meta information -* Überschrift 1 :testtag: -Text 1 - -Bla bla -** Überschrift 1.1 :multi:tags: -Text 2 - -Bla Bla bla -** Überschrift 1.2:notag: -Text 3 - -**** Überschrift 1.2.1.falsch :no tag: - -Bla Bla bla bla -*** Überschrift 1.2.1 :no tag -*** Überschrift 1.2.2 no tag: -* Überschrift 2 :more:tags: -* Überschrift 3 :lesser:tag: - asdf sdf -* Überschrift 4 super long long long long long long long long extremely long title :title:long: -* TODO Überschrift 5 super long long long long long long long long extremely long title :title_with_todo: -* oneword :with:tags: -* :noword:with:tags: -* TODO :todo:with:tags: -""".split(u'\n') ] - self.document = VimBuffer().init_dom() - - def test_tag_read_no_word_with_tags(self): - self.assertEqual(len(self.document.headings[6].tags), 3) - self.assertEqual(self.document.headings[6].tags[0], u'noword') - self.assertEqual(self.document.headings[6].title, u'') - self.assertEqual(self.document.headings[6].todo, None) - - def test_tag_read_one_word_with_tags(self): - self.assertEqual(len(self.document.headings[5].tags), 2) - self.assertEqual(self.document.headings[5].tags[0], u'with') - self.assertEqual(self.document.headings[5].title, u'oneword') - self.assertEqual(self.document.headings[5].todo, None) - - def test_tag_read_TODO_with_tags(self): - self.assertEqual(len(self.document.headings[7].tags), 3) - self.assertEqual(self.document.headings[7].tags[0], u'todo') - self.assertEqual(self.document.headings[7].title, u'') - self.assertEqual(self.document.headings[7].todo, u'TODO') - - def test_tag_read_one(self): - self.assertEqual(len(self.document.headings[0].tags), 1) - self.assertEqual(self.document.headings[0].tags[0], u'testtag') - self.assertEqual(unicode(self.document.headings[0]), u'* Überschrift 1 :testtag:') - - def test_tag_read_multiple(self): - self.assertEqual(len(self.document.headings[0].children[0].tags), 2) - self.assertEqual(self.document.headings[0].children[0].tags, [u'multi', 'tags']) - self.assertEqual(unicode(self.document.headings[0].children[0]), u'** Überschrift 1.1 :multi:tags:') - - def test_tag_no_tags(self): - self.assertEqual(len(self.document.headings[0].children[1].children), 3) - self.assertEqual(len(self.document.headings[0].children[1].tags), 0) - self.assertEqual(len(self.document.headings[0].children[1].children[0].tags), 0) - self.assertEqual(len(self.document.headings[0].children[1].children[1].tags), 0) - self.assertEqual(len(self.document.headings[0].children[1].children[2].tags), 0) - - def test_tag_read_space_and_tab_separated(self): - self.assertEqual(len(self.document.headings[1].children), 0) - self.assertEqual(len(self.document.headings[1].tags), 2) - self.assertEqual(self.document.headings[1].tags, [u'more', u'tags']) - - def test_tag_read_tab_separated(self): - self.assertEqual(len(self.document.headings[2].children), 0) - self.assertEqual(len(self.document.headings[2].tags), 2) - self.assertEqual(self.document.headings[2].tags, [u'lesser', u'tag']) - - def test_tag_read_long_title(self): - self.assertEqual(len(self.document.headings[3].children), 0) - self.assertEqual(len(self.document.headings[3].tags), 2) - self.assertEqual(self.document.headings[3].tags, [u'title', u'long']) - self.assertEqual(unicode(self.document.headings[3]), u'* Überschrift 4 super long long long long long long long long extremely long title :title:long:') - - def test_tag_read_long_title_plus_todo_state(self): - self.assertEqual(len(self.document.headings[4].children), 0) - self.assertEqual(len(self.document.headings[4].tags), 1) - self.assertEqual(self.document.headings[4].level, 1) - self.assertEqual(self.document.headings[4].todo, u'TODO') - self.assertEqual(self.document.headings[4].title, u'Überschrift 5 super long long long long long long long long extremely long title') - self.assertEqual(self.document.headings[4].tags, [u'title_with_todo']) - self.assertEqual(unicode(self.document.headings[4]), u'* TODO Überschrift 5 super long long long long long long long long extremely long title :title_with_todo:') - - def test_tag_del_tags(self): - self.assertEqual(len(self.document.headings[0].tags), 1) - del self.document.headings[0].tags - self.assertEqual(len(self.document.headings[0].tags), 0) - self.assertEqual(self.document.headings[0].is_dirty_heading, True) - self.assertEqual(self.document.headings[0].is_dirty_body, False) - self.assertEqual(unicode(self.document.headings[0]), u'* Überschrift 1') - self.assertEqual(self.document.write(), True) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(len(d.headings[0].tags), 0) - self.assertEqual(d.headings[0].title, u'Überschrift 1') - self.assertEqual(unicode(d.headings[0]), u'* Überschrift 1') - - def test_tag_replace_one_tag(self): - self.assertEqual(len(self.document.headings[0].tags), 1) - self.document.headings[0].tags = [u'justonetag'] - self.assertEqual(len(self.document.headings[0].tags), 1) - self.assertEqual(self.document.headings[0].is_dirty_heading, True) - self.assertEqual(self.document.headings[0].is_dirty_body, False) - self.assertEqual(unicode(self.document.headings[0]), u'* Überschrift 1 :justonetag:') - self.assertEqual(self.document.write(), True) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(len(d.headings[0].tags), 1) - self.assertEqual(d.headings[0].tags, [u'justonetag']) - self.assertEqual(d.headings[0].title, u'Überschrift 1') - self.assertEqual(unicode(d.headings[0]), u'* Überschrift 1 :justonetag:') - - def test_tag_replace_multiple_tags(self): - self.assertEqual(len(self.document.headings[1].tags), 2) - self.document.headings[1].tags = [u'justonetag', u'moretags', u'lesstags'] - self.assertEqual(len(self.document.headings[1].tags), 3) - self.assertEqual(self.document.headings[1].is_dirty_heading, True) - self.assertEqual(self.document.headings[1].is_dirty_body, False) - self.assertEqual(unicode(self.document.headings[1]), u'* Überschrift 2 :justonetag:moretags:lesstags:') - self.assertEqual(self.document.write(), True) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(len(d.headings[1].tags), 3) - self.assertEqual(d.headings[1].tags, [u'justonetag', u'moretags', u'lesstags']) - self.assertEqual(d.headings[1].title, u'Überschrift 2') - self.assertEqual(unicode(d.headings[1]), u'* Überschrift 2 :justonetag:moretags:lesstags:') - -class VimBufferTodoTestCase(unittest.TestCase): - def setUp(self): - global counter - counter += 1 - vim.CMDHISTORY = [] - vim.CMDRESULTS = {} - vim.EVALHISTORY = [] - vim.EVALRESULTS = { - # no org_todo_keywords for b - u_encode(u'exists("b:org_todo_keywords")'): u_encode('0'), - # global values for org_todo_keywords - u_encode(u'exists("g:org_todo_keywords")'): u_encode('1'), - u_encode(u'g:org_todo_keywords'): [u_encode(u'TODO'), \ - u_encode(u'DONß'), u_encode(u'DONÉ'), \ - u_encode(u'DÖNE'), u_encode(u'WAITING'), \ - u_encode(u'DONE'), u_encode(u'|')], - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("g:org_debug")'): u_encode(u'0'), - u_encode(u'exists("*repeat#set()")'): u_encode(u'0'), - u_encode(u'b:changedtick'): u_encode(u'0'), - u_encode(u'&ts'): u_encode(u'8'), - u_encode(u'exists("g:org_tag_column")'): u_encode(u'0'), - u_encode(u'exists("b:org_tag_column")'): u_encode(u'0'), - u_encode(u"v:count"): u_encode(u'0')} - vim.current.buffer[:] = [ u_encode(i) for i in u"""#Meta information -#more meta information -* TODO Überschrift 1 :testtag: -Text 1 - -Bla bla -** TODO NOTODO Überschrift 1.1 :multi:tags: -Text 2 - -Bla Bla bla -** NO-TODO Überschrift 1.2:notag: -Text 3 - -**** NOTODOÜberschrift 1.2.1.falsch :no tag: - -Bla Bla bla bla -*** notodo Überschrift 1.2.1 :no tag -*** NOTODo Überschrift 1.2.2 no tag: -* WAITING Überschrift 2 :more:tags: -* DONE Überschrift 3 :lesser:tag: - asdf sdf -* DÖNE Überschrift 4 -* DONß Überschrift 5 -* DONÉ Überschrift 6 -* DONé Überschrift 7 -""".split(u'\n') ] - self.document = VimBuffer().init_dom() - - def test_no_space_after_upper_case_single_word_heading(self): - vim.current.buffer[:] = [ u_encode(i) for i in u""" -* TEST -** Text 1 -*** Text 2 -* Text 1 -** Text 1 - some text that is - no heading - -""".split(u'\n') ] - d = VimBuffer().init_dom() - self.assertEqual(unicode(d.headings[0]), u'* TEST') - - def test_todo_read_TODO(self): - self.assertEqual(self.document.headings[0].todo, u'TODO') - self.assertEqual(self.document.headings[0].title, u'Überschrift 1') - self.assertEqual(unicode(self.document.headings[0]), u'* TODO Überschrift 1 :testtag:') - - def test_todo_read_TODO_NOTODO(self): - self.assertEqual(self.document.headings[0].children[0].todo, u'TODO') - self.assertEqual(self.document.headings[0].children[0].title, u'NOTODO Überschrift 1.1') - self.assertEqual(unicode(self.document.headings[0].children[0]), u'** TODO NOTODO Überschrift 1.1 :multi:tags:') - - def test_todo_read_WAITING(self): - self.assertEqual(self.document.headings[1].todo, u'WAITING') - self.assertEqual(self.document.headings[1].title, u'Überschrift 2') - self.assertEqual(unicode(self.document.headings[1]), u'* WAITING Überschrift 2 :more:tags:') - - def test_todo_read_DONE(self): - self.assertEqual(self.document.headings[2].todo, u'DONE') - self.assertEqual(self.document.headings[2].title, u'Überschrift 3') - self.assertEqual(unicode(self.document.headings[2]), u'* DONE Überschrift 3 :lesser:tag:') - - def test_todo_read_special(self): - self.assertEqual(self.document.headings[3].todo, u'DÖNE') - self.assertEqual(self.document.headings[3].title, u'Überschrift 4') - - self.assertEqual(self.document.headings[4].todo, u'DONß') - self.assertEqual(self.document.headings[4].title, u'Überschrift 5') - - self.assertEqual(self.document.headings[5].todo, u'DONÉ') - self.assertEqual(self.document.headings[5].title, u'Überschrift 6') - - self.assertEqual(self.document.headings[6].todo, None) - self.assertEqual(self.document.headings[6].title, u'DONé Überschrift 7') - - def test_todo_del_todo(self): - self.assertEqual(self.document.headings[0].todo, u'TODO') - del self.document.headings[0].todo - self.assertEqual(self.document.headings[0].is_dirty_body, False) - self.assertEqual(self.document.headings[0].is_dirty_heading, True) - self.assertEqual(self.document.headings[0].todo, None) - self.assertEqual(self.document.headings[0].title, u'Überschrift 1') - self.assertEqual(unicode(self.document.headings[0]), u'* Überschrift 1 :testtag:') - self.assertEqual(self.document.write(), True) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(d.headings[0].todo, None) - self.assertEqual(d.headings[0].title, u'Überschrift 1') - self.assertEqual(unicode(d.headings[0]), u'* Überschrift 1 :testtag:') - - def test_todo_write_todo_uppercase(self): - self.assertEqual(self.document.headings[0].todo, u'TODO') - self.document.headings[0].todo = u'DONE' - self.assertEqual(self.document.headings[0].is_dirty_body, False) - self.assertEqual(self.document.headings[0].is_dirty_heading, True) - self.assertEqual(self.document.headings[0].todo, u'DONE') - self.assertEqual(self.document.headings[0].title, u'Überschrift 1') - self.assertEqual(unicode(self.document.headings[0]), u'* DONE Überschrift 1 :testtag:') - self.assertEqual(self.document.write(), True) - - # sanity check - d = VimBuffer().init_dom() - self.assertEqual(d.headings[0].todo, u'DONE') - self.assertEqual(d.headings[0].title, u'Überschrift 1') - self.assertEqual(unicode(d.headings[0]), u'* DONE Überschrift 1 :testtag:') - - def test_todo_set_illegal_todo(self): - def set_todo(todo): - self.document.headings[0].todo = todo - self.assertEqual(self.document.headings[0].todo, u'TODO') - self.assertRaises(ValueError, set_todo, u'DO NE') - self.assertRaises(ValueError, set_todo, u'DO\tNE') - self.assertRaises(ValueError, set_todo, u'D\nNE') - self.assertRaises(ValueError, set_todo, u'DO\rNE') - self.assertEqual(self.document.headings[0].todo, u'TODO') - -def suite(): - return ( \ - unittest.TestLoader().loadTestsFromTestCase(VimBufferTestCase), \ - unittest.TestLoader().loadTestsFromTestCase(VimBufferTagsTestCase), \ - unittest.TestLoader().loadTestsFromTestCase(VimBufferTodoTestCase), \ - ) diff --git a/pack/acp/start/vim-orgmode/tests/vim.py b/pack/acp/start/vim-orgmode/tests/vim.py deleted file mode 100644 index 95b6686..0000000 --- a/pack/acp/start/vim-orgmode/tests/vim.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*- - - -class VimWindow(object): - u""" Docstring for VimWindow """ - - def __init__(self, test): - object.__init__(self) - self._test = test - self.cursor = (1, 0) - - def buffer(): - def fget(self): - return self._test.buffer - - def fset(self, value): - self._test.buffer = value - return locals() - buffer = property(**buffer()) - - -class VimBuffer(list): - def __init__(self, iterable=None): - self.number = 0 - if iterable is not None: - list.__init__(self, iterable) - else: - list.__init__(self) - - def append(self, o): - u""" - mimic the specific behavior of vim.current.buffer - """ - if isinstance(o, list) or isinstance(o, tuple): - for i in o: - list.append(self, i) - else: - list.append(self, o) - - -class VimTest(object): - u""" Replacement for vim API """ - - def __init__(self): - object.__init__(self) - self._buffer = VimBuffer() - self.window = VimWindow(self) - - def buffer(): - def fget(self): - return self._buffer - - def fset(self, value): - self._buffer = VimBuffer(value) - return locals() - buffer = property(**buffer()) - - -EVALHISTORY = [] -EVALRESULTS = { - u'exists("g:org_debug")': 0, - u'exists("b:org_debug")': 0, - u'exists("*repeat#set()")': 0, - u'exists("b:org_plugins")': 0, - u'exists("g:org_plugins")': 0, - u'b:changedtick': 0, - } - - -def eval(cmd): - u""" evaluate command - - :returns: results stored in EVALRESULTS - """ - EVALHISTORY.append(cmd) - return EVALRESULTS.get(cmd, None) - - -CMDHISTORY = [] -CMDRESULTS = {} - - -def command(cmd): - CMDHISTORY.append(cmd) - return CMDRESULTS.get(cmd, None) - - -current = VimTest() diff --git a/pack/acp/start/vimoutliner/.gitignore b/pack/acp/start/vimoutliner/.gitignore deleted file mode 100644 index fdc5844..0000000 --- a/pack/acp/start/vimoutliner/.gitignore +++ /dev/null @@ -1,16 +0,0 @@ -# Vim -*.sw? -*.un? -tags - -# archives -*.zip -*.gz -*.gzip - -# osx noise -.DS_Store - -# Python -*.pyc -*~ diff --git a/pack/acp/start/vimoutliner/CHANGELOG b/pack/acp/start/vimoutliner/CHANGELOG deleted file mode 100644 index 3b52f7d..0000000 --- a/pack/acp/start/vimoutliner/CHANGELOG +++ /dev/null @@ -1,1556 +0,0 @@ -CHANGELOG - - -Version 0.4.0 -Updated 2014-10-19 - * Additions/Changes: - - Added a list-based tags feature similar to org-mode - - Complete rewrite of the outline math plugin. - - Added colorscheme option to vimoutlinerrc and directory - - Modified to install.sh to: 1. Turn off backup functionality. - 2. Remove old backup clutter. 3. Remove old vo_base.vim files from - syntax, ftdetect and ftpluginAdd VimOutliner icons to the repository. - - Updated TODO.otl - - Move README.detailed to doc/votl.txt to make Pathogen working. - - Added information on pathogen installation to INSTALL file. - - Added syntax conceal for math equations. Concealed equations appear - as µ - - Add VimOutliner icons to the repository - - Add votl_maketags manpage - * Bug fixes: - - Small corrections and updates - - Removed unnecessary reserved mappings - - doc/votl_readme.txt is just a copy of old votl.txt, removed it. - - Fix for user-defined <localleader> for command mappings. - - Moved loading of .vimoutlinerrc to before key mappings, other fixes - - Update in install.sh so that it installs vimoutlinerrc correctly. - - Correct votl_cheatsheet so that it is installed with helptags. - - Gramatical and stylistic corrections. - - Remove all remainders of localleader munging. - - Removed vimball install instructions from INSTALL and README files. - - Fix Help links - - Fix FSF address - - -Version 0.3.7 -Released 2014-04-05 - * Additions/Changes: - - Added new hoisting plugin. - - Added new tags plugin. - - Add weighted checkboxes. - - Now checkboxes calculations will ignore dash ([-]) marked items. - - Added new math plugin. - - Merged new clock plugin. - - Added new format plugin. - - Added new gtd plugin. - - Added updated smart_paste plugin. - - Added otl2latex script with files. - - New file type naming convention: vo_base to votl. - - Color fixes and updates. - - Updated vimoutlinerrc with more options for new plugins. - - Moved previous hoist plugin to prev directory, - - Made new TODO list - - Uploaded MediaWiki2otl script. - - Updated documentation. - * Bug fixes: - - Stop setting global options. - - Fixed checkboxes calculation to make it faster and more consistent. - - Strtime fix in vo_base.vim - - Corrections to READNE.detailed, readme, INSTALL and cheatsheet files. - - Corrections to install.sh. - - Replaced len() so it works with multibyte chars. - -Version 0.3.6 -Released 2011-05-09 - * Additions/Changes: - - Added updated comments and information to the user in the INSTALL - file. - - Added comments and information to the user in install.sh to align - with the new version. - - Added new light version of README and moved the more extensive file - to README.detailed - - Several updates and additions to the README, README.detailed and - doc/vo_readme.txt file. - * Bug fixes: - - Source only the first vimoutlinerrc found. - - Do not echo mappings. - - Fixed typo and updated reference in install.sh. - - Fixed several typos and updated reference in the - ftplugin/vo_base.vim - - Fixed typos and removed outdated references in the vo_hoist.otl and - vo_hoist.vim files. - - Fixed typos and removed outdated references in the vo_checkbox.otl - file. - - Fixed two mappings for sourcing rc file and writing file in - ftplugin/vo_base.vim. - - Fixed typos in colors/vo_base.vim - - Fixed errors when g:vo_modules_load is not defined, also updated the - plugin loading process to use lists. - -Version 0.3.5 -Released 2011-03-20 - * Additions/Changes: - - Moved all files inside $HOME/.vim. - - Added a cheat sheet to the documentation. - - Added smart-paste plugin. - - Added and updated post-processor scripts: - · fs2otl - · Node.pm - · otl2aft.awk - · otl2docbook.pl - · otl2html.py - · otl2lyx.awk - · otl2ooimpress.py - · otl2table.py - · otl2tags.py - · otlgrep.py - · otlhead.sh - · otlsplit.py - · otltail.sh - · otl_handler - · outline_calendar - · outline_freemind - · vo_maketags.pl - - Added syntax support for _ilink_. - - Hoist plugin disabled by default. - - Layout of vo_readme.txt made more similar to Vim help. - * Bug fixes: - - ,,S did not work. Fixed - -Version 0.3.4 -Released - * Additions/changes: - - added ,,cp as an alias to ,,c% - - Color schemes have been added - - Checkboxes and hoisting default to 'on' - - Modified ,,cb and ,,c% (and ,,cp) to work only on headings - - Fixed the ,,cz command to make the correct call - - Added descriptions of VO objects to help (headings, text, tables, - etc.) - * Bug fixes: - - W18 errors have been fixed - -============================================================================= -RCS file: /root/VimOutliner/VimOutliner/INSTALL,v -Working file: INSTALL -head: 1.2 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 2; selected revisions: 2 -description: ----------------------------- -revision 1.2 -date: 2004-11-27 19:30:43 +0000; author: noel; state: Exp; lines: +2 -2 - -Minor syntax and installation adjustments. -Change to vo_checkbox to fix a typo. ----------------------------- -revision 1.1 -date: 2004-02-17 22:00:15 +0000; author: noel; state: Exp; -These files are only in cvs for backup purposes. They should be extracted -from vo_readme.txt and never edited themselves: - INSTALL - LICENSE - VERSION -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/Attic/INSTALL.TXT,v -Working file: INSTALL.TXT -head: 1.3 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 3; selected revisions: 3 -description: -Quick installation instructions for developers. ----------------------------- -revision 1.3 -date: 2003-06-20 14:13:15 +0000; author: noel; state: dead; lines: +0 -0 -Final documentation tweaks for the final 0.3.0 release. ----------------------------- -revision 1.2 -date: 2003-06-18 13:50:55 +0000; author: noel; state: Exp; lines: +1 -1 -Modified the installation title. ----------------------------- -revision 1.1 -date: 2003-03-20 22:56:49 +0000; author: noel; state: Exp; -Initial revision -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/LICENSE,v -Working file: LICENSE -head: 1.2 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 2; selected revisions: 2 -description: ----------------------------- -revision 1.2 -date: 2004-11-27 19:30:43 +0000; author: noel; state: Exp; lines: +4 -2 - -Minor syntax and installation adjustments. -Change to vo_checkbox to fix a typo. ----------------------------- -revision 1.1 -date: 2004-02-17 22:00:15 +0000; author: noel; state: Exp; -These files are only in cvs for backup purposes. They should be extracted -from vo_readme.txt and never edited themselves: - INSTALL - LICENSE - VERSION -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/VERSION,v -Working file: VERSION -head: 1.4 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 4; selected revisions: 4 -description: ----------------------------- -revision 1.4 -date: 2005-06-07 17:48:50 +0000; author: noel; state: Exp; lines: +4 -0 -Updated to include help on VO objects. ----------------------------- -revision 1.3 -date: 2005-06-07 17:41:42 +0000; author: noel; state: Exp; lines: +10 -10 -Updated version. ----------------------------- -revision 1.2 -date: 2004-11-27 19:30:43 +0000; author: noel; state: Exp; lines: +9 -14 - -Minor syntax and installation adjustments. -Change to vo_checkbox to fix a typo. ----------------------------- -revision 1.1 -date: 2004-02-17 22:00:15 +0000; author: noel; state: Exp; -These files are only in cvs for backup purposes. They should be extracted -from vo_readme.txt and never edited themselves: - INSTALL - LICENSE - VERSION -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/install.sh,v -Working file: install.sh -head: 1.3 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 3; selected revisions: 3 -description: ----------------------------- -revision 1.3 -date: 2005-06-06 18:42:29 +0000; author: noel; state: Exp; lines: +3 -0 -Added support for color schemes. ----------------------------- -revision 1.2 -date: 2004-11-27 19:30:43 +0000; author: noel; state: Exp; lines: +2 -2 - -Minor syntax and installation adjustments. -Change to vo_checkbox to fix a typo. ----------------------------- -revision 1.1 -date: 2004-05-02 19:03:01 +0000; author: noel; state: Exp; -Added to the distro. -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/vimoutlinerrc,v -Working file: vimoutlinerrc -head: 1.6 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 6; selected revisions: 6 -description: ----------------------------- -revision 1.6 -date: 2005-06-07 12:39:01 +0000; author: noel; state: Exp; lines: +9 -78 -Enabled checkboxes and hoisting by default. -Added Vim colorscheme support. ----------------------------- -revision 1.5 -date: 2005-01-19 15:06:20 +0000; author: noel; state: Exp; lines: +4 -3 -Fixed another W18 error. -Enabled hoisting and checkboxes by default. ----------------------------- -revision 1.4 -date: 2004-05-24 15:56:34 +0000; author: noel; state: Exp; lines: +45 -0 -Added highlighting and folding support for: - Tables (marked with '|') - User-defined, wrapping text (marked with '>') - User-defined, non-wrapping text (marked with '<') ----------------------------- -revision 1.3 -date: 2004-05-17 17:27:55 +0000; author: noel; state: Exp; lines: +2 -2 -Fixed plugin loaders for checkboxes and hoisting. ----------------------------- -revision 1.2 -date: 2004-03-18 13:23:53 +0000; author: noel; state: Exp; lines: +1 -0 -Added a line to change the background. ----------------------------- -revision 1.1 -date: 2004-02-17 21:50:36 +0000; author: noel; state: Exp; -This file will be provided from now on to make it easy for people -to customize their settings. The install process will rename this file -to .vimoutlinerrc and put it into the user's home directory. -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/Attic/vo_INSTALL.TXT,v -Working file: vo_INSTALL.TXT -head: 1.2 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 2; selected revisions: 2 -description: ----------------------------- -revision 1.2 -date: 2005-06-07 17:24:05 +0000; author: noel; state: dead; lines: +0 -0 -*** empty log message *** ----------------------------- -revision 1.1 -date: 2003-06-26 19:52:07 +0000; author: noel; state: Exp; -Initial add to VimOutliner -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/Attic/vo_README.otl,v -Working file: vo_README.otl -head: 1.4 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 4; selected revisions: 4 -description: ----------------------------- -revision 1.4 -date: 2005-06-07 17:24:05 +0000; author: noel; state: dead; lines: +0 -0 -*** empty log message *** ----------------------------- -revision 1.3 -date: 2003-10-17 02:17:07 +0000; author: noel; state: Exp; lines: +2 -2 -Changed version numbers. ----------------------------- -revision 1.2 -date: 2003-06-20 14:13:15 +0000; author: noel; state: Exp; lines: +4 -41 -Final documentation tweaks for the final 0.3.0 release. ----------------------------- -revision 1.1 -date: 2003-06-18 13:55:03 +0000; author: noel; state: Exp; -Added this documentation to Vim Outliner. -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/add-ons/plugins/vo_checkbox.otl,v -Working file: add-ons/plugins/vo_checkbox.otl -head: 1.3 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 3; selected revisions: 3 -description: ----------------------------- -revision 1.3 -date: 2004-11-27 19:30:43 +0000; author: noel; state: Exp; lines: +12 -8 - -Minor syntax and installation adjustments. -Change to vo_checkbox to fix a typo. ----------------------------- -revision 1.2 -date: 2004-05-17 15:57:58 +0000; author: noel; state: Exp; lines: +6 -0 -Modified documentation to match current version. ----------------------------- -revision 1.1 -date: 2003-10-23 22:13:00 +0000; author: noel; state: Exp; -Instructions for vo_checkbox.vim -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/add-ons/plugins/vo_checkbox.vim,v -Working file: add-ons/plugins/vo_checkbox.vim -head: 1.18 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 18; selected revisions: 18 -description: ----------------------------- -revision 1.18 -date: 2005-06-07 15:08:59 +0000; author: noel; state: Exp; lines: +12 -45 -Fixed a bug that added checkboxes to body text, preformatted body text, -tables, user-defined text and user-defined preformatted text lines. -Fixed a bug where ,,cb would modify terms like 'test%' or ',,c%'. Now -it only modifies this term: ' [0-9]*%'. ----------------------------- -revision 1.17 -date: 2005-06-07 13:53:22 +0000; author: noel; state: Exp; lines: +8 -2 -Added ,,cp. It is the same as ,,c% ----------------------------- -revision 1.16 -date: 2004-05-27 22:22:48 +0000; author: noel; state: Exp; lines: +24 -4 -Made ,,cd smart so it would try to delete non-existent checkboxes. -Fixed a recursion bug in NewHMD to branches with a single child would -be computed properly. ----------------------------- -revision 1.15 -date: 2004-05-27 18:11:53 +0000; author: noel; state: Exp; lines: +25 -5 -Added smart (only the entire tree in which the child exists), automatic -completion calculations to the ,,cx command. -Added smart (only for parents, not children) '%' sign insertion for -,,c%. ----------------------------- -revision 1.14 -date: 2004-05-17 15:53:38 +0000; author: noel; state: Exp; lines: +13 -7 -Modified SwitchBox() to be more selective. ----------------------------- -revision 1.13 -date: 2004-05-17 15:43:23 +0000; author: noel; state: Exp; lines: +7 -3 -Fixed a broken key mapping: ,,c%. ----------------------------- -revision 1.12 -date: 2004-02-23 12:19:27 +0000; author: noel; state: Exp; lines: +26 -9 -Fixed Up-to-date problem. -Fixed 'Safely script names'. ----------------------------- -revision 1.11 -date: 2003-09-05 16:37:55 +0000; author: cepl; state: Exp; lines: +41 -2 -Added ,cp binding for the new function InsertCheckBoxPerCent, -which adds not only the checkbox but also percentage sign. ----------------------------- -revision 1.10 -date: 2003-08-23 16:42:15 +0000; author: noel; state: Exp; lines: +18 -17 -Modified completion percentages to be recursive. -This: -[_] 0% Project - [_] 33% Task - [_] Subtask - [X] Subtask - [X] Subtask - [_] 0% Task - [_] Subtask - [_] 50% Subtask - [X] Subsubtask - [_] Subsubtask - [X] Subsubtask - [_] Subsubtask - -Becomes this: -[_] 29% Project - [_] 33% Task - [_] Subtask - [X] Subtask - [X] Subtask - [_] 25% Task - [_] Subtask - [_] 50% Subtask - [X] Subsubtask - [_] Subsubtask - [X] Subsubtask - [_] Subsubtask ----------------------------- -revision 1.9 -date: 2003-08-16 13:49:53 +0000; author: noel; state: Exp; lines: +9 -7 -added ! to functions. ----------------------------- -revision 1.8 -date: 2003-08-11 19:16:28 +0000; author: noel; state: Exp; lines: +30 -5 -Fixed a bug in which any line that contained the letter x was counted as -completed. ----------------------------- -revision 1.7 -date: 2003-08-03 23:56:46 +0000; author: noel; state: Exp; lines: +89 -40 - -Replaced HowManyDone() with a new routine. The new routine is recursive, -ignores headings that don't have checkboxes and does not care what the -current folding states of the parent or children are. The heading at the -top of the tree does not even need to have a checkbox. This will work: - -Projects - [_] Software - [_] Input - [_] Processing - [_] Math - [_] Database - [_] Networking - [_] Output - [_] Hardware - [_] Keyboard - [_] Harddisk - [_] Processor - [_] Printer - -One only needs to ,,cx on Projects to update everything (everything shown). -As before, including a % on a parent heading with childred, will be replaced -with a percentage of completion. Nice work Matej! ----------------------------- -revision 1.6 -date: 2003-07-14 00:36:57 +0000; author: noel; state: Exp; lines: +9 -5 -Changed [x] to [X] to make it look more full. If the consensus is -[x], I'll gladly put it back. ----------------------------- -revision 1.5 -date: 2003-07-10 16:29:50 +0000; author: cepl; state: Exp; lines: +75 -3 -Calculation of the subtree completion added. The very first alpha -draft. ----------------------------- -revision 1.4 -date: 2003-07-08 23:48:43 +0000; author: noel; state: Exp; lines: +6 -3 -Fixed a bug in <localleader>cd. It used to only delete unchecked boxes. -Now it does both. ----------------------------- -revision 1.3 -date: 2003-07-07 14:17:04 +0000; author: noel; state: Exp; lines: +11 -6 -Fixed the folding of the new headers. ----------------------------- -revision 1.2 -date: 2003-07-07 14:14:02 +0000; author: noel; state: Exp; lines: +24 -0 -Added appropriate headers. ----------------------------- -revision 1.1 -date: 2003-07-07 13:52:45 +0000; author: noel; state: Exp; -Changed checkbox.vim to vo_checkbox.vim -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/add-ons/plugins/vo_hoist.otl,v -Working file: add-ons/plugins/vo_hoist.otl -head: 1.1 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 1; selected revisions: 1 -description: ----------------------------- -revision 1.1 -date: 2003-10-23 22:12:20 +0000; author: noel; state: Exp; -Instructions for vo_hoist.vim. -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/add-ons/plugins/vo_hoist.vim,v -Working file: add-ons/plugins/vo_hoist.vim -head: 1.9 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 9; selected revisions: 9 -description: ----------------------------- -revision 1.9 -date: 2003-11-12 17:26:09 +0000; author: noel; state: Exp; lines: +6 -2 -Added a command to place the cursor on the first line of -a hoisted outline. ----------------------------- -revision 1.8 -date: 2003-11-12 17:10:51 +0000; author: noel; state: Exp; lines: +9 -3 -Fixed a bug that occurs on a level 1 heading with no children. ----------------------------- -revision 1.7 -date: 2003-10-23 22:14:14 +0000; author: noel; state: Exp; lines: +13 -5 -Minor changes to DeHoist() to compensate for current foldlevel settings. ----------------------------- -revision 1.6 -date: 2003-08-17 15:35:24 +0000; author: noel; state: Exp; lines: +10 -9 -Put the new mappings in the correct place this time. -Added a : and <cr> to the ZZ command. ----------------------------- -revision 1.5 -date: 2003-08-17 14:47:42 +0000; author: noel; state: Exp; lines: +8 -2 -Added ZZ, qa, and x to the list of commands that de-hoist the current -outline. ----------------------------- -revision 1.4 -date: 2003-08-17 00:07:31 +0000; author: noel; state: Exp; lines: +13 -10 -Added "silent" to commands generating tedious messages. ----------------------------- -revision 1.3 -date: 2003-08-16 20:08:06 +0000; author: noel; state: Exp; lines: +11 -6 -Removed a need to exclude fold level 1 headings. ----------------------------- -revision 1.2 -date: 2003-08-16 19:02:44 +0000; author: noel; state: Exp; lines: +84 -31 -First fully functional version. May need some tweaks but it works and is -quite easy to use. ----------------------------- -revision 1.1 -date: 2003-08-14 21:05:05 +0000; author: noel; state: Exp; -First publicly available, experiment verison -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/colors/vo_dark.vim,v -Working file: colors/vo_dark.vim -head: 1.2 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 2; selected revisions: 2 -description: ----------------------------- -revision 1.2 -date: 2005-06-07 15:24:30 +0000; author: noel; state: Exp; lines: +1 -1 -The color darkyellow does not appear to exist on some systems. This color -has been changed to darkred. ----------------------------- -revision 1.1 -date: 2005-06-06 18:45:11 +0000; author: noel; state: Exp; -These are the new color scheme files. -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/colors/vo_light.vim,v -Working file: colors/vo_light.vim -head: 1.2 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 2; selected revisions: 2 -description: ----------------------------- -revision 1.2 -date: 2005-06-07 15:24:30 +0000; author: noel; state: Exp; lines: +3 -3 -The color darkyellow does not appear to exist on some systems. This color -has been changed to darkred. ----------------------------- -revision 1.1 -date: 2005-06-06 18:45:11 +0000; author: noel; state: Exp; -These are the new color scheme files. -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/doc/vo_readme.txt,v -Working file: doc/vo_readme.txt -head: 1.9 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 9; selected revisions: 9 -description: ----------------------------- -revision 1.9 -date: 2005-06-07 17:48:21 +0000; author: noel; state: Exp; lines: +4 -0 -Added a better VERSION description. ----------------------------- -revision 1.8 -date: 2005-06-07 16:44:58 +0000; author: noel; state: Exp; lines: +294 -150 -Added a section about VO objects. -Added the ,,cp command. ----------------------------- -revision 1.7 -date: 2004-05-28 15:28:47 +0000; author: noel; state: Exp; lines: +274 -28 -Added complete help for vo_checkbox.vim. ----------------------------- -revision 1.6 -date: 2004-05-17 17:16:28 +0000; author: noel; state: Exp; lines: +1 -1 -Changed 0.3.2 to 0.3.3 in the tite. ----------------------------- -revision 1.5 -date: 2004-05-17 15:21:25 +0000; author: noel; state: Exp; lines: +75 -69 -Modified to reflecte 0.3.3 changes. ----------------------------- -revision 1.4 -date: 2004-02-17 21:52:41 +0000; author: noel; state: Exp; lines: +263 -111 -Modified heavily by Stefan Schiedl for 0.3.2. ----------------------------- -revision 1.3 -date: 2003-10-17 02:18:07 +0000; author: noel; state: Exp; lines: +44 -7 -Changed version numbers. ----------------------------- -revision 1.2 -date: 2003-06-20 14:13:15 +0000; author: noel; state: Exp; lines: +5 -42 -Final documentation tweaks for the final 0.3.0 release. ----------------------------- -revision 1.1 -date: 2003-06-18 13:55:03 +0000; author: noel; state: Exp; -Added this documentation to Vim Outliner. -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/experimental/Attic/checkbox.vim,v -Working file: experimental/checkbox.vim -head: 1.2 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 2; selected revisions: 2 -description: ----------------------------- -revision 1.2 -date: 2003-07-07 13:52:45 +0000; author: noel; state: dead; lines: +0 -0 -Changed checkbox.vim to vo_checkbox.vim ----------------------------- -revision 1.1 -date: 2003-07-07 01:22:35 +0000; author: noel; state: Exp; -Initial experimental version of checkboxes. -Contains only one function and two mappings. -The only capabilities are to add and delete check boxes from -the beginnings of headings. -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/filetype/Attic/filetype.vim,v -Working file: filetype/filetype.vim -head: 1.5 -branch: -locks: strict -access list: -symbolic names: - arelease: 1.1.1.1 - avendor: 1.1.1 - testfork: 1.3.0.2 -keyword substitution: kv -total revisions: 6; selected revisions: 6 -description: -VimOutliner filetype.vim ----------------------------- -revision 1.5 -date: 2005-06-07 17:26:52 +0000; author: noel; state: dead; lines: +5 -2 -*** empty log message *** ----------------------------- -revision 1.4 -date: 2003-03-01 17:37:17 +0000; author: noel; state: Exp; lines: +6 -3 -Changed the filetype name to our new standard: vo_base ----------------------------- -revision 1.3 -date: 2003-02-14 17:49:43 +0000; author: noel; state: Exp; lines: +6 -4 -Removed unnecessary filetype commands ----------------------------- -revision 1.2 -date: 2003-02-09 15:07:35 +0000; author: noel; state: Exp; lines: +8 -7 -Changed the auto commands. Setting the "filetype plugin indent on" -option here does not work with ftplugins. ----------------------------- -revision 1.1 -date: 2003-02-08 21:11:26 +0000; author: noel; state: Exp; -branches: 1.1.1; -Initial revision ----------------------------- -revision 1.1.1.1 -date: 2003-03-20 22:35:15 +0000; author: noel; state: Exp; lines: +17 -8 -no message -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/filetype/vo_base.vim,v -Working file: filetype/vo_base.vim -head: 1.1 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 1; selected revisions: 1 -description: ----------------------------- -revision 1.1 -date: 2005-01-19 16:12:37 +0000; author: noel; state: Exp; -Finally added to CVS. -Don't know how I missed this one. -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/ftplugin/vo_base.vim,v -Working file: ftplugin/vo_base.vim -head: 2.59 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 59; selected revisions: 59 -description: -Vim Outliner Main Program File ----------------------------- -revision 2.59 -date: 2005-06-07 19:50:45 +0000; author: noel; state: Exp; lines: +2 -1 -Re-removed the did_filetype() function. Restored the original variable-based -solution. ----------------------------- -revision 2.58 -date: 2005-06-07 12:47:38 +0000; author: noel; state: Exp; lines: +1 -2 -Modified switch that prevents the filetype from being loaded more than once. ----------------------------- -revision 2.57 -date: 2004-05-24 22:31:11 +0000; author: noel; state: Exp; lines: +0 -6 -Removed a redundant PreformattedBodyText() function. ----------------------------- -revision 2.56 -date: 2004-05-24 15:56:34 +0000; author: noel; state: Exp; lines: +78 -0 -Added highlighting and folding support for: - Tables (marked with '|') - User-defined, wrapping text (marked with '>') - User-defined, non-wrapping text (marked with '<') ----------------------------- -revision 2.55 -date: 2004-05-17 15:18:20 +0000; author: noel; state: Exp; lines: +20 -1 -Added Steve Litt's simple executable lines. ----------------------------- -revision 2.54 -date: 2004-05-17 14:18:27 +0000; author: noel; state: Exp; lines: +41 -16 -Replaced system calls to 'date' with strftime(). -Modified the time- and date-stamp functions. -normal <localleader>t append the time to the current heading -normal <localleader>T prepend the time to the current heading -insert <localleader>t insert the time at the cursor -normal <localleader>d append the date to the current heading -normal <localleader>D prepend the date to the current heading -insert <localleader>d insert the date at the cursor ----------------------------- -revision 2.53 -date: 2004-05-17 13:32:38 +0000; author: noel; state: Exp; lines: +2 -2 -Added <cr> to end of sort commands. ----------------------------- -revision 2.52 -date: 2004-05-17 13:30:12 +0000; author: noel; state: Exp; lines: +167 -2 -Added child-aware sorting functions. -Mapped <localleader>s to sort ascending. -Mapped <localleader>S to sort descending. ----------------------------- -revision 2.51 -date: 2004-03-18 13:25:46 +0000; author: noel; state: Exp; lines: +1 -1 -Fixed a mapping command for <localleader>w ----------------------------- -revision 2.50 -date: 2004-02-17 21:47:31 +0000; author: noel; state: Exp; lines: +0 -217 -Removed the detailed revision log. It's getting too big. From now on -'cvs log' will need to be used to see the log. ----------------------------- -revision 2.49 -date: 2003-10-17 01:37:10 +0000; author: noel; state: Exp; lines: +24 -10 -Fixed a minor folding issue. ----------------------------- -revision 2.48 -date: 2003-08-04 13:25:17 +0000; author: noel; state: Exp; lines: +37 -7 -Corrected a type for <localleader>w ----------------------------- -revision 2.47 -date: 2003-06-16 23:57:20 +0000; author: noel; state: Exp; lines: +7 -3 -Set UseSpaceColon=0. This is now the standard. ----------------------------- -revision 2.46 -date: 2003-06-04 11:54:25 +0000; author: noel; state: Exp; lines: +24 -6 -The behavior of the "d" and "t" commands have been improved and put into -functions. These commands are now mapped to call the improved functions. ----------------------------- -revision 2.45 -date: 2003-06-04 11:25:56 +0000; author: noel; state: Exp; lines: +12 -3 -Moved the modification to the tags path outside the "if" statement in -autocommands in ftplugin. Completely removed the line from syntax. ----------------------------- -revision 2.44 -date: 2003-05-27 13:33:34 +0000; author: noel; state: Exp; lines: +45 -29 -Added Vim style folds to both vo_base files to make them easier to read. -Added a mode line to the end of each to activate the folds. -Added a "Documentation" section that is mostly empty. This section will -eventually be extracted automatically to form the online help via Vim's -built-in help mechanisms. ----------------------------- -revision 2.43 -date: 2003-05-23 18:36:44 +0000; author: noel; state: Exp; lines: +7 -4 -More trouble with the ,,d function and retaining proper indentation. ----------------------------- -revision 2.42 -date: 2003-05-23 16:02:42 +0000; author: noel; state: Exp; lines: +8 -2 -Added tag file support for ~/.vimoutliner. ----------------------------- -revision 2.41 -date: 2003-05-23 13:55:25 +0000; author: noel; state: Exp; lines: +10 -6 -Modified the d and t commands. They did not work properly on closed folds. -Commented-out the d and t commands when in insert mode. I have not used them -and they don't work properly. ----------------------------- -revision 2.40 -date: 2003-05-17 23:29:25 +0000; author: noel; state: Exp; lines: +11 -6 -Modified date and time (,,d/,,t) to place date/time at beginning of -line instead of end of line to allow for sorting. ----------------------------- -revision 2.39 -date: 2003-05-17 22:49:26 +0000; author: noel; state: Exp; lines: +20 -16 -Changed ^M to <cr> in all occurrances. -Modified date (<leader>d) and time (<leader>t) to add date/time to end of -current line. ----------------------------- -revision 2.38 -date: 2003-03-05 17:58:22 +0000; author: cepl; state: Exp; lines: +6 -3 -Personal configuration file was not run from the user's $HOME directory. -Fixed. ----------------------------- -revision 2.37 -date: 2003-03-03 16:24:49 +0000; author: noel; state: Exp; lines: +6 -3 -Added ~/.vim and ~/.vimoutliner as places to look for tag files. ----------------------------- -revision 2.36 -date: 2003-03-01 17:37:41 +0000; author: noel; state: Exp; lines: +13 -5 -Changed the filetype name to our new standard: vo_base ----------------------------- -revision 2.35 -date: 2003-02-09 15:04:56 +0000; author: noel; state: Exp; lines: +70 -55 -Changed key mappings to be local to the current buffer only. They -will also be loaded for any subsequent .otl file. -Changed key mappings to use an easily modifiable leader. In this case -",,". -Changed the scope of some variables. They had a buffer scoping but now -have a function scope. ----------------------------- -revision 2.34 -date: 2003-02-08 22:07:47 +0000; author: noel; state: Exp; lines: +5 -63 -Removed spellfix functions. Perhaps I'll make them another plugin. ----------------------------- -revision 2.33 -date: 2003-02-08 21:31:01 +0000; author: noel; state: Exp; lines: +5 -116 -Split out syntax settings as Dillon originally showed. ----------------------------- -revision 2.32 -date: 2003-01-30 01:47:41 +0000; author: noel; state: Exp; lines: +6 -3 -modified switches sent to ispell to make it guess better. ----------------------------- -revision 2.31 -date: 2003-01-28 22:31:37 +0000; author: noel; state: Exp; lines: +6 -3 -Modified setlocal foldtext.... to set foldtext.... ----------------------------- -revision 2.30 -date: 2003-01-22 22:03:12 +0000; author: noel; state: Exp; lines: +8 -3 -Fixed bodytext folding method. ----------------------------- -revision 2.29 -date: 2003-01-21 00:18:50 +0000; author: noel; state: Exp; lines: +20 -7 -Fixed a problem with runtimepath. -Added a use_space_colon setting to that one can choose between bodytext -marked with a : or with a space-:. ----------------------------- -revision 2.28 -date: 2003-01-19 16:46:27 +0000; author: noel; state: Exp; lines: +11 -3 -Removed some strange escape characters from a revision comment. ----------------------------- -revision 2.27 -date: 2003-01-19 16:16:54 +0000; author: noel; state: Exp; lines: +101 -88 -Added detection of the color scheme and an alternative set of colors -for dark backgrounds. (well actually for non-"light" backgrounds) at -Dillon Jones' request. -Set the "current_syntax" at Dillon's request. -Modified the exe lines in the source to remove the debugging style I was -using. ----------------------------- -revision 2.26 -date: 2003-01-16 00:56:51 +0000; author: noel; state: Exp; lines: +26 -23 -Changed a bunch of set commands to setlocal commands at the -suggestion of Jeffrey Hood. Thanks, Jeffrey! ----------------------------- -revision 2.25 -date: 2003-01-13 17:05:08 +0000; author: noel; state: Exp; lines: +14 -11 -Fixed a problem with the new regex that define headings. ----------------------------- -revision 2.24 -date: 2003-01-12 19:08:32 +0000; author: noel; state: Exp; lines: +36 -25 -Converted from _ to : ----------------------------- -revision 2.23 -date: 2003-01-11 21:00:33 +0000; author: noel; state: Exp; lines: +55 -38 -Added Matej requirement for personalization settings via -.vimoutlinerrc. -Added Steve's style of bodytext that allows for wrapping and formatting -with have the headings wrap as well. It is currently set for "_" as -the bodytext marker. -Added ,,b to set all bodytext to Steve's style. -Added ,,B to set all bodytext to my style. This will also make it -possible for Steve's style to be quickly reformatted for pretty -printing with :ha. ----------------------------- -revision 2.22 -date: 2003-01-11 00:35:32 +0000; author: noel; state: Exp; lines: +7 -2 -[6~Added support for .vimoutlinerrc in both ~ and ~/.vimoutliner. ----------------------------- -revision 2.21 -date: 2002-12-12 13:38:58 +0000; author: noel; state: Exp; lines: +10 -3 -Fixed a spelling problem when words contain a '. ----------------------------- -revision 2.20 -date: 2002-12-11 23:33:16 +0000; author: noel; state: Exp; lines: +7 -3 -Removed a debug setting, again (sigh). -Added some iskeyword symbols so spell-check would work on things -like: don't ----------------------------- -revision 2.19 -date: 2002-12-11 22:55:19 +0000; author: noel; state: Exp; lines: +24 -11 -Fixed body text end error. I was checking for too specific a case. ----------------------------- -revision 2.18 -date: 2002-12-11 14:57:52 +0000; author: noel; state: Exp; lines: +7 -4 -Fixed wrapmargin setting and a line counter error during folding. ----------------------------- -revision 2.17 -date: 2002-12-11 00:42:47 +0000; author: noel; state: Exp; lines: +7 -3 -Removed a debug setting, again. ----------------------------- -revision 2.16 -date: 2002-12-10 22:21:09 +0000; author: noel; state: Exp; lines: +19 -14 -Moved body text up one tab level. It seems to be more intuitive -to others. ----------------------------- -revision 2.15 -date: 2002-12-10 19:24:13 +0000; author: noel; state: Exp; lines: +6 -2 -Added a function to auto-wrap lines. This could be a problem for entering long headings. ----------------------------- -revision 2.14 -date: 2002-12-10 18:11:13 +0000; author: noel; state: Exp; lines: +9 -3 -Removed a debug feature ----------------------------- -revision 2.13 -date: 2002-12-10 17:59:42 +0000; author: noel; state: Exp; lines: +45 -15 -Added bodytext. -Added bodytext folding. -Modified MyFoldText to show [TEXT] for folded bodytext. -Added an autocommand to re-sync the folding. ----------------------------- -revision 2.12 -date: 2002-12-09 18:16:49 +0000; author: noel; state: Exp; lines: +11 -4 -Fixed a typo and added an extra \ before & for adding upper cas3e -words. ----------------------------- -revision 2.11 -date: 2002-12-09 17:15:37 +0000; author: noel; state: Exp; lines: +13 -5 -Added ,,kA. -Swapped functions of ,,ka and ,,kA. - ,,ka add lowercase version of word to dictionary - ,,kA add word as it appears to dictionary ----------------------------- -revision 2.10 -date: 2002-12-09 17:08:47 +0000; author: noel; state: Exp; lines: +15 -8 -Fixed an error that occurs when there is just a single spelling checker. ----------------------------- -revision 2.9 -date: 2002-12-09 16:42:02 +0000; author: noel; state: Exp; lines: +13 -7 -Fixed error messages on searches with no matches. -This is part of the spell-check search. ----------------------------- -revision 2.8 -date: 2002-12-09 14:21:29 +0000; author: noel; state: Exp; lines: +11 -8 -Fixed spelling highlighting and and spelling searches so that only real matches are highlighed and possible to jump to with ,,kn and ,,kN (and n and N after -that). -Modified the "source" statement that load spellfix.vim. Spellfix.vim now -needs to be in ~/.vimoutliner. ----------------------------- -revision 2.7 -date: 2002-12-07 22:08:02 +0000; author: noel; state: Exp; lines: +30 -39 -finished integration of spellfix.vim ----------------------------- -revision 2.6 -date: 2002-12-07 16:46:47 +0000; author: noel; state: Exp; lines: +86 -6 -Added these commands to enhance the spelling checker - ,,kk speck-check document highlighting errors - ,,ka add the word under the cursor to the selected dictionary - ,,kn search forward to the next spelling error - N and n both work well with this - ,,kN search backward to the next spelling error - N and n both work well with this - ,,kq unhighlight the spelling errors ----------------------------- -revision 2.5 -date: 2002-11-27 22:54:28 +0000; author: noel; state: Exp; lines: +22 -16 -Changed date and time formats. -changed the mappings of ,,0-,,9 so that ,,1 corresponds to show only -1 level. ----------------------------- -revision 2.4 -date: 2002-11-26 00:36:08 +0000; author: noel; state: Exp; lines: +68 -62 -Added more comments. -Added Steve's GPL header. -Will keep the RCS info in my version but will remove it for -distribution. ----------------------------- -revision 2.3 -date: 2002-11-21 19:30:37 +0000; author: noel; state: Exp; lines: +21 -8 -Included a patchfile from Steve to: - move the if loaded behavior to a place in the file after the settings - add an if loaded behavior for the file extension autocommmand - added the nocindent setting - changed the ,,,, mapping - clear the indexexpr setting ----------------------------- -revision 2.2 -date: 2002-11-16 00:00:10 +0000; author: noel; state: Exp; lines: +215 -196 -Added more comments. -Switched the polarity of the if exists(loaded_outliner) function -Commented-out some experimental features. -Grouped the user preferences together and separated out the -VimOutliner operational settings. ----------------------------- -revision 2.1 -date: 2002-11-15 23:37:39 +0000; author: noel; state: Exp; -Version 2 Beta Candidate before pre-release modifications -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/otf/otf.vim,v -Working file: otf/otf.vim -head: 1.3 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 3; selected revisions: 3 -description: ----------------------------- -revision 1.3 -date: 2003-06-03 19:56:09 +0000; author: gabriel; state: Exp; lines: +2 -2 -changed bash function to perl,corrected file name error in otf.vi ----------------------------- -revision 1.2 -date: 2003-06-02 21:01:16 +0000; author: gabriel; state: Exp; lines: +9 -9 -created wishlist_demo.otl -changed output files of Createotl() in otf.vim so users need only a ~/bin directory ----------------------------- -revision 1.1 -date: 2003-06-01 13:16:32 +0000; author: gabriel; state: Exp; -new 'on the fly' files -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/otf/otfREADME,v -Working file: otf/otfREADME -head: 1.4 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 4; selected revisions: 4 -description: ----------------------------- -revision 1.4 -date: 2003-06-03 20:21:43 +0000; author: gabriel; state: Exp; lines: +2 -1 -instruction where to put otl.pl ----------------------------- -revision 1.3 -date: 2003-06-03 19:56:09 +0000; author: gabriel; state: Exp; lines: +2 -3 -changed bash function to perl,corrected file name error in otf.vi ----------------------------- -revision 1.2 -date: 2003-06-02 21:01:16 +0000; author: gabriel; state: Exp; lines: +12 -7 -created wishlist_demo.otl -changed output files of Createotl() in otf.vim so users need only a ~/bin directory ----------------------------- -revision 1.1 -date: 2003-06-01 13:16:32 +0000; author: gabriel; state: Exp; -new 'on the fly' files -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/otf/otl,v -Working file: otf/otl -head: 1.2 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 2; selected revisions: 2 -description: ----------------------------- -revision 1.2 -date: 2003-06-02 21:01:16 +0000; author: gabriel; state: Exp; lines: +2 -5 -created wishlist_demo.otl -changed output files of Createotl() in otf.vim so users need only a ~/bin directory ----------------------------- -revision 1.1 -date: 2003-06-01 13:16:32 +0000; author: gabriel; state: Exp; -new 'on the fly' files -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/otf/otl.pl,v -Working file: otf/otl.pl -head: 1.1 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 1; selected revisions: 1 -description: ----------------------------- -revision 1.1 -date: 2003-06-03 19:57:00 +0000; author: gabriel; state: Exp; -new script replacing otl -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/otf/wishlist_demo.otl,v -Working file: otf/wishlist_demo.otl -head: 1.3 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 3; selected revisions: 3 -description: ----------------------------- -revision 1.3 -date: 2003-06-03 20:21:43 +0000; author: gabriel; state: Exp; lines: +2 -1 -instruction where to put otl.pl ----------------------------- -revision 1.2 -date: 2003-06-02 21:29:49 +0000; author: gabriel; state: Exp; lines: +28 -18 -changed Otl fns branch so it had the correct parents ----------------------------- -revision 1.1 -date: 2003-06-02 21:01:16 +0000; author: gabriel; state: Exp; -created wishlist_demo.otl -changed output files of Createotl() in otf.vim so users need only a ~/bin directory -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/scripts/vo_maketags.pl,v -Working file: scripts/vo_maketags.pl -head: 1.1 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 1; selected revisions: 1 -description: ----------------------------- -revision 1.1 -date: 2003-06-20 14:13:15 +0000; author: noel; state: Exp; -Final documentation tweaks for the final 0.3.0 release. -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/syntax/vo_base.vim,v -Working file: syntax/vo_base.vim -head: 2.47 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 47; selected revisions: 47 -description: -Vim Outliner Main Program File ----------------------------- -revision 2.47 -date: 2005-06-07 15:24:30 +0000; author: noel; state: Exp; lines: +4 -4 -The color darkyellow does not appear to exist on some systems. This color -has been changed to darkred. ----------------------------- -revision 2.46 -date: 2005-01-19 15:03:55 +0000; author: noel; state: Exp; lines: +2 -1 -Fixed another W18 error. ----------------------------- -revision 2.45 -date: 2004-11-27 19:30:43 +0000; author: noel; state: Exp; lines: +6 -5 - -Minor syntax and installation adjustments. -Change to vo_checkbox to fix a typo. ----------------------------- -revision 2.44 -date: 2004-05-24 15:56:34 +0000; author: noel; state: Exp; lines: +142 -19 -Added highlighting and folding support for: - Tables (marked with '|') - User-defined, wrapping text (marked with '>') - User-defined, non-wrapping text (marked with '<') ----------------------------- -revision 2.43 -date: 2004-02-17 21:48:47 +0000; author: noel; state: Exp; lines: +0 -297 -Removed the embedded and out-of-date documentation. -Removed the detailed revision log. It's too large. From now on -'cvs log' will be needed to see the log. ----------------------------- -revision 2.42 -date: 2003-10-17 01:34:03 +0000; author: noel; state: Exp; lines: +43 -30 - -Modified highlighting to support extended character sets. ----------------------------- -revision 2.41 -date: 2003-06-04 11:25:56 +0000; author: noel; state: Exp; lines: +5 -3 -Moved the modification to the tags path outside the "if" statement in -autocommands in ftplugin. Completely removed the line from syntax. ----------------------------- -revision 2.40 -date: 2003-05-27 15:03:26 +0000; author: noel; state: Exp; lines: +88 -23 -Added some documentation on the commands. ----------------------------- -revision 2.39 -date: 2003-05-27 13:33:34 +0000; author: noel; state: Exp; lines: +73 -16 -Added Vim style folds to both vo_base files to make them easier to read. -Added a mode line to the end of each to activate the folds. -Added a "Documentation" section that is mostly empty. This section will -eventually be extracted automatically to form the online help via Vim's -built-in help mechanisms. ----------------------------- -revision 2.38 -date: 2003-05-23 16:02:42 +0000; author: noel; state: Exp; lines: +8 -3 -Added tag file support for ~/.vimoutliner. ----------------------------- -revision 2.37 -date: 2003-03-01 17:07:53 +0000; author: noel; state: Exp; lines: +34 -36 -Removed the bold and underline glamour. -It did not work with the level colorization nor properly cross line boundries. ----------------------------- -revision 2.36 -date: 2003-02-12 15:40:26 +0000; author: noel; state: Exp; lines: +41 -32 -Added some glamour. *word* make word bold and _word_ underlines a word. ----------------------------- -revision 2.35 -date: 2003-02-09 14:54:10 +0000; author: noel; state: Exp; lines: +7 -3 -Removed syntax highlighting for SpellErrors and BadWord. The plugins -include their own. ----------------------------- -revision 2.34 -date: 2003-02-08 21:59:25 +0000; author: noel; state: Exp; lines: +36 -31 -Added SpellErrors and BadWord to the contains attributes of headings -and bodytext. Now we're compatible with engspchk and vimspell. ----------------------------- -revision 2.33 -date: 2003-02-08 21:34:46 +0000; author: noel; state: Exp; lines: +5 -213 -Split out functions as Dillon originally showed. ----------------------------- -revision 2.32 -date: 2003-01-30 01:47:41 +0000; author: noel; state: Exp; lines: +6 -3 -modified switches sent to ispell to make it guess better. ----------------------------- -revision 2.31 -date: 2003-01-28 22:31:37 +0000; author: noel; state: Exp; lines: +6 -3 -Modified setlocal foldtext.... to set foldtext.... ----------------------------- -revision 2.30 -date: 2003-01-22 22:03:12 +0000; author: noel; state: Exp; lines: +8 -3 -Fixed bodytext folding method. ----------------------------- -revision 2.29 -date: 2003-01-21 00:18:50 +0000; author: noel; state: Exp; lines: +20 -7 -Fixed a problem with runtimepath. -Added a use_space_colon setting to that one can choose between bodytext -marked with a : or with a space-:. ----------------------------- -revision 2.28 -date: 2003-01-19 16:46:27 +0000; author: noel; state: Exp; lines: +11 -3 -Removed some strange escape characters from a revision comment. ----------------------------- -revision 2.27 -date: 2003-01-19 16:16:54 +0000; author: noel; state: Exp; lines: +101 -88 -Added detection of the color scheme and an alternative set of colors -for dark backgrounds. (well actually for non-"light" backgrounds) at -Dillon Jones' request. -Set the "current_syntax" at Dillon's request. -Modified the exe lines in the source to remove the debugging style I was -using. ----------------------------- -revision 2.26 -date: 2003-01-16 00:56:51 +0000; author: noel; state: Exp; lines: +26 -23 -Changed a bunch of set commands to setlocal commands at the -suggestion of Jeffrey Hood. Thanks, Jeffrey! ----------------------------- -revision 2.25 -date: 2003-01-13 17:05:08 +0000; author: noel; state: Exp; lines: +14 -11 -Fixed a problem with the new regex that define headings. ----------------------------- -revision 2.24 -date: 2003-01-12 19:08:32 +0000; author: noel; state: Exp; lines: +36 -25 -Converted from _ to : ----------------------------- -revision 2.23 -date: 2003-01-11 21:00:33 +0000; author: noel; state: Exp; lines: +55 -38 -Added Matej requirement for personalization settings via -.vimoutlinerrc. -Added Steve's style of bodytext that allows for wrapping and formatting -with have the headings wrap as well. It is currently set for "_" as -the bodytext marker. -Added ,,b to set all bodytext to Steve's style. -Added ,,B to set all bodytext to my style. This will also make it -possible for Steve's style to be quickly reformatted for pretty -printing with :ha. ----------------------------- -revision 2.22 -date: 2003-01-11 00:35:32 +0000; author: noel; state: Exp; lines: +7 -2 -[6~Added support for .vimoutlinerrc in both ~ and ~/.vimoutliner. ----------------------------- -revision 2.21 -date: 2002-12-12 13:38:58 +0000; author: noel; state: Exp; lines: +10 -3 -Fixed a spelling problem when words contain a '. ----------------------------- -revision 2.20 -date: 2002-12-11 23:33:16 +0000; author: noel; state: Exp; lines: +7 -3 -Removed a debug setting, again (sigh). -Added some iskeyword symbols so spell-check would work on things -like: don't ----------------------------- -revision 2.19 -date: 2002-12-11 22:55:19 +0000; author: noel; state: Exp; lines: +24 -11 -Fixed body text end error. I was checking for too specific a case. ----------------------------- -revision 2.18 -date: 2002-12-11 14:57:52 +0000; author: noel; state: Exp; lines: +7 -4 -Fixed wrapmargin setting and a line counter error during folding. ----------------------------- -revision 2.17 -date: 2002-12-11 00:42:47 +0000; author: noel; state: Exp; lines: +7 -3 -Removed a debug setting, again. ----------------------------- -revision 2.16 -date: 2002-12-10 22:21:09 +0000; author: noel; state: Exp; lines: +19 -14 -Moved body text up one tab level. It seems to be more intuitive -to others. ----------------------------- -revision 2.15 -date: 2002-12-10 19:24:13 +0000; author: noel; state: Exp; lines: +6 -2 -Added a function to auto-wrap lines. This could be a problem for entering long headings. ----------------------------- -revision 2.14 -date: 2002-12-10 18:11:13 +0000; author: noel; state: Exp; lines: +9 -3 -Removed a debug feature ----------------------------- -revision 2.13 -date: 2002-12-10 17:59:42 +0000; author: noel; state: Exp; lines: +45 -15 -Added bodytext. -Added bodytext folding. -Modified MyFoldText to show [TEXT] for folded bodytext. -Added an autocommand to re-sync the folding. ----------------------------- -revision 2.12 -date: 2002-12-09 18:16:49 +0000; author: noel; state: Exp; lines: +11 -4 -Fixed a typo and added an extra \ before & for adding upper cas3e -words. ----------------------------- -revision 2.11 -date: 2002-12-09 17:15:37 +0000; author: noel; state: Exp; lines: +13 -5 -Added ,,kA. -Swapped functions of ,,ka and ,,kA. - ,,ka add lowercase version of word to dictionary - ,,kA add word as it appears to dictionary ----------------------------- -revision 2.10 -date: 2002-12-09 17:08:47 +0000; author: noel; state: Exp; lines: +15 -8 -Fixed an error that occurs when there is just a single spelling checker. ----------------------------- -revision 2.9 -date: 2002-12-09 16:42:02 +0000; author: noel; state: Exp; lines: +13 -7 -Fixed error messages on searches with no matches. -This is part of the spell-check search. ----------------------------- -revision 2.8 -date: 2002-12-09 14:21:29 +0000; author: noel; state: Exp; lines: +11 -8 -Fixed spelling highlighting and and spelling searches so that only real matches are highlighed and possible to jump to with ,,kn and ,,kN (and n and N after -that). -Modified the "source" statement that load spellfix.vim. Spellfix.vim now -needs to be in ~/.vimoutliner. ----------------------------- -revision 2.7 -date: 2002-12-07 22:08:02 +0000; author: noel; state: Exp; lines: +30 -39 -finished integration of spellfix.vim ----------------------------- -revision 2.6 -date: 2002-12-07 16:46:47 +0000; author: noel; state: Exp; lines: +86 -6 -Added these commands to enhance the spelling checker - ,,kk speck-check document highlighting errors - ,,ka add the word under the cursor to the selected dictionary - ,,kn search forward to the next spelling error - N and n both work well with this - ,,kN search backward to the next spelling error - N and n both work well with this - ,,kq unhighlight the spelling errors ----------------------------- -revision 2.5 -date: 2002-11-27 22:54:28 +0000; author: noel; state: Exp; lines: +22 -16 -Changed date and time formats. -changed the mappings of ,,0-,,9 so that ,,1 corresponds to show only -1 level. ----------------------------- -revision 2.4 -date: 2002-11-26 00:36:08 +0000; author: noel; state: Exp; lines: +68 -62 -Added more comments. -Added Steve's GPL header. -Will keep the RCS info in my version but will remove it for -distribution. ----------------------------- -revision 2.3 -date: 2002-11-21 19:30:37 +0000; author: noel; state: Exp; lines: +21 -8 -Included a patchfile from Steve to: - move the if loaded behavior to a place in the file after the settings - add an if loaded behavior for the file extension autocommmand - added the nocindent setting - changed the ,,,, mapping - clear the indexexpr setting ----------------------------- -revision 2.2 -date: 2002-11-16 00:00:10 +0000; author: noel; state: Exp; lines: +215 -196 -Added more comments. -Switched the polarity of the if exists(loaded_outliner) function -Commented-out some experimental features. -Grouped the user preferences together and separated out the -VimOutliner operational settings. ----------------------------- -revision 2.1 -date: 2002-11-15 23:37:39 +0000; author: noel; state: Exp; -Version 2 Beta Candidate before pre-release modifications -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/tarballs/vimoutliner-0.3.2.tar.gz,v -Working file: tarballs/vimoutliner-0.3.2.tar.gz -head: 1.1 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 1; selected revisions: 1 -description: ----------------------------- -revision 1.1 -date: 2004-02-23 12:34:28 +0000; author: noel; state: Exp; -Adding for posterity's sake. -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/tarballs/vimoutliner-0.3.2a.tar.gz,v -Working file: tarballs/vimoutliner-0.3.2a.tar.gz -head: 1.1 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 1; selected revisions: 1 -description: ----------------------------- -revision 1.1 -date: 2004-02-23 12:34:28 +0000; author: noel; state: Exp; -Adding for posterity's sake. -============================================================================= - -RCS file: /root/VimOutliner/VimOutliner/tarballs/vimoutliner.0.3.1.tgz,v -Working file: tarballs/vimoutliner.0.3.1.tgz -head: 1.1 -branch: -locks: strict -access list: -symbolic names: -keyword substitution: kv -total revisions: 1; selected revisions: 1 -description: ----------------------------- -revision 1.1 -date: 2003-10-17 02:21:28 +0000; author: noel; state: Exp; -Official version 0.3.1 -============================================================================= - -" vim600: set noet ts=8 sw=8 sts=8 tw=78: diff --git a/pack/acp/start/vimoutliner/INSTALL b/pack/acp/start/vimoutliner/INSTALL deleted file mode 100644 index c3e71c8..0000000 --- a/pack/acp/start/vimoutliner/INSTALL +++ /dev/null @@ -1,137 +0,0 @@ -Installing and Testing VimOutliner - - - Automatic Method |vo-auto-install| - Updating |vo-updating| - Manual Method |vo-manual-install| - Testing |vo-testing| - - -Automatic Method - -The automatic installation targets Unix-compatible platforms: - -From tar archive - - $ tar xzvf vimoutliner-0.3.x.tar.gz - $ cd vimoutliner - $ sh install.sh - -From zip archive - - $ unzip vimoutliner-0.3.x.zip - $ cd vimoutliner-0.3.x - $ sh install.sh - -Installing with pathogen - -If you have pathogen installed as your package manager you can clone the git repository in you -pathogen directory: - $ cd ~/.vim/bundle && git clone https://github.com/vimoutliner/vimoutliner.git - -Installing using install.sh: - -First you can decide whether to install the VimOutliner files or abort the -process leaving everything unchanged. Assuming you confirmed the -installation, the script creates the necessary directory tree and copies the -files which provide the core functionality and documentation. - -With the second question you decide whether you want to install some brand new -add-ons, currently implementing checkboxes(enabled), hoisting(disabled) -and smart paste(disabled), as well as several useful external scripts in the vimoutliner/scripts folder. - - -Updating - -Updating an existing installation might require some manual work. - -If you are already working with a previous VimOutliner release, there is a -slight chance that the current directory tree is different from your current -one. In this case, you will have to manually migrate your files to the new -locations. - -The installation script creates unique backups of files being replaced with -newer versions. So if you put some local customisations into, say -$HOME/.vim/vimoutliner/vimoutlinerrc, you'll probably have to merge the backup -with the new file by hand. - - -Manual Method - -You can also copy the files from the unpacked distribution tarball into their -destination folders by yourself. The following steps are a description of what -has to go where and assume some knowledge of your vim setup. - -If you encounter problems, please contact the mailing list for an immediate -solution and more complete future documentation. www.lists.vimoutliner.org - -If you want to setup VimOutliner on a system running Microsoft Windows, the -directory $HOME denotes the base folder of the vim installation. If you're on -Unix based system, $HOME is as usual. - -You need the following sub trees in your $HOME directory: - - $HOME/.vim/ - doc/ - ftdetect/ - ftplugin/ - syntax/ - vimoutliner/ - plugins/ - scripts/ - -The distribution tarball unpacks into a directory vimoutliner with the -following contents: - - vimoutliner/ - plugins/ (1) - scripts/ (1) - doc/ (1) - ftdetect/ (1) - ftplugin/ (1) - install.sh* - syntax/ (1) - syntax/ (1) - vimoutlinerrc (1) - -(1) The content of these folders should be copied to their namesakes in the -$HOME/.vim folder - -Your $HOME/.vimrc file should contain the lines - - filetype plugin indent on - syntax on - -Finally, you need to integrate the online help provided with VimOutliner into -the vim help system. Start vim and execute the following command: - - :helptags $HOME/.vim/doc - -At this point, VimOutliner should be functional. Type ":help vo" to get -started. To get a quick overview of all VimOutliner commands you can view the -cheatsheet with ":help votl_cheatsheet". - -Testing Base Functionality - -Create a text file and save it as a .otl file like vo_test.otl. Enter -some text and verify the following: -- Tabs indent the text -- Different indent levels are different colors -- Lines starting with a colon and space word-wrap - -Lines starting with colons are body text. They should word wrap and -should be a special color (typically green, but it can vary). Verify -that paragraphs of body text can be reformatted with the Vim gq -commands. - -You can test the different VimOutliner commands by looking at the examples -in the cheatsheet. "help votl_cheatsheet". - -Debian Installation - -Debian does include VimOutliner as a package. However some Debian versions -require this line to be added to your .vimrc file: - - syntax on - - diff --git a/pack/acp/start/vimoutliner/LICENSE b/pack/acp/start/vimoutliner/LICENSE deleted file mode 100644 index e260844..0000000 --- a/pack/acp/start/vimoutliner/LICENSE +++ /dev/null @@ -1,11 +0,0 @@ -LICENSE - - VimOutliner - Copyright (C) 2001, 2003 by Steve Litt - Copyright (C) 2004 by Noel Henson - Licensed under the GNU General Public License (GPL), version 3 - Absolutely no warranty. - - If your distro doesn't come with the GPL file you can find it here: - HTML: http://www.gnu.org/copyleft/gpl.html - Text: http://www.gnu.org/copyleft/gpl.txt diff --git a/pack/acp/start/vimoutliner/README b/pack/acp/start/vimoutliner/README deleted file mode 100644 index addfde3..0000000 --- a/pack/acp/start/vimoutliner/README +++ /dev/null @@ -1,81 +0,0 @@ - -VimOutliner README file - -Introduction - -VimOutliner is an outline processor with many of the same features -as Grandview, More, Thinktank, Ecco, etc. Features include tree -expand/collapse, tree promotion/demotion, level sensitive colors, -interoutline linking, and body text. - -What sets VimOutliner apart from the rest is that it's been constructed -from the ground up for fast and easy authoring. Keystrokes are quick and -easy, especially for someone knowing the Vim editor. VimOutliner can be -used without the mouse (but is supported to the extent that Vim supports -the mouse). - -Many of the VimOutliner commands start with a double comma ",," because -that's very quick to type. All VimOutliner files have the ".otl" -extension. For help on VimOutliner type ":h vo". For an overview of -all the most important VimOutliner commands you can type ":h votl_cheatsheet" -when you have opened an otl file. - - -* Usage - -VimOutliner has been reported to help with the following tasks: - - - Project management - - Password wallet - - To-do lists - - Account and cash book - - 'Plot device' for writing novels - - Inventory control - - Hierarchical database - - Web site management - -* Characteristics - - - Fast and effective - - Fully integrated with Vim - - Extensible through plugins - - Many post-processing scripts allow exporting to multiple formats - - Extensive documentation - -For more information on the use of VimOutliner see the README.detailed -file in this directory. - - -Installation details - -1. Zip file - -To install from the zip file do the following (exchange "x" with -version number from the package you have downloaded): - -$ unzip vimoutliner-0.3.x.zip $ cd vimoutliner-0.3.x $ sh install.sh - -2. Gzip archive - -To install from the gzip archive follow these steps: - -$ tar -xzvf vimoutliner-0.3.x.tgz $ cd vimoutliner-0.3.x $ sh install.sh - -Downloads - -zip archives are available here: - -https://github.com/vimoutliner/vimoutliner/downloads - -Download of all packages can also be done from the Freshmeat site: - -http://freecode.com/projects/vimoutliner - -For more detailed installation instructions see the INSTALL file in -this directory. - - - - - - diff --git a/pack/acp/start/vimoutliner/README.detailed b/pack/acp/start/vimoutliner/README.detailed deleted file mode 120000 index 5b34fec..0000000 --- a/pack/acp/start/vimoutliner/README.detailed +++ /dev/null @@ -1 +0,0 @@ -doc/votl.txt \ No newline at end of file diff --git a/pack/acp/start/vimoutliner/TODO.otl b/pack/acp/start/vimoutliner/TODO.otl deleted file mode 100644 index 933fa04..0000000 --- a/pack/acp/start/vimoutliner/TODO.otl +++ /dev/null @@ -1,27 +0,0 @@ -TODO LIST - Updated: 20140916 - :This is just a preliminary roadmap, use the issue list at - :https://github.com/vimoutliner/vimoutliner/issues for suggesting new - :features and register issues or bugs - -Work planned for next version: - Cleanup code in plugins to more efficient vim script - Make plug mappings for all commands - Decide on common script language, and write scripts in new language - -Maybe/probably: - Include a list of vim plugins that are useful with VimOutliner - Templates - More sort functionality - Wiki plugin and documentation - Documentation on how to convert VO files to mindmap programs, Grapviz and Lyx - More colorschemes - vimoutliner-tutor - Documentation on how to use VO for writing - MetaData? - -Done: - Remove included RCS,logs etc. - - - diff --git a/pack/acp/start/vimoutliner/colors/votl_dark.vim b/pack/acp/start/vimoutliner/colors/votl_dark.vim deleted file mode 100644 index a5d9868..0000000 --- a/pack/acp/start/vimoutliner/colors/votl_dark.vim +++ /dev/null @@ -1,81 +0,0 @@ -let g:colors_name="VO Dark" -hi normal guifg=white guibg=black ctermfg=gray ctermbg=black -hi StatusLine guifg=white guibg=black ctermfg=gray ctermbg=black -hi StatusLineNC guifg=white guibg=black ctermfg=gray ctermbg=black -hi VertSplit guifg=white guibg=black ctermfg=gray ctermbg=black -hi OL1 guifg=white ctermfg=gray -hi OL2 guifg=red ctermfg=darkred -hi OL3 guifg=lightblue ctermfg=darkblue -hi OL4 guifg=violet ctermfg=darkmagenta -hi OL5 guifg=white ctermfg=gray -hi OL6 guifg=red ctermfg=darkred -hi OL7 guifg=lightblue ctermfg=darkblue -hi OL8 guifg=violet ctermfg=darkmagenta -hi OL9 guifg=white ctermfg=gray - -" colors for tags -hi outlTags guifg=darkred ctermfg=darkred - -" color for body text -hi BT1 guifg=green ctermfg=darkgreen -hi BT2 guifg=green ctermfg=darkgreen -hi BT3 guifg=green ctermfg=darkgreen -hi BT4 guifg=green ctermfg=darkgreen -hi BT5 guifg=green ctermfg=darkgreen -hi BT6 guifg=green ctermfg=darkgreen -hi BT7 guifg=green ctermfg=darkgreen -hi BT8 guifg=green ctermfg=darkgreen -hi BT9 guifg=green ctermfg=darkgreen - -" color for pre-formatted text -hi PT1 guifg=blue ctermfg=darkcyan -hi PT2 guifg=blue ctermfg=darkcyan -hi PT3 guifg=blue ctermfg=darkcyan -hi PT4 guifg=blue ctermfg=darkcyan -hi PT5 guifg=blue ctermfg=darkcyan -hi PT6 guifg=blue ctermfg=darkcyan -hi PT7 guifg=blue ctermfg=darkcyan -hi PT8 guifg=blue ctermfg=darkcyan -hi PT9 guifg=blue ctermfg=darkcyan - -" color for tables -hi TA1 guifg=darkviolet ctermfg=darkcyan -hi TA2 guifg=darkviolet ctermfg=darkcyan -hi TA3 guifg=darkviolet ctermfg=darkcyan -hi TA4 guifg=darkviolet ctermfg=darkcyan -hi TA5 guifg=darkviolet ctermfg=darkcyan -hi TA6 guifg=darkviolet ctermfg=darkcyan -hi TA7 guifg=darkviolet ctermfg=darkcyan -hi TA8 guifg=darkviolet ctermfg=darkcyan -hi TA9 guifg=darkviolet ctermfg=darkcyan - -" color for user text (wrapping) -hi UT1 guifg=darkred ctermfg=darkcyan -hi UT2 guifg=darkred ctermfg=darkcyan -hi UT3 guifg=darkred ctermfg=darkcyan -hi UT4 guifg=darkred ctermfg=darkcyan -hi UT5 guifg=darkred ctermfg=darkcyan -hi UT6 guifg=darkred ctermfg=darkcyan -hi UT7 guifg=darkred ctermfg=darkcyan -hi UT8 guifg=darkred ctermfg=darkcyan -hi UT9 guifg=darkred ctermfg=darkcyan - -" color for user text (non-wrapping) -hi UB1 guifg=darkgray ctermfg=darkcyan -hi UB2 guifg=darkgray ctermfg=darkcyan -hi UB3 guifg=darkgray ctermfg=darkcyan -hi UB4 guifg=darkgray ctermfg=darkcyan -hi UB5 guifg=darkgray ctermfg=darkcyan -hi UB6 guifg=darkgray ctermfg=darkcyan -hi UB7 guifg=darkgray ctermfg=darkcyan -hi UB8 guifg=darkgray ctermfg=darkcyan -hi UB9 guifg=darkgray ctermfg=darkcyan - -" colors for folded sections -hi Folded guifg=darkcyan guibg=bg ctermfg=darkcyan ctermbg=black -hi FoldColumn guifg=darkcyan guibg=bg ctermfg=darkcyan ctermbg=black - -" colors for experimental spelling error highlighting -" this only works for spellfix.vim with will be cease to exist soon -hi spellErr gui=underline guifg=yellow cterm=underline ctermfg=darkyellow -hi BadWord gui=underline guifg=yellow cterm=underline ctermfg=darkyellow diff --git a/pack/acp/start/vimoutliner/colors/votl_light.vim b/pack/acp/start/vimoutliner/colors/votl_light.vim deleted file mode 100644 index beef395..0000000 --- a/pack/acp/start/vimoutliner/colors/votl_light.vim +++ /dev/null @@ -1,81 +0,0 @@ -let g:colors_name="VO Light" -hi normal guifg=black guibg=white ctermfg=white ctermbg=black -hi StatusLine guifg=black guibg=white ctermfg=white ctermbg=black -hi StatusLineNC guifg=black guibg=white ctermfg=white ctermbg=black -hi VertSplit guifg=black guibg=white ctermfg=white ctermbg=black -hi OL1 guifg=black ctermfg=black -hi OL2 guifg=red ctermfg=red -hi OL3 guifg=blue ctermfg=blue -hi OL4 guifg=darkviolet ctermfg=magenta -hi OL5 guifg=black ctermfg=black -hi OL6 guifg=red ctermfg=red -hi OL7 guifg=blue ctermfg=blue -hi OL8 guifg=darkviolet ctermfg=magenta -hi OL9 guifg=black ctermfg=black - -" colors for tags -hi outlTags guifg=darkred ctermfg=darkred - -" color for body text -hi BT1 guifg=darkgreen ctermfg=green -hi BT2 guifg=darkgreen ctermfg=green -hi BT3 guifg=darkgreen ctermfg=green -hi BT4 guifg=darkgreen ctermfg=green -hi BT5 guifg=darkgreen ctermfg=green -hi BT6 guifg=darkgreen ctermfg=green -hi BT7 guifg=darkgreen ctermfg=green -hi BT8 guifg=darkgreen ctermfg=green -hi BT9 guifg=darkgreen ctermfg=green - -" color for pre-formatted text -hi PT1 guifg=darkblue ctermfg=cyan -hi PT2 guifg=darkblue ctermfg=cyan -hi PT3 guifg=darkblue ctermfg=cyan -hi PT4 guifg=darkblue ctermfg=cyan -hi PT5 guifg=darkblue ctermfg=cyan -hi PT6 guifg=darkblue ctermfg=cyan -hi PT7 guifg=darkblue ctermfg=cyan -hi PT8 guifg=darkblue ctermfg=cyan -hi PT9 guifg=darkblue ctermfg=cyan - -" color for tables -hi TA1 guifg=darkviolet ctermfg=cyan -hi TA2 guifg=darkviolet ctermfg=cyan -hi TA3 guifg=darkviolet ctermfg=cyan -hi TA4 guifg=darkviolet ctermfg=cyan -hi TA5 guifg=darkviolet ctermfg=cyan -hi TA6 guifg=darkviolet ctermfg=cyan -hi TA7 guifg=darkviolet ctermfg=cyan -hi TA8 guifg=darkviolet ctermfg=cyan -hi TA9 guifg=darkviolet ctermfg=cyan - -" color for user text (wrapping) -hi UT1 guifg=darkred ctermfg=cyan -hi UT2 guifg=darkred ctermfg=cyan -hi UT3 guifg=darkred ctermfg=cyan -hi UT4 guifg=darkred ctermfg=cyan -hi UT5 guifg=darkred ctermfg=cyan -hi UT6 guifg=darkred ctermfg=cyan -hi UT7 guifg=darkred ctermfg=cyan -hi UT8 guifg=darkred ctermfg=cyan -hi UT9 guifg=darkred ctermfg=cyan - -" color for user text (non-wrapping) -hi UB1 guifg=darkgray ctermfg=cyan -hi UB2 guifg=darkgray ctermfg=cyan -hi UB3 guifg=darkgray ctermfg=cyan -hi UB4 guifg=darkgray ctermfg=cyan -hi UB5 guifg=darkgray ctermfg=cyan -hi UB6 guifg=darkgray ctermfg=cyan -hi UB7 guifg=darkgray ctermfg=cyan -hi UB8 guifg=darkgray ctermfg=cyan -hi UB9 guifg=darkgray ctermfg=cyan - -" colors for folded sections -hi Folded guifg=darkcyan guibg=bg ctermfg=cyan ctermbg=white -hi FoldColumn guifg=darkcyan guibg=bg ctermfg=cyan ctermbg=white - -" colors for experimental spelling error highlighting -" this only works for spellfix.vim with will be cease to exist soon -hi spellErr gui=underline guifg=darkred cterm=underline ctermfg=darkred -hi BadWord gui=underline guifg=darkred cterm=underline ctermfg=darkred diff --git a/pack/acp/start/vimoutliner/colors/votl_test.vim b/pack/acp/start/vimoutliner/colors/votl_test.vim deleted file mode 100644 index 9866ace..0000000 --- a/pack/acp/start/vimoutliner/colors/votl_test.vim +++ /dev/null @@ -1,81 +0,0 @@ -let g:colors_name="VO Light" -hi normal guifg=black guibg=white ctermfg=white ctermbg=black -hi StatusLine guifg=black guibg=white ctermfg=white ctermbg=black -hi StatusLineNC guifg=black guibg=white ctermfg=white ctermbg=black -hi VertSplit guifg=black guibg=white ctermfg=white ctermbg=black -hi OL1 guifg=black ctermfg=black -hi OL2 guifg=red ctermfg=red -hi OL3 guifg=blue ctermfg=blue -hi OL4 guifg=darkviolet ctermfg=magenta -hi OL5 guifg=black ctermfg=black -hi OL6 guifg=red ctermfg=red -hi OL7 guifg=blue ctermfg=blue -hi OL8 guifg=darkviolet ctermfg=magenta -hi OL9 guifg=black ctermfg=black - -" colors for tags -hi outlTags guifg=darkred ctermfg=darkred - -" color for body text -hi BT1 guifg=darkviolet ctermfg=magenta -hi BT2 guifg=black ctermfg=black -hi BT3 guifg=red ctermfg=red -hi BT4 guifg=blue ctermfg=blue -hi BT5 guifg=darkviolet ctermfg=magenta -hi BT6 guifg=black ctermfg=black -hi BT7 guifg=red ctermfg=red -hi BT8 guifg=blue ctermfg=blue -hi BT9 guifg=darkviolet ctermfg=magenta - -" color for pre-formatted text -hi PT1 guifg=darkblue ctermfg=cyan -hi PT2 guifg=darkblue ctermfg=cyan -hi PT3 guifg=darkblue ctermfg=cyan -hi PT4 guifg=darkblue ctermfg=cyan -hi PT5 guifg=darkblue ctermfg=cyan -hi PT6 guifg=darkblue ctermfg=cyan -hi PT7 guifg=darkblue ctermfg=cyan -hi PT8 guifg=darkblue ctermfg=cyan -hi PT9 guifg=darkblue ctermfg=cyan - -" color for tables -hi TA1 guifg=darkviolet ctermfg=cyan -hi TA2 guifg=darkviolet ctermfg=cyan -hi TA3 guifg=darkviolet ctermfg=cyan -hi TA4 guifg=darkviolet ctermfg=cyan -hi TA5 guifg=darkviolet ctermfg=cyan -hi TA6 guifg=darkviolet ctermfg=cyan -hi TA7 guifg=darkviolet ctermfg=cyan -hi TA8 guifg=darkviolet ctermfg=cyan -hi TA9 guifg=darkviolet ctermfg=cyan - -" color for user text (wrapping) -hi UT1 guifg=darkred ctermfg=cyan -hi UT2 guifg=darkred ctermfg=cyan -hi UT3 guifg=darkred ctermfg=cyan -hi UT4 guifg=darkred ctermfg=cyan -hi UT5 guifg=darkred ctermfg=cyan -hi UT6 guifg=darkred ctermfg=cyan -hi UT7 guifg=darkred ctermfg=cyan -hi UT8 guifg=darkred ctermfg=cyan -hi UT9 guifg=darkred ctermfg=cyan - -" color for user text (non-wrapping) -hi UB1 guifg=darkgray ctermfg=cyan -hi UB2 guifg=darkgray ctermfg=cyan -hi UB3 guifg=darkgray ctermfg=cyan -hi UB4 guifg=darkgray ctermfg=cyan -hi UB5 guifg=darkgray ctermfg=cyan -hi UB6 guifg=darkgray ctermfg=cyan -hi UB7 guifg=darkgray ctermfg=cyan -hi UB8 guifg=darkgray ctermfg=cyan -hi UB9 guifg=darkgray ctermfg=cyan - -" colors for folded sections -hi Folded guifg=darkcyan guibg=bg ctermfg=cyan ctermbg=white -hi FoldColumn guifg=darkcyan guibg=bg ctermfg=cyan ctermbg=white - -" colors for experimental spelling error highlighting -" this only works for spellfix.vim with will be cease to exist soon -hi spellErr gui=underline guifg=darkred cterm=underline ctermfg=darkred -hi BadWord gui=underline guifg=darkred cterm=underline ctermfg=darkred diff --git a/pack/acp/start/vimoutliner/doc/votl.txt b/pack/acp/start/vimoutliner/doc/votl.txt deleted file mode 100644 index 38671d7..0000000 --- a/pack/acp/start/vimoutliner/doc/votl.txt +++ /dev/null @@ -1,1331 +0,0 @@ -*votl_readme.txt* For Vim version 7.2 Last change: 2014-09-28 - - *vo* *votl* *vimoutliner* -VimOutliner 0.4.0 ~ - -VimOutliner is an outline processor designed with lighting fast authoring as -the main feature, it also has many of the same features as Grandview, More, -Thinktank, Ecco, etc. These features include tree expand/collapse, tree -promotion/demotion, level sensitive colors, interoutline linking, checkboxes -and body text. - - - License |votl-license| - Version |votl-version| - Installing and testing VimOutliner |votl-install| - Install via Pathogen |votl-pathogen-install| - Legacy Script Driven Method |votl-auto-install| - Updating |votl-updating| - Manual method |votl-manual-install| - Testing |votl-testing| - Debian |votl-debian| - Using VimOutliner on other file types |votl-other-files| - Troubleshooting |votl-troubleshooting| - VimOutliner philosophy |votl-philosophy| - Running VimOutliner |votl-running| - VimOutliner configuration file |vimoutlinerrc| - Comma comma commands |votl-command| - Basic VimOutliner activities |votl-activities| - Menu |votl-menu| - Vim Outliner objects |votl-objects| - Post Processors |votl-post-processors| - Advanced |votl-advanced| - Executable Lines |votl-executable-lines| - Plugins |votl-plugins| - Checkboxes |votl-checkbox| - Hoisting |votl-hoisting| - Clock |votl-clock| - Scripts |votl-scripts| - votl_maketags.pl |votl-maketags| - otl2html.py |otl2html| - Other information |votl-other-info| - - -============================================================================== -License *votl-license* - - -VimOutliner Copyright (C) 2001, 2003 by Steve Litt - Copyright (C) 2004, 2014 by Noel Henson -Licensed under the GNU General Public License (GPL), version 2 -Absolutely no warranty, see COPYING file for details. - - HTML: http://www.gnu.org/copyleft/gpl.html - Text: http://www.gnu.org/copyleft/gpl.txt - - -============================================================================== -Installing and Testing VimOutliner *votl-install* - - - Install via Pathogen |votl-pathogen-install| - Legacy Script Driven Method |votl-auto-install| - Updating |votl-updating| - Manual Method |votl-manual-install| - Testing |votl-testing| - - *votl-pathogen-install* -Install via Pathogen~ - -Preferred and most simple method of VimOutliner installation is using -Pathogen (developers of VimOutliner actually believe that Pathogen -(https://github.com/tpope/vim-pathogen), or Vundle, should be generally -the preferred way of installation of any vim plugin). - -Installation with working Pathogen should be just - - $ cd ~/.vim/bundle - # Or even better is to have whole ~/.vim/bundle as a separate repo - # and then plugins are added as submodules. - $ git clone git@github.com:vimoutliner/vimoutliner.git - -Restart vim and you should be good to go. If something does nott work, -please, let us know (either on the email list or file a ticket to the -GitHub issue tracker). - - *votl-auto-install* -Legacy Script Driven Method~ - -The automatic installation targets Unix-compatible platforms: > - -From tar archive - - $ tar xzvf vimoutliner-0.3.x.tar.gz - $ cd vimoutliner - $ sh install.sh - -From zip archive - - $ unzip vimoutliner-0.3.x.zip - $ cd vimoutliner-0.3.x - $ sh install.sh - -< -The install.sh script will ask you whether to install the VimOutliner files or -abort the process leaving everything unchanged. Assuming you confirmed the -installation, the script creates the necessary directory tree and copies the -files which provide the core functionality and documentation. - -With the second question you decide whether you want to install some brand new -add-ons, currently implementing hoisting and checkboxes. - - *votl-updating* -Updating~ - -Updating an existing installation might require some manual work. - -If you are already working with a previous VimOutliner release, there is a -slight chance that the current directory tree is different from your current -one. In this case, you will have to manually migrate your files to the new -locations. - -The installation script creates unique backups of files being replaced -with newer versions. So if you put some local customizations into -vimoutlinerrc in the directory where VimOutliner is run from (say -$HOME/.vim/vimoutliner/vimoutlinerrc), you'll probably have to merge the -backup with the new file by hand. Which is one good reason why it is -preferred to use for the custom configuration and extensions your own -copy of the |vimoutlinerrc| in some other location where the file is -sought for. - - *votl-manual-install* -Manual Method~ - -You can also copy the files from the unpacked distribution tar ball into their -destination folders by yourself. The following steps are a description of what -has to go where and assume some knowledge of your vim setup. - -If you encounter problems, please contact the mailing list for an immediate -solution and more complete future documentation. -https://groups.google.com/forum/#!forum/vimoutliner - -If you want to setup VimOutliner on a system running Microsoft Windows, the -directory $HOME denotes the base folder of the vim installation. If you're on -Unix based system, the location of $HOME is as usual. - -You need the following subtrees in your $HOME directory: > - - $HOME/.vim/ - doc/ - ftdetect/ - ftplugin/ - syntax/ - vimoutliner/ - plugins/ - scripts/ -< -The distribution tar ball unpacks into a directory vimoutliner with the -following contents: > - - vimoutliner/ - plugins/ (1) - scripts/ (1) - doc/ (1) - ftdetect/ (1) - ftplugin/ (1) - install.sh* - syntax/ (1) - syntax/ (1) - vimoutlinerrc (1) -< -(1) The content of these folders should be copied to their namesakes in the -$HOME/.vim folder - -Your $HOME/.vimrc file should contain the lines > - - filetype plugin indent on - syntax on -< -Finally, you need to integrate the online help provided with VimOutliner into -the vim help system. Start vim and execute the following command: > -> - :helptags $HOME/.vim/doc -< -At this point, VimOutliner should be functional. Type ":help vo" to get -started. You can also type ":help votl_cheatsheet" to a get a quick overview -of all the VimOutliner commands. - - *votl-testing* -Testing Base Functionality~ - -Open a new outline with the following: -> - rm $HOME/votl_test.otl - gvim $HOME/votl_test.otl or vim $HOME/votl_test.otl -< -Verify the following: -- Tabs indent the text -- Different indent levels are different colors -- Lines starting with a colon and space word-wrap - - Lines starting with colons are body text. They should word wrap and - should be a special color (typically green, but it can vary). Verify - that paragraphs of body text can be reformatted with the Vim gq - commands. - -Verify Interoutline Linking: - -Interoutline linking currently requires a working perl installation to -generate the necessary tag file. We are looking into porting this to vim's own -scripting language. - -Place the following two lines in $HOME/votl_test.otl: -> - _tag_newfile - $HOME/votl_newfile.otl -< -Note that in the preceding, the 2nd line should be indented from the first. - -To create VimOutliner's tag file $HOME/.vim/vimoutliner/votl_tags.tag, run -votl_maketags.pl, which resides in $HOME/.vimoutliner/scripts/: $ -$HOME/.vim/vimoutliner/scripts/votl_maketags.pl $HOME/votl_test.otl - -Try the following: -- In $HOME/votl_test.otl -- Cursor to the _tag_newfile marker -- Press CTRL-K - You should be brought to $HOME/votl_newfile.otl -- Press CTRL-N - You should be brought back to $HOME/votl_test.otl -Note: - CTRL-K is a VimOutliner synonym for CTRL-] - CTRL-N is a VimOutliner synonym for CTRL-T - -This might also be achieved more efficiently by using the UTL plugin for -linking to other files and text. Check out the plugin at: - -http://www.vim.org/scripts/script.php?script_id=293 - - *votl-debian* -Debian Installation~ - -Debian does include Vim Outliner as a package. However some Debian version -require this line to be added to your |vimrc| file: > - - syntax on -> - -============================================================================== -Using VimOutliner On Other File Types~ *votl-other-files* - -How to use VimOutliner on non .otl files~ - -Previous VimOutliner versions used the ol script to invoke VimOutliner. As of -VimOutliner 0.3.0, the ol script is no longer necessary nor provided. Instead, -VimOutliner is now a Vim plugin, so Vim does all the work. - -This makes VimOutliner much simpler to use in most cases, but Vim plugins are -file extension based, meaning that if you want to use VimOutliner on a file -extension other than .otl, you must declare that file extension in -$HOME/.vim/ftdetect/votl.vim. In this section we'll use the .emdl extension -(Easy Menu Definition Language) as an example. - -To enable VimOutliner work with .emdl files, do this: -> - vim $HOME/.vim/ftdetect/votl.vim -< -Right below the line reading: -> - au! BufRead,BufNewFile *.otl setfiletype votl -< -Insert the following line: -> - au! BufRead,BufNewFile *.emdl setfiletype votl -< -Save and exit -> - gvim $HOME/votl_test.emdl -< -You should get: -- level colors, -- body text (lines starting with colon) -- comma comma commands (try ,,2 and ,,1) - - -============================================================================== -Troubleshooting~ *votl-troubleshooting* - - -Q: I can't switch between colon based and space based body text. -A: See next question - -Q: My ,,b and ,,B don't do anything. How do I fix it? -A: Open vim like this: -> - vim $HOME/.vim/ftplugin/votl.vim -< - Search for use_space_colon - Make sure it is set to 0, not 1 - Rerun Vim, and ,,b and ,,B should work - -Q: I don't get VimOutliner features on files of extension .whatever. -A: Open vim like this: -> - vim $HOME/.vim/ftdetect/votl.vim -< - Right below the line reading: -> - au! BufRead,BufNewFile *.otl setfiletype votl -< - Insert the following line: -> - au! BufRead,BufNewFile *.whatever setfiletype votl -< - Save and exit. - - -============================================================================== -VimOutliner Philosophy~ *votl-philosophy* - - -Authoring Speed~ - -VimOutliner is an outline processor with many of the same features as -Grandview, More, Thinktank, Ecco, etc. Features include tree expand/collapse, -tree promotion/demotion, level sensitive colors, interoutline linking, and -body text. - -What sets VimOutliner apart from the rest is that it's been constructed from -the ground up for fast and easy authoring. Keystrokes are quick and easy, -especially for someone knowing the Vim editor. The mouse is completely -unnecessary (but is supported to the extent that Vim supports the mouse). Many -of the VimOutliner commands start with a double comma because that's very -quick to type. - -Many outliners are prettier than VimOutliner. Most other outliners are more -intuitive for the newbie not knowing Vim. Many outliners are more featureful -than VimOutliner (although VimOutliner gains features monthly and is already -very powerful). Some outliners are faster on lookup than VimOutliner. But as -far as we know, NO outliner is faster at getting information out of your mind -and into an outline than VimOutliner. - -VimOutliner will always give you lightning fast authoring. That's our basic, -underlying philosophy, and will never change, no matter what features are -added. - - -Vim Integration~ - -Earlier VimOutliner versions prided themselves on being stand alone -applications, self-contained in a single directory with a special script to -run everything. - -As of 0.3.0, VimOutliner is packaged as a Vim Plugin, eliminating the need for -the ol script, which many saw as clumsy. Given that all VimOutliner features -are produced by the Vim engine, it makes perfect sense to admit that -VimOutliner is an add-on to Vim. - -Therefore VimOutliner now prides itself in being a Vim plugin. With the -VimOutliner package installed, the Vim editor yields the VimOutliner feature -set for files whose extensions are listed as votl types in -$HOME/.vim/ftplugin/votl.vim. - - -============================================================================== -Running VimOutliner~ *votl-running* - - -Vim Knowledge~ - -You needn't be a Vim expert to use VimOutliner. If you know the basics -- -inserting and deleting line-wise and character-wise, moving between command and -insert modes, use of Visual Mode selections,and reformatting, you should be -well equipped to use VimOutliner. - -Run Vim or GVim and follow the instruction on :help |tutor| - -VimOutliner is a set of Vim scripts and configurations. Its features all come -from the Vim editor's engine. If you do not know Vim, you'll need to learn the -Vim basics before using VimOutliner. Start by taking the Vim tutorial. The -tutorial should take about 2 hours. - -VimOutliner is so fast, that if you often use outlining, you'll make up that -time within a week. - - *vimoutlinerrc* -VimOutliner configuration file~ - -Custom configuration (and small custom extensions) should be written to -the vimoutlinerrc file. It is a regular vimscript file and the first of -the files searched in the following locations will be used: - - * a file .vimoutlinerrc (notice the leading dot) in the users $HOME or - $HOME/.vimoutliner directory - * a file vimoutlinerrc (name without the leading dot) in the users - $HOME, $HOME/.vimoutliner, or $HOME/.vim directory - * a file vimoutlinerrc (again without the leading dot) in the folder - where the VimOutliner is run from (that could be again $HOME/.vim - directory with manual installation or for example - $HOME/.vim/bundle/vimoutliner when using pathogen) - -Many global variables can be also set in the normal vim manner in the -user’s $VIMRC file. See general vim documentation for more details for -individual variables. - - *votl-command* -Comma Comma Commands~ - -Traditionally (meaning in terms of the VimOutliner traditions ;)) all -VimOutliner were features accessed through keyboard commands starting -with two commas. The double comma followed by a character is incredibly -fast to type. However, with more widespread use of the VimOutliner some -developers felt that all idiosyncrasies should be eliminated and -VimOutliner should behave as a normal vim plugin. Therefore now we -don’t redefine this command leader (as it is called in the Vim lingo) -and unless the user redefines it on her own (in |vimoutlinerrc|) it -defaults to backslash. If you configure VimOutliner to use different key -combination, you have to mentally replace it everywhere in this -documentation. - -If you are friend of the ancient regime, then just uncomment the line in -|vimoutlinerrc| (see more about the locations where you should put it): - - "let maplocalleader = ',,' " uncomment for compatibility with - " previous versions of VO - -We expect to create more comma comma commands, so try not to create your own, -as they may clash with later comma comma commands. If you have an -exceptionally handy command, please report it to the VimOutliner list. Perhaps -others could benefit from it. - - Command List Description ~ - ,,D all VimOutliner reserved command - ,,H all reserved for manual de-hoisting (add-on) - ,,h all reserved for hoisting (add-on) - ,,1 all set foldlevel=0 - ,,2 all set foldlevel=1 - ,,3 all set foldlevel=2 - ,,4 all set foldlevel=3 - ,,5 all set foldlevel=4 - ,,6 all set foldlevel=5 - ,,7 all set foldlevel=6 - ,,8 all set foldlevel=7 - ,,9 all set foldlevel=8 - ,,0 all set foldlevel=99999 - ,,- all Draw dashed line - ,,f normal Directory listing of the current directory - ,,s normal Sort sub-tree under cursor ascending - ,,S normal Sort sub-tree under cursor descending - ,,t normal Append timestamp (HH:MM:SS) to heading - ,,T normal Pre-pend timestamp (HH:MM:SS) to heading - ,,T normal Pre-pend timestamp (HH:MM:SS) to heading - ,,t insert Insert timestamp (HH:MM:SS) at cursor - ,,d normal Append datestamp (YYYY-MM-DD) to heading - ,,d insert Insert datestamp (YYYY-MM-DD) at cursor - ,,D normal Pre-pend datestamp (YYYY-MM-DD) to heading - ,,B normal Make body text start with a space - ,,b normal Make body text start with a colon and space - ,,w insert Save changes and return to insert mode - ,,e normal Execute the executable tag line under cursor - - -Other VimOutliner Commands~ - -Naturally, almost all Vim commands work in VimOutliner. Additionally, -VimOutliner adds a few extra commands besides the comma comma commands -discussed previously. - -Command list: - CTRL-K Follow tag (Synonym for CTRL-]) - CTRL-N Return from tag (Synonym for CTRL-T) - Q Reformat (Synonym for gq) - - -To get a quick overview of all VimOutliner commands type ":help votl_cheatsheet" in vim. - - *votl-activities* -Basic VimOutliner activities~ - -How do I collapse a tree within command mode? - zc - (note: a full list of folding commands |fold-commands|) - -How do I expand a tree within command mode? - To expand one level: - zo - To expand all the way down - zO - -How do I demote a headline? - In command mode, >> - In insert mode at start of the line, press the Tab key - In insert mode within the headline, CTRL-T - -How do I promote a headline? - In command mode, << - In insert mode at start of the line, press the Backspace key - In insert mode within the headline, CTRL-D - -How do I promote or demote several consecutive headlines? - Highlight the lines with the V command - Press < to promote or > to demote. You can precede - the < or > with a count to promote or demote several levels - -How do I promote or demote an entire tree? - Collapse the tree - Use << or >> as appropriate - -How do I collapse an entire outline? - ,,1 - -How do I maximally expand an entire outline? - ,,0 - -How do I expand an outline down to the third level? - ,,3 - -How do I move a tree? - Use Vim's visual cut and paste - -How do I create body text? - Open a blank line below a headline - Start the line with a colon followed by a space - Continue to type. Your text will wrap - -How do I reformat body text? - Highlight (Shift+V) the body text to be reformatted - Use the gq command to reformat - -How do I reformat one paragraph of body text? - The safest way is highlighting. - DANGER! Other methods can reformat genuine headlines. - -How do I switch between colon based and space based body text? - ,,b for colon based, ,,B for space based - -What if ,,b and ,,B don't work - Change variable use_space_colon from 1 to 0 - in $HOME/.vim/ftplugin/votl.vim - -How do I perform a word count? - Use the command :w !wc - The space before the exclamation point is a MUST. - - *votl-menu* -Menu~ - -There is a simple menu included in Vim Outliner when running in GUI mode. -Named 'VO', you can usually find it right next to the 'Help' menu. There are -commands to change the fold level and select alternate color schemes. There is -also entries for common tools. - -The last tool item calls a shell script, 'myotl2html.sh'. This script should -be provided by the user and is not included in VO releases. A sample -myotl2html.sh script might look like this: -> - #!/bin/bash - otl2html.py -S pjtstat.css $1 > $HOME/public_html/$1.html -< -If you have several different types of reports you create regularly, you can -create your own menu entries. Just add lines like these to your -|vimoutlinerrc| file: > -> - amenu &VO.&Reports.&Big\ Project :!otl2html.py -S big.css % > %.html - amenu &VO.&Reports.&Hot\ List :!otl2html.py -S todo.css % > %.html - amenu &VO.&Reports.&Weekly :!otl2html.py -S weekly.css % > %.html -< -I'm sure you get the idea. - - *votl-objects* -Vim Outliner Objects~ - -There are several object/line types that VO supports. The most common on -simple headings and body text. Simple headings are tab-indented line that -start with any non-whitespace character except: : ; | < >. These characters -specify other objects. Here is a list of each of the non-heading types: - - Start Description~ - : body text (wrapping) - ; Pre-formatted body text (non-wrapping) - | table - > user-defined, text block (wrapping) - < user-defined, Pre-formatted text block (non-wrapping) - -The body text marker, :, is used to specify lines that are automatically -wrapped and reformatted. VO and post-processors are free to wrap and reformat -this text as well as use proportionally- spaced fonts. A post-processor will -probably change the appearance of what you have written. If you are writing a -book or other document, most of the information you enter will be body text. - -Here is an example: -> - Kirby the Wonder Dog - : Kirby is nine years old. He understand about 70-100 - : English words. Kirby also understands 11 different hand - : signals. He is affectionate, playful and attentive. - : - : His breeding is unknown. He appears to be a mix between - : a German shepherd and a collie. -< -When folded, body text looks something like this: -> - Kirby the Wonder Dog - [TEXT] -------------------------------- (6 lines) -< -The Pre-formatted text marker, ;, is used to mark text that should not be -reformatted nor wrapped by VO or any post-processor. A post- processor would -use a fixed-space font, like courier, to render these lines. A post-processor -will probably not change the appearance of what you have written. This is -useful for making text picture, program code or other format-dependent text. - -Here is an example: -> - Output waveform - ; _______ ______ - ; _____/ \______________/ - ; |-10us--|----35us------| -< -When folded, Pre-formatted body text looks something like this: -> - Output waveform - [TEXT BLOCK] -------------------------- (6 lines) -< -The table marker, |, is used to create tables. This is an excellent way to -show tabular data. The marker is used as if it were are real vertical line. A -|| (double-|) is optionally used to mark a table heading line. This is useful -for post-processors. - -Here is an example: -> - Pets - || Name | Age | Animal | Inside/Outside | - | Kirby | 9 | dog | both | - | Hoover | 1 | dog | both | - | Sophia | 9 | cat | inside | -< -There is no automatic alignment of columns yet. It must be done manually. The -post-processor, otl2thml.py, does have alignment functions. See its -documentation for more information. - -When folded, a table looks something like this: -> - Pets - [TABLE] ------------------------------- (4 lines) -< -User-defined text is similar to body text but more flexible and it's use is -not pre-defined by Vim Outliner. The basic, user-defined text block marker, >, -behaves just like body text. - -For example: -> - Kirby the Wonder Dog - > Kirby is nine years old. He understand about 70-100 - > English words. Kirby also understands 11 different hand - > signals. He is affectionate, playful and attentive. - > - > His breeding is unknown. He appears to be a mix between - > a German shepherd and a collie. -< -When folded, body text looks something like this: -> - Kirby the Wonder Dog - [USER] -------------------------------- (6 lines) -< -But unlike body text, user-defined text can be expanded. You could have -user-defined text types. If you were writing a book, in addition to body text -for paragraphs you might need special paragraphs for tips and warnings. -User-defined text blocks can accomplish this: -> - >Tips - > Don't forget to back up your computer daily. You don't - > need to back up the entire computer. You just need to - > backup up the files that have changed. - >Warning - >Never store you backup floppy disks on the side of you - >file cabinets by adhering them with magnets. -< -A post processor will know how to remove the style tags (Tips and Warning) and -you want the text to be formatted. - -When folded, the above would appear as: -> - [USER Tips] --------------------------- (4 lines) - [USER Warning]------------------------- (3 lines) -< -The user-defined, pre-formatted text block marker, <, behaves just like -pre-formatted text. But like >, it leaves the functional definition up to the -user. A simple user-defined, pre-formatted text block could be: -> - Tux - < _.._ - < .-' `-. - < : ; - < ; ,_ _, ; - < : \{" "}/ : - < ,'.'"=..=''.'. - < ; / \ / \ ; - < .' ; '.__.' ; '. - < .-' .' '. '-. - < .' ; ; '. - < / / \ \ - < ; ; ; ; - < ; `-._ _.-' ; - < ; ""--. .--"" ; - < '. _ ; ; _ .' - < {""..' '._.-. .-._.' '..""} - < \ ; ; / - < : : : : - < : :.__.: : - < \ /"-..-"\ / fsc - < '-.__.' '.__.-' -< -When folded it would be: -> - Tux - [USER BLOCK] -------------------------- (6 lines) -< -Like user-defined text, these blocks can be given user-defined styles. For -example: -> - <ASCIIart - < _.._ - < .-' `-. - < : ; - < ; ,_ _, ; - < : \{" "}/ : - < ,'.'"=..=''.'. - < ; / \ / \ ; - < .' ; '.__.' ; '. - < .-' .' '. '-. - < .' ; ; '. - < / / \ \ - < ; ; ; ; - < ; `-._ _.-' ; - < ; ""--. .--"" ; - < '. _ ; ; _ .' - < {""..' '._.-. .-._.' '..""} - < \ ; ; / - < : : : : - < : :.__.: : - < \ /"-..-"\ / fsc - < '-.__.' '.__.-' - <Code - < getRXDN macro - < - < local gRXD1, gRXD2 - < bcf STATUS,C - < btfsc FLAGS,SERPOL - < - < goto gRXD1 - < btfsc RXDN - < bsf STATUS,C - < goto gRXD2 - < - < gRXD1 btfss RXDN - < bsf STATUS,C - < nop - < gRXD2 - < endm -< -When folded, the above would appear as: -> - [USER BLOCK ASCIIart] ----------------- (22 lines) - [USER BLOCK Code] --------------------- (17 lines) -< - - *votl-post-processors* -VimOutliner Post-Processors~ - -There are already several post processors for Vim Outliner. Some are general -purpose in nature and others perform specific conversions. There are several of -the tested scripts now included in the $HOME/.vim/vimoutliner/scripts folder. -See also the scripts section. |votl-scripts| - - -============================================================================== -Advanced VimOutliner *votl-advanced* - - *votl-executable-lines* -Executable Lines~ - -Executable lines enable you to launch any command from a specially constructed -headline within VimOutliner. The line must be constructed like this: -> - Description _exe_ command -< -Here's an example to pull up Troubleshooters.Com: -> - Troubleshooters.Com _exe_ mozilla http://www.troubleshooters.com -< -Executable lines offer the huge benefit of a single-source knowledge tree, -where all your knowledge, no matter what its format, exists within a single -tree of outlines connected with inter-outline links and executable lines. - -A more efficient and feature rich way to achieve this might be to use the UTL -plugin for vim. See the scripts section at http://www.vim.org - - -============================================================================== -Plugins *votl-plugins* - - -The VimOutliner distribution currently includes plugins for easy handling -of checkboxes, hoisting (see below), smart paste, clocking, math and format. - -The checkboxes tags and smart paste plugins are enabled by default. The -hoisting, clocking, math and format plugins are disabled by default. To -enable these plugins look for the easy instructions for this in your -|vimoutlinerrc| file. - -More information below and in the plugin files in the directory where -the VimOutliner is run from (either $HOME/.vim/vimoutliner/plugin for -manual installation or $HOME/.vim/bundle/vimoutliner/plugin when using -pathogen). - - *votl-checkbox* -Checkboxes~ - -Checkboxes enable VimOutliner to understand tasks and calculate the current -status of todo-lists etc. Three special notations are used: -> - [_] an unchecked item or incomplete task - [X] a checked item or complete task - % a placeholder for percentage of completion -< -Several ,,-commands make up the user interface: -> - ,,cb Insert a check box on the current line or each line of the currently - selected range (including lines in selected but closed folds). This - command is currently not aware of body text. Automatic recalculation - of is performed for the entire root-parent branch that contains the - updated child. (see ,,cz) - ,,cx Toggle check box state (percentage aware) - ,,cd Delete check boxes - ,,c% Create a check box with percentage placeholder except on childless - parents - ,,cp Create a check box with percentage placeholder on all headings - ,,cz Compute completion for the tree below the current heading. -< -How do I use it? - -Start with a simple example. Let's start planning a small party, say a barbecue. - -1. Make the initial outline. -> - Barbecue - Guests - Bill and Barb - Larry and Louise - Marty and Mary - Chris and Christine - David and Darla - Noel and Susan - Food - Chicken - Ribs - Corn on the cob - Salad - Desert - Beverages - Soda - Iced Tea - Beer - Party Favors - Squirt guns - Hats - Name tags - Materials - Paper Plates - Napkins - Trash Containers -< - -2. Add the check boxes. - -This can be done by visually selecting them and typing ,,cb. When done, you -should see this: -> - [_] Barbecue - [_] Guests - [_] Bill and Barb - [_] Larry and Louise - [_] Marty and Mary - [_] Chris and Christine - [_] David and Darla - [_] Noel and Susan - [_] Food - [_] Chicken - [_] Ribs - [_] Corn on the cob - [_] Salad - [_] Desert - [_] Beverages - [_] Soda - [_] Iced Tea - [_] Beer - [_] Party Favors - [_] Squirt guns - [_] Hats - [_] Name tags - [_] Materials - [_] Paper Plates - [_] Napkins - [_] Trash Containers -< - -3. Now check off what's done. - -Checking off what is complete is easy with the -,,cx command. Just place the cursor on a heading and ,,cx it. Now you can see -what's done as long as the outline is fully expanded. -> - [_] Barbecue - [_] Guests - [X] Bill and Barb - [X] Larry and Louise - [X] Marty and Mary - [X] Chris and Christine - [X] David and Darla - [X] Noel and Susan - [_] Food - [X] Chicken - [X] Ribs - [_] Corn on the cob - [_] Salad - [X] Desert - [_] Beverages - [_] Soda - [X] Iced Tea - [X] Beer - [_] Party Favors - [_] Squirt guns - [_] Hats - [_] Name tags - [_] Materials - [X] Paper Plates - [_] Napkins - [X] Trash Containers -< - -4. Now summarize what's done. - -You can summarize what is done with the ,,cz command. Place the cursor on the -'Barbecue' heading and ,,cz it. The command will recursively process the -outline and update the check boxes of the parent headlines. You should see: -(Note: the only change is on the 'Guests' heading. It changed because all of -its children are complete.) -> - [_] Barbecue - [X] Guests - [X] Bill and Barb - [X] Larry and Louise - [X] Marty and Mary - [X] Chris and Christine - [X] David and Darla - [X] Noel and Susan - [_] Food - [X] Chicken - [X] Ribs - [_] Corn on the cob - [_] Salad - [X] Desert - [_] Beverages - [_] Soda - [X] Iced Tea - [X] Beer - [_] Party Favors - [_] Squirt guns - [_] Hats - [_] Name tags - [_] Materials - [X] Paper Plates - [_] Napkins - [X] Trash Containers -< - -5. Add percentages for a better view. - -You can get a much better view of what's going on, especially with collapsed -headings, if you add percentages. Place a % on each heading that has children -like this: -> - [_] % Barbecue - [X] % Guests - [X] Bill and Barb - [X] Larry and Louise - [X] Marty and Mary - [X] Chris and Christine - [X] David and Darla - [X] Noel and Susan - [_] % Food - [X] Chicken - [X] Ribs - [_] Corn on the cob - [_] Salad - [X] Desert - [_] % Beverages - [_] Soda - [X] Iced Tea - [X] Beer - [_] % Party Favors - [_] Squirt guns - [_] Hats - [_] Name tags - [_] % Materials - [X] Paper Plates - [_] Napkins - [X] Trash Containers -< - -6. Now compute the percentage of completion. - -After adding the % symbols, place the cursor on the 'Barbecue' heading and -execute ,,cz as before. Keep in mind that the recursive percentages are -weighted. You should see: -> - [_] 58% Barbecue - [X] 100% Guests - [X] Bill and Barb - [X] Larry and Louise - [X] Marty and Mary - [X] Chris and Christine - [X] David and Darla - [X] Noel and Susan - [_] 60% Food - [X] Chicken - [X] Ribs - [_] Corn on the cob - [_] Salad - [X] Desert - [_] 66% Beverages - [_] Soda - [X] Iced Tea - [X] Beer - [_] 0% Party Favors - [_] Squirt guns - [_] Hats - [_] Name tags - [_] 66% Materials - [X] Paper Plates - [_] Napkins - [X] Trash Containers -< - -7. Complete a few more just for fun. - -Mark Salad and Soda and you should see the outline below. Try playing around -with zc and zo to see the effects of opening and closing folds. Even if you -place the cursor on 'Barbecue' and zo it, you still have a good understanding -of how complete the project is. -> - [_] 69% Barbecue - [X] 100% Guests - [X] Bill and Barb - [X] Larry and Louise - [X] Marty and Mary - [X] Chris and Christine - [X] David and Darla - [X] Noel and Susan - [_] 80% Food - [X] Chicken - [X] Ribs - [_] Corn on the cob - [X] Salad - [X] Desert - [X] 100% Beverages - [X] Soda - [X] Iced Tea - [X] Beer - [_] 0% Party Favors - [_] Squirt guns - [_] Hats - [_] Name tags - [_] 66% Materials - [X] Paper Plates - [_] Napkins - [X] Trash Containers -< - *votl-hoisting* -Hoisting~ - -Hoisting is a way to focus on the offspring of the currently selected outline -item. The sub items will be presented as top level items in the automatically -extracted hoist-file located in the same directory as the main outline file. -You cannot hoist parts of an already hoisted file again. - -To enable this plugin uncomment the following line in |vimoutlinerrc|: -> - "let g:vo_modules_load .= ':newhoist' -< -Once it is enabled, you hoist the subtopics of the currently selected -item with - - ,,h Hoist the subtopics into a temporary file - -The changes are merged back into the original file by closing the temporary -hoist file with - - :q :wq :x ZZ - -If something went wrong, you can perform a manual de-hoisting with the -following procedure: - -Open the main file in VimOutliner Search for the line containing the __hoist -tag On this line, do - - ,,H Manual de-hoisting - - *votl-clock* -Clock~ - -The clock plugin is a little imitation of a nice feature from emacs org mode. -The clockpugin allows to track times and summarize them up in the parent -heading. - -To enable this plugin uncomment the following line in |vimoutlinerrc|: -> - "let g:vo_modules_load .= ':clock' -< -To start clocking you need to write a heading containing times in square -brackets like shown below. After the closing bracket -> indicates the place -where the calculated time is written. The arrow can be followed by a char to -indicate to unit in which the time is displayed. Use 's' for seconds, 'm' for -minutes, 'h' for hours and 'd' for days. If no unit is given hours are used. -> - Year 2011 -> d - January -> - Monday, 3th [08:30:00 -- 17:45:00] -> m - Tuesday, 3th [08:50:25 -- 18:00:02] -> s -< - -To summarize the times up within the outline headings ending with -> {char} -use - - ,,cu Clock update with the cursor somewhere in the hierarchy. - -After that the outline should look like this: -> - Year 2011 -> 0.77 d - January -> 18.41 h - Monday, 3th [08:30:00 -- 17:45:00] -> 555.00 m - Tuesday, 3th [08:50:25 -- 18:00:02] -> 32977 s -< -Every time the times are changed or the units where changed use ,,cu to update -all times within the hierarchy. - -Mappings for fast clocking: - - ,,cs Clock start. Date and current time as start and end time are - written at cursor position. Works in normal mode and insert mode. -> - Year 2011 -> 0.77 d - January -> 18.41 h - Monday, 3th [08:30:00 -- 17:45:00] -> 555.00 m - Tuesday, 3th [08:50:25 -- 18:00:02] -> 32977 s - 2011-10-11 [01:32:11 -- 01:32:11] -> -> -To set a new end time, place the cursor at the desired line and use following -mapping: - - ,,cS Clock stop. Set the end time to current time. This works also in - normal mode and insert mode. - -> - Year 2011 -> 0.77 d - January -> 18.41 h - Monday, 3th [08:30:00 -- 17:45:00] -> 555.00 m - Tuesday, 3th [08:50:25 -- 18:00:02] -> 32977 s - 2011-10-11 [01:32:11 -- 01:42:19] -> 0.17 h -> -At the moment there are no user defined time formats supported. And it's not -possible to clock times over the midnight like [22:25:00 -- 01:00:00], but -it's usable for the most important cases. - - -============================================================================== -Scripts *votl-scripts* - - -The VimOutliner distribution currently includes several useful external -scripts to support interoutline links, HTML export and more. All scripts are -included in your $HOME/.vim/vimoutliner/scripts folder. For more information -on these scripts see usage section in the scripts. You can also find several -of these scripts on this web site with links to their specific web site: -https://sites.google.com/site/vimoutlinerinfo/scripts-for-vimoutliner - - -Information on some of the scripts - -votl_maketags.pl *votl-maketags* - -A basic description of how to use this Perl script is given in section -|votl-testing|, subsection "Verify interoutline linking". - -otl2html.py *otl2html* - -This Python script transforms an outline into an HTML file. Use $ otl2html.py ---help to get detailed information. - -This script does not adhere to the VimOutliner naming convention with the -'votl_' prefix because it is not necessary for any VimOutliner functionality. -It is provided both as a useful tool for creating HTML pages and HTML slides -from outlines and as a working demonstration of how to convert .otl files to -other formats. - - -============================================================================== -Other Information *votl-other-info* - - -The VimOutliner Project~ - -- How do I add my own features? -Two ways -- by changing VimOutliner source code, or by inserting your own code -in |vimoutlinerrc|, which runs at the end of the VimOutliner startup -scripts. You might have to merge your personal vimoutlinerrc with future -versions to take advantage of new features. - -- How is VimOutliner licensed? -VimOutliner is licensed under the GNU General Public License. - -- How do I contribute to VimOutliner -Step 1 is to subscribe to our mailing list. Join up at -https://groups.google.com/forum/#!forum/vimoutliner. -Lurk for a few days or so to get the feel, then submit your idea/suggestion. -A lively discussion will ensue, after which your idea, probably in some modified -form, will be considered. The more of the actual work you have done, the more -likely your feature will go in the distribution in a timely manner. - - -- What's with the VimOutliner file names? -All VimOutliner files must begin with votl_ unless Vim itself requires them to -have a different name. A few older files from previous versions break this -rule, but over time these will be changed to our naming convention. - -In the old days, with the "self contained" philosophy, there was no naming -convention, because VimOutliner files were segregated into their own tree. -With the coming of the "vim plugin" philosophy, there's a need to identify -VimOutliner files for purposes of modification, upgrade and de-installation. -Hence our naming convention. - -- What if my feature doesn't make it into the VimOutliner distribution? -You can offer it on your own web site, or very possibly on -to the forthcoming new VimOutliner home page VimOutliner ships with its -core features, but many additional functionalities, especially those that -operate from Perl scripts (or bash or python) are available outside the -distro. For instance, right now there's an Executable Line feature that turns -VimOutliner into a true single tree information reservoir. The Executable Line -feature is available extra-distro on the VimOutliner home page. See also the -scripts included in the $HOME/.vim/vimoutliner/scripts folder. - - -Anticipated improvements in later versions~ - -Command-invoking headlines - Already prototyped - Probably coming next version - Allows you to press a key and get an html command in a browser - Enables a true single tree knowledge collection - Enables use of VimOutliner as a shell - -Groupware - Not yet well defined - Enables collaborative work on an outline - A pipe dream, but VimOutliner itself was once a pipe dream - -Easy mode - Let's Windows users operate VO like a common insert-only editor. This will - remove a great deal of VO's keyboarder- friendly features. But then, - they're Windows users: let them use the mouse. - -Headline to headline links - Not yet sanctioned, might never be implemented If implemented, this would - presumably create links not just between outlines, but between headlines, - either in the same outline or in a different one. This would be a start on - "neural networking". - -Headline numbering - Under feasibility investigation - Supported by external scripts - -Toolbar in gvim - Under feasibility investigation - - -Further information on outlines, outline processing and outliners~ - -http://www.vim.org/scripts/script.php?script_id=3515 -vim.org script site - -http://freecode.com/projects/vimoutliner -Main distribution website - -https://github.com/vimoutliner/vimoutliner -git repository - -http://www.troubleshooters.com/projects/alt-vimoutliner-litt/ -Preliminary main web site with links to other sites - -http://www.troubleshooters.com/tpromag/199911/199911.htm -Outlining discussion, not product specific - -http://www.troubleshooters.com/linux/olvim.htm -Discussion on how to use Vim for outlining - -http://www.troubleshooters.com/projects/vimoutliner.htm -Former Web page for the VimOutliner distro - -http://www.outliners.com -Discussion of (proprietary) outliners from days gone by. -Downloads for ancient versions of such outliners. -Unfortunately, all are DOS, Windows and Mac. - -http://members.ozemail.com.au/~caveman/Creative/Software/Inspiration/index.html -Discussion of (proprietary,Mac) Inspiration software -This page discusses many methods of thought/computer interaction: - Visual Outlining - Textual Outlining - Idea mapping - Mind Mapping - Brainstorming with Rapid Fire Entry - Concept Mapping - Story boarding - Diagrams (using rich symbol library) - -http://members.ozemail.com.au/~caveman/Creative/index.html -Not about outlines, but instead about how to use your brain. -The whole purpose of outlines is to use your brain. -New ways of using your brain produce new ways to use outlines. - -For the VimOutliner version information and history, see the CHANGELOG. - diff --git a/pack/acp/start/vimoutliner/doc/votl_cheatsheet.txt b/pack/acp/start/vimoutliner/doc/votl_cheatsheet.txt deleted file mode 100644 index d9f877d..0000000 --- a/pack/acp/start/vimoutliner/doc/votl_cheatsheet.txt +++ /dev/null @@ -1,85 +0,0 @@ - *votl_cheatsheet.txt* Last change: 2013-04-06 - -VIMOUTLINER CHEAT SHEET~ - -This overview has Vimoutliner specific commands for the available operations. -Remember that all Vim commands can be performed in Vimoutliner files. This is -especially useful for copying, pasting, moving around and similar commands. - -For more extensive descriptions of command uses in Vimoutliner do ':h vo-command'. |vo-command| - -List format explained: [command] [mode] [description] - - - -CHECKBOXES~ - -,,cb normal Insert a check box on the current line/range -,,cx normal Toggle check box state (percentage aware) -,,cd normal Delete check boxes -,,c% normal Create a check box with percentage placeholder -,,cp normal Create a check box with percentage placeholder on all -headings -,,cz normal Compute completion for the tree below the current -heading. - - -EXECUTABLE LINES~ - -,,e normal Execute the executable tag line under cursor - - -FOLDING~ - -,,1 all set foldlevel=0 -,,2 all set foldlevel=1 -,,3 all set foldlevel=2 -,,4 all set foldlevel=3 -,,5 all set foldlevel=4 -,,6 all set foldlevel=5 -,,7 all set foldlevel=6 -,,8 all set foldlevel=7 -,,9 all set foldlevel=8 -,,0 all set foldlevel=99999 - - -FORMATTING~ - -,,- all Draw dashed line -,,s normal Sort sub-tree under cursor ascending -,,S normal Sort sub-tree under cursor descending -,,B normal Make body text start with a space -,,b normal Make body text start with a colon and space ->> normal Demote headline -<< normal Promote headline -<C-T> insert Demote headline -<C-D> insert Promote headline -Q normal Reformat (Synonym for gq) - - -OTHER~ - -,,f normal Directory listing of the current directory -,,w insert Save changes and return to insert mode -,,D all VimOutliner reserved command - - -TAGGING/INTEROUTLINE~ - -<C-K> normal Follow tag/interoutline (Synonym for Ctrl+]) -<C-N> normal Return from tag (Synonym for Ctrl+T) - - -TIME AND DATE~ - -,,t normal Append timestamp (HH:MM:SS) to heading -,,T normal Prepend timestamp (HH:MM:SS) to heading -,,t insert Insert timestamp (HH:MM:SS) at cursor -,,d normal Append datestamp (YYYY-MM-DD) to heading -,,d insert Insert datestamp (YYYY-MM-DD) at cursor -,,D normal Prepend datestamp (YYYY-MM-DD) to heading - - - vim:set filetype=help textwidth=78: - - diff --git a/pack/acp/start/vimoutliner/ftdetect/votl.vim b/pack/acp/start/vimoutliner/ftdetect/votl.vim deleted file mode 100644 index 2897f50..0000000 --- a/pack/acp/start/vimoutliner/ftdetect/votl.vim +++ /dev/null @@ -1,26 +0,0 @@ -"# ####################################################################### -"# filetype.vim: filetype loader -"# version 0.4.0 -"# Copyright (C) 2001,2003 by Steve Litt (slitt@troubleshooters.com) -"# -"# This program is free software; you can redistribute it and/or modify -"# it under the terms of the GNU General Public License as published by -"# the Free Software Foundation; either version 2 of the License, or -"# (at your option) any later version. -"# -"# This program is distributed in the hope that it will be useful, -"# but WITHOUT ANY WARRANTY; without even the implied warranty of -"# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -"# GNU General Public License for more details. -"# -"# You should have received a copy of the GNU General Public License -"# along with this program; if not, see <http://www.gnu.org/licenses/>. -"# -"# Steve Litt, slitt@troubleshooters.com, http://www.troubleshooters.com -"# ####################################################################### - -augroup filetypedetect - au! BufRead,BufNewFile *.otl setfiletype votl - au! BufRead,BufNewFile *.oln setfiletype xoutliner -augroup END - diff --git a/pack/acp/start/vimoutliner/ftplugin/votl.vim b/pack/acp/start/vimoutliner/ftplugin/votl.vim deleted file mode 100644 index 84b69ad..0000000 --- a/pack/acp/start/vimoutliner/ftplugin/votl.vim +++ /dev/null @@ -1,679 +0,0 @@ -"######################################################################### -"# ftplugin/votl.vim: VimOutliner functions, commands and settings -"# version 0.4.0 -"# Copyright (C) 2001,2003 by Steve Litt (slitt@troubleshooters.com) -"# Copyright (C) 2004,2014 by Noel Henson (noelwhenson@gmail.com) -"# -"# This program is free software; you can redistribute it and/or modify -"# it under the terms of the GNU General Public License as published by -"# the Free Software Foundation; either version 2 of the License, or -"# (at your option) any later version. -"# -"# This program is distributed in the hope that it will be useful, -"# but WITHOUT ANY WARRANTY; without even the implied warranty of -"# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -"# GNU General Public License for more details. -"# -"# You should have received a copy of the GNU General Public License -"# along with this program; if not, see <http://www.gnu.org/licenses/>. -"# -"# Steve Litt, slitt@troubleshooters.com, http://www.troubleshooters.com -"######################################################################### - -" Load the plugin {{{1 -" Prevent the plugin from being loaded twice -"if exists("b:did_ftplugin") -" finish -"endif -"let b:did_ftplugin = 1 -let b:current_syntax = "outliner" - -" Default Preferences {{{1 - -let use_space_colon=0 - -" End User Preferences - -" VimOutliner Standard Settings {{{1 -setlocal autoindent -"setlocal backspace=2 -setlocal wrapmargin=5 -setlocal wrap -setlocal tw=78 -setlocal noexpandtab -setlocal tabstop=4 " tabstop and shiftwidth must match -setlocal shiftwidth=4 " values from 2 to 8 work well -"setlocal nosmarttab -"setlocal softtabstop=0 -setlocal foldlevel=20 -setlocal foldcolumn=1 " turns on "+" at the beginning of close folds -setlocal foldmethod=expr -setlocal foldexpr=MyFoldLevel(v:lnum) -setlocal indentexpr= -setlocal nocindent -setlocal iskeyword=@,39,45,48-57,_,129-255 - -" Vim Outliner Functions {{{1 - -if !exists("loaded_vimoutliner_functions") -let loaded_vimoutliner_functions=1 - -" Sorting {{{2 -" IsParent(line) {{{3 -" Return 1 if this line is a parent -function! IsParent(line) - return (Ind(a:line)+1) == Ind(a:line+1) -endfunction -"}}}3 -" FindParent(line) {{{3 -" Return line if parent, parent line if not -function! FindParent(line) - if IsParent(a:line) - return a:line - else - let l:parentindent = Ind(a:line)-1 - let l:searchline = a:line - while (Ind(l:searchline) != l:parentindent) && (l:searchline > 0) - let l:searchline = l:searchline-1 - endwhile - return l:searchline - endif -endfunction -"}}}3 -" FindLastChild(line) {{{3 -" Return the line number of the last decendent of parent line -function! FindLastChild(line) - let l:parentindent = Ind(a:line) - let l:searchline = a:line+1 - while Ind(l:searchline) > l:parentindent - let l:searchline = l:searchline+1 - endwhile - return l:searchline-1 -endfunction -"}}}3 -" MoveDown() {{{3 -" Move a heading down by one -" Used for sorts and reordering of headings -function! MoveDown() - call cursor(line("."),0) - del x - put x -endfunction -"}}}3 -" DelHead() {{{3 -" Delete a heading -" Used for sorts and reordering of headings -function! DelHead(line) - let l:fstart = foldclosed(a:line) - if l:fstart == -1 - let l:execstr = a:line . "del x" - else - let l:fend = foldclosedend(a:line) - let l:execstr = l:fstart . "," . l:fend . "del x" - endif - exec l:execstr -endfunction -" PutHead() {{{3 -" Put a heading -" Used for sorts and reordering of headings -function! PutHead(line) - let l:fstart = foldclosed(a:line) - if l:fstart == -1 - let l:execstr = a:line . "put x" - exec l:execstr - else - let l:fend = foldclosedend(a:line) - let l:execstr = l:fend . "put x" - exec l:execstr - endif -endfunction -"}}}3 -" NextHead(line) {{{3 -" Return line of next heading -" Used for sorts and reordering of headings -function! NextHead(line) - let l:fend = foldclosedend(a:line) - if l:fend == -1 - return a:line+1 - else - return l:fend+1 - endif -endfunction -"}}}3 -" CompHead(line) {{{3 -" Compare this heading and the next -" Return 1: next is greater, 0 next is same, -1 next is less -function! CompHead(line) - let nexthead = NextHead(a:line) - let l:thisline=getline(a:line) - let l:nextline=getline(nexthead) - if indent(a:line) != indent(nexthead) - return 0 - elseif l:thisline <# l:nextline - return 1 - elseif l:thisline ># l:nextline - return -1 - else - return 0 - endif -endfunction - -"}}}3 -" Sort1Line(line) {{{3 -" Compare this heading and the next and swap if out of order -" Dir is 0 for forward, 1 for reverse -" Return a 1 if a change was made -function! Sort1Line(line,dir) - if (CompHead(a:line) == -1) && (a:dir == 0) - call DelHead(a:line) - call PutHead(a:line) - return 1 - elseif (CompHead(a:line) == 1) && (a:dir == 1) - call DelHead(a:line) - call PutHead(a:line) - return 1 - else - return 0 - endif -endfunction -"}}}3 -" Sort1Pass(start,end,dir) {{{3 -" Compare this heading and the next and swap if out of order -" Dir is 0 for forward, 1 for reverse -" Return a 0 if no change was made, other wise return the change count -function! Sort1Pass(fstart,fend,dir) - let l:i = a:fstart - let l:changed = 0 - while l:i < a:fend - let l:changed = l:changed + Sort1Line(l:i,a:dir) - let l:i = NextHead(l:i) - endwhile - return l:changed -endfunction -"}}}3 -" Sort(start,end,dir) {{{3 -" Sort this range of headings -" dir: 0 = ascending, 1 = decending -function! SortRange(fstart,fend,dir) - let l:changed = 1 - while l:changed != 0 - let l:changed = Sort1Pass(a:fstart,a:fend,a:dir) - endwhile -endfunction -"}}}3 -" SortChildren(dir) {{{3 -" Sort the children of a parent -" dir: 0 = ascending, 1 = descending -function! SortChildren(dir) - let l:oldcursor = line(".") - let l:fstart = FindParent(line(".")) - let l:fend = FindLastChild(l:fstart) - let l:fstart = l:fstart - if l:fend <= l:fstart + 1 - return - endif - call append(line("$"),"Temporary last line for sorting") - mkview - let l:execstr = "set foldlevel=" . foldlevel(l:fstart) - exec l:execstr - call SortRange(l:fstart + 1,l:fend,a:dir) - call cursor(line("$"),0) - del x - loadview - call cursor(l:oldcursor,0) -endfunction -"}}}3 -"}}}2 -" MakeChars() {{{2 -" Make a string of characters -" Used for strings of repeated characters -function MakeChars(count,char) - let i = 0 - let l:chars="" - while i < a:count - let l:chars = l:chars . a:char - let i = i + 1 - endwhile - return l:chars -endfunction -"}}}2 -" MakeSpaces() {{{2 -" Make a string of spaces -function MakeSpaces(count) - return MakeChars(a:count," ") -endfunction -"}}}2 -" MakeDashes() {{{2 -" Make a string of dashes -function MakeDashes(count) - return MakeChars(a:count,"-") -endfunction -"}}}2 -" MyFoldText() {{{2 -" Create string used for folded text blocks -function MyFoldText() - if exists('g:vo_fold_length') && g:vo_fold_length == "max" - let l:foldlength = winwidth(0) - 1 - &numberwidth - &foldcolumn - elseif exists('g:vo_fold_length') - let l:foldlength = g:vo_fold_length - else - let l:foldlength = 58 - endif - " I have this as an option, if the user wants to set "…" as the padding - " string, or some other string, like "(more)" - if exists('g:vo_trim_string') - let l:trimstr = g:vo_trim_string - else - let l:trimstr = "..." - endif - let l:MySpaces = MakeSpaces(&sw) - let l:line = getline(v:foldstart) - let l:bodyTextFlag=0 - if l:line =~ "^\t* \\S" || l:line =~ "^\t*\:" - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[TEXT]" - elseif l:line =~ "^\t*\;" - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[TEXT BLOCK]" - elseif l:line =~ "^\t*\> " - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[USER]" - elseif l:line =~ "^\t*\>" - let l:ls = stridx(l:line,">") - let l:le = stridx(l:line," ") - if l:le == -1 - let l:l = strpart(l:line, l:ls+1) - else - let l:l = strpart(l:line, l:ls+1, l:le-l:ls-1) - endif - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[USER ".l:l."]" - elseif l:line =~ "^\t*\< " - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[USER BLOCK]" - elseif l:line =~ "^\t*\<" - let l:ls = stridx(l:line,"<") - let l:le = stridx(l:line," ") - if l:le == -1 - let l:l = strpart(l:line, l:ls+1) - else - let l:l = strpart(l:line, l:ls+1, l:le-l:ls-1) - endif - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[USER BLOCK ".l:l."]" - elseif l:line =~ "^\t*\|" - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[TABLE]" - endif - let l:sub = substitute(l:line,'\t',l:MySpaces,'g') - let l:sublen = strdisplaywidth(l:sub) - let l:end = " (" . ((v:foldend + l:bodyTextFlag)- v:foldstart) - if ((v:foldend + l:bodyTextFlag)- v:foldstart) == 1 - let l:end = l:end . " line)" - else - let l:end = l:end . " lines)" - endif - let l:endlen = strdisplaywidth(l:end) - - " Multiple cases: - " (1) Full padding with ellipse (...) or user defined string, - " (2) No point in padding, pad would just obscure the end of text, - " (3) Don't pad and use dashes to fill up the space. - if l:endlen + l:sublen > l:foldlength - let l:sub = strpart(l:sub, 0, l:foldlength - l:endlen - strdisplaywidth(l:trimstr)) - let l:sub = l:sub . l:trimstr - let l:sublen = strdisplaywidth(l:sub) - let l:sub = l:sub . l:end - elseif l:endlen + l:sublen == l:foldlength - let l:sub = l:sub . l:end - else - let l:sub = l:sub . " " . MakeDashes(l:foldlength - l:endlen - l:sublen - 1) . l:end - endif - return l:sub.repeat(' ', winwidth(0)-strdisplaywidth(l:sub)) -endfunction -"}}}2 -" InsertDate() {{{2 -" Insert today's date. -function InsertDate(ba) - let @x = strftime("%Y-%m-%d") - if a:ba == "0" - normal! "xp - else - normal! "xP - endif -endfunction -"}}}2 -" InsertSpaceDate() {{{2 -" Insert a space, then today's date. -function InsertSpaceDate() - let @x = " " - let @x = @x . strftime("%Y-%m-%d") - normal! "xp -endfunction -"}}}2 -" InsertTime() {{{2 -" Insert the time. -function InsertTime(ba) - let @x = strftime("%H:%M:%S") - if a:ba == "0" - normal! "xp - else - normal! "xP - endif -endfunction -"}}}2 -" InsertSpaceTime() {{{2 -" Insert a space, then the time. -function InsertSpaceTime() - let @x = " " - let @x = @x . strftime("%H:%M:%S") - normal! "xp -endfunction -"}}}2 -" Ind(line) {{{2 -" Determine the indent level of a line. -" Courtesy of Gabriel Horner -function! Ind(line) - return indent(a:line)/&tabstop -endfunction -"}}}2 -" BodyText(line) {{{2 -" Determine the indent level of a line. -function! BodyText(line) - return (match(getline(a:line),"^\t*:") == 0) -endfunction -"}}}2 -" PreformattedBodyText(line) {{{2 -" Determine the indent level of a line. -function! PreformattedBodyText(line) - return (match(getline(a:line),"^\t*;") == 0) -endfunction -"}}}2 -" PreformattedUserText(line) {{{2 -" Determine the indent level of a line. -function! PreformattedUserText(line) - return (match(getline(a:line),"^\t*<") == 0) -endfunction -"}}}2 -" PreformattedUserTextLabeled(line) {{{2 -" Determine the indent level of a line. -function! PreformattedUserTextLabeled(line) - return (match(getline(a:line),"^\t*<\S") == 0) -endfunction -"}}}2 -" PreformattedUserTextSpace(line) {{{2 -" Determine the indent level of a line. -function! PreformattedUserTextSpace(line) - return (match(getline(a:line),"^\t*< ") == 0) -endfunction -"}}}2 -" UserText(line) {{{2 -" Determine the indent level of a line. -function! UserText(line) - return (match(getline(a:line),"^\t*>") == 0) -endfunction -"}}}2 -" UserTextSpace(line) {{{2 -" Determine the indent level of a line. -function! UserTextSpace(line) - return (match(getline(a:line),"^\t*> ") == 0) -endfunction -"}}}2 -" UserTextLabeled(line) {{{2 -" Determine the indent level of a line. -function! UserTextLabeled(line) - return (match(getline(a:line),"^\t*>\S") == 0) -endfunction -"}}}2 -" PreformattedTable(line) {{{2 -" Determine the indent level of a line. -function! PreformattedTable(line) - return (match(getline(a:line),"^\t*|") == 0) -endfunction -"}}}2 -" MyFoldLevel(Line) {{{2 -" Determine the fold level of a line. -function MyFoldLevel(line) - let l:myindent = Ind(a:line) - let l:nextindent = Ind(a:line+1) - - if BodyText(a:line) - if (BodyText(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (BodyText(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - elseif PreformattedBodyText(a:line) - if (PreformattedBodyText(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (PreformattedBodyText(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - elseif PreformattedTable(a:line) - if (PreformattedTable(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (PreformattedTable(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - elseif PreformattedUserText(a:line) - if (PreformattedUserText(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (PreformattedUserTextSpace(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - elseif PreformattedUserTextLabeled(a:line) - if (PreformattedUserTextLabeled(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (PreformattedUserText(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - elseif UserText(a:line) - if (UserText(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (UserTextSpace(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - elseif UserTextLabeled(a:line) - if (UserTextLabeled(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (UserText(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - else - if l:myindent < l:nextindent - return '>'.(l:myindent+1) - endif - if l:myindent > l:nextindent - "return '<'.(l:nextindent+1) - return (l:myindent) - "return '<'.(l:nextindent-1) - endif - return l:myindent - endif -endfunction -"}}}2 -" Spawn(line) {{{2 -" Execute an executable line -" Courtesy of Steve Litt -if !exists("loaded_steveoutliner_functions") - let loaded_steveoutliner_functions=1 -function Spawn() - let theline=getline(line(".")) - let idx=matchend(theline, "_exe_\\s*") - if idx == -1 - echo "Not an executable line" - else - let command=strpart(theline, idx) - let command="!".command - exec command - endif -endfunction -endif -"}}}2 -" This should be a setlocal but that doesn't work when switching to a new .otl file -" within the same buffer. Using :e has demonstrated this. -set foldtext=MyFoldText() - -"setlocal fillchars=|, - -endif " if !exists("loaded_vimoutliner_functions") -" End Vim Outliner Functions - -" Menu Entries {{{1 -" VO menu -amenu &VO.Expand\ Level\ &1 :set foldlevel=0<cr> -amenu &VO.Expand\ Level\ &2 :set foldlevel=1<cr> -amenu &VO.Expand\ Level\ &3 :set foldlevel=2<cr> -amenu &VO.Expand\ Level\ &4 :set foldlevel=3<cr> -amenu &VO.Expand\ Level\ &5 :set foldlevel=4<cr> -amenu &VO.Expand\ Level\ &6 :set foldlevel=5<cr> -amenu &VO.Expand\ Level\ &7 :set foldlevel=6<cr> -amenu &VO.Expand\ Level\ &8 :set foldlevel=7<cr> -amenu &VO.Expand\ Level\ &9 :set foldlevel=8<cr> -amenu &VO.Expand\ Level\ &All :set foldlevel=99999<cr> -amenu &VO.-Sep1- : -"Tools sub-menu -let s:path2scripts = expand('<sfile>:p:h:h').'/vimoutliner/scripts' -" otl2html -exec 'amenu &VO.&Tools.otl2&html\.py\ (otl2html\.py\ thisfile\ -S\ html2otl_nnnnnn\.css\ >\ thisfile\.html) :!'.s:path2scripts.'/otl2html.py -S html2otl_nnnnnn.css % > %.html<CR>' -" otl2docbook -exec 'amenu &VO.&Tools.otl2&docbook\.pl\ (otl2docbook\.pl\ thisfile\ >\ thisfile\.dbk) :!'.s:path2scripts.'/otl2docbook.pl % > %.dbk<CR>' -" otl2table -exec 'amenu &VO.&Tools.otl2&table\.py\ (otl2table\.py\ thisfile\ >\ thisfile\.txt) :!'.s:path2scripts.'/otl2table.py % > %.txt<CR>' -" otl2tags => FreeMind -exec 'amenu &VO.&Tools.otl2tags\.py\ =>\ &FreeMind\ (otl2tags\.py\ \-c\ otl2tags_freemind\.conf\ thisfile\ >\ thisfile\.mm) :!'.s:path2scripts.'/otl2tags.py -c '.s:path2scripts.'/otl2tags_freemind.conf % > %.mm<CR>' -" otl2tags => Graphviz -exec 'amenu &VO.&Tools.otl2tags\.py\ =>\ &Graphviz\ (otl2tags\.py\ \-c\ otl2tags_graphviz\.conf\ thisfile\ >\ thisfile\.gv) :!'.s:path2scripts.'/otl2tags.py -c '.s:path2scripts.'/otl2tags_graphviz.conf % > %.gv<CR>' -amenu &VO.&Tools.&myotl2thml\.sh\ (myotl2html\.sh\ thisfile) :!myotl2html.sh %<CR> -amenu &VO.-Sep2- : -amenu &VO.&Color\ Scheme :popup Edit.Color\ Scheme<cr> -amenu &VO.-Sep3- : -amenu &VO.&Help.&Index :he vo<cr> -amenu &VO.&Help.&,,\ Commands :he votl-command<cr> -amenu &VO.&Help.&Checkboxes :he votl-checkbox<cr> -amenu &VO.&Help.&Hoisting :he votl-hoisting<cr> -amenu &Help.-Sep1- : -" Help menu additions -amenu &Help.&Vim\ Outliner.&Index :he votl<cr> -amenu &Help.&Vim\ Outliner.&,,\ Commands :he votl-command<cr> -amenu &Help.&Vim\ Outliner.&Checkboxes :he votl-checkbox<cr> -amenu &Help.&Vim\ Outliner.&Hoisting :he votl-hoisting<cr> -"}}}1 -" Auto-commands {{{1 -if !exists("autocommand_vo_loaded") - let autocommand_vo_loaded = 1 - au BufNewFile,BufRead *.otl setf votl -" au CursorHold *.otl syn sync fromstart - "set updatetime=500 -endif -"}}}1 - -" this command needs to be run every time so Vim doesn't forget where to look -setlocal tags^=$HOME/.vim/vimoutliner/vo_tags.tag - -" Added an indication of current syntax as per Dillon Jones' request -let b:current_syntax = "outliner" - -" Directory where VO is located now -let vo_dir = expand("<sfile>:p:h:h") - -" Load rc file, only the first found. -let rcs = split(globpath('$HOME,$HOME/.vimoutliner','.vimoutlinerrc'), "\n") + - \ split(globpath('$HOME,$HOME/.vimoutliner,$HOME/.vim', 'vimoutlinerrc'), "\n") + - \ split(globpath(vo_dir, 'vimoutlinerrc'), "\n") - -if len(rcs) > 0 - exec 'source '.rcs[0] -else - runtime vimoutliner/vimoutlinerrc -endif -" Load modules -if exists('g:vo_modules_load') - for vo_module in split(g:vo_modules_load, '\s*:\s*') - exec "runtime! vimoutliner/plugin/votl_" . vo_module . ".vim" - endfor -unlet! vo_module -endif - -" Vim Outliner Key Mappings {{{1 -" insert the date -nmap <silent><buffer> <localleader>d $:call InsertSpaceDate()<cr> -imap <silent><buffer> <localleader>d ~<esc>x:call InsertDate(0)<cr>a -nmap <silent><buffer> <localleader>D ^:call InsertDate(1)<cr>a <esc> - -" insert the time -nmap <silent><buffer> <localleader>t $:call InsertSpaceTime()<cr> -imap <silent><buffer> <localleader>t ~<esc>x:call InsertTime(0)<cr>a -nmap <silent><buffer> <localleader>T ^:call InsertTime(1)<cr>a <esc> - -" sort a list naturally -map <silent> <buffer> <localleader>s :silent call SortChildren(0)<cr> -" sort a list, but you supply the options -map <silent> <buffer> <localleader>S :silent call SortChildren(1)<cr> - -" invoke the file explorer -map <silent><buffer> <localleader>f :e .<cr> -imap <silent><buffer> <localleader>f :e .<cr> - -" Insert a fence for segmented lists. -" this divider is used by otl2html.py to create '<hr>' -map <silent><buffer> <localleader>- o----------------------------------------0 -imap <silent><buffer> <localleader>- ----------------------------------------<cr> - -" switch document between the two types of bodytext styles -if use_space_colon == 1 - " First, convert document to the marker style - map <silent><buffer><localleader>b :%s/\(^\t*\) :/\1/e<cr>:%s/\(^\t*\) /\1 : /e<cr>:let @/=""<cr> - " Now, convert document to the space style - map <silent><buffer><localleader>B :%s/\(^\t*\) :/\1/e<cr>:let @/=""<cr> -else - " First, convert document to the marker style - map <silent><buffer><localleader>b :%s/\(^\t*\):/\1/e<cr>:%s/\(^\t*\) /\1: /e<cr>:let @/=""<cr> - " Now, convert document to the space style - map <silent><buffer><localleader>B :%s/\(^\t*\):/\1/e<cr>:let @/=""<cr> -endif - -" Steve's additional mappings start here -map <silent><buffer> <C-K> <C-]> -map <silent><buffer> <C-N> <C-T> -map <silent><buffer> <localleader>0 :set foldlevel=99999<CR> -map <silent><buffer> <localleader>9 :set foldlevel=8<CR> -map <silent><buffer> <localleader>8 :set foldlevel=7<CR> -map <silent><buffer> <localleader>7 :set foldlevel=6<CR> -map <silent><buffer> <localleader>6 :set foldlevel=5<CR> -map <silent><buffer> <localleader>5 :set foldlevel=4<CR> -map <silent><buffer> <localleader>4 :set foldlevel=3<CR> -map <silent><buffer> <localleader>3 :set foldlevel=2<CR> -map <silent><buffer> <localleader>2 :set foldlevel=1<CR> -map <silent><buffer> <localleader>1 :set foldlevel=0<CR> -"next line commented out due to hard-coded nature and ancient, nonexistent file -"map <silent><buffer> <localleader>,, :runtime vimoutliner/vimoutlinerrc<CR> -map! <silent><buffer> <localleader>w <Esc>:w<CR>a -nmap <silent><buffer> <localleader>e :call Spawn()<cr> -" Steve's additional mappings end here - -" End of Vim Outliner Key Mappings }}}1 - -" The End -" vim600: set foldmethod=marker foldlevel=0: diff --git a/pack/acp/start/vimoutliner/install.sh b/pack/acp/start/vimoutliner/install.sh deleted file mode 100755 index 254b828..0000000 --- a/pack/acp/start/vimoutliner/install.sh +++ /dev/null @@ -1,173 +0,0 @@ -#!/bin/bash - -homedir=$HOME -vimdir=$homedir/.vim -vodir=$vimdir/vimoutliner -OS=`uname` - -backupargs="" - - -#SOME FUNCTIONS -sure () { - read REPLY - echo test $REPLY = "y" || test $REPLY = "Y" -} - -make_dir () { - test -d $1 || { - echo " creating: $1" - mkdir $1 - created=1 - } -} - -copyfile () { - echo " installing: $2/$1" - install $backupargs $1 $2/$1 -} - -copydir () { - files=`ls $1` - for i in $files; do - echo " installing: $2/$i" - if [ -d $1/$i ]; then - mkdir -p $2/$i - copydir $1/$i $2/$i - else - install $backupargs $1/$i $2 - fi - done -} - -#START THE INSTALLATION -cat <<EOT -Vim Outliner Installation - This script is safe for installing Vim Outliner and for upgrading an - existing Vim Outliner installation. -EOT -echo -n "Would you like to continue (y/N) ? " -sure || exit - - -#CREATE NECESSARY DIRECTORIES -created=0 -echo checking/creating needed directories -make_dir $vimdir -make_dir $vimdir/syntax -make_dir $vimdir/ftplugin -make_dir $vimdir/ftdetect -make_dir $vimdir/doc -make_dir $vimdir/colors -make_dir $vodir -make_dir $vodir/plugin -make_dir $vodir/scripts -if [ $created -eq 0 ]; then echo " none created"; fi - -#TWEAK $HOME/.vimrc -modified=0 -echo checking/creating/modifying $homedir/.vimrc -test -f $homedir/.vimrc || { echo " creating $homedir/.vimrc" - touch $homedir/.vimrc - } -egrep -lq "filetype[[:space:]]+plugin[[:space:]]+indent[[:space:]]+on" $homedir/.vimrc || \ - { modified=1 - echo "filetype plugin indent on" >> $homedir/.vimrc - } -egrep -lq "syntax[[:space:]]+on" $homedir/.vimrc || \ - { modified=1 - echo "syntax on" >> $homedir/.vimrc - } -if [ $modified -eq 0 ] ; then - echo " not modified"; -else - echo " modifying $homedir/.vimrc" -fi - -#TWEAK $HOME/.vim/filetype.vim -modified=0 -echo checking/creating/modifying $homedir/.vim/filetype.vim -test -f $homedir/.vim/filetype.vim || \ - { echo " creating $homedir/.vim/filetype.vim" - touch $homedir/.vim/filetype.vim - } -egrep -lq "runtime\! ftdetect/\*.vim" $homedir/.vim/filetype.vim || \ - { echo " modifying $homedir/.vim/filetype.vim" - modified=1 - echo "runtime! ftdetect/*.vim" >> $homedir/.vim/filetype.vim - } -if [ $modified -eq 0 ] ; then echo " not modified"; fi - -#CLEANUP OLD INSTALLATIONS -echo "cleaning up old (<0.3.5) installations" -files=`find $vimdir -iname "vo_*"` -for file in $files; do - echo "removing $file" - rm -v $file -done - -#CLEANUP OLD BACKUPS -if [ -z $backupargs ]; then - echo "cleaning up old backups" - files=`find $vimdir -iname "vo*.old"` - for file in $files; do - echo "removing $file" - rm -v $file - done - files2=`find $vodir -iname "*.old"` - for file in $files; do - echo "removing $file" - rm -v $file - done -fi - -#COPY FILES -echo "installing files" -copyfile syntax/votl.vim $vimdir -copyfile ftplugin/votl.vim $vimdir -copyfile ftdetect/votl.vim $vimdir -copyfile colors/vo_light.vim $vimdir -copyfile colors/vo_dark.vim $vimdir -copyfile doc/votl.txt $vimdir -copyfile doc/votl_cheatsheet.txt $vimdir -copyfile vimoutlinerrc $vodir -copyfile vimoutliner/scripts/votl_maketags.pl $vimdir - -#INCORPORATE HELP DOCUMENTATION -echo "Installing vimoutliner documentation" -vim -c "helptags $HOME/.vim/doc" -c q - -#INSTALL THE ADD-ONS -cat <<EOT -Add-ons - There are optional Vim Outliner plugins to handle checkboxes, hoisting and - smartpaste. There is also a script to convert a Vim Outliner .otl file - to a html file, as well as many other external scripts included. - The plugins will be stored in $vodir/plugin and the scripts will be installed in - $vodir/scripts. - -EOT - -echo -n "Would you like to install these (y/N) " -if sure; then - echo installing add-ons - copydir vimoutliner/plugin $vodir/plugin - copydir vimoutliner/scripts $vodir/scripts -fi - -#ALL DONE -echo "" -echo "Installation of Vimoutliner is now complete" - -cat <<EOT - -********************************************************************** -* For help with using VimOutliner simply execute ":help vo" within * -* vim. For a quick overview of all commands execute: * -* ":help votl_cheatsheet" * -* * -* Additional useful scripts are available in the scripts folder, * -* see $HOME/.vim/vimoutliner/scripts * -********************************************************************** - -EOT diff --git a/pack/acp/start/vimoutliner/syntax/votl.vim b/pack/acp/start/vimoutliner/syntax/votl.vim deleted file mode 100644 index 1d3b14d..0000000 --- a/pack/acp/start/vimoutliner/syntax/votl.vim +++ /dev/null @@ -1,248 +0,0 @@ -"######################################################################### -"# syntax/votl.vim: VimOutliner syntax highlighting -"# version 0.4.0 -"# Copyright (C) 2001,2003 by Steve Litt (slitt@troubleshooters.com) -"# -"# This program is free software; you can redistribute it and/or modify -"# it under the terms of the GNU General Public License as published by -"# the Free Software Foundation; either version 2 of the License, or -"# (at your option) any later version. -"# -"# This program is distributed in the hope that it will be useful, -"# but WITHOUT ANY WARRANTY; without even the implied warranty of -"# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -"# GNU General Public License for more details. -"# -"# You should have received a copy of the GNU General Public License -"# along with this program; if not, see <http://www.gnu.org/licenses/>. -"# -"# Steve Litt, slitt@troubleshooters.com, http://www.troubleshooters.com -"######################################################################### - -" HISTORY {{{1 -"######################################################################### -"# V0.1.0 Pre-alpha -"# Set of outliner friendly settings -"# Steve Litt, 5/28/2001 -"# End of version 0.1.0 -"# -"# V0.1.1 Pre-alpha -"# No change -"# -"# Steve Litt, 5/28/2001 -"# End of version 0.1.1 -"# -"# V0.1.2 Pre-alpha -"# No Change -"# Steve Litt, 5/30/2001 -"# End of version 0.1.2 -"# V0.1.3 Pre-alpha -"# No Change -"# Steve Litt, 5/30/2001 -"# End of version 0.1.3 -"# V0.2.0 -"# Noel Henson adds code for outliner-friendly expand and -"# collapse, comma comma commands, color coding, hooks for a -"# spellchecker, sorting, and date insertion. -"# Noel Henson, 11/24/2002 -"# End of version 0.2.0 -"# END OF HISTORY -"# -"######################################################################### - -" Colors linked {{{1 -" Bill Powell, http://www.billpowellisalive.com -" Linked colors to normal groups. Different schemes will need tweaking. -" Occasionally certain groups will be rendered invisible. ;) -" -" Changelog {{{2 -"2007 Jan 23, 21:23 Tue - 0.3.0, Modified version 0.1 - " Linked syntax groups to standard Vim color groups, intsead of to - " particular colors. Now each colorscheme can work its own magic on - " a VO file. -"2007 Apr 30, 9:36 Mon - 0.3.0, Modified version 0.2 - " Changed a few linked groups to reduce chances of groups being invisible. - " No longer use Ignore group for anything. - " Still a little redundancy; different groups might linked to same color group. - " E.g., PT1 and UT1. But some color schemes (e.g. astronout) will differentiate between - " Special and Debug. Others will use the same colors for, say, Identifier and Debug. - " It just depends. - " To tweak these groups, try :h syntax and go to group-name. - " This shows the color groups, highlighted in your current colorscheme. -" }}} -hi link OL1 Statement -hi link OL2 Identifier -hi link OL3 Constant -hi link OL4 PreProc -hi link OL5 Statement -hi link OL6 Identifier -hi link OL7 Constant -hi link OL8 PreProc -hi link OL9 Statement - -"colors for tags -"hi link outlTags Tag -hi link outlTags Todo - -"color for body text -hi link BT1 Comment -hi link BT2 Comment -hi link BT3 Comment -hi link BT4 Comment -hi link BT5 Comment -hi link BT6 Comment -hi link BT7 Comment -hi link BT8 Comment -hi link BT9 Comment - -"color for pre-formatted text -hi link PT1 Special -hi link PT2 Special -hi link PT3 Special -hi link PT4 Special -hi link PT5 Special -hi link PT6 Special -hi link PT7 Special -hi link PT8 Special -hi link PT9 Special - -"color for tables -hi link TA1 Type -hi link TA2 Type -hi link TA3 Type -hi link TA4 Type -hi link TA5 Type -hi link TA6 Type -hi link TA7 Type -hi link TA8 Type -hi link TA9 Type - -"color for user text (wrapping) -hi link UT1 Debug -hi link UT2 Debug -hi link UT3 Debug -hi link UT4 Debug -hi link UT5 Debug -hi link UT6 Debug -hi link UT7 Debug -hi link UT8 Debug -hi link UT9 Debug - -"color for user text (non-wrapping) -hi link UB1 Underlined -hi link UB2 Underlined -hi link UB3 Underlined -hi link UB4 Underlined -hi link UB5 Underlined -hi link UB6 Underlined -hi link UB7 Underlined -hi link UB8 Underlined -hi link UB9 Underlined - -"colors for folded sections -"hi link Folded Special -"hi link FoldColumn Type - -"colors for experimental spelling error highlighting -"this only works for spellfix.vim with will be cease to exist soon -hi link spellErr Error -hi link BadWord Todo - -" Syntax {{{1 -syn clear -syn sync fromstart - -syn match outlTags '_tag_\w*' contained - -" Noel's style of body text {{{2 -syntax region BT1 start=+^ \S+ skip=+^ \S+ end=+^\S+me=e-1 end=+^\(\t\)\{1}\S+me=e-2 contains=spellErr,SpellErrors,BadWord contained -syntax region BT2 start=+^\(\t\)\{1} \S+ skip=+^\(\t\)\{1} \S+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT3 start=+^\(\t\)\{2} \S+ skip=+^\(\t\)\{2} \S+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT4 start=+^\(\t\)\{3} \S+ skip=+^\(\t\)\{3} \S+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT5 start=+^\(\t\)\{4} \S+ skip=+^\(\t\)\{4} \S+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT6 start=+^\(\t\)\{5} \S+ skip=+^\(\t\)\{5} \S+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT7 start=+^\(\t\)\{6} \S+ skip=+^\(\t\)\{6} \S+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT8 start=+^\(\t\)\{7} \S+ skip=+^\(\t\)\{7} \S+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT9 start=+^\(\t\)\{8} \S+ skip=+^\(\t\)\{8} \S+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained - -"comment-style bodytext as per Steve Litt {{{2 -syntax region BT1 start=+^:+ skip=+^:+ end=+^\S+me=e-1 end=+^\(\t\)\{1}\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT2 start=+^\(\t\)\{1}:+ skip=+^\(\t\)\{1}:+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT3 start=+^\(\t\)\{2}:+ skip=+^\(\t\)\{2}:+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT4 start=+^\(\t\)\{3}:+ skip=+^\(\t\)\{3}:+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT5 start=+^\(\t\)\{4}:+ skip=+^\(\t\)\{4}:+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT6 start=+^\(\t\)\{5}:+ skip=+^\(\t\)\{5}:+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT7 start=+^\(\t\)\{6}:+ skip=+^\(\t\)\{6}:+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT8 start=+^\(\t\)\{7}:+ skip=+^\(\t\)\{7}:+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region BT9 start=+^\(\t\)\{8}:+ skip=+^\(\t\)\{8}:+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained - -"Preformatted body text {{{2 -syntax region PT1 start=+^;+ skip=+^;+ end=+^\S+me=e-1 end=+^\(\t\)\{1}\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region PT2 start=+^\(\t\)\{1};+ skip=+^\(\t\)\{1};+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region PT3 start=+^\(\t\)\{2};+ skip=+^\(\t\)\{2};+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region PT4 start=+^\(\t\)\{3};+ skip=+^\(\t\)\{3};+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region PT5 start=+^\(\t\)\{4};+ skip=+^\(\t\)\{4};+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region PT6 start=+^\(\t\)\{5};+ skip=+^\(\t\)\{5};+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region PT7 start=+^\(\t\)\{6};+ skip=+^\(\t\)\{6};+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region PT8 start=+^\(\t\)\{7};+ skip=+^\(\t\)\{7};+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region PT9 start=+^\(\t\)\{8};+ skip=+^\(\t\)\{8};+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained - -"Preformatted tables {{{2 -syntax region TA1 start=+^|+ skip=+^|+ end=+^\S+me=e-1 end=+^\(\t\)\{1}\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region TA2 start=+^\(\t\)\{1}|+ skip=+^\(\t\)\{1}|+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region TA3 start=+^\(\t\)\{2}|+ skip=+^\(\t\)\{2}|+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region TA4 start=+^\(\t\)\{3}|+ skip=+^\(\t\)\{3}|+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region TA5 start=+^\(\t\)\{4}|+ skip=+^\(\t\)\{4}|+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region TA6 start=+^\(\t\)\{5}|+ skip=+^\(\t\)\{5}|+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region TA7 start=+^\(\t\)\{6}|+ skip=+^\(\t\)\{6}|+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region TA8 start=+^\(\t\)\{7}|+ skip=+^\(\t\)\{7}|+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region TA9 start=+^\(\t\)\{8}|+ skip=+^\(\t\)\{8}|+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained - -"wrapping user text {{{2 -syntax region UT1 start=+^>+ skip=+^>+ end=+^\S+me=e-1 end=+^\(\t\)\{1}\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UT2 start=+^\(\t\)\{1}>+ skip=+^\(\t\)\{1}>+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UT3 start=+^\(\t\)\{2}>+ skip=+^\(\t\)\{2}>+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UT4 start=+^\(\t\)\{3}>+ skip=+^\(\t\)\{3}>+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UT5 start=+^\(\t\)\{4}>+ skip=+^\(\t\)\{4}>+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UT6 start=+^\(\t\)\{5}>+ skip=+^\(\t\)\{5}>+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UT7 start=+^\(\t\)\{6}>+ skip=+^\(\t\)\{6}>+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UT8 start=+^\(\t\)\{7}>+ skip=+^\(\t\)\{7}>+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UT9 start=+^\(\t\)\{8}>+ skip=+^\(\t\)\{8}>+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained - -"non-wrapping user text {{{2 -syntax region UB1 start=+^<+ skip=+^<+ end=+^\S+me=e-1 end=+^\(\t\)\{1}\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UB2 start=+^\(\t\)\{1}<+ skip=+^\(\t\)\{1}<+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UB3 start=+^\(\t\)\{2}<+ skip=+^\(\t\)\{2}<+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UB4 start=+^\(\t\)\{3}<+ skip=+^\(\t\)\{3}<+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UB5 start=+^\(\t\)\{4}<+ skip=+^\(\t\)\{4}<+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UB6 start=+^\(\t\)\{5}<+ skip=+^\(\t\)\{5}<+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UB7 start=+^\(\t\)\{6}<+ skip=+^\(\t\)\{6}<+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UB8 start=+^\(\t\)\{7}<+ skip=+^\(\t\)\{7}<+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained -syntax region UB9 start=+^\(\t\)\{8}<+ skip=+^\(\t\)\{8}<+ end=+^\(\t\)*\S+me=s-1 contains=spellErr,SpellErrors,BadWord contained - -"comment-style bodytext formatting as per Steve Litt -syntax match Comment "^\s*:.*$" -setlocal fo-=t fo+=crqno -setlocal com=sO:\:\ -,mO:\:\ \ ,eO:\:\:,:\:,sO:\>\ -,mO:\>\ \ ,eO:\>\>,:\> - -" Headings {{{2 -syntax region OL1 start=+^[^:\t]+ end=+^[^:\t]+me=e-1 contains=outlTags,BT1,BT2,PT1,PT2,TA1,TA2,UT1,UT2,UB1,UB2,spellErr,SpellErrors,BadWord,OL2 keepend -syntax region OL2 start=+^\t[^:\t]+ end=+^\t[^:\t]+me=s-1 contains=outlTags,BT2,BT3,PT2,PT3,TA2,TA3,UT2,UT3,UB2,UB3,spellErr,SpellErrors,BadWord,OL3 keepend -syntax region OL3 start=+^\(\t\)\{2}[^:\t]+ end=+^\(\t\)\{2}[^:\t]+me=e-3 contains=outlTags,BT3,BT4,PT3,PT4,TA3,TA4,UT3,UT4,UB3,UB4,spellErr,SpellErrors,BadWord,OL4 keepend -syntax region OL4 start=+^\(\t\)\{3}[^:\t]+ end=+^\(\t\)\{3}[^:\t]+me=e-4 contains=outlTags,BT4,BT5,PT4,PT5,TA4,TA5,UT4,UT5,UB4,UB5,spellErr,SpellErrors,BadWord,OL5 keepend -syntax region OL5 start=+^\(\t\)\{4}[^:\t]+ end=+^\(\t\)\{4}[^:\t]+me=e-5 contains=outlTags,BT5,BT6,PT5,PT6,TA5,TA6,UT5,UT6,UB5,UB6,spellErr,SpellErrors,BadWord,OL6 keepend -syntax region OL6 start=+^\(\t\)\{5}[^:\t]+ end=+^\(\t\)\{5}[^:\t]+me=e-6 contains=outlTags,BT6,BT7,PT6,PT7,TA6,TA7,UT6,UT7,UB6,UB7,spellErr,SpellErrors,BadWord,OL7 keepend -syntax region OL7 start=+^\(\t\)\{6}[^:\t]+ end=+^\(\t\)\{6}[^:\t]+me=e-7 contains=outlTags,BT7,BT8,PT7,PT8,TA7,TA8,UT7,UT8,UB7,UB8,spellErr,SpellErrors,BadWord,OL8 keepend -syntax region OL8 start=+^\(\t\)\{7}[^:\t]+ end=+^\(\t\)\{7}[^:\t]+me=e-8 contains=outlTags,BT8,BT9,PT8,PT9,TA8,TA9,UT8,UT9,UB8,UB9,spellErr,SpellErrors,BadWord,OL9 keepend -syntax region OL9 start=+^\(\t\)\{8}[^:\t]+ end=+^\(\t\)\{8}[^:\t]+me=e-9 contains=outlTags,BT9,PT9,TA9,UT9,UB9,spellErr,SpellErrors,BadWord keepend - -" Auto-commands {{{1 -if !exists("autocommand_vo_loaded") - let autocommand_vo_loaded = 1 - au BufNewFile,BufRead *.otl setf outliner -" au CursorHold *.otl syn sync fromstart -" set updatetime=500 -endif - -" The End -" vim600: set foldmethod=marker foldlevel=0: diff --git a/pack/acp/start/vimoutliner/vimoutliner/images/Vimoutliner_logo.png b/pack/acp/start/vimoutliner/vimoutliner/images/Vimoutliner_logo.png deleted file mode 100644 index 5831d93a7d83bcd4bd030e7955c06cb86b32f697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19060 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 V5u0KSk&gfX002ovPDHLkV1nsl(4GJQ diff --git a/pack/acp/start/vimoutliner/vimoutliner/images/Vimoutliner_logo_tiny.png b/pack/acp/start/vimoutliner/vimoutliner/images/Vimoutliner_logo_tiny.png deleted file mode 100644 index 4c942ada9e69e008a5c81ae6cd4f683049a4e943..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7036 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 L4K->Jj`9Bk?m-Q2 diff --git a/pack/acp/start/vimoutliner/vimoutliner/images/favicon.ico b/pack/acp/start/vimoutliner/vimoutliner/images/favicon.ico deleted file mode 100644 index fd42fabfcd72a56d5648e3392be574a7161543bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmZ|HJxfAi0LAhD1tBHW3%x>v<s=w16>ZWGEoDQE(a@VTw$v2&Y7m7}ItZ;n5jM0n zgf`R|eS-)hFc3~sLXkW?q0XJ<cR0fV2M5=6aR`ubU=T<EE-(t6{l5ewA(G=sdS)Vo z*7}%FFEE)&5k44Vb34P*?lQflF;)&YILaTBzdGTfe95nAbuR6#{cbj!*6L+{B<6WW zb<^6p_Kb8hSE<|?sb;OUMv@nwh_-!SpGt)#Y4NLIq_k>{qLKO~Z_7xZt9ol2J5{}H zqgbsKtJ24`UJJ%N+n>ktRMbYTjmPa%86E~8mj&Me--18e?F@q-1U~>dAWK&VILpG` GJ^TS%#eDz( diff --git a/pack/acp/start/vimoutliner/vimoutliner/plugin/prev/votl_hoist.otl b/pack/acp/start/vimoutliner/vimoutliner/plugin/prev/votl_hoist.otl deleted file mode 100644 index 9b0dd67..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/plugin/prev/votl_hoist.otl +++ /dev/null @@ -1,77 +0,0 @@ -Hoisting -What is it? - : Hoisting is a way to focus on a particular area of an outline. Only the - : offspring from a selected parent will be shown. The offspring are - : left-justified just as if they were the top level headings and had no - : parent. -Installation - The hoist plugin is included in the VimOutliner plugin directory - This plugin is disabled by default - See information in the ~/.vimoutlinerrc on how to enable it - Optionally set the hoistParanoia variable - : If you are really paranoid about loosing your data during shakedown - : of vo_hoist.vim, you can add this to your ~/.vimoutlinerrc file. It - : will prevent VO from automatically removing the temporary hoist - : files. This will have a tendency to hugely increase the number of - : files in your working directory (but if you're paranoid... ;) ) - let g:hoistParanoia = 1 -How do I use it? - Hoisting - : Whenever you open a VO document, hoisting will be available. - Invocation - Place the cursor on the parent to be hoisted - ,,h - You will need to hit <ENTER> to accept some informational messages - You should now see the children of the selected parent ready for editing - Treat this document just like a normal .otl file - De-hoisting - : From within the hoisted document you simply need to quit. The - : hoisted data will be saved in place of the old children. The cursor - : will be returned to the hoisted parent. - Invocation - The :q, :wq, :x and ZZ perform a de-hoist operation - A write will automatically be done to save any changes - Manual De-hoisting - : Should the de-hoisting ever fail or should an operator quit Vim (by - : closing the window with the mouse, say), a manual de-hoisting will - : need to be performed. - You can find a currently hoisted parent by searching for __hoist - Place the cursor on the parent with the __hoist tag - ,,H - The edited, hoisted offspring will replace the current offspring - The __hoist tag will be removed -The Hoist Tag - Example Tag - : The hoist tag is added to a hoisted parent for error recovery. It - : includes a filename, a line number and a timestamp. - Example Tag - __hoist:vo_hoist.46.20030816124249.otl - Tag Components - Tag Marker - __hoist: - Easy search and replace - Filename Prefix - vo_hoist. - Needed to comply with VO standards for file naming - Parent Line Number (at time of hoisting) - 46. - Timestamp - 20030816124249 - YYYYMMDDhhmmss - Filename Suffix - .otl - Duh -The Log Files - : Log files of the hoists are created to aid in error recovery should that - : become necessary. They are created in the same directory as the working - : .otl file. - Log Filename - .vo_hoist.<otlfilename>.log - Example Log Filename - .vo_hoist.test.otl.log - Contents - There is one line per hoist operation - Each is comprised of a parent with a __hoist tag -Limitations - 1 Level Deep - : Until debug is complete, hoisting is limited to one level. diff --git a/pack/acp/start/vimoutliner/vimoutliner/plugin/prev/votl_hoist.vim b/pack/acp/start/vimoutliner/vimoutliner/plugin/prev/votl_hoist.vim deleted file mode 100755 index c4064d1..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/plugin/prev/votl_hoist.vim +++ /dev/null @@ -1,251 +0,0 @@ -"###################################################################### -"# VimOutliner Hoisting -"# Copyright (C) 2003 by Noel Henson noel@noels-lab.com -"# The file is currently an experimental part of Vim Outliner. -"# -"# This program is free software; you can redistribute it and/or modify -"# it under the terms of the GNU General Public License as published by -"# the Free Software Foundation; either version 2 of the License, or -"# (at your option) any later version. -"# -"# This program is distributed in the hope that it will be useful, -"# but WITHOUT ANY WARRANTY; without even the implied warranty of -"# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -"# GNU General Public License for more details. -"###################################################################### - -" Load the plugin {{{1 -" mappings {{{1 -map <silent> <buffer> <localleader>h :call Hoist(line("."))<cr> -map <silent> <buffer> <localleader>H :call DeHoistThis(line("."))<cr> -"}}}1 -if exists("g:did_vo_hoist") - finish -endif -if !exists("g:hoistParanoia") - let g:hoistParanoia=0 -endif -let g:did_vo_hoist = 1 -" Functions {{{1 -" RemoveTabsLine(line,tabs) {{{2 -" remove specified number of tabs from the beginning of line -function! RemoveTabsLine(line,tabs) - return substitute(getline(a:line),"^\\(\\t\\)\\{".a:tabs."}", "", "") -endfunction -"}}}2 -" MakeTempFilename(line) {{{2 -" return a string to use as the temporary filename for the hoisted area -function! MakeTempFilename(line) - return "vo_hoist.".a:line.strftime(".%Y%m%d%H%M%S").".otl" -endfunction -"}}}2 -" AddHoistFilename(line) {{{2 -" Add a temporary filename to a parent line to indicate hoisting -function! AddHoistFilename(line) - let l:newparent = getline(a:line)." __hoist:".MakeTempFilename(a:line) - call setline(a:line,l:newparent) -endfunction -"}}}2 -"}}}2 -" DeleteHoistFilename(line) {{{2 -" Delete a temporary filename from a parent line -function! DeleteHoistFilename(line) - call setline(a:line,substitute(getline(a:line)," __hoist:.*","","")) -endfunction -"}}}2 -" ExtractHoistFilename(line) {{{2 -" Extract a filename from a hoisted parent -function! ExtractHoistFilename(line) - return substitute(getline(a:line),".* __hoist:","","") -endfunction -"}}}2 -" IsParent(line) {{{2 -" Return 1 if this line is a parent -function! IsParent(line) - return (Ind(a:line)+1) == Ind(a:line+1) -endfunction -"}}}2 -" IsHoistedParent(line) {{{2 -" Return 1 if this line is a parent with hoisted children -function! IsHoistParent(line) - return match(getline(a:line)," __hoist:","") != -1 -endfunction -"}}}2 -" FindParent(line) {{{2 -" Return line if parent, parent line if not -function! FindParent(line) - if IsParent(a:line) - return a:line - else - let l:parentindent = Ind(a:line)-1 - let l:searchline = a:line - while (Ind(l:searchline) != l:parentindent) && (l:searchline > 0) - let l:searchline = l:searchline-1 - endwhile - return l:searchline - endif -endfunction -"}}}2 -" FindLastChild(line) {{{2 -" Return the line number of the last descendent of parent line -function! FindLastChild(line) - let l:parentindent = Ind(a:line) - let l:searchline = a:line+1 - while Ind(l:searchline) > l:parentindent - let l:searchline = l:searchline+1 - endwhile - return l:searchline-1 -endfunction -"}}}2 -"}}}2 -" Hoist(line) {{{2 -" Write the offspring of a parent to a new file, open it and remove the -" leading tabs. -function! Hoist(line) - let l:parent = FindParent(a:line) - if l:parent == 0 - return - endif - call cursor(l:parent,1) - let l:firstline = l:parent+1 - let l:childindent = Ind(l:firstline) - let l:lastline = FindLastChild(l:parent) - let l:filename = MakeTempFilename(l:parent) - echo l:firstline.",".l:lastline."w! ".l:filename - let l:folded = foldclosed(l:parent) - call cursor(l:parent,1) - normal zo - exe l:firstline.",".l:lastline."w! ".l:filename - call AddHoistFilename(l:parent) - silent write - " log what we did in case we need to recover manually - let l:doit = l:parent."write! >> .vo_hoist.".bufname(bufnr("%")).".log" - exe l:doit - let l:parentbuffer = bufnr("%") - "WARNING: switching files - let l:doit = "silent e +%s/^\\\\(\\\t\\\\)\\\\{" - let l:doit = l:doit.l:childindent."}// ".l:filename." | " - let l:doit = l:doit."let b:myParentBuffer = ".l:parentbuffer." | " - let l:doit = l:doit."let b:myParentLine = ".l:parent." | " - let l:doit = l:doit."call cursor(1,1)|" - let l:doit = l:doit."let b:hoisted = 1" - exe l:doit - silent write -endfunction -"}}}2 -" DeleteChildren(line) {{{2 -" Delete the existing offspring of a parent -function! DeleteChildren(line) - let l:parent = FindParent(a:line) - let l:firstline = l:parent+1 - let l:lastline = FindLastChild(l:parent) - exe l:firstline.",".l:lastline."d" -endfunction -"}}}2 -" MakeTabString(n) {{{2 -" Return a string of n tabs -function! MakeTabString(n) - let l:string = "" - let l:i = 0 - while l:i < a:n - let l:string = l:string."\t" - let l:i = l:i +1 - endwhile - return l:string -endfunction -"}}}2 -" AddChildren(line) {{{2 -" Add left-justified children to parent. The filename is extracted from the -" end of the parent line. The parent is assumed to have no children at this -" point. -function! AddChildren(line) - let l:filename = ExtractHoistFilename(a:line) - if filereadable(l:filename) == 1 - if a:line == line("$") - exe "read ".l:filename - if a:line != line("$") - exe a:line+1.",$"." s/^/".MakeTabString(Ind(a:line)+1)."/" - endif - else - exe a:line+1."ma v" - call cursor(a:line,1) - exe "read ".l:filename - if a:line+1 != line("'v") - exe a:line+1.",'v-1"." s/^/".MakeTabString(Ind(a:line)+1)."/" - endif - endif - endif -endfunction -"}}}2 -" DeleteHoistFile(line) {{{2 -" Delete a temporary filename from a parent line -function! DeleteHoistFile(line) - if g:hoistParanoia - return - endif - let l:filename = ExtractHoistFilename(a:line) - call delete(l:filename) - let l:filename = l:filename."~" - call delete(l:filename) -endfunction -"}}}2 -" DeHoistThis(line) {{{2 -" Remove the old children, add the new children and remove the __hoist data -" leading tabs from this file. -function! DeHoistThis(line) - let l:parent = FindParent(a:line) - let l:folded = foldclosed(l:parent) - call cursor(l:parent,1) - if l:folded == l:parent - normal zo - endif - call DeleteChildren(l:parent) - call AddChildren(l:parent) - call DeleteHoistFile(l:parent) - call DeleteHoistFilename(l:parent) - if l:folded == l:parent - normal zc - endif -endfunction -"}}}2 -" DeHoist() {{{2 -" Remove the old children, add the new children and remove the __hoist data -" leading tabs from the calling file. -function! DeHoist() - silent write - if bufexists(b:myParentBuffer) == 0 - return - endif - let l:myParentBuffer = b:myParentBuffer - let l:myParentLine = b:myParentLine - bdelete - " Warning switching files - exe "buffer ".l:myParentBuffer - call cursor(l:myParentLine,1) - let l:parent = FindParent(l:myParentLine) - let l:folded = foldclosed(l:parent) - call cursor(l:parent,1) -" if l:folded == l:parent -" normal zo -" endif - normal zv - silent call DeleteChildren(l:parent) - silent call AddChildren(l:parent) - silent call DeleteHoistFile(l:parent) - silent call DeleteHoistFilename(l:parent) - if l:folded == l:parent - call cursor(l:parent,1) - normal zc - endif - silent write -endfunction -"}}}2 -"}}}1 -" Autocommands {{{1 - au BufReadPost vo_hoist.*.otl cmap <buffer> wq call DeHoist() - au BufReadPost vo_hoist.*.otl cmap <buffer> qa call DeHoist() - au BufReadPost vo_hoist.*.otl cmap <buffer> q call DeHoist() - au BufReadPost vo_hoist.*.otl cmap <buffer> x call DeHoist() - au BufReadPost vo_hoist.*.otl nmap <buffer> ZZ :call DeHoist()<cr> -"}}}1 -" vim600: set foldlevel=0 foldmethod=marker: diff --git a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_checkbox.otl b/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_checkbox.otl deleted file mode 100644 index 0a135b4..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_checkbox.otl +++ /dev/null @@ -1,310 +0,0 @@ -Checkboxes: votl_checkbox -What is it? - : Checkboxes is a plugin for project, task and list managment. It add an - : understanding of check boxes and percentage of task completion to Vim - : Outliner. It adds just three tags and six commands. -Installation - This should already be included in your Vim Outliner package - The newest, stable version is included with this package in the plugin directory - The pluging is already enabled in your ~/.vimoutlinerrc -Tag Syntax - [_] an unchecked item or incomplete task - [X] a checked item or complete task - [-] a canceled item - removes this item/branch from completion calculations - % a placeholder for percentage of completion - n% a percentage of completion, used in calculating parent completion - n%w a percentage with a weighting factor - e.g.: 10%2 - [tag] a tag than can be replaced from a list of tags - [tag] also the default tag name - will be replaced by tag[0] of tag list[0] - [tag] [tag] tags must be separated by whitespace -Example g:cbTags (put in .vimoutlinerrc) - let g:cbTags = [ - \ ['TODO','FEEDBACK','VERIFY','DELEGATED','HOLDING'] - \,['Feature','Enhancement','Bug'] - \,['Low','Normal','High','URGENT'] - \,['Home','Lab','Work','Shopping'] - \] -Checkbox Commands - : The default <localleader> for VimOutliner is ,, so we will use this - : leader in the command discussions. - ,,cb Create a check box - : This works for the current heading or selected range of lines - : including folds. Visual selection of the range of headings works - : nicely. This command is currently not aware of body text. This - : limited awareness needs to be fixed before this plugin can be - : included in the standard Vim Outliner plugins. - ,,cB Create a check box (even if one exists) - ,,c% Create a checkbox and % symbol - : This works just like ,,cb but add a % symbol for use in completion - : calculations. - ,,cp Create a checkbox and % symbol - : This works just like ,,cb but add a % symbol for use in completion - : calculations; even on childless headings. - ,,cx Change check box state - : If there is a checkbox on the line the cursor is on, change its - : state. If it's checked, uncheck it and vice-versa. Then recompute - : the completion of the entire branch starting from the root parent. - ,,cd Delete a checkbox - : Delete the left-most check box on the selected heading(s). - ,,cz Compute completion - : Starting at the heading the cursor is on, recursively compute the - : completion level of all sub-headings. - ,,c1 Set completion to 10% - : Set the completion to 10%, if a percentage already exists. - ,,c2 Set completion to 20% - : Set the completion to 20%, if a percentage already exists. - ,,c3 Set completion to 30% - : Set the completion to 30%, if a percentage already exists. - ,,c4 Set completion to 40% - : Set the completion to 40%, if a percentage already exists. - ,,c5 Set completion to 50% - : Set the completion to 50%, if a percentage already exists. - ,,c6 Set completion to 60% - : Set the completion to 60%, if a percentage already exists. - ,,c7 Set completion to 70% - : Set the completion to 70%, if a percentage already exists. - ,,c8 Set completion to 80% - : Set the completion to 80%, if a percentage already exists. - ,,c9 Set completion to 90% - : Set the completion to 90%, if a percentage already exists. - ,,c+ Increment the completion by 10% - : Increment the completion by 10%, if a percentage already exists. - ,,c- Decrement the completion by 10% - : Decrement the completion by 10%, if a percentage already exists. - ,,ct Set tag to next tag in current tag list - : Set the tag under the cursor to the next tag in the list that - : contains the current tag. This command is not mapped if g:cbTags - : does not exist. - ,,cT Set tag to next tag list - : Set the tag under the cursor to the first tag in the next tag list. - : This command is not mapped if g:cbTags does not exist. -How do I use it? - Start with a simple example - : Let's start with planning a small party; say a barbeque. - Make the initial outline - Barbeque - Guests - Bill and Barb - Larry and Louise - Marty and Mary - Food - Chicken - Ribs - Corn on the cob - Beverages - Soda - Iced Tea - Beer - Party Favors - Squirt guns - Hats - Name tags - Materials - Paper Plates - Napkins - Trash Containers - Add the check boxes - : This can be done by visually selecting them and typing ,,cb. - : When done, you should see this: - [_] Barbeque - [_] Guests - [_] Bill and Barb - [_] Larry and Louise - [_] Marty and Mary - [_] Food - [_] Chicken - [_] Ribs - [_] Corn on the cob - [_] Beverages - [_] Soda - [_] Iced Tea - [_] Beer - [_] Party Favors - [_] Squirt guns - [_] Hats - [_] Name tags - [_] Materials - [_] Paper Plates - [_] Napkins - [_] Trash Containers - Now check off what's done - : Checking off what is complete is easy with the ,,cx command. - : Just place the cursor on a heading and ,,cx it. Now you can see - : what's done as long as the outline is fully expanded. - [_] Barbeque - [X] Guests - [X] Bill and Barb - [X] Larry and Louise - [X] Marty and Mary - [_] Food - [X] Chicken - [X] Ribs - [_] Corn on the cob - [_] Beverages - [_] Soda - [X] Iced Tea - [X] Beer - [_] Party Favors - [_] Squirt guns - [_] Hats - [_] Name tags - [_] Materials - [X] Paper Plates - [_] Napkins - [X] Trash Containers - Getting more advanced - Now summarize what's done - : You can summarize what is done with the ,,cz command. Place the - : cursor on the 'Barbeque' heading and ,,cz it. The command will - : recursively process the outline and update the check boxes of - : the parent headlines. You should see: - : (Note: the only change is on the 'Guests' heading. It changed - : because all of its children are complete.) - [_] Barbeque - [X] Guests - [X] Bill and Barb - [X] Larry and Louise - [X] Marty and Mary - [_] Food - [X] Chicken - [X] Ribs - [_] Corn on the cob - [_] Beverages - [_] Soda - [X] Iced Tea - [X] Beer - [_] Party Favors - [_] Squirt guns - [_] Hats - [_] Name tags - [_] Materials - [X] Paper Plates - [_] Napkins - [X] Trash Containers - Add percentages for a better view - : You can get a much better view of what's going on, especially - : with collapsed headings, if you add percentages. Place a 0% on - : each heading that has children like this: - [_] 59% Barbeque - [X] 100% Guests - [X] Bill and Barb - [X] Larry and Louise - [X] Marty and Mary - [_] 66% Food - [X] Chicken - [X] Ribs - [_] Corn on the cob - [_] 66% Beverages - [_] Soda - [X] Iced Tea - [X] Beer - [_] 0% Party Favors - [_] Squirt guns - [_] Hats - [_] Name tags - [_] 66% Materials - [X] Paper Plates - [_] Napkins - [X] Trash Containers - Now compute the percentage of completion - : After adding the 0% symbols, place the cursor on the 'Barbeque' - : heading and execute ,,cz as before. Keep in mind that the - : recursive percentages are weighted. You should see: - [_] 59% Barbeque - [X] 100% Guests - [X] Bill and Barb - [X] Larry and Louise - [X] Marty and Mary - [_] 66% Food - [X] Chicken - [X] Ribs - [_] Corn on the cob - [_] 66% Beverages - [_] Soda - [X] Iced Tea - [X] Beer - [_] 0% Party Favors - [_] Squirt guns - [_] Hats - [_] Name tags - [_] 66% Materials - [X] Paper Plates - [_] Napkins - [X] Trash Containers - Complete a few more just for fun - : Mark Salad and Soda and recompute with ,,cz and you should - : see the ouline below. - : - : Try playng around with zc and zo to see the effects of opening - : and closing folds. Even if you place the cursor on 'Barbeque' - : and zo it, you still have a good understanding of how complete - : the project is. - [_] 66% Barbeque - [X] 100% Guests - [X] Bill and Barb - [X] Larry and Louise - [X] Marty and Mary - [_] 66% Food - [X] Chicken - [X] Ribs - [_] Corn on the cob - [X] 100% Beverages - [X] Soda - [X] Iced Tea - [X] Beer - [_] 0% Party Favors - [_] Squirt guns - [_] Hats - [_] Name tags - [_] 66% Materials - [X] Paper Plates - [_] Napkins - [X] Trash Containers - Getting way more advanced - Weighted Tasks - Here is a simple outline to track a project - [_] 22% Garage Upgrade - [_] 66% Clean out old junk - [X] 100% empty garage - [X] 100% sort junk - [_] 0% dispose of junk - [_] 0% Build Shelves - [_] 0% Oranize Junk - [_] 0% oranize saved junk - [_] 0% put junk on shelves - What if some tasks take more effort? - : Assume that you know that it will take twice as long to sort - : junk as it does to remove it from the garage or to dispose - : of it. This can be represented with weights. Notice the - : completion percentage of 'Clean out old junk' once a weight - : has been added. Each percentage can be weighted. - [_] 25% Garage Upgrade - [_] 75% Clean out old junk - [X] 100% empty garage - [X] 100%2 sort junk - [_] 0% dispose of junk - [_] 0% Build Shelves - [_] 0% Oranize Junk - [_] 0% oranize saved junk - [_] 0% put junk on shelves - Complex weighting - [_] 83% Garage Upgrade - [_] 75%2 Clean out old junk - [X] 100% empty garage - [X] 100%2 sort junk - [_] 0% dispose of junk - [X] 100%2 Build Shelves - [_] 66% Oranize Junk - [X] 100%2 oranize saved junk - [_] 0% put junk on shelves - Tags: Add more information to a heading - : Additional information and workflow information can easily - : be added to headings with tags. The command ,,ct can be used - : to cycle a tag among it sibling tags in g:cbTags. ,,cT can - : be be used to cycle a tag to a different list of sibling - : tags. - My Software Project - [_] 33% To Do - [X] Misspellings in documention [Bug] [High] - [_] Installation infects all networked systems with app [Feature] [Normal] - [_] Clean garage [Low] [@Home] diff --git a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_checkbox.vim b/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_checkbox.vim deleted file mode 100755 index e97ae57..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_checkbox.vim +++ /dev/null @@ -1,475 +0,0 @@ -"###################################################################### -"# VimOutliner Checkboxes -"# Copyright (C) 2003 by Noel Henson noel@noels-lab.com -"# The file is currently an experimental part of Vim Outliner. -"# -"# This program is free software; you can redistribute it and/or modify -"# it under the terms of the GNU General Public License as published by -"# the Free Software Foundation; either version 2 of the License, or -"# (at your option) any later version. -"# -"# This program is distributed in the hope that it will be useful, -"# but WITHOUT ANY WARRANTY; without even the implied warranty of -"# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -"# GNU General Public License for more details. -"###################################################################### - -" mappings {{{1 -" insert a chechbox -noremap <silent><buffer> <localleader>cb :call SafelyInsertCheckBox()<cr> -noremap <silent><buffer> <localleader>c% :call SafelyInsertCheckBoxPercent()<cr> -noremap <silent><buffer> <localleader>cp :call SafelyInsertCheckBoxPercentAlways()<cr> -noremap <silent><buffer> <localleader>cB :call InsertCheckBox()<cr> - -" delete a chechbox -noremap <silent><buffer> <localleader>cd :call DeleteCheckbox()<cr> - -" switch the status of the box and adjust percentages -if !exists('g:vo_checkbox_fast_calc') || g:vo_checkbox_fast_calc == 1 - " Use new and faster method - noremap <silent><buffer> <localleader>cx :call SwitchBox() <bar>call CalculateMyBranch(line("."))<cr> - noremap <silent><buffer> <localleader>c+ :call IncPercent(".") <bar>call CalculateMyBranch(line("."))<cr> - noremap <silent><buffer> <localleader>c- :call DecPercent(".") <bar>call CalculateMyBranch(line("."))<cr> - noremap <silent><buffer> <localleader>c1 :call SetPercent(".",10)<bar>call CalculateMyBranch(line('.'))<cr> - noremap <silent><buffer> <localleader>c2 :call SetPercent(".",20)<bar>call CalculateMyBranch(line('.'))<cr> - noremap <silent><buffer> <localleader>c3 :call SetPercent(".",30)<bar>call CalculateMyBranch(line('.'))<cr> - noremap <silent><buffer> <localleader>c4 :call SetPercent(".",40)<bar>call CalculateMyBranch(line('.'))<cr> - noremap <silent><buffer> <localleader>c5 :call SetPercent(".",50)<bar>call CalculateMyBranch(line('.'))<cr> - noremap <silent><buffer> <localleader>c6 :call SetPercent(".",60)<bar>call CalculateMyBranch(line('.'))<cr> - noremap <silent><buffer> <localleader>c7 :call SetPercent(".",70)<bar>call CalculateMyBranch(line('.'))<cr> - noremap <silent><buffer> <localleader>c8 :call SetPercent(".",80)<bar>call CalculateMyBranch(line('.'))<cr> - noremap <silent><buffer> <localleader>c9 :call SetPercent(".",90)<bar>call CalculateMyBranch(line('.'))<cr> -else - " Use the old method - noremap <silent><buffer> <localleader>cx :call SwitchBox() <bar>call NewHMD(FindRootParent(line(".")))<cr> - noremap <silent><buffer> <localleader>c+ :call IncPercent(".") <bar>call NewHMD(FindRootParent(line(".")))<cr> - noremap <silent><buffer> <localleader>c- :call DecPercent(".") <bar>call NewHMD(FindRootParent(line(".")))<cr> - noremap <silent><buffer> <localleader>c1 :call SetPercent(".",10)<bar>call NewHMD(FindRootParent(line(".")))<cr> - noremap <silent><buffer> <localleader>c2 :call SetPercent(".",20)<bar>call NewHMD(FindRootParent(line(".")))<cr> - noremap <silent><buffer> <localleader>c3 :call SetPercent(".",30)<bar>call NewHMD(FindRootParent(line(".")))<cr> - noremap <silent><buffer> <localleader>c4 :call SetPercent(".",40)<bar>call NewHMD(FindRootParent(line(".")))<cr> - noremap <silent><buffer> <localleader>c5 :call SetPercent(".",50)<bar>call NewHMD(FindRootParent(line(".")))<cr> - noremap <silent><buffer> <localleader>c6 :call SetPercent(".",60)<bar>call NewHMD(FindRootParent(line(".")))<cr> - noremap <silent><buffer> <localleader>c7 :call SetPercent(".",70)<bar>call NewHMD(FindRootParent(line(".")))<cr> - noremap <silent><buffer> <localleader>c8 :call SetPercent(".",80)<bar>call NewHMD(FindRootParent(line(".")))<cr> - noremap <silent><buffer> <localleader>c9 :call SetPercent(".",90)<bar>call NewHMD(FindRootParent(line(".")))<cr> -endif - -" calculate the proportion of work done on the subtree -noremap <silent><buffer> <localleader>cz :call NewHMD(FindRootParent(line(".")))<cr> - -" tag list key mappings -if exists("g:cbTags") - noremap <silent><buffer> <localleader>ct :call SetNextTag()<cr> - noremap <silent><buffer> <localleader>cT :call SetNextList()<cr> -endif - -"}}}1 -" Load guard for functions {{{1 -if exists('s:loaded') - finish -endif -let s:loaded = 1 - -" InsertCheckBox() {{{1 -" Insert a checkbox at the beginning of a header without disturbing the -" current folding. -function! InsertCheckBox() - let @x = "[_] " - normal! ^"xP -endfunction -"}}}1 -" Safely InsertCheckBox() {{{1 -" Insert a checkbox at the beginning of a header without disturbing the -" current folding only if there is no checkbox already. -function! SafelyInsertCheckBox() - if match(getline("."),"^\t\t*\[<>:;|\]") != -1 - return - endif - if match(getline("."),"[\[X_\]]") == -1 - let @x = "[_] " - normal! ^"xP - endif -endfunction -"}}}1 -" Safely InsertCheckBoxPercent() {{{1 -" Insert a checkbox and % sign at the beginning of a header without disturbing -" the current folding only if there is no checkbox already. -function! SafelyInsertCheckBoxPercent() - if match(getline("."),"^\t\t*\[<>:;|\]") != -1 - return - endif - if match(getline("."), "[\[X_\]]") == -1 - if Ind(line(".")+1) > Ind(line(".")) - let @x = "[_] % " - else - let @x = "[_] " - endif - normal! ^"xP - endif -endfunction -"}}}1 -" Safely InsertCheckBoxPercentAlways() {{{1 -" Insert a checkbox and % sign at the beginning of a header without disturbing -" the current folding only if there is no checkbox already. Include the -" checkbox even on childless headings. -function! SafelyInsertCheckBoxPercentAlways() - if match(getline("."),"^\t\t*\[<>:;|\]") != -1 - return - endif - if match(getline("."), "[\[X_\]]") == -1 - let @x = "[_] % " - normal! ^"xP - endif -endfunction -"}}}1 -" SetBox(char) {{{1 -" Switch the state of the checkbox on the current line. -function! SetBox(char) - substitute/\[.\]/\="[".expand(a:char)."]"/ - if a:char == 'X' - call SetPercent(".",100) - elseif a:char == '_' - call SetPercent(".",0) - endif -endfunction - -"}}}1 -" SwitchBox() {{{1 -" Switch the state of the checkbox on the current line. -function! SwitchBox() - let l:line = getline(".") - let questa = strridx(l:line,"[_]") - let questb = strridx(l:line,"[X]") - if (questa != -1) || (questb != -1) - if (questa != -1) - call SetBox('X') - else - call SetBox('_') - endif - endif -endfunction -"}}}1 -" DeleteCheckbox() {{{1 -" Delete a checkbox if one exists -function! DeleteCheckbox() - let questa = strridx(getline("."),"[_]") - let questb = strridx(getline("."),"[X]") - if (questa != -1) || (questb != -1) - if (questa != -1) - substitute/\(^\s*\)\[_\] \(.*\)/\1\2/ - else - substitute/\(^\s*\)\[X\] \(.*\)/\1\2/ - endif - endif -endfunction -"}}}1 -" Ind(line) {{{1 -" Return the index of the line. -" Remove it when using the new version of VO -function! Ind(line) - return indent(a:line) / &tabstop -endf -" FindMyParent(line) {{{1 -" returns the line number of the parent of the current node -function! FindMyParent(line) - let l:mylevel = Ind(a:line) - if l:mylevel == 0 - return (a:line) - endif - let l:i = a:line - while Ind(l:i) >= l:mylevel - let l:i -= 1 - endwhile - return l:i -endf - -" FindRootParent(line) {{{1 -" returns the line number of the root parent for any child -function! FindRootParent(line) - if Ind(a:line) == 0 - return (a:line) - endif - let l:i = a:line - while l:i > 1 && Ind(l:i) > 0 - let l:i = l:i - 1 - endwhile - return l:i -endf - -" LimitPercent(percent) {{{1 -" Limits percentage values to between 0 and 100 -function! LimitPercent(val) - if a:val > 100 - return 100 - elseif a:val < 0 - return 0 - else - return a:val - endif -endf - -" GetPercent(line) {{{1 -" Get the percent complete from a line -function! GetPercent(line) - let l:proportion = 0 - let mbegin=match(getline(a:line), " [0-9]*%") - if mbegin - let mend=matchend(getline(a:line), " [0-9]*%") - let l:proportion=getline(a:line)[mbegin+1 : mend-1] - let l:proportion=str2nr(l:proportion) - endif - return l:proportion -endf - -" SetPercent(line,proportion) {{{1 -" Set the percent complete for a line -function! SetPercent(line,proportion) - let mbegin=match(getline(a:line), " [0-9]*%") - if mbegin - call setline(a:line,substitute(getline(a:line)," [0-9]*%"," ".a:proportion."%","")) - endif -endf - -" IncPercent(line) {{{1 -" Increments the percent doneness by 10% -function! IncPercent(line) - if match(getline(a:line), " [0-9]*%") - call SetPercent(a:line,LimitPercent(GetPercent(a:line)+10)) - endif -endf - -" DecPercent(line) {{{1 -" Decrements the percent doneness by 10% -function! DecPercent(line) - if match(getline(a:line), " [0-9]*%") - let l:percent = GetPercent(a:line) - call setline(a:line,substitute(getline(a:line),"\\[X\\]","[_]","")) - call SetPercent(a:line,LimitPercent(l:percent-10)) - endif -endf - -" ComputePW(line,count,done) {{{1 -" Computes proportion and weight of a node -" Returns (proportion,weight) proportion could be a flag of -1 -function! ComputePW(line,count,done) - let l:proportion=0 - let l:haspercent = 0 - " get the percent - let mbegin=match(getline(a:line), " [0-9]*%") - if mbegin != -1 - let l:haspercent = 1 - let mend=matchend(getline(a:line), " [0-9]*%") - let l:proportion=str2nr(getline(a:line)[mbegin+1 : mend-1]) - endif - " get the weight - let l:weight=1 - let mbegin=match(getline(a:line), "%[0-9]\\+") - if mbegin != -1 - let mend=matchend(getline(a:line), "%[0-9]\\+\s") - let l:weight=str2nr(getline(a:line)[mbegin+1 : mend-1]) - endif - " compute the proportion - if a:count>0 - let l:proportion = ((a:done*100)/a:count)/100 - elseif match(getline(a:line),"\\[X\\]") != -1 - let l:proportion = 100 - elseif match(getline(a:line),"\\[-\\]") != -1 - let l:weight = 0 - endif - " update non-ignored items - let l:questa = strridx(getline(a:line),"[-]") - if l:questa == -1 - call setline(a:line,substitute(getline(a:line)," [0-9]*%"," ".l:proportion."%","")) - endif - " Limit proportion to 0 or 100 if there is not a percentage sign - if !haspercent && (!exists('g:vo_checkbox_fast_calc') || g:vo_checkbox_fast_calc == 1) - let l:proportion = l:proportion == 100 ? l:proportion : 0 - endif - " update the completion - if l:questa != -1 - return [100,l:weight] - elseif l:proportion == 100 - call setline(a:line,substitute(getline(a:line),"\\[_\\]","[X]","")) - return [100,l:weight] - elseif l:proportion == 0 && a:count == 0 - if match(getline(a:line),"\\[X\\]") != -1 - return [100,l:weight] - elseif match(getline(a:line),"\\[_\\]") != -1 - return [0,l:weight] - else - return [-1,l:weight] - endif - else - call setline(a:line,substitute(getline(a:line),"\\[X\\]","[_]","")) - return [l:proportion,l:weight] - endif -endf - -" CalculateMyChildren(line) {{{1 -" Calculates percent completion only on the immediate children of the -" parent specified by line. -function! CalculateMyChildren(line) - let l:done = 0 - let l:count = 0 - let l:line = a:line + 1 - let l:mylevel = Ind(a:line) - let l:childlevel = l:mylevel+1 - while l:mylevel < Ind(l:line) " I have children - if l:childlevel == Ind(l:line) - let l:childstat = ComputePW(l:line,0,0) - let l:childdoneness = l:childstat[0] * l:childstat[1] - if l:childdoneness >= 0 - let l:done += l:childdoneness - let l:count += l:childstat[1] - endif - endif - let l:line += 1 - endwhile - return ComputePW(a:line,l:count,l:done) " returns with (proportion,weight) -endf - -" CalculateMyBranch(line) {{{1 -" Calculate from the leaf, up unlke NewHMD -function! CalculateMyBranch(line) - call NewHMD(a:line) " compute and adjust my children, if I have any - let l:line = a:line - while Ind(l:line) > 0 - let l:line = FindMyParent(l:line) - call CalculateMyChildren(l:line) - endwhile -endf - -" NewHMD(line) {{{1 -" (New How Many Done) -" Calculates proportion of already done work in the subtree -" Recursive, but slow because it computes an entire branch of an outline -" from level 1. -" Returns (proportion,weight) proportion could be a flag of -1 -function! NewHMD(line) - let l:done = 0 - let l:count = 0 - let l:line = a:line+1 - let l:mylevel = Ind(a:line) - let l:childlevel = l:mylevel+1 - while l:mylevel < Ind(l:line) " I have children - if l:childlevel == Ind(l:line) - let l:childstat = NewHMD(l:line) - let l:childdoneness = l:childstat[0] * l:childstat[1] - if l:childdoneness >= 0 - let l:done += l:childdoneness - let l:count += l:childstat[1] - endif - endif - let l:line += 1 - endwhile - return ComputePW(a:line,l:count,l:done) " returns with (proportion,weight) -endf - -" Experimental Heading Tags {{{1 - -if !exists('g:cbTags') - finish -endif - -" GetTag() {{{2 -" return the tag word under the cursor -function! GetTag() - let word = expand("<cWORD>") - if word[0] == '[' && word[-1:] == ']' - return word[1:-2] - endif - return "" -endfunction - -" WhereInLists(word) {{{2 -" return a single-entry list with a pair of values [listIndex,tagIndex] -" return -1,-1 if tag word not found -function! WhereInLists(word) - let lidx = 0 - for list in g:cbTags - let tidx = index(list,a:word) - if tidx >= 0 - return [lidx,tidx] - endif - let lidx += 1 - endfor - return [-1,-1] -endfunction - -" NextTagIdx(lidx,tidx) {{{2 -" return the index of the next tag in the current list -function! NextTagIdx(lidx,tidx) - if a:tidx >= 0 - let llen = len(g:cbTags[a:lidx]) - let tidx = (a:tidx + 1)%llen - endif - return tidx -endfunction - -" GetNextTag(word) {{{2 -" return the next tag word (from a:word) in the list -function! GetNextTag(word) - if a:word == 'tag' - return g:cbTags[0][0] - endif - let liti = WhereInLists(a:word) - if liti[1] == -1 - return "" - endif - let liti[1] = NextTagIdx(liti[0],liti[1]) - let nextword = g:cbTags[liti[0]][liti[1]] - return nextword -endfunction - -" SetNextTag() {{{2 -" set the current tag to the next tag in the same list -" this is circular, the last tag will roll to the first tag -function! SetNextTag() - let oldtag = GetTag() - let newtag = GetNextTag(oldtag) - if newtag == "" - return - endif - let sub = "normal!ci[".newtag - exec sub -endfunction - -" NextListIdx(lidx) {{{2 -" return the index of the next list -function! NextListIdx(lidx) - if a:lidx >= 0 - let llen = len(g:cbTags) - let lidx = (a:lidx + 1)%llen - endif - return lidx -endfunction - -" GetNextList(word) {{{2 -" return the next tag word (from a:word) in the list -function! GetNextList(word) - if a:word == 'tag' - return g:cbTags[0][0] - endif - let liti = WhereInLists(a:word) - if liti[1] == -1 - return "" - endif - let liti[0] = NextListIdx(liti[0]) - let nextword = g:cbTags[liti[0]][0] - return nextword -endfunction - -" SetNextList() {{{2 -" set the current tag to the first tag in the next list -" this is circular, the last list will roll to the first list -function! SetNextList() - let oldtag = GetTag() - let newtag = GetNextList(oldtag) - if newtag == "" - return - endif - let sub = "normal!ci[".newtag - exec sub -endfunction -" vim600: set foldlevel=0 foldmethod=marker: diff --git a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_clock.vim b/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_clock.vim deleted file mode 100644 index fe16968..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_clock.vim +++ /dev/null @@ -1,139 +0,0 @@ -"###################################################################### -"# VimOutliner Clock -"# Copyright (C) 2011 by Daniel Carl -"# The file is currently an experimental part of Vim Outliner. -"# -"# This program is free software; you can redistribute it and/or modify -"# it under the terms of the GNU General Public License as published by -"# the Free Software Foundation; either version 2 of the License, or -"# (at your option) any later version. -"# -"# This program is distributed in the hope that it will be useful, -"# but WITHOUT ANY WARRANTY; without even the implied warranty of -"# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -"# GNU General Public License for more details. -"###################################################################### -" Shortlog{{{1 -" -" This plugin of vimoutliner allow the simple tracking of times and the -" calculation of them in seconds, minutes, hours or days -" Exmaple : -" May -> 64.75 h -" Working time week 51 -> 46.00 h -" Working time week 52 -> 18.75 h -" 2010-05-03 [08:00:00 -- 17:45:00] -> 9.75 h -" 2010-05-04 [09:00:00 -- 18:00:00] -> 9.00 h -" -" TODO: Use better date calculation to track also time around 00:00 -" [23:00:00 -- 03:00:00] that will at the time lead to negative -" hours. -" TODO: change the clocking format so that times over several days could -" be calculated - [2010-05-03 08:00:00 -- 2010-05-23 26:30:45] or -" a shorter dateformat - this seems to need a more complex -" datehandling -" TODO: write a helppage for the vimoutliner that describes the votd_clock -" TODO: allow the user to select his own dateformat -"}}}1 -" ClockStart(space) {{{1 -" Insert a space, then the datetime. -function! ClockStart(space) - let @x = "" - if a:space == 1 - let @x = " " - endif - let @x = @x . strftime("%Y-%m-%d [%T -- %T] ->") - normal! "xp -endfunction -"}}}1 -" ClockStop() {{{1 -" Insert a space, then the datetime. -function! ClockStop() - if match(getline("."), "\\[.* -- .*\\]\\s*-\>") != -1 - call setline(".",substitute(getline(".")," -- .*]\\s*-\>"," -- ".strftime("%T] ->"),"")) - endif -endfunction -"}}}1 -" CalculateSeconds(str) {{{1 -" Calculates the seconds between the start and the end time. -function! CalculateSeconds(str) - let l:parts = split(a:str,"\ --\ ") - let l:startparts = split(l:parts[0],":") - let l:endparts = split(l:parts[1],":") - - let l:seconds = (str2nr(l:endparts[2]) - str2nr(l:startparts[2])) - let l:seconds = (str2nr(l:endparts[1]) - str2nr(l:startparts[1])) * 60 + l:seconds - let l:seconds = (str2nr(l:endparts[0]) - str2nr(l:startparts[0])) * 3600 + l:seconds - return l:seconds -endfunction -" }}}1 -" CalculateDuration() {{{1 -" insert date time -function! CalculateDuration(line) - let l:seconds=0 - let l:count=0 - let l:i = 1 - while Ind(a:line) < Ind(a:line+l:i) - if (Ind(a:line)+1) == (Ind(a:line+l:i)) - let l:childseconds = CalculateDuration(a:line+l:i) - if l:childseconds >= 0 - let l:seconds = l:seconds + l:childseconds - let l:count = l:count+1 - endif - endif - let l:i = l:i+1 - endwhile - - " if no childs found calculate the seconds for the line - let l:lineString = getline(a:line) - if match(l:lineString,"\\s*-\>") != -1 - let l:times = matchstr(l:lineString,"\\[.* -- .*\\]\\s*-\>") - if l:times != "" - " calculate the real time difference - let l:seconds = CalculateSeconds(substitute(l:times,"\\[\\(.*\\)\\]","\\1","")) - endif - " don't add summarized time to text lines - if match(l:lineString,"^\t*[;:<>]") == -1 - if match(l:lineString," -\> [0-9 .]*s") != -1 - call setline(a:line,substitute(l:lineString," -\>.*s"," -> ".l:seconds." s","")) - elseif match(getline(a:line)," -\> [0-9 .]*m") != -1 - call setline(a:line,substitute(l:lineString," -\>.*m"," -> ".printf("%.2f",l:seconds/60.0)." m","")) - elseif match(getline(a:line)," -\> [0-9 .]*d") != -1 - call setline(a:line,substitute(l:lineString," -\>.*"," -> ".printf("%.2f",(l:seconds/86400.0))." d","")) - else - call setline(a:line,substitute(l:lineString," -\>.*"," -> ".printf("%.2f",(l:seconds/3600.0))." h","")) - endif - endif - " else - " return -1 - endif - return l:seconds -endf -"}}}1 -" FindRootParent(line) {{{1 -" returns the line number of the root parent for any child -function! FindRootParent(line) - if Ind(a:line) == 0 - return (a:line) - endif - let l:i = a:line - while l:i > 1 && Ind(l:i) > 0 - let l:i = l:i - 1 - endwhile - return l:i -endf -"}}}1 -" UpdateTimes() {{{1 -" initiates the update of all times in the tree where the cursur is located -function! UpdateTimes() - call CalculateDuration(FindRootParent(line("."))) -endf -"}}}1 -" Mappings {{{1 -nmap <silent> <buffer> <localleader>cs $:call ClockStart(1)<cr> -imap <silent> <buffer> <localleader>cs ~<esc>x:call ClockStart(0)<cr>a -nmap <silent> <buffer> <localleader>cS $:call ClockStop()<cr>:call UpdateTimes()<cr> -imap <silent> <buffer> <localleader>cS ~<esc>x:call ClockStop()<cr>:call UpdateTimes()<cr>i -nmap <silent> <buffer> <localleader>cu $:call UpdateTimes()<cr> -"}}}1 -" The End -" vim600: set foldmethod=marker foldlevel=0: diff --git a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_format.vim b/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_format.vim deleted file mode 100755 index a59fb33..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_format.vim +++ /dev/null @@ -1,157 +0,0 @@ -"###################################################################### -"# VimOutliner Format plugin -"# Copyright (C) 2011 by Jostein Berntsen -"# The file is currently an experimental part of Vim Outliner. -"# -"# This program is free software; you can redistribute it and/or modify -"# it under the terms of the GNU General Public License as published by -"# the Free Software Foundation; either version 2 of the License, or -"# (at your option) any later version. -"# -"# This program is distributed in the hope that it will be useful, -"# but WITHOUT ANY WARRANTY; without even the implied warranty of -"# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -"# GNU General Public License for more details. -"###################################################################### -" Documentation{{{1 -" -" This script inserts bullets, dashes, and arrows in front of lines, including -" VO body text. To insert markers for several lines, select the lines with V -" and execute the mapping. Indents will be kept as they are. -" You can also use the MakeText function to make body text from headers or -" lists. -" -" There are also functions for -" 1) Aligning text in a paragraph to a level 1 header -" 2) Insert checkboxes for all headings in a paragraph -" 3) Indent text in a paragraph/branch to the right -" 4) Indent text in a paragraph/branch to the left -" -"}}}1 -" Load guard for functions {{{1 -if exists("g:loaded_votl_format") || &cp - finish -endif -let g:loaded_votl_format= 1 -let s:keepcpo = &cpo -set cpo&vim - -" Mappings {{{1 - -""" Command mappings -" -" Insert bullets on selected text -map <buffer><localleader><F1> :call InsertBullet()<cr> -" Insert dashes on selected text -map <buffer><localleader><F2> :call InsertDash()<cr> -" Insert arrows on selected text -map <buffer><localleader><F3> :call InsertArrow()<cr> -" Insert colons before selected text -map <buffer><localleader><F4> :call MakeText()<cr> -" Align text in a paragraph and indent 1 level -map <buffer><localleader><F5> V}k:le<cr>V}> -" Insert checkboxes for text lines in a paragraph -map <buffer><localleader><F6> V}k,,cb -" Indent text in a paragraph 1 level to the right and keep indentation -map <buffer><localleader><F7> :call VOindentright()<cr> -" Indent text in a paragraph 1 level to the level and keep indentation -map <buffer><localleader><F8> :call VOindentleft()<cr> - -"}}}1 -" InsertBullet() {{{1 -" Insert bullets on selected text. - -function! InsertBullet() - if match(getline("."),"^[\t]*:") != -1 - let @x = ": * " - normal! ^"xPex - else - let @x = "* " - normal! ^"xP - endif -endfunction - -"}}}1 -" InsertDash() {{{1 -" Insert dashes on selected text. - -function! InsertDash() - if match(getline("."),"^[\t]*:") != -1 - let @x = ": - " - normal! ^"xPex - else - let @x = "- " - normal! ^"xP - endif -endfunction - -"}}}1 -" InsertArrow() {{{1 -" Insert arrows on selected text. - -function! InsertArrow() - if match(getline("."),"^[\t]*:") != -1 - let @x = ": --> " - normal! ^"xPex - else - let @x = "--> " - normal! ^"xP - endif -endfunction - -"}}}1 -" MakeText() {{{1 -" Make selected lines body text. - -function! MakeText() - let @x = ":" - normal! ^"xP -endfunction - -"}}}1 -" VOindentright() {{{1 -" Indent branch 1 level to the right. - -function! VOindentright() - let thisLine = line(".") - if (foldclosed(thisLine) == -1) && IsParent(thisLine) - normal! zc - let fold_cursor = getpos(".") - normal! >> - let get_cursor = getpos(".") - call setpos('.',fold_cursor) - normal! zo - call setpos('.',get_cursor) - set foldlevel=3 - else - normal! >> - endif -endfunction - - -"}}}1 -" VOindentleft() {{{1 -" Indent branch 1 level to the left. - -function! VOindentleft() - let thisLine = line(".") - if (foldclosed(thisLine) == -1) && IsParent(thisLine) - normal! zc - let fold_cursor = getpos(".") - normal! << - let get_cursor = getpos(".") - call setpos('.',fold_cursor) - normal! zo - call setpos('.',get_cursor) - set foldlevel=3 - else - normal! << - endif -endfunction - -"}}}1 -" The End -" vim600: set foldmethod=marker foldlevel=0: - - - diff --git a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_gtd.vim b/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_gtd.vim deleted file mode 100644 index acdef8b..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_gtd.vim +++ /dev/null @@ -1,219 +0,0 @@ -"###################################################################### -"# VimOutliner GTD -"# Copyright (C) 2003 by Noel Henson noel@noels-lab.com -"# The file is currently an experimental part of Vim Outliner. -"# -"# This program is free software; you can redistribute it and/or modify -"# it under the terms of the GNU General Public License as published by -"# the Free Software Foundation; either version 2 of the License, or -"# (at your option) any later version. -"# -"# This program is distributed in the hope that it will be useful, -"# but WITHOUT ANY WARRANTY; without even the implied warranty of -"# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -"# GNU General Public License for more details. -"###################################################################### - -" InsertElem() {{{1 -" Insert a elem without disturbing the current folding. -function! InsertElem(elem) - let @x = a:elem - normal! ^"xP -endfunction -"}}}1 - -" DeleteCheckbox() {{{1 -" Delete a checkbox with all its marks (team/completion) -" if one exists -function! DeleteCheckbox() - :-1/\[[X_?-]\%(,[<>=] [^]]*\)\?\] \%(\d*%\)\?/s/// -endfunction -"}}}1 - -let g:reOutline = "^\t\+\[<>:;|\]" -let g:reBox = "[\[X_?-\]" -let g:reTeam = ",\[<>=\] \[^]\]*" -let g:rePercent = "\\d*% " - -" Safe Insert *Box() {{{1 -" Insert a element at the beginning of a header without disturbing the -" current folding only if there is no element already. -function! InsertSwitch(elem) - if match(getline("."),g:reOutline) != -1 - return - endif -" if match(getline("."),"[".a:elem."\\%(".g:reTeam."\\)\\?"."] ") != -1 -" return -" endif - if match(getline("."),g:reBox."\\%(".g:reTeam."\\)\\?"."] ") != -1 - substitute/\[./\="[".a:elem/ - else - call InsertElem("[".a:elem."] ") - endif -endfunction -"}}}1 - -" Safe Add Team Indicator() {{{1 -" Insert a work with("="), for (">"), waiting for ("<") -" in a checkbox (created if needed) at the beginning of a header -" without disturbing the current folding. -function! SafeAddTeam(elem) - if match(getline("."),g:reOutline) != -1 - return - endif - if match(getline("."),g:reBox.g:reTeam."] ") != -1 - return - endif - if match(getline("."),g:reBox."] ") != -1 - substitute/\[[X_?-]/\=submatch(0).",".a:elem." "/ - else - call InsertElem("[_".",".a:elem." "."] ") - endif -endfunction -"}}}1 - -" Safe InsertCheckBoxPercent() {{{1 -" Insert a checkbox and % sign at the beginning of a header without disturbing -" the current folding -function! SafeAddPercent() -" if Ind(line(".")+1) <= Ind(line(".")) -" return -" endif - if match(getline("."),g:reOutline) != -1 - return - endif - if match(getline("."),g:reBox."\\%(".g:reTeam."\\)\\?"."] ".g:rePercent) != -1 - return - endif - if match(getline("."),g:reBox."\\%(".g:reTeam."\\)\\?"."] ") != -1 - substitute/\[[^]]\+\] /&% / - else - call InsertElem("[_] % ") - endif -endfunction -"}}}1 - -" Ind(line) {{{1 -" Return the index of the line. -" Remove it when using the new version of VO -function! Ind(line) - return indent(a:line) / &tabstop -endf -"}}}1 - -" FindRootParent(line) {{{1 -" returns the line number of the root parent for any child -function! FindRootParent(line) - let l:i = a:line - while l:i > 1 && Ind(l:i) > 0 - let l:i -= 1 - endwhile - return l:i -endf -"}}}1 - -" NewHMD(line) {{{1 -" (How Many Done) -" Calculates proportion of already done work in the subtree -function! NewHMD(line) - let l:done = 0 " checkboxes - let l:count = 0 " number of elems : for % - let l:i = 1 " line counting - let l:proportion = 0 " % : for checkboxes (<100 or 100 ?) and % - let l:lineindent = Ind(a:line) - - " look recursively - - while Ind(a:line+l:i) > l:lineindent - if Ind(a:line+l:i) == l:lineindent + 1 - let l:childdoneness = NewHMD(a:line+l:i) - if l:childdoneness >= 0 - let l:done += l:childdoneness - let l:count += 1 - endif -" echomsg "->".a:line."/".(a:line+l:i)."/ [".l:childdoneness."]-[".l:count."]" - else -" echomsg "(skip) ->".a:line."/".(a:line+l:i) - endif - let l:i += 1 - endwhile - - " update % - - if l:count > 0 -" echomsg "->".a:line." proportion ".l:proportion - let l:proportion = ((l:done * 100)/l:count)/100 - endif - call setline(a:line,substitute(getline(a:line)," [0-9]*%"," ".l:proportion."%","")) - - " - " update checkboxes - " - - " everything under is done, toggle - if l:proportion == 100 -" echomsg "->".a:line." proportion 100." - call setline(a:line,substitute(getline(a:line),"[.","[X","")) - return 100 - endif - - if l:proportion == 0 && l:count == 0 - " done or skipped - if match(getline(a:line),"\[[X-][\],]") != -1 -" echomsg "->".a:line." proportion is X or -." - return 100 - endif - - " not done or questionnable - if match(getline(a:line),"\[[_\?][\],]") != -1 -" echomsg "->".a:line." proportion is _ or ?." - return 0 - endif - - " unknown status for line -" echomsg "->".a:line." proportion is unknown." - return -1 - endif - - " we have not done tasks, undo 'mark as done' - if match(getline(a:line),"\[[X][\],]") != -1 - call setline(a:line,substitute(getline(a:line),"[.","[_","")) - endif -" echomsg "->".a:line." proportion is revert?. [".l:proportion."] / [".l:count."]" - return l:proportion -endf -"}}}1 - -" mappings {{{1 -" gtd addings - " work alone -noremap <buffer> <localleader>cb :call InsertSwitch("_")<cr> -noremap <buffer> <localleader>cq :call InsertSwitch("?")<cr> -noremap <buffer> <localleader>cD :call InsertSwitch("-")<cr> -noremap <buffer> <localleader>cx :call InsertSwitch("X")<cr>:call NewHMD(FindRootParent(line(".")))<cr> -" noremap <buffer> <localleader>cx :call InsertSwitch("X")<cr> - " team work -noremap <buffer> <localleader>cw :call SafeAddTeam("<")<cr> -noremap <buffer> <localleader>cf :call SafeAddTeam(">")<cr> -noremap <buffer> <localleader>c= :call SafeAddTeam("=")<cr> -" completion -noremap <buffer> <localleader>c% :call SafeAddPercent()<cr> - -" forced mapping -noremap <buffer> <localleader>gb :call InsertElem("[_] ")<cr> -noremap <buffer> <localleader>gq :call InsertElem("[?] ")<cr> -noremap <buffer> <localleader>gD :call InsertElem("[-] ")<cr> -noremap <buffer> <localleader>gx :call InsertElem("[X] ")<cr> -noremap <buffer> <localleader>gw :call InsertElem("[_,< ] ")<cr> -noremap <buffer> <localleader>gf :call InsertElem("[_,> ] ")<cr> -noremap <buffer> <localleader>g= :call InsertElem("[_,= ] ")<cr> -noremap <buffer> <localleader>g% :call InsertElem("[_] % ")<cr> - -" delete a chechbox -noremap <buffer> <localleader>cd :call DeleteCheckbox()<cr> - -" calculate the proportion of work done on the subtree -noremap <buffer> <localleader>cz :call NewHMD(FindRootParent(line(".")))<cr> -"}}}1 - -" vim600: set foldlevel=0 foldmethod=marker: diff --git a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_math.otl b/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_math.otl deleted file mode 100644 index 54fe307..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_math.otl +++ /dev/null @@ -1,56 +0,0 @@ -VO Math -Syntax - {} contains formalae to compute - {f0;f1} semicolon separates formulae - There is a respective order between the formulae and variables in a heading - {math0;math1;math2} var0=result0 var1=result1 var2=result2 - ordering - Math can come before or after variables - {3+5;3*5} sum=8 product=15 - sum=8 product=15 {3+5;3*5} - name=n name become a named result for passing to a parent - A=n B=n space separates variables - A=n test B=n space separates variables, interspersed words are allowed -Math Examples - Example 1: one-line math {3*5} result=15 - Example 2: one-line floating-point math {3*5.0} result=15.0 - Example 3: Simple math with child variables {A*B+C} result=5.0 - Item 1 A=2 - Item 2 B=2 - Item 3 C=3.0 - Example 4: Automatic summing {bonk} total=6.0 - Item 1 bonk=1 - Item 2 bonk=2 - Item 3 bonk=3.0 - Example 5: Multiple equations {A*B;B*C;C*A;A+B+C} AB=2.0 BC=6.0 CA=3.0 sumABC=6.0 - Item 1 A=1 - Item 2 B=2 - Item 3 C=3.0 - Example 6: Multiple trees {Labor;Materials;Total} Labor=1222.5 Materials=225.0 Total=1447.5 - Project 1 {Labor;Materials;Labor+Materials} Labor=747.5 Materials=110.0 Total=857.5 - Task 1 {Hours*Rate;Materials} Labor=500.0 Materials=100.0 - Hours=10 - Rate=50 - Materials=100 - Task 2 {Hours*Rate;Materials} Labor=247.5 Materials=10.0 - Hours=4.5 - Rate=55 - Materials=10 - Project 2 {Labor;Materials;Labor+Materials} Labor=475.0 Materials=115.0 Total=590.0 - Task 1 {Hours*Rate;Materials} Labor=300.0 Materials=70.0 - Hours=6 - Rate=50 - Materials=70 - Task 2 {Hours*Rate;Materials} Labor=175.0 Materials=45.0 - Hours=3.5 - Rate=50 - Materials=45 - Example 7: Reversal of results and maths AB=2.0 BC=6.0 CA=3.0 sumABC=6.0 {A*B;B*C;C*A;A+B+C} - Item 1 A=1 - Item 2 B=2 - Item 3 C=3.0 - Example 8: Scientific notation: {10000.0*100000} result=1.0e9 - Example 9: Trigonometry: {sin(pi/4)} theta=0.707107 - pi=3.1415926 - Example 10: Base conversion: {printf("0x%x",65)} hex='0x41' - Example 11: Vim internal state: {&ts;&foldlevel} tabstop=4 foldlevel=99999 diff --git a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_math.vim b/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_math.vim deleted file mode 100644 index 5c09db1..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_math.vim +++ /dev/null @@ -1,286 +0,0 @@ -"###################################################################### -"# VimOutliner Outline Math -"# Copyright (C) 2014 by Noel Henson noelwhenson@gmail.com -"# The file is currently an experimental part of Vim Outliner. -"# -"# This program is free software; you can redistribute it and/or modify -"# it under the terms of the GNU General Public License as published by -"# the Free Software Foundation; either version 2 of the License, or -"# (at your option) any later version. -"# -"# This program is distributed in the hope that it will be useful, -"# but WITHOUT ANY WARRANTY; without even the implied warranty of -"# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -"# GNU General Public License for more details. -"###################################################################### - -" Naming Conventions ################################################## {{{1 -" lnum: line number -" line: string from a line -" vars: dictionary of variables, key:value pairs -" -" Common Functions #################################################### {{{1 -" These functions have broader application scope than those specific to -" performing math on outline trees. Perhaps even adding math to VO tables. -" - -" MyLineage(lnum) {{{2 -" return a list of ancestors in order of youngest-first -" eg: -" 9 A -" 10 B -" 11 C -" 12 D -" MyLineage(12) -" [11,10,9] -function! MyLineage(lnum) - let lineage = [] - let lnum = a:lnum - let indent = Ind(lnum) - if indent == 0 - return lineage - endif - let parentIndent = indent - 1 - while (parentIndent >= 0) && (lnum >= 0) - while (indent > parentIndent) && (lnum >= 0) - let lnum -= 1 - let indent = Ind(lnum) - endwhile - let lineage += [lnum] - let parentIndent -= 1 - endwhile - return lineage -endfunction - -" MyChildren(lnum) {{{2 -" return a list of immediate children from the specificed line -function! MyChildren(lnum) - let children = [] - let parentInd = Ind(a:lnum) - let childInd = parentInd + 1 - let last = line("$") - let lnum = a:lnum + 1 - let lnumInd = Ind(lnum) - while (lnum <= last) && (parentInd < lnumInd) - if lnumInd == childInd - let children += [lnum] - endif - let lnum += 1 - let lnumInd = Ind(lnum) - endwhile - return children -endfunction - -" RootParents() {{{2 -" return a list of all root nodes (indent level 0) -function! RootParents() - let parents = [] - let lnum = 1 - let lines = line("$") - while lnum <= lines - let ind = Ind(lnum) - if ind == 0 - let parents += [lnum] - endif - let lnum += 1 - endwhile - return parents -endfunction - -" FindMath(string) {{{2 -" location of first character of match, -1 if not -" notation: ...{...}...=number... -" function! FindMath(string) -" return match(a:string,'{.*}.*=-\?[0-9]\+\(.[0-9]\+\)\+\([eE][-+]\?[0-9]\+\)\?') -" endfunction -" the below is faster! -" function! FindMath(string) -" return match(a:string,'{.*}.*=-\?[0-9]') -" endfunction -" the below is even faster -" and allows for formulae to be placed at the end of a heading -function! FindMath(string) - if match(a:string,'=') != -1 - return match(a:string,'{.*}') - else - return -1 - endif -endfunction - -" GetMathFromString(string) {{{2 -" returns a list of formulae in a string, in the order they were listed -" returns an empty list if none -" notation: {formula} or {formula1;formula2;...;formulan} -function! GetMathFromString(string) - let mstart = FindMath(a:string) - if mstart == -1 - return [] - endif - let mstart += 1 - let mend = match(a:string,'}',mstart) - if mend == -1 - return [] - endif - let mend -= 1 - return split(a:string[mstart : mend],';') -endfunction - -" MarkValues(string) {{{2 -" mark Values in a string for replacement by formula results -" turns each number into '= voMathResult' -function! MarkValues(string) - return substitute(a:string,'=-\?[0-9]\+\(.[0-9]\+\)\?\([eE][-+]\?[0-9]\+\)\?','=voMathResult','g') -endfunction - -" GetVarsFromString(string,vars) {{{2 -" add key:value pairs from a string to the passed dictionary -" create new entries if key does not exist -" add values to existing entries -" vars is a dictionary of key:value pairs -" notation: name=number -function! GetVarsFromString(string,vars) - " quick return if no potential variables - if match(a:string,'=') == -1 - return - endif - let tokens = split(a:string) - for token in tokens - if match(token,'=') == -1 - continue - endif - let [key,value] = split(token,"=") - " read values are cast to floats to prevent - " auto-casting to integers in the first case - " and strings in the second - if has_key(a:vars,key) - let a:vars[key] += str2float(value) - else - let a:vars[key] = str2float(value) - endif - endfor -endfunction - -" ReplaceVars(formula,vars) {{{2 -" replace variables with their values from the supplied dictionary -" vars is a dictionary of key:value pairs -" key:value pairs are first sorted by key length, longest-first -" this prevents name collisions when similar key names are used like: -" Total and Totals -or- X1 and X12 -function! ReplaceVars(formula,vars) - let formula = a:formula - let vars = [] - for [key,val] in items(a:vars) - let vars += [[len(key),key,val]] - endfor - let vars = reverse(sort(vars)) - for [len,key,val] in vars - let formula = substitute(formula,key,string(val),"g") - endfor - return formula -endfunction - -" ComputeString(string,vars) {{{2 -" compute a string using its math and a dictionary of variables -" return the computed, modified string -" string is a string containing math and result variable names -" vars is a dictionary of key:value pairs used in the computation -function! ComputeString(string,vars) - let string = a:string - let maths = GetMathFromString(string) - if len(maths) - let string = MarkValues(string) - for math in maths - let math = ReplaceVars(math,a:vars) - let result = string(eval(math)) - let string = substitute(string,'voMathResult',result,"") - endfor - endif - return string -endfunction - -" Math Functions on Outlines ########################################## {{{1 - -" MyChildrensVars(lnum) {{{2 -" return a dictionary of variable from immediate children -function! MyChildrensVars(lnum) - let children = MyChildren(a:lnum) - let vars = {} - for child in children - call GetVarsFromString(getline(child),vars) - endfor - return vars -endfunction - -" ComputeLine(lnum) {{{2 -" compute a line's maths using variables from it's children -" replace the line with the newly computed line -function! ComputeLine(lnum) - let vars = MyChildrensVars(a:lnum) - let line = ComputeString(getline(a:lnum),vars) - call setline(a:lnum,line) -endfunction - -" ComputeUp(lnum) {{{2 -" compute 'up' a tree towards level 1 -" the line (lnum) itself is computed first -" this is intended to be a fast compute method to update a branch of nodes -" it assumes that all other calculations in a tree are correct -function! ComputeUp(lnum) - call ComputeLine(a:lnum) - let lineage = MyLineage(a:lnum) - if len(lineage) - for lnum in lineage - call ComputeLine(lnum) - endfor - endif -endfunction - -" ComputeDown(lnum) {{{2 -" compute 'down' a tree from the current node -" the line (lnum) itself is computed last -function! ComputeDown(lnum) - let children = MyChildren(a:lnum) - if len(children) - for lnum in children - call ComputeDown(lnum) - endfor - endif - call ComputeLine(a:lnum) -endfunction - -" ComputeTree(lnum) {{{2 -" compute down an entire tree -function! ComputeTree(lnum) - let parents = MyLineage(a:lnum) - if len(parents) - let topparent = parents[-1] - else - let topparent = a:lnum - endif - call ComputeDown(topparent) -endfunction - -" ComputeDocument() {{{2 -" compute down all trees - -function! ComputeDocument(lnum) - let parents = RootParents() - for parent in parents - call ComputeDown(parent) - endfor -endfunction - -" Concealings {{{1 -" BadWord is a very old VO region that is no longer used. -" It can be used now for plugins :) -" This should probably be fixed at some point in the future -syntax match BadWord "{.\+}" conceal transparent cchar=µ -set conceallevel=1 - -" mappings {{{1 - -map <silent><buffer> <localleader>== :call ComputeUp(line("."))<cr> -map <silent><buffer> <localleader>=t :call ComputeTree(line("."))<cr> -map <silent><buffer> <localleader>=d :call ComputeDocument()<cr> -map <silent><buffer> <localleader>=h :set conceallevel=1<cr> -map <silent><buffer> <localleader>=H :set conceallevel=0<cr> diff --git a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_newhoist.vim b/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_newhoist.vim deleted file mode 100644 index e2ecd64..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_newhoist.vim +++ /dev/null @@ -1,456 +0,0 @@ -"###################################################################### -"# VimOutliner Hoisting -"# Copyright (C) 2003 by Noel Henson noel@noels-lab.com -"# The file is currently an experimental part of Vim Outliner. -"# -"# This program is free software; you can redistribute it and/or modify -"# it under the terms of the GNU General Public License as published by -"# the Free Software Foundation; either version 2 of the License, or -"# (at your option) any later version. -"# -"# This program is distributed in the hope that it will be useful, -"# but WITHOUT ANY WARRANTY; without even the implied warranty of -"# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -"# GNU General Public License for more details. -"###################################################################### - -" Load the plugin {{{1 -if exists("g:did_vo_hoist") - "finish -endif -if !exists("g:hoistParanoia") - let g:hoistParanoia=0 -endif -if !exists('hlevel') - let hlevel = 20 -endif -let g:did_vo_hoist = 1 -" mappings {{{1 -map <silent> <buffer> <localleader>hh :call Hoist(line("."))<cr> -map <silent> <buffer> <localleader>hd :call DeHoist()<cr> -map <silent> <buffer> <localleader>hD :call DeHoistAll()<cr> -"}}}1 -" syntax {{{1 -" Hoisted {{{2 -"syntax match Invis +^\~\zs.*$+ containedin=ALL conceal cchar=~ -""hi Invis guifg=bg ctermfg=bg -""hi Invis guifg=bg -"hi link Invis Conceal -"}}}2 -"}}}1 -" MyFoldText() {{{1 -" Create string used for folded text blocks -function! MyFoldText() - let l:MySpaces = MakeSpaces(&sw) - let l:line = getline(v:foldstart) - let l:bodyTextFlag=0 - if l:line =~'^\~' - let l:line = '~'.repeat(' ', winwidth(0)-1) - elseif l:line =~ "^\t* \\S" || l:line =~ "^\t*\:" - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[TEXT]" - elseif l:line =~ "^\t*\;" - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[TEXT BLOCK]" - elseif l:line =~ "^\t*\> " - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[USER]" - elseif l:line =~ "^\t*\>" - let l:ls = stridx(l:line,">") - let l:le = stridx(l:line," ") - if l:le == -1 - let l:l = strpart(l:line, l:ls+1) - else - let l:l = strpart(l:line, l:ls+1, l:le-l:ls-1) - endif - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[USER ".l:l."]" - elseif l:line =~ "^\t*\< " - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[USER BLOCK]" - elseif l:line =~ "^\t*\<" - let l:ls = stridx(l:line,"<") - let l:le = stridx(l:line," ") - if l:le == -1 - let l:l = strpart(l:line, l:ls+1) - else - let l:l = strpart(l:line, l:ls+1, l:le-l:ls-1) - endif - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[USER BLOCK ".l:l."]" - elseif l:line =~ "^\t*\|" - let l:bodyTextFlag=1 - let l:MySpaces = MakeSpaces(&sw * (v:foldlevel-1)) - let l:line = l:MySpaces."[TABLE]" - endif - let l:sub = substitute(l:line,'\t',l:MySpaces,'g') - let l:len = strlen(l:sub) - let l:sub = l:sub . " " . MakeDashes(58 - l:len) - let frange = (v:foldend + l:bodyTextFlag)- v:foldstart - let l:sub = l:sub . " (" . frange - if frange == 1 - let l:sub = l:sub . " line)" - else - let l:sub = l:sub . " lines)" - endif - return l:sub.repeat(' ', winwidth(0)-len(l:sub)) -endfunction -"}}}1 -" New Fold Function (will be put into vo_base later {{{1 -function! MyHoistableFoldLevel(line) - let l:myindent = Ind(a:line) - let l:nextindent = Ind(a:line+1) - - if HoistFold(a:line) - " if (a:line == 1) - " return g:hlevel - " elseif (HoistFold(a:line-1) == 0) - " return ">".0 - " else - " return g:hlevel - " endif - return g:hlevel - - elseif BodyText(a:line) - if (BodyText(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (BodyText(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - elseif PreformattedBodyText(a:line) - if (PreformattedBodyText(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (PreformattedBodyText(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - elseif PreformattedTable(a:line) - if (PreformattedTable(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (PreformattedTable(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - elseif PreformattedUserText(a:line) - if (PreformattedUserText(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (PreformattedUserTextSpace(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - elseif PreformattedUserTextLabeled(a:line) - if (PreformattedUserTextLabeled(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (PreformattedUserText(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - elseif UserText(a:line) - if (UserText(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (UserTextSpace(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - elseif UserTextLabeled(a:line) - if (UserTextLabeled(a:line-1) == 0) - return '>'.(l:myindent+1) - endif - if (UserText(a:line+1) == 0) - return '<'.(l:myindent+1) - endif - return (l:myindent+1) - else - if l:myindent < l:nextindent - return '>'.(l:myindent+1) - endif - if l:myindent > l:nextindent - return (l:myindent) - endif - return l:myindent - endif -endfunction -set foldexpr=MyHoistableFoldLevel(v:lnum) -"}}}2 -"}}}1 -" Functions {{{1 -" RemoveTabs(line,tabs) {{{2 -" remove specified number of tabs from the begining of line -function! RemoveTabs(start,end,tabs) - if a:tabs > 0 - let l:doit = "silent ".a:start.",".a:end."s/^\\(\\t\\)\\{".a:tabs."}/" - exe l:doit - endif -endfunction -"}}}2 -" IsParent(line) {{{2 -" Return 1 if this line is a parent -function! IsParent(line) - return (Ind(a:line)+1) == Ind(a:line+1) -endfunction -"}}}2 -" FindParent(line) {{{2 -" Return line if parent, parent line if not -function! FindParent(line) - if IsParent(a:line) - return a:line - else - let l:parentindent = Ind(a:line)-1 - let l:searchline = a:line - while (Ind(l:searchline) != l:parentindent) && (l:searchline > 0) - let l:searchline = l:searchline-1 - endwhile - return l:searchline - endif -endfunction -"}}}2 -" HoistFold() {{{2 -" Return a flag indicating that there is a valid hoist -function! HoistFold(line) - if getline(a:line) =~ '^\~' - return 1 - else - return 0 - endif -endfunction -"}}}2 -" Hoisted() {{{2 -" Return a flag indicating that there is a valid hoist -function! Hoisted() - if getline(1) =~ '^\~' - return 1 - else - return 0 - endif -endfunction -"}}}2 -" FindTopHoist(line) {{{2 -" Return line number of the nearest (last line) top hoist tag -function! FindTopHoist(line) - let l:line = a:line - while (match(getline(l:line),"^\\~") == -1) && (l:line > 0) - let l:line -= 1 - endwhile - return l:line -endfunction -"}}}2 -" FindBottomHoist(line) {{{2 -" Return line number of the nearest (last line) top hoist tag -function! FindBottomHoist(line) - let l:line = a:line - let l:lastline = line('$') - while getline(l:line) !~ "^\\~" && (l:line > 0) && l:line <= l:lastline - let l:line += 1 - endwhile - return l:line -endfunction -"}}}2 -" FindLastChild(line) {{{2 -" Return the line number of the last decendent of parent line -function! FindLastChild(line) - let l:parentindent = Ind(a:line) - let l:searchline = a:line+1 - while Ind(l:searchline) > l:parentindent - let l:searchline = l:searchline+1 - endwhile - return l:searchline-1 -endfunction -"}}}2 -" GetHoistedIndent(line) {{{2 -" line is the line number containing the indent -" Returns the original indent of the hoisted region -function! GetHoistedIndent(line) - return str2nr(strpart(getline(a:line),1,2)) -endfunction -"}}}2 -" HoistTagBefore(line,indent) {{{2 -function! HoistTagBefore(line,indent) - let l:doit = "silent 1,".(a:line-1)."s/^/\\~".a:indent." /" - exe l:doit - "call setline(1, map(getline(1,a:line-1), '"~".a:indent.v:val')) -endfunction -"}}}2 -" HoistDeTagBefore(line) {{{2 -function! HoistDeTagBefore(line) - let l:doit = "silent 1,".a:line."s/^\\~\\d* //" - exe l:doit -endfunction -"}}}2 -" HoistTagAfter(line) {{{2 -function! HoistTagAfter(line) - if a:line > line('$') - return - endif - let l:doit = "silent ".a:line.",$s/^/\\~/" - exe l:doit -endfunction -"}}}2 -" HoistDeTagAfter(line) {{{2 -function! HoistDeTagAfter(line) - if a:line > line('$') - return - endif - let l:doit = "silent ".a:line.",$s/^\\~//" - exe l:doit -endfunction -"}}}2 -" HoistWrite(file) {{{2 -" Write the clean file if hoisted -function! HoistWrite(file,...) range - "let lines = getline(1,line('$')) - let saved = 0 - mkview - call DeHoistAll() - if v:cmdbang - let bang = '!' - else - let bang = '' - endif - try - if a:0 - echom a:firstline.','.a:lastline."w".bang.fnameescape(v:cmdarg).' '.a:file - exe a:firstline.','.a:lastline."w".bang.fnameescape(v:cmdarg).' '.a:file - else - exe "w".bang.fnameescape(v:cmdarg).' '.a:file - endif - let saved = 1 - catch - echohl ErrorMsg - echom substitute(v:exception,'^Vim(.\{-}):','','') - echohl None - endtry - "call setline(1,lines) - silent earlier - silent loadview - if saved - silent setlocal nomodified - endif -endfunction "HoistWrite -" Hoist(line) {{{2 -" Write the offspring of a parent to a new file, open it and remove the -" leading tabs. -function! Hoist(line) - let l:parent = FindParent(a:line) - if l:parent == 0 - return - endif - "call cursor(l:parent,1) - "let l:firstline = l:parent+1 - let l:firstline = l:parent - let l:childindent = Ind(l:firstline) - let l:lastline = FindLastChild(l:parent) - setlocal foldlevel=20 - call HoistTagBefore(l:firstline,l:childindent) - call HoistTagAfter(l:lastline+1) -" call RemoveTabs(l:firstline,l:lastline,l:childindent) - call cursor(l:firstline,1) - setlocal foldlevel=19 - augroup VO_HOIST - au! - au CursorMoved,CursorMovedI <buffer> - \ if getline('.') =~ '^\~\d* ' | - \ call HoistKeepCursor(1) | - \ elseif getline('.') =~ '^\~' | - \ call HoistKeepCursor(0) | - \ endif - "au BufWriteCmd <buffer> call HoistWrite(fnameescape(expand("<amatch>"))) - "au FileWriteCmd <buffer> '[,']call HoistWrite(fnameescape(expand("<amatch>")), 1) - augroup END - if exists('+conceallevel') - syntax match Invis +^\~.*$+ conceal cchar=~ - hi link Invis Conceal - setlocal conceallevel=2 - else - syntax match Invis +^\~.*$+ containedin=ALL - let i = 1 - while synIDtrans(i) != 0 - if synIDattr(i, 'name') == 'Normal' - if synIDattr(i, 'bg') >= 0 - " bg is set - hi Invis guifg=bg ctermfg=bg - else - hi Invis guifg=NONE ctermfg=NONE - endif - break - endif - let i += 1 - endwhile - endif -endfunction -" }}}2 -" HoistKeepCursor(top) {{{2 -" Keep cursor out of non-hoisted area. -function! HoistKeepCursor( top ) - if a:top - while getline('.') =~ '^\~\d* ' - normal! j - endwhile - else - while getline('.') =~ '^\~' - normal! k - endwhile - endif -endfunction "HoistKeepCursor }}}2 -" MakeTabs(n) {{{2 -" return a string of n tabs -function! MakeTabs(n) - let l:tabs = "" - let l:n = a:n - while l:n > 0 - let l:tabs = l:tabs."\t" - let l:n -= 1 - endwhile - return l:tabs -endfunction -"}}}2 -"}}}2 -" DeHoist() {{{2 -" Write the offspring of a parent to a new file, open it and remove the -" leading tabs. -function! DeHoist() - if !Hoisted() - return - endif - let l:line = line(".") - let l:top = FindTopHoist(l:line) - let l:bottom = FindBottomHoist(l:line) - echom 1 - let l:indent = GetHoistedIndent(l:top) -" let l:tabs = MakeTabs(l:indent) -" let l:doit = "silent ".(l:top+1).",".(l:bottom-1)."s/^/".l:tabs."/" -" exe l:doit - call HoistDeTagBefore(l:top) - call HoistDeTagAfter(l:bottom) - if !Hoisted() - augroup VO_HOIST - au! - augroup! VO_HOIST - augroup END - endif - call cursor(l:line,l:indent) -endfunction -"}}}2 -" DeHoistAll() {{{2 -" Write the offspring of a parent to a new file, open it and remove the -" leading tabs. -function! DeHoistAll() - while Hoisted() - call DeHoist() - endwhile -endfunction -"}}}2 -"}}}1 -" vim600: set foldlevel=0 foldmethod=marker: diff --git a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_smart_paste.vim b/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_smart_paste.vim deleted file mode 100644 index 6aa0c45..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_smart_paste.vim +++ /dev/null @@ -1,117 +0,0 @@ -" Here is a small script that remaps the p and P normal commands such that VO -" will do what one would expect when pasting cut/copied nodes into another -" section of an outline. It will adjust the indents and not paste into the -" middle of a branch. -" Added 2011-03-01(JB): This script will now also copy an outline correctly by -" using \\y, copy to the register with \\r, cut an outline by using \\d, and -" paste from the register using \\b. -" http://www.lists.vimoutliner.org/pipermail/vimoutliner/2008-October/002366.html - -map <buffer>p :call VOput()<cr> -map <buffer>\\b :call VOputreg()<cr> -map <buffer>\\y :call VOcop()<cr> -map <buffer>\\r :call VOreg()<cr> -map <buffer>\\d :call VOcut()<cr> -map <buffer>P ]P - -if exists('s:loaded') - finish -endif -let s:loaded = 1 - -function! IsParent(line) - if a:line == line("$") - return 0 - elseif Ind(a:line) < Ind(a:line+1) - return 1 - else - return 0 - endif -endfunction - - -function! VOcop() - let thisLine = line(".") - if (foldclosed(thisLine) == -1) && IsParent(thisLine) - normal! zc - let fold_cursor = getpos(".") - normal! yy - let get_cursor = getpos(".") - call setpos('.',fold_cursor) - normal! zo - call setpos('.',get_cursor) - else - normal! yy - endif -endfunction - -function! VOreg() - let thisLine = line(".") - if (foldclosed(thisLine) == -1) && IsParent(thisLine) - normal! zc - let fold_cursor = getpos(".") - normal! V"+y - let get_cursor = getpos(".") - call setpos('.',fold_cursor) - normal! zo - call setpos('.',get_cursor) - else - normal! V"+y - endif -endfunction - -function! VOcut() - let thisLine = line(".") - if (foldclosed(thisLine) == -1) && IsParent(thisLine) - normal! zc - let fold_cursor = getpos(".") - normal! dd - let get_cursor = getpos(".") - call setpos('.',fold_cursor) - normal! zo - call setpos('.',get_cursor) - else - normal! dd - endif -endfunction - -function! VOput() - let thisLine = line(".") - if (foldclosed(thisLine) == -1) && IsParent(thisLine) - normal! zc - let fold_cursor = getpos(".") - normal! ]p - let put_cursor = getpos(".") - call setpos('.',fold_cursor) - normal! zo - call setpos('.',put_cursor) - else - normal! ]p - endif -endfunction - - -function! VOputreg() - let thisLine = line(".") - if (foldclosed(thisLine) == -1) && IsParent(thisLine) - normal! zc - let fold_cursor = getpos(".") - normal! "+]p - let put_cursor = getpos(".") - call setpos('.',fold_cursor) - normal! zo - call setpos('.',put_cursor) - else - normal! "+]p - endif -endfunction - - - - - - - - - - diff --git a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_tags.vim b/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_tags.vim deleted file mode 100644 index c5bebde..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/plugin/votl_tags.vim +++ /dev/null @@ -1,246 +0,0 @@ -" File: plugin/votl_tags.vim -" Version: 1.0 -" Modified: 2011-02-28 -" Description: This plugin provides inter-outline links for vimoutliner. -" Maintainer: Israel Chauca F. <israelchauca@gmail.com> -" Manual: The following mappings are added: -" - <C-K> : Follow a link. -" - <C-N> : Jump back in the link-history. -" - <localleader>l : Create a link. -" ============================================================================ - -if v:version < 700 - echom 'VimOutliner: votl_tags.vim requires Vim 7.0 or later.' - finish -endif - -" Create outlines' jump-list. -if !exists('w:vo_jump_list') - let w:vo_jump_list = [] -endif - -" Mappings {{{1 - -" Follow inter-outline link. -noremap <buffer> <Plug>VO_FollowLink :call <SID>follow_link()<CR> -if !hasmapto('<Plug>VO_FollowLink') - "map <unique> <buffer> <C-K> <Plug>VO_FollowLink - map <silent> <buffer> <C-K> <Plug>VO_FollowLink -endif - -" Go back to previous outline. -noremap <buffer> <Plug>VO_JumpBack :call <SID>jump_back()<CR> -if !hasmapto('<Plug>VO_JumpBack') - "map <unique> <buffer> <C-N> <Plug>VO_JumpBack - map <silent> <buffer> <C-N> <Plug>VO_JumpBack -endif - -" Create a link from a word in normal mode. -noremap <buffer> <Plug>VO_CreateLink :call <SID>create_link()<CR> -if !hasmapto('<Plug>VO_CreateLink') - silent! map <silent> <unique> <buffer> <localleader>l <Plug>VO_CreateLink -endif - -" Create a link from a word in insert mode. -inoremap <buffer> <Plug>VO_CreateLinkI <C-O>:call <SID>create_link()<CR> -if !hasmapto('<Plug>VO_CreateLinkI') - silent! imap <silent> <unique> <buffer> <localleader>l <Plug>VO_CreateLinkI -endif - -" Functions {{{1 - -let s:checkboxpat = '\%(\[[^[\]]\+\]\s\+\%(\d*%\d*\s\+\)\?\)\?' - -" Don't re-load functions. -if exists('s:loaded') - finish -endif -let s:loaded = 1 - -" s:get_link() {{{2 -" Get link data. -function! s:get_link(linenr) - " Check if it's a valid link. - let line = getline(a:linenr) - if line =~? '\m^\t*'.s:checkboxpat.'_tag_\w\+\s*$' - " Don't remember where this bit came from, please let me know if you do. - let [_,file,row,col;m0] = matchlist(getline(a:linenr + 1), '\m^\t*'.s:checkboxpat.'\([^:]\+\)\%(:\(\d\+\)\)\?\%(:\(\d\+\)\)\?$') - elseif line =~? '\m^\t*'.s:checkboxpat.'_ilink_\(.\{-}:\s\)\?\s*\S.*$' - let pat = '\m^\t*'.s:checkboxpat.'_ilink_\%([^:\\/]\{-}:\s\)\?\s*\(.\+\)\%(:\(\d\+\)\)\?\%(:\(\d\+\)\)\?$' - let [_,file,row,col;m0] = matchlist(line, pat) - else - return ['',0,0,0] - endif - let is_inner_link = 0 - if file == '%' - let file = expand('%:p') - let is_inner_link = 1 - endif - let row = (row == '' ? 0 : row * 1) - let col = (col == '' ? 0 : col * 1) - - return [file, row, col, is_inner_link] -endfunction - -" s:follow_link() {{{2 -" Follow an interoutline link. -function! s:follow_link() - " Get link data. - let [file, row, col, is_inner_link] = s:get_link(line('.')) - if file == '' - echom 'Vimoutliner: "'.substitute(getline('.'), '\m^\t*'.s:checkboxpat, '', '').'" doesn''t not look like an inter-outline link.' - return - endif - - " Check if file path exists. - let file = s:get_absolute_path(expand('%:h'), file) - let file = fnamemodify(file,':p') - let baseDir = fnamemodify(file,':h') - let dirconfirm = 0 - " Check if directories exists. {{{3 - if glob(baseDir) == '' - if exists('*confirm') - let dirconfirm = confirm('The linked file "'.file.'" and one or more directories do not exist, do you want to create them now?', "&Yes\n&No", '2', 'Question') - else - " Can't ask, asume a yes for answer. - let dirconfirm = 1 - endif - if dirconfirm == 1 - " Create dir(s): - if exists('*mkdir') - call mkdir(baseDir,'p') - elseif executable('mkdir') - call system('`which mkdir` -p '.shellescape(baseDir)) - else - echom 'Vimoutliner: Vim can not create the required directories, please create them yourself.' - return - endif - else - return - endif - endif - " Check if file exists. {{{3 - if glob(file) == '' - if exists('*confirm') && dirconfirm == 0 - let confirm = confirm('The linked file "'.file.'" does not exist, do you want to create it now?', "&Yes\n&No", '2', 'Question') - else - " Can't ask, asume a yes for answer. - let confirm = 1 - endif - if confirm == 1 - call writefile([], file) - else - return - endif - endif - " }}}3 - " Now let's jump to that outline. - try - call s:update_jump_list() - if !is_inner_link - exec "buffer ".bufnr(substitute(file, '\m^'.getcwd().'/','',''), 1) - endif - if row > 0 - call setpos('.',[0,row,col,0]) - endif - setlocal buflisted - catch - " Prevent reporting that the error ocurred inside this function. - echoh ErrorMsg - echom substitute(v:exception,'\m^Vim(.\{-}):','','') - echoh None - endtry - return '' -endfunction -" s:get_absolute_path(baseDir, fileName) {{{2 -" Guess an absolute path -function! s:get_absolute_path(baseDir, fileName) - let baseDir = a:baseDir - if baseDir !~ '/$' - let baseDir = baseDir . '/' - endif - if a:fileName =~ '^/' - let absFileName = a:fileName - else - let absFileName = baseDir . a:fileName - endif - - let absFileName = substitute(absFileName, '\m/\./', '/', 'g') - while absFileName =~ '/\.\./' - absFileName = substitute(absFileName, '\m/[^/]*\.\./', '', '') - endwhile - return absFileName -endfunction -" s:update_jump_list() {{{2 -" Add current outline to list. -function! s:update_jump_list() - call add(w:vo_jump_list, [bufnr('%')] + getpos('.')) -endfunction -" s:remove_buf(buf) {{{2 -" Remove outline from list. -function! s:remove_buf() - if !exists('w:vo_jump_list') || len(w:vo_jump_list) == 0 - return - endif - " Remove last outline. - call remove(w:vo_jump_list, -1) -endfunction -" s:jump_back() {{{2 -" Jump back to the previous outline. -function! s:jump_back() - if len(w:vo_jump_list) == 0 - echom 'This is the first outline.' - return - endif - exec "buffer ".w:vo_jump_list[-1][0] - call setpos('.', w:vo_jump_list[-1][1 : ]) - call s:remove_buf() -endfunction -" s:create_link() {{{2 -" Create an interoutline link with the current keyword under the cursor. -function! s:create_link() - let line = getline('.') - " Create link on a header only - if line =~ '\m^\t\+[^ :;<>|]' - echom 'Vimoutliner: Links have to be on a header.' - return - endif - " Check if the there's is some content in the current line and a current - " link doesn't exists. - if line =~# '\m^\t*'.s:checkboxpat.'_ilink_\%([^:]\{-}:\s\)\?\s*\S\+.*$' - echom 'Vimoutliner: Looks like "'.substitute(line,'^\t*'.s:checkboxpat.'\(\S.*$\)','\1','').'" is already a link.' - return - endif - call inputsave() - let path = input('Linked outline''s path: ', '', 'file') - call inputrestore() - if path == '' - " User canceled. - return '' - endif - let path = matchstr(path, '\m^\t*'.s:checkboxpat.'\zs\S.\{-}\ze\s*$') - "if path !~ '\.otl$' - "" Add extension. - "let path = path.'.otl' - "endif - let tag = '_ilink_' - let [_,indent,checkbox,label;m0] = matchlist(line, '\m^\(\t*\)\('.s:checkboxpat.'\)\%(_ilink_\)\?\s*\(\S\%(.\{-1,}\S\)\?\)\?\s*\%(:\s\)\?\s*$') - "echom indent.'-'.checkbox.'-'.label - if indent == '' - let indent = matchstr(getline(line('.')-1), '\m^\(\t*\)') - endif - if label !~ ':\s*$' - let label = substitute(label, '\m\s*$', ': ', '') - else - let label = substitute(label, '\m:\s*$', ': ', '') - endif - - call setline(line('.'), indent.checkbox.tag.' '.label.path) - echo '' -endfunction -" Autocommands {{{1 -augroup vo_links - au! - au BufWinEnter * if !exists('w:vo_jump_list') | let w:vo_jump_list = [] | endif -augroup END -"{{{1 vim:foldmethod=marker diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/MediaWiki2otl b/pack/acp/start/vimoutliner/vimoutliner/scripts/MediaWiki2otl deleted file mode 100644 index f8f5f1a..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/MediaWiki2otl +++ /dev/null @@ -1,17 +0,0 @@ -"delete trailing white space -:%s/^[ \t][ \t]*\(.*\)$/\1/ -"delete one line from each block of empty lines -:g/^\_$\n\_^..*$/d -"add leading : to body text -:%s/^[^=]..*[^=]$/:&/ -"add leading : to dividers made entirely of equal signs -:%s/^==*$/:&/ -"delete one leading = and space from heading -"delete trailing space and = from heading -"\1 is leading equal signs. \2 is heading. -:%s/^=\(=*\) \(.*\) =\+$/\1\2/ -"indent body text lines (lines starting with ":") -"how to indent body text lines? -"indent headings -"substitute each = with tab -:g/^=/s/=/\t/g diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/MediaWiki2otl.desc b/pack/acp/start/vimoutliner/vimoutliner/scripts/MediaWiki2otl.desc deleted file mode 100644 index 6f8a7f6..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/MediaWiki2otl.desc +++ /dev/null @@ -1,37 +0,0 @@ -This email has the attachment. - -Hello Vim Outliners, - -I want to migrate some word processor documents to otl.  If you know of a formatter to convert "MediaWiki to otl" or "odt to otl" or "doc to otl" please let me know.  I did not find one. - -I am attempting to write ex script to convert MediaWiki to otl.  This would be useful because LibreOffice Writer can export to MediaWiki format, and then the script would convert it to otl. - -The heading format in MediaWiki is simple; one equal sign for each level in the heading hierarchy e.g.: - -= head1 = -body text -== head2 == -body text -=== head3 === -body text - -The above MediaWiki text should convert to otl like this: - -head1 -:body text -head2 -:body text -head3 -:body text - -The attached MediaWiki2otl script converts MediaWiki to otl except for one thing.  I can not figure out how to indent the body text lines (indent lines that start with “:”). Here is the pseudo code: - -if current line has “=” -set count to number of “=” -else   -insert count “\t” - -Can this be done in ex script? i.e. Is there an ex command that can set a variable (or register) and an ex command to read that variable in the following lines? - -Thank you, -wolfv diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/COPYING b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/COPYING deleted file mode 100644 index 0e7003c..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/COPYING +++ /dev/null @@ -1,118 +0,0 @@ -The Litt Perl Development Tools License -Version 1.0, 3/14/2003 ---------------------------------------- - -The Litt Perl Development Tools License (LPDTL) -consists of the GNU GPL plus an exception, plus an -exception to that exception. - -This program is free software; you can -redistribute it and/or modify it under the terms -of version 2 of the GNU General Public License as -published by the Free Software Foundation. - -This program is distributed in the hope that it -will be useful, but WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General -Public License along with this software; see the -file COPYING.GPL. If not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite -330, Boston, MA 02111-1307 USA. Other locations -for the GNU General Public License include: - - http://www.troubleshooters.com/licenses/LPDTL/COPYING.GPL - -and - - http://www.gnu.org/licenses/gpl.txt - - -THE EXCEPTION - -As a special exception, the author of this Perl -Development Tool gives permission for additional -uses of the text contained in this Perl -Development Tool. - -The exception is that, if you reference the LPDTL -licensed software, by use of a Perl "use" or -"require" statement, from other files, this does -not by itself cause the files referencing this -Perl Development Tool to be covered by the GNU -General Public License. Your use of the -referencing files is in no way restricted on -account of their referencing the code in this Perl -Development Tool. - -Likewise, if you link the LPDTL licensed software -with other files to produce an executable, this -does not by itself cause the resulting executable -to be covered by the GNU General Public License. -Your use of that executable is in no way -restricted on account of linking the LPDTL -licensed software's code into it. - - -EXCEPTION LIMITATIONS - -This exception does not however invalidate any -other reasons why the referencing files, or any -produced executables, might be covered by the GNU -General Public License. - -This exception applies only to the code released -by its author under the Litt Perl Development -Tools License. Such code must clearly state that -it's covered by the Litt Perl Development Tools -License. If you copy code from other GNU-GPL -compatible software, as the General Public License -permits, the exception does not apply to the code -that you add in this way. To avoid misleading -anyone as to the status of such modified files, -you must delete this exception notice from them. - -If you write modifications of your own for -software licensed under the Litt Perl Development -Tools License, it is your choice whether to permit -this exception to apply to your modifications. If -you do not wish that, delete this exception -notice. - -This exception cannot be applied to software whose -license, End User License Agreement, or Terms Of -Use limit reverse engineering or discussion about -the software. This exception cannot be applied to -software incorporating any type of software -patents. - - -THE EXCEPTION TO THE EXCEPTION - -The intent of the Litt Perl Development Tools -License (LPDTL) is to produce a free software -development environment enabling a software -developer to create free software, nonfree -software, or proprietary software. Therefore, all -of the resulting program's software development -features must be contained in the LPDTL licensed -software, or in GPL licensed software. It is a -violation of the LPDTL to place any software -development features in any file not licensed -under either the GPL or the LPDTL. - -A "software development feature" is a feature -enabling creation or modification of software. - - -DISCUSSION OF INTENT OF THIS LICENSE - -You can find a discussion of the intent of this -license in the LPDTL_discuss.txt file. If you -haven't been given a copy of this file, you can -find it in the -http://www.troubleshooters.com/licenses/LPDTL/ -directory. diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/COPYING.GPL b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/COPYING.GPL deleted file mode 100644 index 5b6e7c6..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/COPYING.GPL +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/COPYING.LPDTL.1.0 b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/COPYING.LPDTL.1.0 deleted file mode 100644 index 0e7003c..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/COPYING.LPDTL.1.0 +++ /dev/null @@ -1,118 +0,0 @@ -The Litt Perl Development Tools License -Version 1.0, 3/14/2003 ---------------------------------------- - -The Litt Perl Development Tools License (LPDTL) -consists of the GNU GPL plus an exception, plus an -exception to that exception. - -This program is free software; you can -redistribute it and/or modify it under the terms -of version 2 of the GNU General Public License as -published by the Free Software Foundation. - -This program is distributed in the hope that it -will be useful, but WITHOUT ANY WARRANTY; without -even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General -Public License along with this software; see the -file COPYING.GPL. If not, write to the Free -Software Foundation, Inc., 59 Temple Place, Suite -330, Boston, MA 02111-1307 USA. Other locations -for the GNU General Public License include: - - http://www.troubleshooters.com/licenses/LPDTL/COPYING.GPL - -and - - http://www.gnu.org/licenses/gpl.txt - - -THE EXCEPTION - -As a special exception, the author of this Perl -Development Tool gives permission for additional -uses of the text contained in this Perl -Development Tool. - -The exception is that, if you reference the LPDTL -licensed software, by use of a Perl "use" or -"require" statement, from other files, this does -not by itself cause the files referencing this -Perl Development Tool to be covered by the GNU -General Public License. Your use of the -referencing files is in no way restricted on -account of their referencing the code in this Perl -Development Tool. - -Likewise, if you link the LPDTL licensed software -with other files to produce an executable, this -does not by itself cause the resulting executable -to be covered by the GNU General Public License. -Your use of that executable is in no way -restricted on account of linking the LPDTL -licensed software's code into it. - - -EXCEPTION LIMITATIONS - -This exception does not however invalidate any -other reasons why the referencing files, or any -produced executables, might be covered by the GNU -General Public License. - -This exception applies only to the code released -by its author under the Litt Perl Development -Tools License. Such code must clearly state that -it's covered by the Litt Perl Development Tools -License. If you copy code from other GNU-GPL -compatible software, as the General Public License -permits, the exception does not apply to the code -that you add in this way. To avoid misleading -anyone as to the status of such modified files, -you must delete this exception notice from them. - -If you write modifications of your own for -software licensed under the Litt Perl Development -Tools License, it is your choice whether to permit -this exception to apply to your modifications. If -you do not wish that, delete this exception -notice. - -This exception cannot be applied to software whose -license, End User License Agreement, or Terms Of -Use limit reverse engineering or discussion about -the software. This exception cannot be applied to -software incorporating any type of software -patents. - - -THE EXCEPTION TO THE EXCEPTION - -The intent of the Litt Perl Development Tools -License (LPDTL) is to produce a free software -development environment enabling a software -developer to create free software, nonfree -software, or proprietary software. Therefore, all -of the resulting program's software development -features must be contained in the LPDTL licensed -software, or in GPL licensed software. It is a -violation of the LPDTL to place any software -development features in any file not licensed -under either the GPL or the LPDTL. - -A "software development feature" is a feature -enabling creation or modification of software. - - -DISCUSSION OF INTENT OF THIS LICENSE - -You can find a discussion of the intent of this -license in the LPDTL_discuss.txt file. If you -haven't been given a copy of this file, you can -find it in the -http://www.troubleshooters.com/licenses/LPDTL/ -directory. diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/INSTALL b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/INSTALL deleted file mode 100644 index 03615a8..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/INSTALL +++ /dev/null @@ -1,23 +0,0 @@ -INSTALLATION PROCEDURES FOR Node.pm - Version 0.2.0 released 5/13/2004 - -Downloading - Download from - http://www.troubleshooters.com/projects/Node/Node.#.#.#.tgz -Installing - The tarball extracts into a directory called Node - cd to the directory into which you want to place Node - Move any existing Node directory out of the way - tar xzvf Node.#.#.#.tgz -Testing - cd into the Node directory - ./hello.pl - troubleshoot as necessary -Using - In any perl program using Node not in the Node directory... - Use following code at beginning - #!/usr/bin/perl -w -I/path/to/Node - use strict; - use Node; - If destination machine has unknown Node.pm directory... - See example_nodepath.pl diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/LPDTL_discuss.txt b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/LPDTL_discuss.txt deleted file mode 100644 index 9ee1b08..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/LPDTL_discuss.txt +++ /dev/null @@ -1,26 +0,0 @@ -INTENT OF THE LITT PERL DEVELOPMENT TOOL LICENSE - -The intent of the Litt Perl Development Tool License (LPDTL) is to provide -programmers with a development tool that is copylefted free software without -requiring applications built from this tool to be free software. - -I (Steve Litt) have tried to craft the LPDTL to prevent "cute and -innovative" ways of taking this tool private. For instance, a person might -try to make the LPDTL licensed code dependent on subroutines in proprietary -subroutines. This is why the LPDTL has a clause stating that all -*development* features must reside in the LPDTL code, or in GPL code, but -not non-GPL-compatible code. - -Although the LPDTL allows its use with software of almost any license, it -specifically forbids use with licenses doing any of the following: - -1. Restricting reverse engineering - -2. Restricting discussion about the software - -3. Code that includes software patents - -I feel that restrictions on reverse engineering and discussion, and software -patents, are so destructive to society, that I have included language -preventing use of LPDTL licensed code with any software incorporating any of -these three atrocities. diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/Node.pm b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/Node.pm deleted file mode 100644 index cec1f97..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/Node.pm +++ /dev/null @@ -1,475 +0,0 @@ -#!/usr/bin/perl -w - -####################################################################### -# Copyright (C) 2003 by Steve Litt, all rights reserved. -# Licensed under version 1 of the -# Litt Perl Development Tools License -# See COPYING file -# Or COPYING.LPDTL.1.0 -# Or see http://www.troubleshooters.com/licenses/LPDTL/COPYING.LPDTL.1.0 -# -# ABSOLUTELY NO WARRANTY, USE AT YOUR OWN RISK! -# -# Version 0.2.0 released 5/13/2004 - -use strict; - -package Node; -sub new($$$$) - { - my($typeOfClass) = $_[0]; - my($self) = {}; - bless($self, $typeOfClass); - - $self->{'name'}=$_[1]; - $self->{'type'}=$_[2]; - $self->{'value'}=$_[3]; - - - $self->{'nextsibling'}=undef; - $self->{'prevsibling'}=undef; - $self->{'parent'}=undef; - $self->{'firstchild'}=undef; - $self->{'lastchild'}=undef; - - $self->{'attributes'}={}; - - return($self); - } - - -#### For single attribute -sub setAttribute() - { - $_[0]->{'attributes'}->{$_[1]} = $_[2]; - } - -sub removeAttribute() - { - delete $_[0]->{'attributes'}->{$_[1]}; - } - -sub getAttribute() - { - if($_[0]->hasAttributes()) - { - return $_[0]->{'attributes'}->{$_[1]}; - } - else - { - return(undef); - } - } - -sub hasAttribute() - { - if($_[0]->hasAttributes()) - { - return defined($_[0]->getAttribute($_[1])); - } - else - { - return(undef); - } - } - -#### For attribute array -sub hasAttributes() - { - return defined($_[0]->getAttributes()); - } -sub getAttributes() - { - return %{$_[0]->{'attributes'}}; - } - -sub setAttributes() - { - $_[0]->{'attributes'} = $_[1]; - } - - - - -#### For traversing -sub getFirstChild() {return($_[0]->{'firstchild'});} -sub getNextSibling() {return($_[0]->{'nextsibling'});} -sub getParent() {return($_[0]->{'parent'});} - -sub hasFirstChild() {return(defined($_[0]->{'firstchild'}));} -sub hasNextSibling() {return(defined($_[0]->{'nextsibling'}));} -sub hasParent() {return(defined($_[0]->{'parent'}));} - -#### For reverse traversing -sub getLastChild() {return($_[0]->{'lastchild'});} -sub getPrevSibling() {return($_[0]->{'prevsibling'});} - -sub hasLastChild() {return(defined($_[0]->{'lastchild'}));} -sub hasPrevSibling() {return(defined($_[0]->{'prevsibling'}));} - -#### For content -sub getName() {return($_[0]->{'name'});} -sub getType() {return($_[0]->{'type'});} -sub getValue() {return($_[0]->{'value'});} -sub setName() {$_[0]->{'name'} = $_[1];} -sub setType() {$_[0]->{'type'} = $_[1];} -sub setValue() {$_[0]->{'value'} = $_[1];} - -sub hasName() {return(defined($_[0]->{'name'}));} -sub hasType() {return(defined($_[0]->{'type'}));} -sub hasValue() {return(defined($_[0]->{'value'}));} - -#### For setting pointers, should probably be private or protected -sub setFirstChild() {$_[0]->{'firstchild'} = $_[1];} -sub setNextSibling() {$_[0]->{'nextsibling'} = $_[1];} -sub setParent() {$_[0]->{'parent'} = $_[1];} -sub setLastChild() {$_[0]->{'lastchild'} = $_[1];} -sub setPrevSibling() {$_[0]->{'prevsibling'} = $_[1];} - -#### For creation -sub insertSiblingBeforeYou() - { - my($self) = $_[0]; - my($oldPrevSibling) = $self->getPrevSibling(); - $self->setPrevSibling($_[1]); - $self->getPrevSibling()->setParent($self->getParent()); - $self->getPrevSibling()->setNextSibling($self); - if(!defined($oldPrevSibling)) - { - $self->getParent()->setFirstChild($self->getPrevSibling()); - $self->getPrevSibling()->setPrevSibling(undef); - } - else - { - $self->getPrevSibling()->setPrevSibling($oldPrevSibling); - $oldPrevSibling->setNextSibling($self->getPrevSibling()); - } - return($self->getPrevSibling()); - } - -sub insertSiblingAfterYou() - { - my($self) = $_[0]; - my($oldNextSibling) = $self->getNextSibling(); - $self->setNextSibling($_[1]); - $self->getNextSibling()->setParent($self->getParent()); - $self->getNextSibling()->setPrevSibling($self); - if(!defined($oldNextSibling)) - { - if(defined($self->getParent())) - { - $self->getParent()->setLastChild($self->getNextSibling()); - } - $self->getNextSibling()->setNextSibling(undef); - } - else - { - $self->getNextSibling()->setNextSibling($oldNextSibling); - $oldNextSibling->setPrevSibling($self->getNextSibling()); - } - return($self->getNextSibling()); - } - -sub insertFirstChild() - { - my($self) = $_[0]; - my($oldFirstChild) = $self->getFirstChild(); - if(defined($oldFirstChild)) - { - $oldFirstChild->insertSiblingBeforeYou($_[1]); - } - else - { - $self->setFirstChild($_[1]); - $self->setLastChild($_[1]); - $self->getFirstChild()->setParent($self); - } - return($self->getFirstChild()); - } - -sub insertLastChild() - { - my($self) = $_[0]; - my($oldLastChild) = $self->getLastChild(); - if(defined($oldLastChild)) - { - $oldLastChild->insertSiblingAfterYou($_[1]); - } - else - { - $self->setFirstChild($_[1]); - $self->setLastChild($_[1]); - $self->getFirstChild()->setParent($self); - } - return($self->getLastChild()); - } - -#### For cloning -sub clone() - { - my($self) = $_[0]; - my($clone) = Node->new(); - $clone->setName($self->getName()); - $clone->setType($self->getType()); - $clone->setValue($self->getValue()); - - $clone->setParent($self->getParent()); - $clone->setFirstChild($self->getFirstChild()); - $clone->setLastChild($self->getLastChild()); - $clone->setPrevSibling($self->getPrevSibling()); - $clone->setNextSibling($self->getNextSibling()); - return($clone); - } - -#### For deletion -sub deleteSelf() - { - my($self) = $_[0]; - my($prev) = $self->getPrevSibling(); - my($next) = $self->getNextSibling(); - my($parent) = $self->getParent(); - if((defined($self->getPrevSibling()))&&(defined($self->getNextSibling()))) - { - $self->getNextSibling()->setPrevSibling($self->getPrevSibling()); - $self->getPrevSibling()->setNextSibling($self->getNextSibling()); - } - elsif((!defined($self->getPrevSibling()))&&(!defined($self->getNextSibling()))) - { - $self->getParent()->setFirstChild(undef); - $self->getParent()->setLastChild(undef); - } - elsif(!defined($self->getPrevSibling())) - { - $self->getParent()->setFirstChild($self->getNextSibling()); - $self->getNextSibling()->setPrevSibling(undef); - } - elsif(!defined($self->getNextSibling())) - { - $self->getParent()->setLastChild($self->getPrevSibling()); - $self->getPrevSibling()->setNextSibling(undef); - } - $self->setFirstChild(undef); - $self->setLastChild(undef); - } - -sub deleteTree() - { - my($self) = $_[0]; - -# #### Code to delete children and decendents here - $self->deleteSelf(); - } - -package OutlineParser; -sub new() - { - my($typeOfClass) = $_[0]; - my($self) = {}; - bless($self, $typeOfClass); - $self->{'head'} = Node->new("Header Node", "Head", "Inserted by OutlineParser"); - $self->{'fromstdin'} = 1; - $self->{'zapblanks'} = 1; - return($self); - } - -sub setCommentChar($$) - { - $_[0]->{'commentchar'} = $_[1]; - } - -sub getCommentChar($) - { - return($_[0]->{'commentchar'}); - } - -sub hasCommentChar($) - { - return(defined($_[0]->{'commentchar'})); - } - -sub getFirstNonBlankChar($$) - { - my $self = shift; - my $line = shift; - chomp $line; - my @parts = split(/\s+/,$line, 2); - $line = join('', @parts); - my $firstchar = substr($line, 0, 1); - return $firstchar; - } - - -sub parse() - { - my($self) = $_[0]; - my($fname) = $_[1]; - - my(@levelStack); - push(@levelStack, ($self->{'head'})); - my($checker) = $self->{'head'}; - my($lineno) = 0; - my($prevLevel) = -1; - - my($inf); - if($self->{'fromstdin'} == 0) - { - defined($fname) or die "OutlineParser::parse() requires a filename argument, terminating.\n"; - open(INF, "<" . $fname) or die "OutlineParser::parse() could not open $fname for input, terminating.\n"; - $inf = q(INF); - } - else - { - $inf = qw(STDIN); - } - while(<$inf>) - { - my($line) = $_; - chomp($line); - $lineno++; - my $zapFlag = 0; - my $firstNonBlankChar = $self->getFirstNonBlankChar($line); - if(($self->{'zapblanks'} != 0) && ($firstNonBlankChar eq '')) - { - $zapFlag = 1; - } - if($self->hasCommentChar() && ($self->getCommentChar() eq $firstNonBlankChar)) - { - $zapFlag = 1; - } - - unless($zapFlag) - { - my($level) = 0; - - $line =~ m/^( *)(.*)/; - if(defined($1)) - { - $level = length($1); - $line = $2; - } - else - { - $line = $2; - } - - my $node = Node->new("", "Node", $line); - $node->setAttribute('_lineno', $lineno); - - if($level == $prevLevel) - { - $levelStack[$prevLevel]->insertSiblingAfterYou($node); - $levelStack[$level] = $node; - } - elsif($level == $prevLevel + 1) - { - $levelStack[$prevLevel]->insertFirstChild($node); - $levelStack[$level] = $node; - } - elsif($level > $prevLevel + 1) - { - die "Multiple indent at line $lineno, \"$line\", terminating.\n"; - } - elsif($level < $prevLevel) - { - my($dedent) = $prevLevel - $level; - while($level < $prevLevel) - { - pop(@levelStack); - $prevLevel--; - } - $levelStack[$prevLevel]->insertSiblingAfterYou($node); - $levelStack[$level] = $node; - } - $prevLevel = $level; - } - } - if($self->{'fromstdin'} == 0) {close(INF);} - return($self->getHead()); - } - -sub fromStdin() {$_[0]->{'fromstdin'} = 1;} -sub fromFile() {$_[0]->{'fromstdin'} = 0;} -sub zapBlanks() {$_[0]->{'zapblanks'} = 1;} -sub dontZapBlanks() {$_[0]->{'zapblanks'} = 0;} -sub getHead() {return($_[0]->{'head'});} - - -package Walker; -sub new() - { - my $typeOfClass = $_[0]; - my $self = {}; - bless($self, $typeOfClass); - $self->{'top'} = $_[1]; - $self->{'entrycallback'} = $_[2]; - $self->{'exitcallback'} = $_[3]; - return($self); - } - -sub walk() - { - my($self) = $_[0]; - my($ascending) = 0; - my($checker)=$self->{'top'}; # like a checker you move around a board - my($level)=0; - my($continue) = 1; - my $counter = 0; - while($continue) - { - if($ascending == 0) - { - if(defined($self->{'entrycallback'})) - { - my @args = @{$self->{'entrycallback'}}; - my $sub = shift(@args); - push(@args, ($checker, $level)); - &{$sub}(@args); - } - if($level < 0) {$continue=0;} ## Callback sets negative to terminate - } - else - { - if(defined($self->{'exitcallback'})) - { - my @args = @{$self->{'exitcallback'}}; - my $sub = shift(@args); - push(@args, ($checker, $level)); - &{$sub}(@args); - } - if($level < 0) {$continue=0;} ## Callback sets negative to terminate - if($checker == $self->{'top'}) {$continue=0;} - } - - if($continue == 0) - { - #skip this if/elsif/else entirely - } - elsif(($ascending == 0) && (defined($checker->getFirstChild()))) - { - $ascending = 0; - $checker = $checker->getFirstChild(); - $level++; - } - elsif((defined($checker->getNextSibling())) && ($checker != $self->{'top'})) - { - $ascending = 0; - $checker = $checker->getNextSibling(); - } - elsif(defined($checker->getParent())) - { - $ascending = 1; - $checker = $checker->getParent(); - $level--; -# if($level < 1) {$continue = 0;} - } - else - { - $continue = 0; - } - $counter++; - } - } - - -1; - diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/README.otl b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/README.otl deleted file mode 100644 index 2d10d5e..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/README.otl +++ /dev/null @@ -1,177 +0,0 @@ -MANUAL FOR THE Node.pm Tool - Version 0.2.0 released 5/13/2004 -License - Litt Perl Development Tools License, version 1 - See COPYING file - This license is the GNU GPL with an exception - See COPYING.GPL - NO WARRANTY!!!!! See COPYING.GPL -Purpose - Handling hierarchies in Perl - Implements a tree of nodes - Each node has a name, a type, a value, and optionally attributes - Each node can have zero, one or many attributes - Each attribute has a name and a value - Especially made to handle tab indented outlines in memory -Learning Node.pm - Learn from the example programs: Study them in this order: - example_hello.pl - example_parse.pl - example_otl2markup.pl - example_attribs.pl - example_bylevel.pl - example_delete.pl - example_insert.pl - example_nodepath.pl - That's the only way to learn this tool - Do each example program in order - Run - Read - Study - Example programs - example_hello.pl - Proof of concept - 7 lines of perl - Instantiate and read from a Node object - example_parse.pl - Parse a tab indented outline file into a Node tree - Use a Walker object to walk the tree and print the Nodes - Create a Callback object and callback routine - example_otl2markup.pl - Use return callback to create end tags - example_attribs.pl - Set and get Node attributes - Observer "_lineno" attribute, - which was set by the Parser object - example_bylevel.pl - Read the Node tree recursively and output by level - Use the Callbacks object to store information - Use multiple callbacks to simplify a complex algorithm - Observe that the performance is still quite good - example_delete.pl - Delete nodes during a callback - Observe that the Walker object takes the deletion in stride - Observe that the Walker object does not "lose its place" - example_insert.pl - Insert nodes - Build a Node tree without an outline or Parser object - Create child nodes using an array - Create child nodes from a callback routine - Use a return callback to count occurrences within in its subtree - Access and use a Node's name, type and value - Move nodes within the tree - example_nodepath.pl - Load a Node.pm file in a different directory - Load a Node.pm file at runtime from an entry in a config file - Use an environment variable to change the name of the config file -File manifest - Documentation - INSTALL - README.otl - Licensing - COPYING - COPYING.GPL - COPYING.LPDTL.1.0 - LPDTL_discuss.txt - Node.pm file - - Node.pm - Example Programs - example_hello.pl - example_parse.pl - example_otl2markup.pl - example_attribs.pl - example_bylevel.pl - example_delete.pl - example_insert.pl - example_nodepath.pl - Sample node path config file (for example_nodepath.pl) - myapp.cfg - Sample outline (used for example_delete.pl) - deletetest.otl -Objects - Node.pm implements three object types: - Node - OutlineParser - Walker - Node - A single element in the hierarchy - All nodes connected - Parent pointer - (the pointer is a Perl reference, of course) - First child pointer - Last child pointer - Previous sibling pointer - Last sibling pointer - Each node has: - A name - hasName() - getName() - setName() - A type - hasType() - getType() - setType() - A value - hasValue() - getValue() - setValue() - Zero, one or many attributes - Each attribute has a name and a value - Single attribute methods: - hasAttribute() - getAttribute() - setAttribute() - removeAttribute() - Attribute array methods: - hasAttributes() - getAttributes() - setAttributes() - Node methods enable all hierarchy operations - Node insertion - insertFirstChild() - insertLastChild() - insertSiblingBeforeYou() - insertSiblingAfterYou() - Node deletion - deleteSelf() - Low level node traversal - hasFirstChild() - getFirstChild() - hasLastChild() - getLastChild() - hasPrevSibling() - getPrevSibling() - hasNextSibling() - getNextSibling() - hasParent() - getParent() - OutlineParser - Object to convert a tab indented outline to a tree of Node objects - Outline must be well formed... - Each line indented zero or one tab to the right of its parent - You can set and access properties of the parse - hasCommentChar() - getCommentChar() - setCommentChar() - fromStdin() - fromFile() - zapBlanks() - dontZapBlanks() - After setting parse properties, you perform the parse - my parser = OutlinerParser->new(); - parser->setCommentChar('#'); - parser->fromFile(); - my $topNode = parser->parse("myoutline.txt"); - Walker - Object to traverse entire Node hierarchy - Performs actions via callback routines - my $walker = Walker->new($topNode, $entryCallbackRef, $returnCallbackRef); - Entry callback occurs when node is first accessed - Return callback occurs when node is re-accessed after going through children - Callbacks should be object methods, not freestanding - Callbacks must take 3 arguments: - $self: The object containing the callback - [\&Callbacks::cbPrintNodeInfo, $callbacks]); -Installation - See INSTALL file diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/deletetest.otl b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/deletetest.otl deleted file mode 100644 index e7d34da..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/deletetest.otl +++ /dev/null @@ -1,18 +0,0 @@ -Top - Level2 - Level2b - Level3 - deleteme - gone - gone - deleteme - gone - gone - this should stay - deleteme - deleteme - gone - gone - Level3b - 2level2 -Top2 diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_attribs.pl b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_attribs.pl deleted file mode 100755 index d82610f..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_attribs.pl +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/perl -w - -# Copyright (C) 2004 by Steve Litt -# Licensed with the GNU General Public License, Version 2 -# ABSOLUTELY NO WARRANTY, USE AT YOUR OWN RISK -# See http://www.gnu.org/licenses/gpl.txt - -##################################################################### -# This exercise demonstrates the use of attributes for each node. -# Attributes are facts about an entity, rather than an entity itself. -# In real practice, many times attributes can be substituted for nodes -# and vice versa. However, an attribute CANNOT have children. -# -# This is the first exercise using multiple Walker objects. The first -# Walker object counts each node's children, and if the node has -# children, it creates an attribute named "children" for that node. -# The value of the attribute is the number of direct children for -# that node. -# -# Nodes are accessed two ways in the cbPrintNode() callback. The entire -# attribute hash is accessed with hasAttributes and getAttributes(), -# while single named attributes are accessed with hasAttributes and -# getAttributes(). -# -# One more action that's demonstrated is the use of secondary navigation -# within a callback routine. For each node, the callback routine -# navigates to the first child and then each successive sibling of that -# child in order to count the direct children. This is a common -# algorithm with Node.pm. It might look inefficient, and you might be -# tempted to perform the count during the callback that prints the -# information. Don't do it. Multiple walkers help keep Node.pm -# enabled programs easy to understand and modify. Because the -# entire node tree is in memory, the double navigation isn't -# particularly slow. -# -# Real world programs make heavy use of multiple walkers. For instance, -# the EMDL to UMENU program (not packaged here) has over 10 walkers. -# -##################################################################### - -use strict; # prevent hard to find errors - -use Node; # Use Note.pm tool - -package Callbacks; -sub new() - { - my($type) = $_[0]; - my($self) = {}; - bless($self, $type); - $self->{'errors'} = 0; - $self->{'warnings'} = 0; - return($self); - } - -sub getErrors(){return $_[0]->{'errors'};} -sub getWarnings(){return $_[0]->{'warnings'};} - -sub cbCountChildren() - { - my($self, $checker, $level) = @_; - unless (defined($checker)) {return -999;} - - my $childCount=0; - if($checker->hasFirstChild()) - { - $childCount++; - my $checker2 = $checker->getFirstChild(); - while($checker2->hasNextSibling()) - { - $childCount++; - $checker2 = $checker2->getNextSibling(); - } - $checker->setAttribute("children", $childCount); - } - } - -sub cbPrintNode() - { - my($self, $checker, $level) = @_; - unless (defined($checker)) {return -999;} # don't process undef node - - for(my $n=0; $n < $level; $n++) {print "\t";} - print "* "; - print $checker->getValue(); # print the text of the node - print "\n"; - - for(my $n=0; $n <= $level; $n++) {print "\t";} - print "("; - - my %attribs = {}; - %attribs = $checker->getAttributes() if $checker->hasAttributes(); - - my @keys = keys(%attribs); - foreach my $key (sort @keys) - { - print $key, "=", $attribs{$key}, "; "; - } - - print ")\n"; - - if($checker->hasAttribute("children")) - { - for(my $n=0; $n <= $level; $n++) {print "\t";} - print "This node has "; - print $checker->getAttribute("children"); - print " children.\n"; - } - } - -package Main; - -sub main() - { - #### PARSE FROM FILE README.otl - my $parser = OutlineParser->new(); # instantiate parser - $parser->setCommentChar("#"); # ignore lines starting with # - $parser->fromFile(); # get input from file - my $topNode=$parser->parse("README.otl"); - - #==================================================================== - # The preceding statement parses file README.otl into a node hierarchy - # and assigns the top level node of that hierarchy to $topNode. When - # you run the program you'll notice that the text in $topNode does - # not appear in README.otl, but instead has value - # "Inserted by OutlineParser". - # - # This is a feature, not a bug. In order to accommodate the typical - # case of an outline having several top level items, and yet still - # be able to represent the whole hierarchy as a single top node, - # the OutlineParser object creates a new node with value - # " Inserted by OutlineParser" - # and places all the outline's top level items under that newly - # created node. - # - # If the outline you're working on is guaranteed to have only - # a single top level item, and if you want that to be the top - # level node, you can simply do the following: - # - # $topNode=$topNode->getFirstChild(); - #==================================================================== - - #### INSTANTIATE THE Callbacks OBJECT - my $callbacks = Callbacks->new(); - - #### WALK THE NODE TREE, - #### OUTPUTTING LEVEL AND TEXT - my $walker = Walker->new - ( - $topNode, - [\&Callbacks::cbCountChildren, $callbacks] - ); - $walker->walk(); - my $walker = Walker->new - ( - $topNode, - [\&Callbacks::cbPrintNode, $callbacks] - ); - $walker->walk(); - } - -main(); diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_bylevel.pl b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_bylevel.pl deleted file mode 100755 index d60d7f6..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_bylevel.pl +++ /dev/null @@ -1,227 +0,0 @@ -#!/usr/bin/perl -w - -# Copyright (C) 2004 by Steve Litt -# Licensed with the GNU General Public License, Version 2 -# ABSOLUTELY NO WARRANTY, USE AT YOUR OWN RISK -# See http://www.gnu.org/licenses/gpl.txt - -use strict; # prevent hard to find errors - -use Node; # Use Node.pm tool - -##################################################################### -# The Walker object walks the node hierarchy recursively. That is, -# it goes deep before going laterally. That's just what's needed for -# many applications. However, sometimes it's necessary to look at -# one level at a time. -# -# There are many ways to accomplish this. Some involve sorting and -# merging. Many involve arrays of nodes on a given level, and -# plunging one deep into each one. -# -# In this example we'll start with a walker that assigns the full -# path to each node as an attribute of that node. We'll then loop -# through all levels starting with 0, and for each one we'll print all -# children of nodes at that level. Every time there's a parent change, -# we'll print a header for that parent. -# -# This example also illustrates the use of variables within the -# Callback object. You might have wondered why callbacks must be -# part of an object rather than free floating functions. The answer -# is that the use of callbacks as object methods means that we can -# keep totals and break logic variables within the callback object, -# thereby eliminating the (nasty) necessity of global variables. -# -# We cannot simply pass variables into and out of callback -# routines because, by the very nature of a callback routine, -# its arguments and return type are strictly predefined. In the -# case of Node.pm the arguments are always $self, $checker and -# $level. To get any other information into or out of the callback -# routine, we must use a non-callback method of the same object. -# -# It should be noted that there's nothing wrong with having -# multiple callback objects. If there are numerous callback -# routines it might make sense to group them by functionality, -# or by totals and persistent variables they must keep track of. -# -# As you run, study and understand this code, be aware that converting -# a hierarchy to a list by levels is a very difficult and complex task. -# Imagine keeping a list of children, and for each level using those -# children to find the next generation, and rewriting the array. Or -# prepending a level number followed by a child index on each line, -# and then sorting the whole array by the level number and child -# index, and finally running a routine to output the formatted -# output, complete with break logic and headers. -# -# Now consider how easy Node.pm made this job. First, a trivial -# Walker to calculate full paths, then a level loop calling a -# Walker to print only children of nodes at the desired level. The -# code is short, and it's very readable and understandable. The -# callback routines are short enough that you can safely use non- -# structured techniques such as returning from the middle instead -# of using nested if statements. The result is even more readability. -# -# One could make the (very valid) point that nodes are visited many -# times to process each once, and that this is not efficient in -# terms of runtime performance. Absolutely true! -# -# However, the programming simplicity prevents truly collosal -# efficency problems, such as cascading intermediate files, sorts, -# and the various other CPU cycle grabbers that seem to crop up -# in complex algorithms. And remember, the entire tree is in memory, -# with navigation via simple pointers, so the environment of Node.pm -# favors runtime speed. -# -# Case in point. My original EMDL to UMENU converter was such an -# epic production that I needed to study it for 4 hours every time -# I made a minor improvement. I had developed it using informal OOP -# and structured techniques, and had paid close attention to -# efficiency. The resulting program took 15 seconds to convert a -# 2300 line EMDL file. -# -# I rewrote the converter using Node.pm. This was a complete -# rewrite -- all new code -- no salvage. It was so much simpler -# that I wrote it in 12 hours. But I was very concerned with -# runtime. If the 15 seconds doubled, this would be a hassle, -# and if it quadrupled it would be totally impractical. When -# I ran it, the program did everything the original did, but -# did it in 2 seconds. Node.pm had given me a 7 fold speed -# increase. -# -##################################################################### - -package Callbacks; -sub new() - { - my($type) = $_[0]; - my($self) = {}; - bless($self, $type); - $self->{'errors'} = 0; - $self->{'warnings'} = 0; - $self->{'childrenatlevel'} = 0; - $self->{'currentlevel'} = 0; - $self->{'previousparentfullpath'} = "initialize"; - return($self); - } - -sub getErrors(){return $_[0]->{'errors'};} -sub getWarnings(){return $_[0]->{'warnings'};} - -sub getChildrenAtLevel(){return $_[0]->{'childrenatlevel'};} -sub setChildrenAtLevel(){$_[0]->{'childrenatlevel'} = $_[1];} -sub incChildrenAtLevel(){$_[0]->{'childrenatlevel'}++;} - -sub getCurrentLevel(){return $_[0]->{'currentlevel'};} -sub setCurrentLevel(){$_[0]->{'currentlevel'} = $_[1];} - -sub cbCalculateFullPath() - { - my($self, $checker, $level) = @_; - unless (defined($checker)) {return -999;} # don't process undef node - - if($checker->hasParent) - { - my $fullpath = $checker->getParent()->getAttribute("fullpath"); - $fullpath .= "/"; - $fullpath .= $checker->getValue(); - $checker->setAttribute("fullpath", $fullpath); - } - else - { - $checker->setAttribute("fullpath", $checker->getValue()); - } - } - -sub cbPrintNode() - { - my($self, $checker, $level) = @_; - unless (defined($checker)) {return -999;} # don't process undef node - - #### DO NOTHING UNLESS THIS NODE IS AT THE CURRENTLY SOUGHT LEVEL - return unless $level == $self->getCurrentLevel(); - - #### DO NOTHING UNLESS THIS NODE HAS CHILDREN - return unless $checker->hasFirstChild(); - - #### PRINT HEADER - print "\n", $checker->getAttribute("fullpath"), "\n"; - - #### PRINT CHILDREN AND COUNT CHILDREN AT LEVEL - my $checker2 = $checker->getFirstChild(); # We returned if there wasn't one - print "\t", $checker2->getValue(), "\n"; - $self->incChildrenAtLevel(); - - while($checker2->hasNextSibling()) - { - $checker2 = $checker2->getNextSibling(); - print "\t", $checker2->getValue(), "\n"; - $self->incChildrenAtLevel(); - } - } - - -package Main; - -sub main() - { - #### PARSE FROM FILE README.otl - my $parser = OutlineParser->new(); # instantiate parser - $parser->setCommentChar("#"); # ignore lines starting with # - $parser->fromFile(); # get input from file - my $topNode=$parser->parse("README.otl"); - - - #### INSTANTIATE THE Callbacks OBJECT - my $callbacks = Callbacks->new(); - - #### WALK THE NODE TREE, - #### CALCULATING FULL PATHS AND PUTTING THEM IN AN ATTRIBUTE - my $walker = Walker->new - ( - $topNode, # start with this node - [\&Callbacks::cbCalculateFullPath, $callbacks] # do this on entry to each node - ); - $walker->walk(); - - #### PRINT LEVEL 0 - print "\n\n********** BEGIN LEVEL ", "0", "\n"; - print "\t", $topNode->getValue(), "\n"; - - #### SET STARTING PARENT LEVEL, - #### AND SET $childCount SO THE LOOP WILL FIRE THE FIRST TIME - my $level=0; - my $childCount=9999; - - #================================================================== - # The main loop follows, level by level. At each level, nodes are - # queried for their children, which are then printed below the - # node's full path. The result is a list of nodes sorted by - # level. - # - # We add 1 to the level in the level header because we're referring - # to the level of the children, not of the current node. We keep - # looping to deeper levels until a level counts no children. - # - # This logic result in an empty level header at the bottom. If this - # were a big concern, we could print the level headers in the - # Callbacks::cbPrintNode() callback, with slightly altered logic. - # However, it's a minor point, so for simplicity we print the - # level header at the top of this loop in the main routine. - #================================================================== - while($childCount > 0) - { - print "\n\n********** BEGIN LEVEL ", $level + 1, "\n"; - $callbacks->setChildrenAtLevel(0); - $callbacks->setCurrentLevel($level); - my $walker = Walker->new - ( - $topNode, - [\&Callbacks::cbPrintNode, $callbacks] - ); - $walker->walk(); - $childCount = $callbacks->getChildrenAtLevel(); - $level++; - } - } - -main(); diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_delete.pl b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_delete.pl deleted file mode 100755 index 810507b..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_delete.pl +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/perl -w - -# Copyright (C) 2004 by Steve Litt -# Licensed with the GNU General Public License, Version 2 -# ABSOLUTELY NO WARRANTY, USE AT YOUR OWN RISK -# See http://www.gnu.org/licenses/gpl.txt - -use strict; # prevent hard to find errors - -use Node; # Use Node.pm tool - -##################################################################### -# This exercise demonstrates the deletion of nodes. -# -# Because Perl is a garbage collection language, node deletion -# DOES NOT deallocate memory and the like. However, in the absense -# of a copy of the node, it will be garbage collected and unavailable. -# Also, the deletion process specificly undef's the deleted node's -# first and last children. -# -# You noticed I mentioned keeping a copy. The algorithm of a Walker -# object moves a node around the tree like a checker. Calling -# $checker->deleteSelf() does not render $checker undefined. In fact, -# it still has its parent, nextSibling and previousSibling pointers -# intact. What this means is that the Walker's next iteration goes -# to exactly the same node as it would have if the deletion had not -# taken place. In other words, you do not need to "move the checker -# back one" after a deletion. -# -# This makes deletion algorithms very simple. -# -# There may come a time when you want to delete a node but keep its -# children. In that case, you must first attach its children to nodes -# that will not be deleted. -# -##################################################################### - -package Callbacks; -sub new() - { - my($type) = $_[0]; - my($self) = {}; - bless($self, $type); - $self->{'errors'} = 0; - $self->{'warnings'} = 0; - return($self); - } - -sub getErrors(){return $_[0]->{'errors'};} -sub getWarnings(){return $_[0]->{'warnings'};} - -sub cbDelete() - { - my($self, $checker, $level) = @_; - unless (defined($checker)) {return -999;} # don't process undef node - - #### DELETE THIS NODE IF ITS VALUE CONTAINS deleteme - my $text = "init"; - $text = $checker->getValue() if $checker->hasValue(); - if($text =~ m/deleteme/) - { - $checker->deleteSelf(); - } - } - -sub cbPrintNode() - { - my($self, $checker, $level) = @_; - unless (defined($checker)) {return -999;} - - for(my $n=0; $n < $level; $n++) {print "\t";} - print $checker->getValue(), "\n"; - } - -package Main; - -sub main() - { - #### PARSE FROM FILE README.otl - my $parser = OutlineParser->new(); - $parser->setCommentChar("#"); - $parser->fromFile(); - my $topNode=$parser->parse("deletetest.otl"); - - #### INSTANTIATE THE Callbacks OBJECT - my $callbacks = Callbacks->new(); - - #### WALK THE NODE TREE, - #### DELETING NODES WITH "deleteme" IN THEM - my $walker = Walker->new - ( - $topNode, - [\&Callbacks::cbDelete, $callbacks] - ); - $walker->walk(); - - #### WALK THE NODE TREE, - #### OUTPUTTING LEVEL AND TEXT - $walker = Walker->new - ( - $topNode, - [\&Callbacks::cbPrintNode, $callbacks] - ); - $walker->walk(); - } - -main(); diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_hello.pl b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_hello.pl deleted file mode 100755 index cf46fad..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_hello.pl +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/perl -w - -# Copyright (C) 2004 by Steve Litt -# Licensed with the GNU General Public License, Version 2 -# ABSOLUTELY NO WARRANTY, USE AT YOUR OWN RISK -# See http://www.gnu.org/licenses/gpl.txt - -use strict; # prevent hard to find errors -use Node; - -my $topNode = Node->new("myname", "mytype", "myvalue"); -print "\n::: "; -print $topNode->getName(), " ::: "; -print $topNode->getType(), " ::: "; -print $topNode->getValue(), " :::\n"; diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_insert.pl b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_insert.pl deleted file mode 100755 index 4fd82fa..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_insert.pl +++ /dev/null @@ -1,550 +0,0 @@ -#!/usr/bin/perl -w - -# Copyright (C) 2004 by Steve Litt -# Licensed with the GNU General Public License, Version 2 -# ABSOLUTELY NO WARRANTY, USE AT YOUR OWN RISK -# See http://www.gnu.org/licenses/gpl.txt - -use strict; # prevent hard to find errors - -use Node; # Use Node.pm tool - -##################################################################### -# WARNING: This is a difficult exercise. Do not attempt this exercise -# until you have completed the prerequisites listed in the README.otl -# file. -# -# I suggest you approach this example starting with the main routine -# at the bottom of the file, and then drilling down into subroutines -# and callbacks. Understand the big picture before drilling down. -# -# This exercise demonstrates insertion of nodes, and much, much more. -# Insertion is accomplished by the insertFirstChild(), -# insertSiblingBeforeYou(), insertSiblingAfterYou(), and -# insertLastChild() methods. The insertLastChild() method is not -# demonstrated. -# -# This exercise is VERY contrived. It is contrived to show techniques -# of building a node tree using insertions, and also how to switch -# two nodes. The switching of the two nodes is especially contrived, -# but I could think of no better way of demonstrating node moving. -# -# This exercise builds a tree that represents a date book type calendar. -# Level 0 is Calender, level 1 are the years, of which there is only 2004, -# Level 2 are the months, level 3 the days, and level 4 the hour long -# timeslots. There is no provision for weekends, nor after hours -# appointments. It is a demonstration only. -# -# Using an array of month names and an array of days per month, you build -# the month and day levels using a nested loop. The hour level is built -# using a Walker. Node names are things like "January" or 31 or -# "11:00-12:00". Node types are things like "Year", "Month", "Day" or -# "Hour". Node values are undefined unless an appointment is made, in -# which case the value is the node text. -# -# A special Walker is used to mark any day, month or year entities -# if they contain appointments. Specifically, all appointments in that -# day, month or year are counted, and that number of stars are placed -# beside the day, month or year. This is implemented by using an -# return callback so that by the time the callback is called, all children -# have been calculated. -# -##################################################################### - -package Callbacks; -sub new() - { - my($type) = $_[0]; - my($self) = {}; - bless($self, $type); - $self->{'errors'} = 0; - $self->{'warnings'} = 0; - return($self); - } - -sub getErrors(){return $_[0]->{'errors'};} -sub getWarnings(){return $_[0]->{'warnings'};} - -#================================================================= -# The cbMakeMarks() callback is called on return to a node from -# its children (return callback). It executes only on year, month -# and day nodes. It iterates through all its immediate children, -# totalling up the "appointments" attribute and setting its -# own attribute to that total. Remember, because this is a -# callback triggered on return from children, it is guaranteed -# that all children have been counted, and that all those children -# have totalled their children, etc. -# -# In the case of a day node, instead of totalling the "appointments" -# attribute, it counts the number of hour nodes with defined values. -# A defined value on an hour node is an appointment. -# -# Last but not least, on non-zero counts, this callback sets the -# day, month or year node's value to a number of asterisks equal -# to the number of appointments in its subtree. -# -# Read this code carefully. Once you understand it, you'll have -# many insights to Node.pm. -#================================================================= -sub cbMakeMarks() - { - my($self, $checker, $level) = @_; - unless (defined($checker)) {return -999;} # don't process undef node - - #### PROCESS ONLY DAY, MONTH OR YEAR NODES - unless ( - $checker->getType() eq "Day" || - $checker->getType() eq "Month" || - $checker->getType() eq "Year" - ) - { - return; - } - - my $count = 0; - my $childNode = $checker->getFirstChild(); - while(defined($childNode)) - { - if($checker->getType() eq "Day") - { - if(defined($childNode->getValue())) - { - $count++; - } - } - else - { - if($childNode->hasAttribute("appointments")) - { - $count += $childNode->getAttribute("appointments"); - } - } - $childNode = $childNode->getNextSibling(); - } - $checker->setAttribute("appointments", $count); - if($count > 0) - { - my $string; - for(my $n=0; $n < $count; $n++){$string .= '*';} - $checker->setValue($string); - } - } - -#================================================================= -# The cbInsertHours() callback operates ONLY on day nodes. When -# called from a day node, it inserts hourlong appointment slots -# starting at 8am and ending at 5pm. The code is pretty -# straightforward. -#================================================================= -sub cbInsertHours() - { - my($self, $checker, $level) = @_; - unless (defined($checker)) {return -999;} # don't process undef node - - - return unless $checker->getType() eq "Day"; # Insert hours under days only - - my $checker2; - for(my $n=8; $n <= 16; $n++) - { - my $startHour = "$n:00"; - my $n2 = $n + 1; - my $endHour = "$n2:00"; - my $node = Node->new("$startHour" . "-" . "$endHour", "Hour", undef); - if($checker->hasFirstChild()) - { - $checker2 = $checker2->insertSiblingAfterYou($node); - } - else - { - $checker2 = $checker->insertFirstChild($node); - } - } - } - -#================================================================= -# The cbPrintNode() callback prints the name of the node, -# and its value if a value is defined. It's very straighforward. -#================================================================= -sub cbPrintNode() - { - my($self, $checker, $level) = @_; - unless (defined($checker)) {return -999;} # don't process undef node - - #### DON'T PRINT LEVEL 0 (CALENDER) - return if $level == 0; - - for(my $n=1; $n < $level; $n++) { print "\t";} - - print $checker->getName() if $checker->hasName(); - print ": "; - - print $checker->getValue() if $checker->hasValue(); - print "\n"; - } - - -#================================================================= -# The cbPrintNodeDiagnosic() callback is not used, but provided -# for any necessary debugging. -#================================================================= -sub cbPrintNodeDiagnostic() - { - my($self, $checker, $level) = @_; - unless (defined($checker)) {return -999;} # don't process undef node - - for(my $n=0; $n < $level; $n++) { print "\t";} - - print ">"; - print $checker->getName() if $checker->hasName(); - print " ::: "; - - print $checker->getType() if $checker->hasType(); - print " ::: "; - - print $checker->getValue() if $checker->hasValue(); - print "<\n"; - } - -package Main; - -########################################################################### -# The insertDays() subroutine handles insertion of days below all -# month nodes. -########################################################################### -sub makeAppointments($) - { - my $yearNode = shift; - #### MARCH 22 AT 8AM - my $monthNode = $yearNode->getFirstChild() -> #January - getNextSibling() -> #February - getNextSibling(); #March - my $dayNode = $monthNode->getFirstChild(); - while($dayNode->getName() != 22) - { - $dayNode = $dayNode->getNextSibling(); - unless(defined($dayNode)) - { - die "No March 22\n"; - } - } - my $hourNode = $dayNode->getFirstChild(); - $hourNode->setValue("Spring Cleaning"); - - #### JUNE 22 AT 9AM - #### WRONGLY LABELED AS FALL FESTIVAL - #### INSTEAD OF SUMMER BREAK - $monthNode = $monthNode->getNextSibling() -> # April - getNextSibling() -> # May - getNextSibling(); # June - $dayNode = $monthNode->getFirstChild(); - while($dayNode->getName() != 22) - { - $dayNode = $dayNode->getNextSibling(); - unless(defined($dayNode)) - { - die "No June 22\n"; - } - } - $hourNode = $dayNode->getFirstChild()->getNextSibling(); - $hourNode->setValue("Fall Festival"); - - #### SEPTEMBER 22 AT 10AM - #### WRONGLY LABELED AS FALL FESTIVAL - #### INSTEAD OF SUMMER BREAK - $monthNode = $monthNode->getNextSibling() -> # July - getNextSibling() -> # August - getNextSibling(); # September - $dayNode = $monthNode->getFirstChild(); - while($dayNode->getName() != 22) - { - $dayNode = $dayNode->getNextSibling(); - unless(defined($dayNode)) - { - die "No September 22\n"; - } - } - $hourNode = $dayNode -> getFirstChild() -> #8-9 - getNextSibling() -> # 9-10 - getNextSibling(); # 10-11 - $hourNode->setValue("Summer Break"); - - #### DECEMBER 22 FROM 3PM TO 5PM (2 TIMESLOTS) - #### HAPPY HOLIDAYS PARTY - $monthNode = $monthNode->getNextSibling() -> # October - getNextSibling() -> # November - getNextSibling(); # December - $dayNode = $monthNode->getFirstChild(); - while($dayNode->getName() != 22) - { - $dayNode = $dayNode->getNextSibling(); - unless(defined($dayNode)) - { - die "No December 22\n"; - } - } - $hourNode = $dayNode->getFirstChild(); - while($hourNode->getName() ne "15:00-16:00") - { - $hourNode = $hourNode->getNextSibling(); - unless(defined($hourNode)) - { - die "No 4pm slot\n"; - } - } - $hourNode->setValue("Happy Holidays Party"); - $hourNode = $hourNode->getNextSibling(); - $hourNode->setValue("Happy Holidays Party"); - - #### DECEMBER 30 AT 9AM BUY PARTY SUPPLIES - while($dayNode->getName() != 30) - { - $dayNode = $dayNode->getNextSibling(); - unless(defined($dayNode)) - { - die "No December 30\n"; - } - } - $hourNode = $dayNode->getFirstChild()->getNextSibling(); - $hourNode->setValue("Buy Party Supplies"); - } - -########################################################################### -# The insertMonthsAndDays() subroutine handles insertion of months -# below the year, and days below every month. It works by iterating through -# an array of months, and finding number of days in an array of month -# lengths. It does NOT use the Node.pm navigational system to find months. -# Use of the Node.pm navigational system for this purpose is demonstrated -# in the insertion of hours in all days. -# -# Note that we could have avoided using a nested loop by using a Walker -# and associated callback to install the days under every month. In such -# a case the array of month lengths would have been placed in the Callback -# object. However, for the sake of variety, we chose to use a nested loop -# to load the months and days. -########################################################################### -sub insertMonthsAndDays($) - { - my $yearNode = shift; - my $checker = $yearNode; - my $checker2; - my @monthNames=("January", "February", "March", "April", "May", - "June", "July", "August", "September", "October", - "November", "December"); - my @monthLengths=(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); - my $monthSS = 0; - foreach my $monthName (@monthNames) - { - my $node = Node->new($monthName, "Month", undef); - $node->setAttribute("days", $monthLengths[$monthSS]); - if($yearNode->hasFirstChild()) - { - $checker = $checker->insertSiblingAfterYou($node); - } - else - { - $checker = $yearNode->insertFirstChild($node); - } - for(my $n=1; $n <= $monthLengths[$monthSS]; $n++) - { - $node = Node->new($n, "Day", undef); - if($checker->hasFirstChild()) - { - $checker2 = $checker2->insertSiblingAfterYou($node); - } - else - { - $checker2 = $checker->insertFirstChild($node); - } - } - $monthSS++; - } - } - -########################################################################### -# This subroutine switches the June 22 9am appointment and the -# September 22 10am appointment. In each case, both the appointment -# text and the time needed switching. -# -# The sane way to accomplish this task would have been to modify -# the nodes in place. However, this subroutine was created solely to -# demonstrate the movement of nodes, so that's what we did. -# -# Note that the fact that the two are at different times complicates the -# situation. It's not enough to just trade nodes -- the Sept 9am node -# must be placed after the existing June 10am node, which itself is after -# the erroneous June 9am node containing what should be September's -# appointment. After such placement, the original June 9am node must -# have its name updated so that it is a 10am node. A similar process -# takes place for September. The original nodes are also deleted. -# -# Please follow the (convoluted and contrived) logic: -# 1. Store the June hour node in $juneNode -# 2. Store the September hour node in $septNode -# 3. After the existing June 10am, place a CLONE of the Sept appointment -# 4. Before the existing Sept 9am, place a CLONE of the June appointment -# 5. Delete the original June appointment -# 6. Delete the original September appointment -# 7. On the original June 10am node, make it 9am -# 8. On the original September 9am node, make it 10am -########################################################################### -sub switchJuneAndSeptemberAppointments($) - { - my $yearNode = shift; - - #### FIND NODE FOR JUNE 22 9AM APPOINTMENT - my $juneNode = $yearNode->getFirstChild(); - while(defined($juneNode)) - { - last if $juneNode->getName() eq "June"; - $juneNode = $juneNode->getNextSibling(); - } - die "Cannot find month of June\n" unless defined($juneNode); - - $juneNode = $juneNode->getFirstChild(); - while(defined($juneNode)) - { - last if $juneNode->getName() eq "22"; - $juneNode = $juneNode->getNextSibling(); - } - die "Cannot find June 22\n" unless defined($juneNode); - - $juneNode = $juneNode->getFirstChild(); - while(defined($juneNode)) - { - last if $juneNode->getName() eq "9:00-10:00"; - $juneNode = $juneNode->getNextSibling(); - } - die "Cannot find June 22 at 9am\n" unless defined($juneNode); - - #### FIND NODE FOR SEPTEMBER 22 10AM APPOINTMENT - my $septNode = $yearNode->getFirstChild(); - while(defined($septNode)) - { - last if $septNode->getName() eq "September"; - $septNode = $septNode->getNextSibling(); - } - die "Cannot find month of September\n" unless defined($septNode); - - $septNode = $septNode->getFirstChild(); - while(defined($septNode)) - { - last if $septNode->getName() eq "22"; - $septNode = $septNode->getNextSibling(); - } - die "Cannot find September 22\n" unless defined($septNode); - - $septNode = $septNode->getFirstChild(); - while(defined($septNode)) - { - last if $septNode->getName() eq "10:00-11:00"; - $septNode = $septNode->getNextSibling(); - } - die "Cannot find September 22 at 9am\n" unless defined($septNode); - - #### SWITCH THE NODES - my $newJune = $juneNode->getNextSibling()->insertSiblingAfterYou($septNode->clone()); - my $newSept = $septNode->getPrevSibling()->insertSiblingBeforeYou($juneNode->clone()); - $juneNode->deleteSelf(); - $septNode->deleteSelf(); - - #### FIX NAMES OF SURROUNDING CLONES - $newJune->getPrevSibling()->setName("9:00-10:00"); - $newSept->getNextSibling()->setName("10:00-11:00"); - - return; - } - - -########################################################################### -# In the main routine, you carry out or delegate the following tasks -# in order to create an appointment calendar: -# 1. Insert single level 0 and 1 nodes -# 2. Instantiate the Callbacks object -# 3. Insert all month and day nodes -# 4. Insert all hour nodes -# 5. Make appointments -# erroneously switching the june 22 & Sept 22 appointments -# 6. Mark days, months and years containing appointments -# 7. Output the calendar -# 8. Switch back June22 and Sept22 -# 9. Re mark days, months and years -# 10. Output a separator between bad and good calendars -# 11. Re output the calendar -# -########################################################################### -sub main() - { - #### INSERT SINGLE LEVEL 0 AND 1 NODES - my $topNode=Node->new("Calender", "Calender", "Calender"); - my $yearNode=$topNode->insertFirstChild(Node->new("2004", "Year", undef)); - - #### INSTANTIATE THE Callbacks OBJECT - my $callbacks = Callbacks->new(); - - #### INSERT MONTH AND DAY NODES - insertMonthsAndDays($yearNode); - - #### INSERT THE HOURS USING A Walker - my $walker = Walker->new - ( - $topNode, - [\&Callbacks::cbInsertHours, $callbacks] - ); - $walker->walk(); - - - #### MAKE A FEW APPOINTMENTS - #### ACCIDENTALLY SWITCHING SUMMER AND FALL - makeAppointments($yearNode); - - #### MARK DAYS, MONTHS AND YEAR THAT HAVE APPOINTMENTS - #### USING A WALKER WITH ONLY A RETURN CALLBACK - $walker = Walker->new - ( - $topNode, - undef, - [\&Callbacks::cbMakeMarks, $callbacks] - ); - $walker->walk(); - - #### WALK THE NODE TREE, - #### OUTPUTTING THE CALENDER - $walker = Walker->new - ( - $topNode, # start with this node - [\&Callbacks::cbPrintNode, $callbacks] # do this on entry to each node - ); - $walker->walk(); - - #### CORRECT THE MISTAKE - #### SWITCH JUNE 22 AND SEPT 22 - switchJuneAndSeptemberAppointments($yearNode); - - #### RE-MARK DAYS, MONTHS AND YEAR THAT HAVE APPOINTMENTS - #### USING A WALKER WITH ONLY A RETURN CALLBACK - $walker = Walker->new - ( - $topNode, - undef, - [\&Callbacks::cbMakeMarks, $callbacks] - ); - $walker->walk(); - - #### OUTPUT A SEPARATOR BETWEEN ORIGINAL AND CORRECTED CALENDARS - for (my $n=0; $n<5; $n++) - { - print "######################################################\n"; - } - - #### RE-WALK THE NODE TREE, - #### RE-OUTPUTTING THE CALENDER - $walker = Walker->new - ( - $topNode, # start with this node - [\&Callbacks::cbPrintNode, $callbacks] # do this on entry to each node - ); - $walker->walk(); - } - -main(); diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_nodepath.pl b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_nodepath.pl deleted file mode 100755 index 033b1fd..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_nodepath.pl +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/perl -w - -# Copyright (C) 2004 by Steve Litt -# Licensed with the GNU General Public License, Version 2 -# ABSOLUTELY NO WARRANTY, USE AT YOUR OWN RISK -# See http://www.gnu.org/licenses/gpl.txt - -use strict; # prevent hard to find errors - -##################################################################### -# Node.pm is a tool you will probably use in many projects located -# in varying directories. How do you enable those projects to -# include Node.pm? Here are some ways: -# 1. Place Node.pm in the project's directory -# 2. Place Node.pm on Perl's module path -# 3. Run the project as perl -I/path/to/Node project.pl -# 4. Shebang line #!/usr/bin/perl -w -I/path/to/Node -# -# Number 1 can become problematic as the number of apps using Node.pm -# increases. If you have 30 different copies in 30 different directories, -# how do you keep them all up to date. -# -# Number 2 is a much better option. It works. However, which @INC -# directory do you place it in? When you update Perl or your distribution, -# it goes away. -# -# Number 3 is great, except you need to create a shellscript to call -# Perl with your program as an argument. BE SURE not to leave a space -# between the -I and the directory, or that space actually becomes -# part of the directory. -# -# Number 4 is greater, because it doesn't require a shellscript. Once -# again, no space between -I and the directory. In all cases where -# you know what directory will contain Node.pm, number 4 is a great -# alternative. -# -# But what if you don't know in advance what directory -# will contain Node.pm? What if you're writing an application to be -# run at varying locations with varying setups? What if, in addition, -# you don't want the end user messing with the source code to change -# the shebang line? In that case, you can actually place the path -# to Node.pm in a configuration file. It takes several lines of code, -# but it's certainly nice to be able to accommodate the user's -# environment without requiring change to the source code. -# -# This exercise demonstrates how to set the Node.pm location from a -# configuration file. Once again, if you're the sole user it might be -# better to change the shebang line, but if you're distributing -# your program like the autumn leaves, a configuration file is the -# way to go. -# -##################################################################### - - -##################################################################### -# The loadNodeModule() subroutine is a complete substitute for: -# use Node -# -# It includes: -# require Node; -# import Node; -# -# The preceding two calls completely replace a use Node statement, -# and better still, unlike the use statement, they happen at -# runtime instead of compile time. Therefore, this subroutine reads -# the directory from a config file, then executes that directory -# with the proper require and import statements. Obviously, the -# loadNodeModule() subroutine must be executed before any code depending -# on the Node.pm module is executed. -##################################################################### -sub loadNodeModule() - { - #### CHANGE THE FOLLOWING TO CHANGE THE DEFAULT APP FILENAME - my $defaultConfFileName = "./myapp.cfg"; - - #### CHANGE THE FOLLOWING TO CHANGE APP FILENAME ENVIRONMENT VAR - my $envVarName = "MY_APP_CONFIG"; - - my($conffile) = $ENV{$envVarName}; - print $conffile, "\n" if defined $conffile; - $conffile = $defaultConfFileName unless defined($conffile); - print "Using config file $conffile.\n"; - - open CONF, '<' . $conffile or die "FATAL ERROR: Could not open config file $conffile."; - my @lines = <CONF>; - close CONF; - - my @nodedirs; - foreach my $line (@lines) - { - chomp $line; - if($line =~ m/^\s*nodedir\s*=\s*([^\s]*)/) - { - my $dir = $1; - if($dir =~ m/(.*)\$HOME(.*)/) - { - $dir = $1 . $ENV{'HOME'} . $2; - } - push @nodedirs, ($dir); - } - } - - if(@nodedirs) - { - unshift @INC, @nodedirs; - } - - require Node; - import Node; - } - -##################################################################### -# The main() routine calls loadNodeModule to include Node.pm, -# and then runs a few lines of code to conclusively prove that -# Node.pm is loaded. It also prints out the @INC array to show that -# directory in which Node.pm resides is now in the @INC path. -# -# Note that in the absense of any change to the environment variable -# defined in loadNodeModule(), the configuration file will be ./myapp.cfg. -##################################################################### -sub main() - { - loadNodeModule(); - my $topNode = Node->new("myname", "mytype", "myvalue"); - print "\n::: "; - print $topNode->getName(), " ::: "; - print $topNode->getType(), " ::: "; - print $topNode->getValue(), " :::\n"; - foreach my $line (@INC) - { - print $line, "\n"; - } - } - -main(); diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_otl2markup.pl b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_otl2markup.pl deleted file mode 100755 index 79d53cb..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_otl2markup.pl +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/perl -w - -# Copyright (C) 2004 by Steve Litt -# Licensed with the GNU General Public License, Version 2 -# ABSOLUTELY NO WARRANTY, USE AT YOUR OWN RISK -# See http://www.gnu.org/licenses/gpl.txt - -##################################################################### -# This exercise demonstrates use of the return callback routine. The -# return callback routine occurs when node navigation returns to a -# node from its children. Therefore, the return callback routine is -# never executed by nodes without children. -# -# An obvious use of the return callback routine is to print end tags -# for nested markup. A node's end tag must follow all markup for all -# the node's children, so the return callback is perfect for that -# purpose. -# -# Because childless nodes never execute the return callback routine, -# in the case of childless nodes this program prints the end tags -# from the entry callback routine. -# -# This program prints the attributes of each Node object. You'll -# immediately note that the "children" attributes you set are printed. -# But you'll also observe that a "_lineno" attribute has been set for -# all nodes except the top one. That attribute was set by the Parser -# object, and corresponds to the line in the parsed outline file. This -# attribute is extremely helpful in printing error messages. -##################################################################### - - -use strict; # prevent hard to find errors - -use Node; # Use Note.pm tool - -package Callbacks; -sub new() - { - my($type) = $_[0]; - my($self) = {}; - bless($self, $type); - $self->{'errors'} = 0; - $self->{'warnings'} = 0; - return($self); - } - -sub getErrors(){return $_[0]->{'errors'};} -sub getWarnings(){return $_[0]->{'warnings'};} - -############################################################## -# cbPrintTag is the entry callback, and is called on first -# entry to each node. It prints the start tag and text. If -# the node is a leaf level node, it also prints the end tag -# on the same line. -############################################################## -sub cbPrintTag() - { - my($self, $checker, $level) = @_; - unless (defined($checker)) {return -999;} - - #### PRINT START TAG AND CONTENT - for(my $n = 0; $n < $level; $n++) {print "\t";} - print "<node level=", $level, ">"; - print $checker->getValue() if $checker->hasValue(); - - #### IF THIS IS A LEAF LEVEL ITEM, PRINT THE - #### END TAG IMMEDIATELY. OTHERWISE, THE - #### RETURN CALLBACK WILL TAKE CARE OF THE END TAG. - unless($checker->hasFirstChild()) - { - print "</node>"; - } - - #### PRINT NEWLINE - print "\n"; - } - -############################################################## -# cbPrintEndTag is the return callback, and is called on reentry -# to the node, after all its children have been processed. -# It is not called by leaf level (childless) nodes. The purpose -# of this routine is to print the end tag. -# -# For nodes with children, the end tag must be printed after -# all information for the node's children has been printed, -# in order to preserve proper nesting. -############################################################## -sub cbPrintEndTag() - { - my($self, $checker, $level) = @_; - unless (defined($checker)) {return -999;} - - #### PRINT END TAG FOR PARENT - for(my $n = 0; $n < $level; $n++) {print "\t";} - print "</node>"; - print "\n"; - } - -package Main; - -sub main() - { - #### PARSE FROM FILE README.otl - my $parser = OutlineParser->new(); - $parser->setCommentChar("#"); - $parser->fromFile(); - my $topNode=$parser->parse("README.otl"); - - #### INSTANTIATE THE Callbacks OBJECT - my $callbacks = Callbacks->new(); - - #### WALK THE NODE TREE, - #### OUTPUTTING LEVEL AND TEXT - my $walker = Walker->new - ( - $topNode, # start with this node - [\&Callbacks::cbPrintTag, $callbacks], # do this on entry to each node - [\&Callbacks::cbPrintEndTag, $callbacks]# do this on return from node's children - ); - $walker->walk(); - } - -main(); diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_parse.pl b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_parse.pl deleted file mode 100755 index 8a2380e..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/example_parse.pl +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/perl -w - -# Copyright (C) 2004 by Steve Litt -# Licensed with the GNU General Public License, Version 2 -# ABSOLUTELY NO WARRANTY, USE AT YOUR OWN RISK -# See http://www.gnu.org/licenses/gpl.txt - -use strict; # prevent hard to find errors - -use Node; # Use Node.pm tool - -##################################################################### -# This exercise demonstrates the most elemental use of Node.pm. -# It does nothing more than read README.otl into a Node tree, and -# then print the tree. -# -# Here's the high level logic: -# Set up a Callback object to house the callback routines -# Instantiate and configure a Parser object to parse README.otl -# Instantiate a Walker object to walk the resulting node tree -# Link Callbacks::cbPrintNode() as the Walker's entry callback -# -##################################################################### - -############################################################## -# You need an object to house callback routines. The object can -# be named anything, but it should have facilities to count up -# errors and warnings. Its new() method should always be something -# like what you see below, and there should have getErrors() and -# getWarnings() methods. -# -# The cbPrintNode() method is typical of a simple callback routine. -# All callback routines have exactly three arguments, $self, -# $checker and $level. $self refers to the object containing -# the callback routine, $checker is the node that called this -# callback routine, and $level is the level of that node in the -# hierarchy. Armed with these pieces of information, you can -# perform almost any operation on the current node ($checker). -# -# The callback routines are called by the Parser object during -# parsing. A callback routine can be called upon first entry -# into a node, or it can be called upon reentry into that node -# after processing all that node's children. The latter is -# an excellent way of outputting end tags at the proper time. -############################################################## -package Callbacks; -sub new() - { - my($type) = $_[0]; - my($self) = {}; - bless($self, $type); - $self->{'errors'} = 0; - $self->{'warnings'} = 0; - return($self); - } - -sub getErrors(){return $_[0]->{'errors'};} -sub getWarnings(){return $_[0]->{'warnings'};} - -sub cbPrintNode() - { - my($self, $checker, $level) = @_; - unless (defined($checker)) {return -999;} # don't process undef node - print $level, " ::: "; # print the level - print $checker->getValue(); # print the text of the node - print "\n"; - } - -package Main; - -sub main() - { - #### PARSE FROM FILE README.otl - my $parser = OutlineParser->new(); # instantiate parser - $parser->setCommentChar("#"); # ignore lines starting with # - $parser->fromFile(); # get input from file - my $topNode=$parser->parse("README.otl"); - - #==================================================================== - # The preceding statement parses file README.otl into a node hierarchy - # and assigns the top level node of that hierarchy to $topNode. When - # you run the program you'll notice that the text in $topNode does - # not appear in README.otl, but instead has value - # "Inserted by OutlineParser". - # - # This is a feature, not a bug. In order to accommodate the typical - # case of an outline having several top level items, and yet still - # be able to represent the whole hierarchy as a single top node, - # the OutlineParser object creates a new node with value - # " Inserted by OutlineParser" - # and places all the outline's top level items under that newly - # created node. - # - # If the outline you're working on is guaranteed to have only - # a single top level item, and if you want that to be the top - # level node, you can simply do the following: - # - # $topNode=$topNode->getFirstChild(); - #==================================================================== - - #### INSTANTIATE THE Callbacks OBJECT - my $callbacks = Callbacks->new(); - - #### WALK THE NODE TREE, - #### OUTPUTTING LEVEL AND TEXT - my $walker = Walker->new - ( - $topNode, # start with this node - [\&Callbacks::cbPrintNode, $callbacks] # do this on entry to each node - ); - $walker->walk(); - } - -main(); diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/myapp.cfg b/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/myapp.cfg deleted file mode 100644 index 26f7d89..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/Node/myapp.cfg +++ /dev/null @@ -1,4 +0,0 @@ -#### THIS FILE CONFIGURES example_nodepath.pl. -#### IN ORDER TO USE example_nodepath.pl, -#### CHANGE FOLLOWING PATH TO THE DIRECTORY WHERE YOU PLACED Node.pm #### -nodedir=/path/to/nodemodule diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/fs2otl b/pack/acp/start/vimoutliner/vimoutliner/scripts/fs2otl deleted file mode 100755 index 33ce89e..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/fs2otl +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -echo "$1" -echo "$1" | perl -pe 's/./-/g;' -cd "$1" -find . \ - | sort \ - | perl -pe 's|^\./||; s|[^/]+/|\t|g; s/([^\t])/[_] $1/;' diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2aft.awk b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2aft.awk deleted file mode 100644 index b4ee4a4..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2aft.awk +++ /dev/null @@ -1,284 +0,0 @@ -# *Title: otl2aft -# *Author: Todd Coram (http://maplefish.com/todd) -# *TOC -# -# ~Version 1.3~ -# -# ~This source is hereby placed into the Public Domain.~ -# ~What you do with it is your own business.~ -# ~Just please do no harm.~ -# -#------------------------------------------------------------------------ -# -# * Introduction -# -# Otl2aft converts VimOutliner files into -# [AFT (http://www.maplefish.com/todd/aft.html)] documents. This file -# can be run with nawk, mawk or gawk. -# -# This tool was created upon the request/inspiration of David J Patrick -#(of http://linuxcaffe.ca fame). -# -# You can downloaded the most up to date -# source [here (http://www.maplefish.com/todd/otl2aft.awk)]. -# A PDF version of this file resides -# [here (http://www.maplefish.com/todd/otl2aft.pdf)]. -# -# AEY: Changed all # symbols within regular expressions to \043 -# to avoid problems with # being the comment character. -# -# * Code -# -# In the beginning we want to print out the AFT title and author. -# We expect the otl file to contain two top level headlines. The first -# will be used as the title and the second as the author. -# -# We also print out some control bits and a table of contents placeholder. -# -BEGIN { - VERSION="v1.3 9/04/2009"; - # AEY: Note first line is now for OTL use only; we ignore it here. - getline; # expect title - print "#---SET-CONTROL tableparser=new" - # AEY: Commented out following lines, since this info is now metadata. - #print "*Title: " $0; - #getline; # expect author - #print "*Author: " $0; - #print "\n*TOC\n" -} - -# AEY: > now starts an inline comment. We ignore these. -/^[\t]+>/ { - next; -} - -# AEY: < is now used for metadata. We only act on certain ones. -#/^[\t]+<[ \t]*title:[ \t]*/ { -/^[\t]+</ { - # "Munch" off the first part, which we don't care about - #sub(/^[\t]+<[ \t]*/,""); - # If there's no colon, there won't be a tag, so we don't care. - spec = rightpart($0,"<"); - if (match(spec,/:/)) { - key = leftpart(spec,":"); - value = rightpart(spec,":"); - - if (key == "title") { - print "*Title: " value; - } else if (key == "author") { - print "*Author: " value; - } else if (key == "aft") { - print value; # "aft:" is an all-purpose "aft"-code insertion tag - } - } else { - if (spec == "toc") { - print "*TOC"; - } - } - next; - -} - -# AEY: Any other metadata line starting with < is currently ignored. -#/^[\t]+</ { -# next; -#} - -# AEY: Stop processing after ---END--- line -#/^---END---/ { -/^\043--- END ---/ { - exit; -} - -# AEY: If we find a VIM Outliner checkbox, get rid of it -/\[[_X]\][ ]/ { - gsub(/\[[_X]\][ ]/, ""); -} - -# Scan for one or more tabs followed by a colon (:). This is the outliner's -# markup for ''body text (wrapping)''. -# If we are not nested inside a list (subheaders), then [reset] before doing -# any work. This makes sure we properly terminatel tables and other modes. -# -# Our work here involves simply killing tabs and removing the colon. -# We then continue reading the rest of the file. -# -/^[\t]+:/ { - if (!list_level) reset(); - gsub(/\t/,""); - sub(/[ ]*:/, ""); - # AEY: Need to handle bulleted and numbered lists too, - # but not here. From our point of view, ": * " is now verboten. - #sub(/^[\t ]*\*/,"\t*"); - #sub(/^[\t ]*\043\./,"\t#."); - # End changes - print $0; next; -} - -# AEY: Support for our own style of bulleted and numbered lists (experimental). -/^[\t]+(\*|\043[\.\)])/ { - if (!list_level) reset(); - gsub(/\t/,""); - if (list_level || $0 ~ /[ ]*(\*|\043[\.\)])/) { - handlelist(); - } - print $0; next; -} -# AEY: * now handled like heading, but must add extra space to avoid confusing Aft -#/^[\t]+\*/ { -# gsub("*"," *"); -# # Continue on and handle as normal -#} - -# Scan for ''user defined text block (wrapping)''. If we get this, we -# kill the tabs, remove the |>| and if we discover a crosshatch |#|, we -# start a list. If we are already in a list, we continue the list. Both -# starting and continuing is handled by [handlelist]. -# -# AEY: Removed this -#/^[\t]+>/ { -# if (!list_level) reset(); -# gsub(/\t/,""); -# sub(/>/, ""); -# -# if (list_level || $0 ~ /[ ]*[\043*]/) { -# handlelist(); -# } -# print $0; next; -#} - -# Scan for |;| or |<| which indicate ''preformatted body text'' and -# ''user-defined preformatted text block'' respectively. Both of these -# are non wrapping but we ignore that (for now). We handle lists just like -# the previous scan action. -# -# AEY: Removed < handling -/^[\t]+;/ { # Handle ";" and "<" (preformated text) - if (!list_level) reset(); - gsub(/\t/,""); - sub(/;/, ""); - - if (list_level || $0 ~ /[ ]*\043/) { # Convert "< #" into numbered lists. - handlelist(); - } - print $0; next; -} - -# Scan for a table. This is tricky. We want to cast the Outliner table -# into the AFT ''new table'' format. AFT tables (especially as rendered -# by LaTeX) really want to have captions/headers. We fake that for now -# by using a |-| place holder. This should be fixed! -# -/^[\t]+\|/ { - if (!in_table) reset(); - in_table = 1 - gsub(/\t/,""); - if ($1 ~ /\|\|/) { - print "\t! _ !"; - print "\t!----------!" - } - gsub(/\|\|/,"!"); - gsub(/\|/,"!"); - print "\t"$0 - print "\t!----------!" - next; -} - -# The default scan matches anything not matching the above scan. We simply -# go through and set the known indent level based on the number of tabs -# seen. -# -{ match($0,/^[\t]+/); indent = RLENGTH; if (indent == -1) indent = 0; } - -# Given the iden level set by the default scan (above), we now determine -# what type of AFT output to do. -# -# Indent levels lower than 7 are represented directly -# using AFT sections. -# -# AEY: Added $0 = "*"$0; back in to ensure top-level headings remain headings! -# (This existed in earlier versions, but not in version 1.3.) -#indent < 7 { gsub(/\t/,"*"); print "";} -indent < 7 { gsub(/\t/,"*"); $0 = "*"$0; print "";} - -# Indent levels greater than 6 are represented by AFT bullet lists. -# This is done by first killing some tabs (we don't want to start off -# nesting too deeply), and using the remaining tabs to adjust to the -# appropriate list nesting level. -# -indent > 6 { - gsub(/\t\t\t/, ""); - match($0,/^[\t]+/); - remtabs = substr($0,RSTART,RLENGTH); - text = substr($0,RSTART+RLENGTH); - $0 = remtabs"* "text; - print ""; -} - -# After adjusting indentation, just print out the line. -# -{ print $0 } - -# **handlelist -# Look at the indentation and produce lists accordingly. -# -function handlelist() { - if (!list_level) { - list_indent = length(indent) + 1; - } - list_level = list_indent - length(indent); - - if ($0 ~ /[ ]*\043/) { # Convert " #" into numbered lists. - for (i=0; i < list_level; i++) - printf("\t"); - gsub(/[ ]*\\043/,"#."); - } else if ($0 ~ /[ ]*\*/) { # Convert " *" into bullet lists. - for (i=0; i < list_level; i++) - printf("\t"); - gsub(/[ ]*\*/,"*"); - } else if (list_level) { - for (i=0; i < list_level; i++) - printf("\t"); - } -} - -# **reset -# Reset various parameters to get us out of various modes. -# -function reset() { - if (list_level) { - print " "; - list_level = 0; - } - if (in_table) { - print "\t!----------!\n" - in_table = 0; - } -} - -# AEY: "Trim" function, added for sanity's sake. -function trim(str) { - sub(/^[ \t]*/,"",str); - sub(/[ \t]*$/,"",str); - return str; -} - -# AEY: Get everything to left of specified regex, and trim it too. -function leftpart(str,regex) { - if (match(str,regex)) { - return trim(substr(str,1,RSTART-1)); - } else { - return ""; - } -} - -# AEY: Get everything to right of specified regex, and trim it too. -function rightpart(str,regex) { - if (match(str,regex)) { - return trim(substr(str,RSTART+RLENGTH)); - } else { - return ""; - } -} - -# That's all folks! diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2aft.pdf b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2aft.pdf deleted file mode 100644 index 8164a6b6c985fe485d54720b7a82e082f274458f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82163 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 W3)W+neV$S@MaG_i14oX_^ZXwz)~25T diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2docbook.pl b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2docbook.pl deleted file mode 100755 index ac7b698..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2docbook.pl +++ /dev/null @@ -1,270 +0,0 @@ -#!/usr/bin/perl - -use strict; -use XML::Writer; -use vars qw($writer $section_has_contents $VERSION); - -use constant DEBUG => 0; - -$VERSION = '2.0'; - -sub debug { - if ( DEBUG ) - { - print STDERR @_; - } -} - -sub start_docbook { - $writer = XML::Writer->new(DATA_MODE => 1, - DATA_INDENT => 1); - - debug(' 'x$writer->getDataIndent(), "starting new docbook\n"); - - $writer->xmlDecl(); - -# my $system = '/usr/share/sgml/docbook/xml-dtd-4.1/docbookx.dtd'; - my $system = 'http://www.oasis-open.org/docbook/xml/4.0/docbookx.dtd'; - - $writer->doctype('article', - '-//OASIS//DTD DocBook XML V4.1//EN', - $system); -} - -sub start_article { - my $id = shift; - - debug(' 'x$writer->getDataIndent(), "starting new article\n"); - - my @attributes = ( - 'class' => 'whitepaper', - ); - - if ( $id ) - { - push @attributes, ( 'id' => $id ); - } - - $writer->startTag('article', @attributes); -} - -sub start_section { - my $title = shift; - - debug(' 'x$writer->getDataIndent(), "starting new section\n"); - - $writer->startTag('section'); - - $section_has_contents = 0; - - if ( $title ) - { - $writer->dataElement('title', $title); - } -} - -sub start_list { - debug(' 'x$writer->getDataIndent(), "starting new list\n"); - - $writer->startTag('itemizedlist'); -} - -sub append_list_item { - my $text = shift; - - debug(' 'x$writer->getDataIndent(), "starting new listitem\n"); - - $writer->startTag('listitem'); - - $writer->dataElement('para', $text); - - $writer->endTag('listitem'); -} - -sub end_list { - $writer->endTag('itemizedlist'); - - debug(' 'x$writer->getDataIndent(), "ending list\n"); -} - -sub append_code { - my $code = shift; - - debug(' 'x$writer->getDataIndent(), "starting new programlisting\n"); - - $section_has_contents = 1; - - $writer->dataElement('programlisting', $code, role=>'C'); -} - -sub append_para { - my $text = shift; - - debug(' 'x$writer->getDataIndent(), "starting new para\n"); - - $section_has_contents = 1; - - $writer->dataElement('para', $text); -} - -sub end_section { - if ( ! $section_has_contents ) - { - $writer->emptyTag('para'); - $section_has_contents = 1; - } - - $writer->endTag('section'); - - debug(' 'x$writer->getDataIndent(), "ending section\n"); -} - -sub end_article { - $writer->endTag('article'); - - debug(' 'x$writer->getDataIndent(), "ending article\n"); -} - -sub end_docbook { - $writer->end(); - - debug(' 'x$writer->getDataIndent(), "ending docbook\n"); -} - -#################################################### - -start_docbook(); -start_article(); - -my $section_level = 0; -my $line; -my $para = ''; -my $list_mode = 0; -my $code_mode = 0; -my $first_line = 1; - -sub list_done { - if ( $list_mode ) { - end_list(); - $list_mode = 0; - } -} - -sub para_done { - if ( $para ) - { - chomp $para; - if ( $code_mode ) - { - append_code($para); - $code_mode = 0; - } - elsif ( $list_mode ) - { - append_list_item($para); - } - else - { - append_para($para); - } - } - $para = ''; -} - -while ( defined ($line = <>) ) -{ - if ( $first_line and $line =~ /^-\*-/ ) - { - next; - } - $first_line = 0; - - if ( $line =~ /^\t*\* (.*)/ ) - { - para_done(); - - $para = $1; - - if ( ! $list_mode ) - { - start_list(); - $list_mode = 1; - } - - next; - } - - if ( $line =~ /^\t*[^\t: ]/ ) - { - para_done(); - list_done(); - } - - if ( $line =~ /^(\t*)([^\t\n: ].*)/ ) - { - my $title = $2; - my $new_section_level = length($1) + 1; - - para_done(); - list_done(); - - for ( my $i = 0 ; $section_level - $new_section_level >= $i ; $i++ ) - { - end_section(); - } - - chomp $title; - start_section($title); - - $section_level = $new_section_level; - next; - } - -# Code mode not supported yet -# if ( ! $list_mode and $line =~ /^\s+/ ) -# { -# debug("enabling code mode\n"); -# $code_mode = 1; -# } - - $line =~ s/^\t*(\: ?| )//; - if ($line =~ /^$/) { - para_done(); - list_done(); - next; - } - $para .= $line; -} -para_done(); - -for ( my $i = 0 ; $section_level > $i ; $i++ ) -{ - end_section(); -} - -end_article(); -end_docbook(); - -__END__ - -=head1 NAME - -outline2dockbook - Generate DocBook XML from VimOutliner outline - -=head1 SYNOPSIS - -outline2docbook < input > output - -=head1 DESCRIPTION - -B<outline2docbook> reads an VimOutliner outline-mode type text file on -standard input and outputs DocBook XML on standard output. - -The original version was written by Thomas R. Fullhart to convert from Emacs -outline mode. It is available at -http://genetikayos.com/code/repos/outline2docbook/distribution/. - -This program uses the B<XML::Writer> perl module, which is available -on B<CPAN>. - -=cut diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2html.py b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2html.py deleted file mode 100755 index 61be3cf..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2html.py +++ /dev/null @@ -1,1111 +0,0 @@ -#!/usr/bin/python2 -# otl2html.py -# convert a tab-formatted outline from VIM to HTML -# -# Copyright 2001 Noel Henson All rights reserved -# -# ALPHA VERSION!!! - -########################################################################### -# Basic function -# -# This program accepts text outline files and converts them -# to HTML. The outline levels are indicated by tabs. A line with no -# tabs is assumed to be part of the highest outline level. -# -# 10 outline levels are supported. These loosely correspond to the -# HTML H1 through H9 tags. Alphabetic, numeric and bullet formats -# are also supported. -# -# CSS support has been added. -# - -########################################################################### -# include whatever mdules we need - -import sys -import re -import os -import time - -########################################################################### -# global variables - -formatMode = "indent" -copyright = "" -level = 0 -div = 0 -silentdiv = 0 -slides = 0 -hideComments = 0 -showTitle = 1 -inputFile = "" -outline = [] -flatoutline = [] -inBodyText = 0 # 0: no, 1: text, 2: preformatted text, 3: table -styleSheet = "nnnnnn.css" -inlineStyle = 0 - -########################################################################### -# function definitions - -# usage -# print the simplest form of help -# input: none -# output: simple command usage is printed on the console - - -def showUsage(): - print """ - Usage: - otl2html.py [options] inputfile > outputfile - Options - -p Presentation: slide show output for use with - HtmlSlides. - -D First-level is divisions (<div> </div>) for making - pretty web pages. - -s sheet Use the specified style sheet with a link. This is the - default. - -S sheet Include the specified style sheet in-line the - output. For encapsulated style. - -T The first line is not the title. Treat it as - outline data - -c comments (line with [ as the first non-whitespace - character. Ending with ] is optional. - -C copyright Override the internal copyright notice with the - one supplied in the quoted string following this - flag. Single or double quotes can be used. - -H Show the file syntax help. - output is on STDOUT - Note: if neither -s or -S are specified, otl2html.py will default - to -s. It will try to use the css file 'nnnnnn.css' if it - exists. If it does not exist, it will be created automatically. - """ - - -def showSyntax(): - print """ - Syntax - Syntax is Vim Outliner's normal syntax. The following are supported: - - Text - : Body text marker. This text will wrap in the output. - ; Preformmated text. This text will will not wrap. - - Tables - || Table header line. - | Table and table columns. Example: - || Name | Age | Animal | - | Kirby | 9 | Dog | - | Sparky | 1 | Bird | - | Sophia | 8 | Cat | - This will cause an item to be left-justified. - | whatever | - This will cause an item to be right-justified. - | whatever | - This will cause an item to be centered. - | whatever | - This will cause an item to be default aligned. - | whatever | - - Character Styles - ** Bold. Example: **Bold Text** - // Italic. Example: //Italic Text// - +++ Highlight. Example: +++Highlight Text+++ - --- Strikeout. Example: ---Strikeout Text--- - Insane ---+++//**Wow! This is insane!**//+++--- - Just remember to keep it all on one line. - Horizontal Rule - ---------------------------------------- (40 dashes). - Copyright - (c) or (C) Converts to a standard copyright symbol. - - Including Images (for web pages) - [imagename] Examples: - [logo.gif] [photo.jpg] [car.png] - [http://i.a.cnn.net/cnn/.element/img/1.1/logo/logl.gif] - or from a database: - [http://www.lab.com/php/image.php?id=4] - - Including links (for web pages) - [link text-or-image] Examples: - [about.html About] [http://www.cnn.com CNN] - or with an image: - [http://www.ted.com [http://www.ted.com/logo.png]] - Links starting with a '+' will be opened in a new - window. Eg. [+about.html About] - - Including external files - !filename! Examples: - !file.txt! - - Including external outlines (first line is parent) - !!filename!! Examples: - !!menu.otl!! - - Including output from executing external programs - !!!program args!!! Examples: - !!!date +%Y%m%d!!! - - Note: - When using -D, the top-level headings become divisions (<div>) - and will be created using a class of the heading name. Spaces - are not allowed. If a top-level heading begins with '_', it - will not be shown but the division name will be the same as - without the '_'. Example: _Menu will have a division name of - Menu and will not be shown. - """ - - -# getArgs -# Check for input arguments and set the necessary switches -# input: none -# output: possible console output for help, switch variables may be set -def getArgs(): - global inputFile, debug, formatMode, slides, hideComments, copyright, \ - styleSheet, inlineStyle, div, showTitle - if (len(sys.argv) == 1): - showUsage() - sys.exit()() - else: - for i in range(len(sys.argv)): - if (i != 0): - if (sys.argv[i] == "-d"): - debug = 1 # test for debug flag - elif (sys.argv[i] == "-?"): # test for help flag - showUsage() # show the help - sys.exit() # exit - elif (sys.argv[i] == "-p"): # test for the slides flag - slides = 1 # set the slides flag - elif (sys.argv[i] == "-D"): # test for the divisions flag - div = 1 # set the divisions flag - elif (sys.argv[i] == "-T"): # test for the no-title flag - showTitle = 0 # clear the show-title flag - elif (sys.argv[i] == "-c"): # test for the comments flag - hideComments = 1 # set the comments flag - elif (sys.argv[i] == "-C"): # test for the copyright flag - copyright = sys.argv[i + 1] # get the copyright - i = i + 1 # increment the pointer - elif (sys.argv[i] == "-s"): # test for the style sheet flag - styleSheet = sys.argv[i + 1] # get the style sheet name - formatMode = "indent" # set the format - i = i + 1 # increment the pointer - elif (sys.argv[i] == "-S"): # test for the style sheet flag - styleSheet = sys.argv[i + 1] # get the style sheet name - formatMode = "indent" # set the format - inlineStyle = 1 - i = i + 1 # increment the pointer - elif (sys.argv[i] == "--help"): - showUsage() - sys.exit() - elif (sys.argv[i] == "-h"): - showUsage() - sys.exit() - elif (sys.argv[i] == "-H"): - showSyntax() - sys.exit() - elif (sys.argv[i][0] == "-"): - print "Error! Unknown option. Aborting" - sys.exit() - else: # get the input file name - inputFile = sys.argv[i] - - -# getLineLevel -# get the level of the current line (count the number of tabs) -# input: linein - a single line that may or may not have tabs at the beginning -# output: returns a number 1 is the lowest -def getLineLevel(linein): - strstart = linein.lstrip() # find the start of text in line - x = linein.find(strstart) # find the text index in the line - n = linein.count("\t", 0, x) # count the tabs - return(n + 1) # return the count + 1 (for level) - - -# getLineTextLevel -# get the level of the current line (count the number of tabs) -# input: linein - a single line that may or may not have tabs at the -# beginning -# output: returns a number 1 is the lowest -def getLineTextLevel(linein): - strstart = linein.lstrip() # find the start of text in line - x = linein.find(strstart) # find the text index in the line - n = linein.count("\t", 0, x) # count the tabs - n = n + linein.count(" ", 0, x) # count the spaces - return(n + 1) # return the count + 1 (for level) - - -# colonStrip(line) -# stip a leading ':', if it exists -# input: line -# output: returns a string with a stipped ':' -def colonStrip(line): - if (line[0] == ":"): - return line[1:].lstrip() - else: - return line - - -# semicolonStrip(line) -# stip a leading ';', if it exists -# input: line -# output: returns a string with a stipped ';' -def semicolonStrip(line): - if (line[0] == ";"): - return line[1:] - else: - return line - - -# dashStrip(line) -# stip a leading '-', if it exists -# input: line -# output: returns a string with a stipped '-' -def dashStrip(line): - if (line[0] == "-"): - return line[1:] - else: - return line - - -# pipeStrip(line) -# stip a leading '|', if it exists -# input: line -# output: returns a string with a stipped '|' -def pipeStrip(line): - if (line[0] == "|"): - return line[1:] - else: - return line - - -# plusStrip(line) -# stip a leading '+', if it exists -# input: line -# output: returns a string with a stipped '+' -def plusStrip(line): - if (line[0] == "+"): - return line[1:] - else: - return line - - -# handleBodyText -# print body text lines with a class indicating level, if style sheets -# are being used. otherwise print just <p> -# input: linein - a single line that may or may not have tabs at the beginning -# output: through standard out -def handleBodyText(linein, lineLevel): - global inBodyText - if (inBodyText == 2): - print "</pre>" - if (inBodyText == 3): - print "</table>" - print "<p", - if (styleSheet != ""): - print " class=\"P" + str(lineLevel) + "\"", - inBodyText = 1 - print ">" + colonStrip(linein.strip()), - - -# handlePreformattedText -# print preformatted text lines with a class indicating level, if style sheets -# are being used. otherwise print just <pre> -# input: linein - a single line that may or may not have tabs at the beginning -# output: through standard out -def handlePreformattedText(linein, lineLevel): - global inBodyText - if (inBodyText == 1): - print "</p>" - if (inBodyText == 3): - print "</table>" - print "<pre", - if (styleSheet != ""): - print " class=\"PRE" + str(lineLevel) + "\"", - inBodyText = 2 - print ">" + semicolonStrip(linein.strip()), - - -# isAlignRight -# return flag -# input: coldata, a string -def isAlignRight(coldata): - l = len(coldata) - if (coldata[0:2] == " ") and (coldata[l - 2:l] != " "): - return 1 - else: - return 0 - - -# isAlignLeft -# return flag -# input: coldata, a string -def isAlignLeft(coldata): - l = len(coldata) - if (coldata[0:2] != " ") and (coldata[l - 2:l] == " "): - return 1 - else: - return 0 - - -# isAlignCenter -# return flag -# input: coldata, a string -def isAlignCenter(coldata): - l = len(coldata) - if (coldata[0:2] == " ") and (coldata[l - 2:l] == " "): - return 1 - else: - return 0 - - -# getColumnAlignment(string) -# return string -# input: coldata -# output: -# <td align="left"> or <td align="right"> or <td align="center"> or <td> -def getColumnAlignment(coldata): - if isAlignCenter(coldata): - return '<td align="center">' - if isAlignRight(coldata): - return '<td align="right">' - if isAlignLeft(coldata): - return '<td align="left">' - return '<td>' - - -# handleTableColumns -# return the souce for a row's columns -# input: linein - a single line that may or may not have tabs at the beginning -# output: string with the columns' source -def handleTableColumns(linein, lineLevel): - out = "" - coldata = linein.strip() - coldata = coldata.split("|") - for i in range(1, len(coldata) - 1): - out += getColumnAlignment(coldata[i]) - out += coldata[i].strip() + '</td>' - return out - - -# handleTableHeaders -# return the souce for a row's headers -# input: linein - a single line that may or may not have tabs at the beginning -# output: string with the columns' source -def handleTableHeaders(linein, lineLevel): - out = "" - coldata = linein.strip() - coldata = coldata.split("|") - for i in range(2, len(coldata) - 1): - out += getColumnAlignment(coldata[i]) - out += coldata[i].strip() + '</td>' - out = out.replace('<td', '<th') - out = out.replace('</td', '</th') - return out - - -# handleTableRow -# print a table row -# input: linein - a single line that may or may not have tabs at the beginning -# output: out -def handleTableRow(linein, lineLevel): - out = "<tr>" - if (lineLevel == linein.find("|| ") + 1): - out += handleTableHeaders(linein, lineLevel) - else: - out += handleTableColumns(linein, lineLevel) - out += "</tr>" - return out - - -# handleTable -# print a table, starting with a <TABLE> tag if necessary -# input: linein - a single line that may or may not have tabs at the beginning -# output: through standard out -def handleTable(linein, lineLevel): - global inBodyText - if (inBodyText == 1): - print "</p>" - if (inBodyText == 2): - print "</pre>" - if (inBodyText != 3): - print "<table class=\"TAB" + str(lineLevel) + "\">" - inBodyText = 3 - print handleTableRow(linein, lineLevel), - - -# linkOrImage -# if there is a link to an image or another page, process it -# input: line -# output: modified line -def linkOrImage(line): - line = re.sub('\[(\S+?)\]', '<img src="\\1" alt="\\1">', line) - line = re.sub('\[(\S+)\s(.*?)\]', '<a href="\\1">\\2</a>', line) - line = re.sub('(<a href=")\+(.*)"\>', '\\1\\2" target=_new>', line) - line = line.replace('<img src="X" alt="X">', '[X]') - line = line.replace('<img src="_" alt="_">', '[_]') - return line - - -# tabs -# return a string with 'count' tabs -# input: count -# output: string of tabs -def tabs(count): - out = "" - if (count == 0): - return "" - for i in range(0, count - 1): - out = out + "\t" - return out - - -# includeFile -# include the specified file, if it exists -# input: line and lineLevel -# output: line is replaced by the contents of the file -def includeFile(line, lineLevel): - filename = re.sub('!(\S+?)!', '\\1', line.strip()) - incfile = open(filename, "r") - linein = incfile.readline() - while linein != "": - linein = re.sub('^', tabs(lineLevel), linein) - processLine(linein) - linein = incfile.readline() - incfile.close() - return - - -# includeOutline -# include the specified file, if it exists -# input: line and lineLevel -# output: line is replaced by the contents of the file -def includeOutline(line, lineLevel): - filename = re.sub('!!(\S+?)!!', '\\1', line.strip()) - incfile = open(filename, "r") - linein = incfile.readline() - linein = re.sub('^', tabs(lineLevel), linein) - processLine(linein) - linein = incfile.readline() - while linein != "": - linein = re.sub('^', tabs(lineLevel + 1), linein) - processLine(linein) - linein = incfile.readline() - incfile.close() - return - - -# execProgram -# execute the specified program -# input: line -# output: program specified is replaced by program output -def execProgram(line): - program = re.sub('.*!!!(.*)!!!.*', '\\1', line.strip()) - child = os.popen(program) - out = child.read() - err = child.close() - out = re.sub('!!!(.*)!!!', out, line) - processLine(out) - if err: - raise RuntimeError('%s failed w/ exit code %d' % (program, err)) - return - - -# divName -# create a name for a division -# input: line -# output: division name -def divName(line): - global silentdiv - line = line.strip() - if (line[0] == '_'): - silentdiv = 1 - line = line[1:] - line = line.replace(' ', '_') - return'<div class="' + line + '">' - - -# getTitleText(line) -# extract some meaningful text to make the document title from the line -# input: line -# output: modified line -def getTitleText(line): - out = re.sub('.*#(.*)#.*', '\\1', line) - out = re.sub('<.*>', '', out) -# if (out != ""): out = re.sub('\"(.*?)\"', '\\1', line) - return(out) - - -# stripTitleText(line) -# strip the title text if it is enclosed in double-quotes -# input: line -# output: modified line -def stripTitleText(line): - out = re.sub('#\W*.*#', '', line) - return(out) - - -# beautifyLine(line) -# do some optional, simple beautification of the text in a line -# input: line -# output: modified line -def beautifyLine(line): - if (line.strip() == "-" * 40): - return "<br><hr><br>" - - out = line - line = "" - - while (line != out): - line = out - # out = replace(out, '---', '<strike>', 1) - if (line[0].lstrip() != ";"): - out = re.sub('\-\-\-(.*?)\-\-\-', '<strike>\\1</strike>', out) - out = linkOrImage(out) - # out = replace(out, '**', '<strong>', 1) - out = re.sub('\*\*(.*?)\*\*', '<strong>\\1</strong>', out) - # out = replace(out, '//', '<i>', 1) - out = re.sub('\/\/(.*?)\/\/', '<i>\\1</i>', out) - # out = replace(out, '+++', '<code>', 1) - out = re.sub('\+\+\+(.*?)\+\+\+', '<code>\\1</code>', out) - out = re.sub('\(c\)', '©', out) - out = re.sub('\(C\)', '©', out) - return out - - -# closeLevels -# generate the number of </ul> or </ol> tags necessary to proplerly finish -# input: format - a string indicating the mode to use for formatting -# level - an integer between 1 and 9 that show the current level -# (not to be confused with the level of the current line) -# output: through standard out -def closeLevels(): - global level, formatMode - while (level > 0): - if (formatMode == "bullets"): - print "</ul>" - if (formatMode == "alpha") or (formatMode == "numeric") or \ - (formatMode == "roman") or (formatMode == "indent"): - print "</ol>" - - level = level - 1 - - -# processLine -# process a single line -# input: linein - a single line that may or may not have tabs at the beginning -# format - a string indicating the mode to use for formatting -# level - an integer between 1 and 9 that show the current level -# (not to be confused with the level of the current line) -# output: through standard out -def processLine(linein): - global level, formatMode, slides, hideComments, inBodyText, styleSheet, \ - inlineStyle, div, silentdiv - if (linein.lstrip() == ""): - return - linein = beautifyLine(linein) - lineLevel = getLineLevel(linein) - if ((hideComments == 0) or (lineLevel != linein.find("[") + 1)): - - if (lineLevel > level): # increasing depth - while (lineLevel > level): - if (formatMode == "indent" or formatMode == "simple"): - if (inBodyText == 1): - print"</p>" - inBodyText = 0 - elif (inBodyText == 2): - print"</pre>" - inBodyText = 0 - elif (inBodyText == 3): - print"</table>" - inBodyText = 0 - if not (div == 1 and lineLevel == 1): - print "<ol>" - else: - sys.exit("Error! Unknown formatMode type") - level = level + 1 - - elif (lineLevel < level): # decreasing depth - while (lineLevel < level): - if (inBodyText == 1): - print"</p>" - inBodyText = 0 - elif (inBodyText == 2): - print"</pre>" - inBodyText = 0 - elif (inBodyText == 3): - print"</table>" - inBodyText = 0 - print "</ol>" - level = level - 1 - if (div == 1 and level == 1): - if (silentdiv == 0): - print'</ol>' - else: - silentdiv = 0 - print'</div>' - - else: - print # same depth - if (div == 1 and lineLevel == 1): - if (lineLevel != linein.find("!") + 1): - print divName(linein) - if (silentdiv == 0): - print "<ol>" - - if (slides == 0): - if (lineLevel == linein.find(" ") + 1) or \ - (lineLevel == linein.find(":") + 1): - if (inBodyText != 1): - handleBodyText(linein, lineLevel) - elif (colonStrip(linein.strip()) == ""): - print "</p>" - handleBodyText(linein, lineLevel) - else: - print colonStrip(linein.strip()), - elif (lineLevel == linein.find(";") + 1): - if (inBodyText != 2): - handlePreformattedText(linein, lineLevel) - elif (semicolonStrip(linein.strip()) == ""): - print "</pre>" - handlePreformattedText(linein, lineLevel) - else: - print semicolonStrip(linein.strip()), - elif (lineLevel == linein.find("|") + 1): - if (inBodyText != 3): - handleTable(linein, lineLevel) - elif (pipeStrip(linein.strip()) == ""): - print "</table>" - handleTable(linein, lineLevel) - else: - print handleTableRow(linein, lineLevel), - elif (lineLevel == linein.find("!!!") + 1): - execProgram(linein) - elif (lineLevel == linein.find("!!") + 1): - includeOutline(linein, lineLevel) - elif (lineLevel == linein.find("!") + 1): - includeFile(linein, lineLevel) - else: - if (inBodyText == 1): - print"</p>" - inBodyText = 0 - elif (inBodyText == 2): - print"</pre>" - inBodyText = 0 - elif (inBodyText == 3): - print"</table>" - inBodyText = 0 - if (silentdiv == 0): - print "<li", - if (styleSheet != ""): - if (lineLevel == linein.find("- ") + 1): - print " class=\"LB" + str(lineLevel) + "\"", - print ">" + \ - dashStrip(linein.strip()), - elif (lineLevel == linein.find("+ ") + 1): - print " class=\"LN" + str(lineLevel) + "\"", - print ">" + \ - plusStrip(linein.strip()), - else: - print " class=\"L" + str(lineLevel) + "\"", - print ">" + linein.strip(), - else: - silentdiv = 0 - else: - if (lineLevel == 1): - if (linein[0] == " "): - if (inBodyText == 0): - handleBodyText(linein, lineLevel) - else: - print linein.strip(), - else: - print "<address>" - print linein.strip(), - print "</address>\n" - else: - if (lineLevel == linein.find(" ") + 1) or \ - (lineLevel == linein.find(":") + 1): - if (inBodyText == 0): - handleBodyText(linein, lineLevel) - else: - print linein.strip(), - else: - if (inBodyText == 1): - print"</p>" - inBodyText = 0 - print "<li", - if (styleSheet != ""): - print " class=\"LI.L" + str(lineLevel) + "\"", - print ">" + linein.strip(), - - -# flatten -# Flatten a subsection of an outline. The index passed is the -# outline section title. All sublevels that are only one level -# deeper are indcluded in the current subsection. Then there is -# a recursion for those items listed in the subsection. Exits -# when the next line to be processed is of the same or lower -# outline level. (lower means shallower) -# input: idx - the index into the outline. The indexed line is the title. -# output: adds reformatted lines to flatoutline[] -def flatten(idx): - if (outline[idx] == ""): - return - if (len(outline) <= idx): - return - titleline = outline[idx] - titlelevel = getLineLevel(titleline) - if (getLineLevel(outline[idx + 1]) > titlelevel): - if (titleline[titlelevel - 1] != " "): - flatoutline.append(titleline.lstrip()) - exitflag = 0 - while (exitflag == 0): - if (idx < len(outline) - 1): - idx = idx + 1 - currlevel = getLineLevel(outline[idx]) - if (currlevel == titlelevel + 1): - if (currlevel == outline[idx].find(" ") + 1): - flatoutline.append("\t " + outline[idx].lstrip()) - else: - flatoutline.append("\t" + outline[idx].lstrip()) - elif (currlevel <= titlelevel): - exitflag = 1 - else: - exitflag = 1 - # level = titlelevel # FIXME level assigned but never used - return - - -def createCSS(): - global styleSheet - output = """ /* copyright notice and filename */ - body { - font-family: helvetica, arial, sans-serif; - font-size: 10pt; - } - /* title at the top of the page */ - H1 { - font-family: helvetica, arial, sans-serif; - font-size: 14pt; - font-weight: bold; - text-align: center; - color: black; - background-color: #ddddee; - padding-top: 20px; - padding-bottom: 20px; - } - H2 { - font-family: helvetica, arial, sans-serif; - font-size: 12pt; - font-weight: bold; - text-align: left; - color: black; - } - H3 { - font-family: helvetica, arial, sans-serif; - font-size: 12pt; - text-align: left; - color: black; - } - H4 { - font-family: helvetica, arial, sans-serif; - font-size: 12pt; - text-align: left; - color: black; - } - H5 { - font-family: helvetica, arial, sans-serif; - font-size: 10pt; - text-align: left; - color: black; - } - /* outline level spacing */ - OL { - margin-left: 1.0em; - padding-left: 0; - padding-bottom: 8pt; - } - /* global heading settings */ - LI { - font-family: helvetica, arial, sans-serif; - color: black; - font-weight: normal; - list-style: lower-alpha; - padding-top: 4px; - } - /* level 1 heading overrides */ - LI.L1 { - font-size: 12pt; - font-weight: bold; - list-style: none; - } - /* level 2 heading overrides */ - LI.L2 { - font-size: 10pt; - font-weight: bold; - list-style: none; - } - /* level 3 heading overrides */ - LI.L3 { - font-size: 10pt; - list-style: none; - } - /* level 4 heading overrides */ - LI.L4 { - font-size: 10pt; - list-style: none; - } - /* level 5 heading overrides */ - LI.L5 { - font-size: 10pt; - list-style: none; - } - /* level 6 heading overrides */ - LI.L6 { - font-size: 10pt; - list-style: none; - } - /* level 7 heading overrides */ - LI.L7 { - font-size: 10pt; - list-style: none; - } - /* level 1 bullet heading overrides */ - LI.LB1 { - font-size: 12pt; - font-weight: bold; - list-style: disc; - } - /* level 2 bullet heading overrides */ - LI.LB2 { - font-size: 10pt; - font-weight: bold; - list-style: disc; - } - /* level 3 bullet heading overrides */ - LI.LB3 { - font-size: 10pt; - list-style: disc; - } - /* level 4 bullet heading overrides */ - LI.LB4 { - font-size: 10pt; - list-style: disc; - } - /* level 5 bullet heading overrides */ - LI.LB5 { - font-size: 10pt; - list-style: disc; - } - /* level 6 bullet heading overrides */ - LI.LB6 { - font-size: 10pt; - list-style: disc; - } - /* level 7 bullet heading overrides */ - LI.LB7 { - font-size: 10pt; - list-style: disc; - } - /* level 1 numeric heading overrides */ - LI.LN1 { - font-size: 12pt; - font-weight: bold; - list-style: decimal; - } - /* level 2 numeric heading overrides */ - LI.LN2 { - font-size: 10pt; - font-weight: bold; - list-style: decimal; - } - /* level 3 numeric heading overrides */ - LI.LN3 { - font-size: 10pt; - list-style: decimal; - } - /* level 4 numeric heading overrides */ - LI.LN4 { - font-size: 10pt; - list-style: decimal; - } - /* level 5 numeric heading overrides */ - LI.LN5 { - font-size: 10pt; - list-style: decimal; - } - /* level 6 numeric heading overrides */ - LI.LN6 { - font-size: 10pt; - list-style: decimal; - } - /* level 7 numeric heading overrides */ - LI.LN7 { - font-size: 10pt; - list-style: decimal; - } - /* body text */ - P { - font-family: helvetica, arial, sans-serif; - font-size: 9pt; - font-weight: normal; - color: darkgreen; - } - /* preformatted text */ - PRE { - font-family: fixed, monospace; - font-size: 9pt; - font-weight: normal; - color: darkblue; - } - - TABLE { - margin-top: 1em; - font-family: helvetica, arial, sans-serif; - font-size: 12pt; - font-weight: normal; - border-collapse: collapse; - } - - TH { - border: 1px solid black; - padding: 0.5em; - background-color: #eeddee; - } - - TD { - border: 1px solid black; - padding: 0.5em; - background-color: #ddeeee; - } - - CODE { - background-color: yellow; - } - - TABLE.TAB1 { - margin-top: 1em; - font-family: helvetica, arial, sans-serif; - font-size: 12pt; - font-weight: normal; - border-collapse: collapse; - } - TABLE.TAB2 { - margin-top: 1em; - font-family: helvetica, arial, sans-serif; - font-size: 11pt; - font-weight: normal; - border-collapse: collapse; - } - TABLE.TAB3 { - margin-top: 1em; - font-family: helvetica, arial, sans-serif; - font-size: 10pt; - font-weight: normal; - border-collapse: collapse; - } - TABLE.TAB4 { - margin-top: 1em; - font-family: helvetica, arial, sans-serif; - font-size: 10pt; - font-weight: normal; - border-collapse: collapse; - } - TABLE.TAB5 { - margin-top: 1em; - font-family: helvetica, arial, sans-serif; - font-size: 10pt; - font-weight: normal; - border-collapse: collapse; - } - TABLE.TAB6 { - margin-top: 1em; - font-family: helvetica, arial, sans-serif; - font-size: 10pt; - font-weight: normal; - border-collapse: collapse; - """ - file = open(styleSheet, "w") - file.write(output) - - -def printHeader(linein): - global styleSheet, inlineStyle - print """<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"s - \"http://www.w3.org/TR/html4/strict.dtd\"> - <html><head><title>""" + getTitleText(linein) + "" - try: - file = open(styleSheet, "r") - except IOError: - createCSS() - file = open(styleSheet, "r") - if (styleSheet != "" and inlineStyle == 0): - print "" - if (styleSheet != "" and inlineStyle == 1): - print "" - print "" - - -def printFirstLine(linein): - print '''

-

%s

-
-
''' % stripTitleText(linein.strip()) - - -def printFooter(): - global slides, div - print "
" - if (slides == 0 and div == 0): - print "
" - print "
" - print copyright - print "
" - print inputFile + "   " + \ - time.strftime("%Y/%m/%d %H:%M", time.localtime(time.time())) - print "
" - print "" - - -def main(): - global showTitle - getArgs() - file = open(inputFile, "r") - if (slides == 0): - firstLine = beautifyLine(file.readline().strip()) - printHeader(firstLine) - if (showTitle == 1): - printFirstLine(firstLine) - linein = beautifyLine(file.readline().strip()) - else: - linein = firstLine - while linein != "": - processLine(linein) - linein = file.readline() - closeLevels() - else: - linein = beautifyLine(file.readline().strip()) - outline.append(linein) - linein = file.readline().strip() - while linein != "": - outline.append("\t" + linein) - linein = file.readline().rstrip() - for i in range(0, len(outline) - 1): - flatten(i) - printHeader(flatoutline[0]) - for i in range(0, len(flatoutline)): - processLine(flatoutline[i]) - - printFooter() - file.close() - - -if __name__ == "__main__": - main() diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2html_autonumbered.css b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2html_autonumbered.css deleted file mode 100644 index ddc8830..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2html_autonumbered.css +++ /dev/null @@ -1,269 +0,0 @@ - /* copyright notice and filename */ -body { - font-family: helvetica,arial,sans-serif; - font-size: 10pt; -} - /* title at the top of the page */ -H1 { - font-family: helvetica,arial,sans-serif; - font-size: 14pt; - font-weight: bold; - text-align: center; - color: black; - background-color: #ddddee; - padding-top: 20px; - padding-bottom: 20px; -} -H2 { - font-family: helvetica,arial,sans-serif; - font-size: 12pt; - font-weight: bold; - text-align: left; - color: black; -} -H3 { - font-family: helvetica,arial,sans-serif; - font-size: 12pt; - text-align: left; - color: black; -} -H4 { - font-family: helvetica,arial,sans-serif; - font-size: 12pt; - text-align: left; - color: black; -} -H5 { - font-family: helvetica,arial,sans-serif; - font-size: 10pt; - text-align: left; - color: black; -} - /* outline level spacing */ -OL { - padding-bottom: 8pt; - counter-reset: section; - margin-left: 1.0em; - padding-left:0 ; -} -OL LI { counter-increment: section; } -OL LI:before { content: counters(section, ".") ". "; } - /* global heading settings */ -LI { - font-family: helvetica,arial,sans-serif; - color: black; - font-weight: normal; - list-style: lower-alpha; - padding-top: 4px; -} - /* level 1 heading overrides */ -LI.L1 { - font-size: 12pt; - font-weight: bold; - list-style: none; -} - /* level 2 heading overrides */ -LI.L2 { - font-size: 10pt; - font-weight: bold; - list-style: none; -} - /* level 3 heading overrides */ -LI.L3 { - font-size: 10pt; - list-style: none; -} - /* level 4 heading overrides */ -LI.L4 { - font-size: 10pt; - list-style: none; -} - /* level 5 heading overrides */ -LI.L5 { - font-size: 10pt; - list-style: none; -} - /* level 6 heading overrides */ -LI.L6 { - font-size: 10pt; - list-style: none; -} - /* level 7 heading overrides */ -LI.L7 { - font-size: 10pt; - list-style: none; -} - /* level 8 heading overrides */ -LI.L8 { - font-size: 10pt; - list-style: none; -} - /* level 9 heading overrides */ -LI.L9 { - font-size: 10pt; - list-style: none; -} - /* level 10 heading overrides */ -LI.L10 { - font-size: 10pt; - list-style: none; -} - /* level 11 heading overrides */ -LI.L11 { - font-size: 10pt; - list-style: none; -} - /* level 1 bullet heading overrides */ -LI.LB1 { - font-size: 12pt; - font-weight: bold; - list-style: disc; -} - /* level 2 bullet heading overrides */ -LI.LB2 { - font-size: 10pt; - font-weight: bold; - list-style: disc; -} - /* level 3 bullet heading overrides */ -LI.LB3 { - font-size: 10pt; - list-style: disc; -} - /* level 4 bullet heading overrides */ -LI.LB4 { - font-size: 10pt; - list-style: disc; -} - /* level 5 bullet heading overrides */ -LI.LB5 { - font-size: 10pt; - list-style: disc; -} - /* level 6 bullet heading overrides */ -LI.LB6 { - font-size: 10pt; - list-style: disc; -} - /* level 7 bullet heading overrides */ -LI.LB7 { - font-size: 10pt; - list-style: disc; -} - /* level 1 numeric heading overrides */ -LI.LN1 { - font-size: 12pt; - font-weight: bold; - list-style: decimal; -} - /* level 2 numeric heading overrides */ -LI.LN2 { - font-size: 10pt; - font-weight: bold; - list-style: decimal; -} - /* level 3 numeric heading overrides */ -LI.LN3 { - font-size: 10pt; - list-style: decimal; -} - /* level 4 numeric heading overrides */ -LI.LN4 { - font-size: 10pt; - list-style: decimal; -} - /* level 5 numeric heading overrides */ -LI.LN5 { - font-size: 10pt; - list-style: decimal; -} - /* level 6 numeric heading overrides */ -LI.LN6 { - font-size: 10pt; - list-style: decimal; -} - /* level 7 numeric heading overrides */ -LI.LN7 { - font-size: 10pt; - list-style: decimal; -} - /* body text */ -P { - font-family: helvetica,arial,sans-serif; - font-size: 9pt; - font-weight: normal; - color: black; -} - /* preformatted text */ -PRE { - font-family: fixed,monospace; - font-size: 9pt; - font-weight: normal; - color: darkblue; -} - -TABLE { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 12pt; - font-weight: normal; - border-collapse: collapse; -} - -TH { - border: 1px solid black; - padding: 0.5em; - background-color: #eeddee; -} - -TD { - border: 1px solid black; - padding: 0.5em; - background-color: #ddeeee; -} - -CODE { - background-color: yellow; -} - -TABLE.TAB1 { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 12pt; - font-weight: normal; - border-collapse: collapse; -} -TABLE.TAB2 { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 11pt; - font-weight: normal; - border-collapse: collapse; -} -TABLE.TAB3 { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 10pt; - font-weight: normal; - border-collapse: collapse; -} -TABLE.TAB4 { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 10pt; - font-weight: normal; - border-collapse: collapse; -} -TABLE.TAB5 { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 10pt; - font-weight: normal; - border-collapse: collapse; -} -TABLE.TAB6 { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 10pt; - font-weight: normal; - border-collapse: collapse; diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2html_nnnnnn.css b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2html_nnnnnn.css deleted file mode 100644 index 7405843..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2html_nnnnnn.css +++ /dev/null @@ -1,246 +0,0 @@ - /* copyright notice and filename */ -body { - font-family: helvetica,arial,sans-serif; - font-size: 10pt; -} - /* title at the top of the page */ -H1 { - font-family: helvetica,arial,sans-serif; - font-size: 14pt; - font-weight: bold; - text-align: center; - color: black; - background-color: #ddddee; - padding-top: 20px; - padding-bottom: 20px; -} -H2 { - font-family: helvetica,arial,sans-serif; - font-size: 12pt; - font-weight: bold; - text-align: left; - color: black; -} -H3 { - font-family: helvetica,arial,sans-serif; - font-size: 12pt; - text-align: left; - color: black; -} -H4 { - font-family: helvetica,arial,sans-serif; - font-size: 12pt; - text-align: left; - color: black; -} -H5 { - font-family: helvetica,arial,sans-serif; - font-size: 10pt; - text-align: left; - color: black; -} - /* outline level spacing */ -OL { - margin-left: 1.0em; - padding-left: 0; - padding-bottom: 8pt; -} - /* global heading settings */ -LI { - font-family: helvetica,arial,sans-serif; - color: black; - font-weight: normal; - list-style: lower-alpha; - padding-top: 4px; -} - /* level 1 heading overrides */ -LI.L1 { - font-size: 12pt; - font-weight: bold; - list-style: none; -} - /* level 2 heading overrides */ -LI.L2 { - font-size: 10pt; - font-weight: bold; - list-style: none; -} - /* level 3 heading overrides */ -LI.L3 { - font-size: 10pt; - list-style: none; -} - /* level 4 heading overrides */ -LI.L4 { - font-size: 10pt; - list-style: none; -} - /* level 5 heading overrides */ -LI.L5 { - font-size: 10pt; - list-style: none; -} - /* level 6 heading overrides */ -LI.L6 { - font-size: 10pt; - list-style: none; -} - /* level 7 heading overrides */ -LI.L7 { - font-size: 10pt; - list-style: none; -} - /* level 1 bullet heading overrides */ -LI.LB1 { - font-size: 12pt; - font-weight: bold; - list-style: disc; -} - /* level 2 bullet heading overrides */ -LI.LB2 { - font-size: 10pt; - font-weight: bold; - list-style: disc; -} - /* level 3 bullet heading overrides */ -LI.LB3 { - font-size: 10pt; - list-style: disc; -} - /* level 4 bullet heading overrides */ -LI.LB4 { - font-size: 10pt; - list-style: disc; -} - /* level 5 bullet heading overrides */ -LI.LB5 { - font-size: 10pt; - list-style: disc; -} - /* level 6 bullet heading overrides */ -LI.LB6 { - font-size: 10pt; - list-style: disc; -} - /* level 7 bullet heading overrides */ -LI.LB7 { - font-size: 10pt; - list-style: disc; -} - /* level 1 numeric heading overrides */ -LI.LN1 { - font-size: 12pt; - font-weight: bold; - list-style: decimal; -} - /* level 2 numeric heading overrides */ -LI.LN2 { - font-size: 10pt; - font-weight: bold; - list-style: decimal; -} - /* level 3 numeric heading overrides */ -LI.LN3 { - font-size: 10pt; - list-style: decimal; -} - /* level 4 numeric heading overrides */ -LI.LN4 { - font-size: 10pt; - list-style: decimal; -} - /* level 5 numeric heading overrides */ -LI.LN5 { - font-size: 10pt; - list-style: decimal; -} - /* level 6 numeric heading overrides */ -LI.LN6 { - font-size: 10pt; - list-style: decimal; -} - /* level 7 numeric heading overrides */ -LI.LN7 { - font-size: 10pt; - list-style: decimal; -} - /* body text */ -P { - font-family: helvetica,arial,sans-serif; - font-size: 9pt; - font-weight: normal; - color: darkgreen; -} - /* preformatted text */ -PRE { - font-family: fixed,monospace; - font-size: 9pt; - font-weight: normal; - color: darkblue; -} - -TABLE { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 12pt; - font-weight: normal; - border-collapse: collapse; -} - -TH { - border: 1px solid black; - padding: 0.5em; - background-color: #eeddee; -} - -TD { - border: 1px solid black; - padding: 0.5em; - background-color: #ddeeee; -} - -CODE { - background-color: yellow; -} - -TABLE.TAB1 { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 12pt; - font-weight: normal; - border-collapse: collapse; -} -TABLE.TAB2 { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 11pt; - font-weight: normal; - border-collapse: collapse; -} -TABLE.TAB3 { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 10pt; - font-weight: normal; - border-collapse: collapse; -} -TABLE.TAB4 { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 10pt; - font-weight: normal; - border-collapse: collapse; -} -TABLE.TAB5 { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 10pt; - font-weight: normal; - border-collapse: collapse; -} -TABLE.TAB6 { - margin-top: 1em; - font-family: helvetica,arial,sans-serif; - font-size: 10pt; - font-weight: normal; - border-collapse: collapse; diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/.vimrc b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/.vimrc deleted file mode 100644 index d1675e5..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/.vimrc +++ /dev/null @@ -1,44 +0,0 @@ -" local .vimrc for working with otl2latex -" -" Used to write notes in vim outlier file (.otl) and have dynamically -" generated beamer-latex files produced. -" -" requires the script otl2latex.py is in the same directory as this script. -" also requires that your user ~/.vimrc file has "set exrc" specified -" -" This can be added to as more functionality is desired. -" -" Author: Serge Rey -" Last Revision: 2007-01-21 - -version 6.0 - -"get rid of blank lines -map ,n :g/^$/d - -"make the next paragraph a text block (in Vim Outliner terms) -map ,t ma}k^mb'a'bI| - -"make an itemized list out of the following contiguous lines (each line is an -"item) -map ,i ^ma}k^mb'a'bI\item 'aObegin{itemize}'aki\'bo\end{itemize} - -"make an itemized list out of the following contiguous lines (each line is an -"item) and then mark block as otl text -map ,I ^ma}k^mb'a'bI\item 'aObegin{itemize}'aki\'bo\end{itemize}'akma}k^mb'a'bI| - -map ,f ^Obegin{center}jo\end{center}k^i\includegraphics[width=.8\linewidth]{A}k^i\^jjmbkk'bI| - -"process the otl file to produce a pdf presentation -map ,b :!python otl2latex.py -p % %<.tex;pdflatex %<.tex  - -"pdflatex the current buffer -map ,p :!pdflatex % - -"set up menus -amenu o&2l.&process,b ,b -amenu o&2l.&delete\ blank\ lines,n ,n -amenu o2l.-Sep- : -amenu o&2l.&itemize,i ,i -amenu o&2l.&textualize,t ,t -amenu o&2l.&itemize_and_textualize,t ,I diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/README b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/README deleted file mode 100644 index eb96167..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/README +++ /dev/null @@ -1,23 +0,0 @@ -otl2latex - -Translate a Vim Outliner file to a LaTeX document. - -Author: Serge Rey -Version 0.1 (2007-01-21) - -REQUIREMENTS - The Vim Outliner http://bike-nomad.com/vim/vimoutliner.html - beamer http://latex-beamer.sourceforge.net/ - Python http://www.python.org - - -INSTRUCTIONS -The user's guide is in otl2latex.pdf - -To reproduce it: - python otl2latex.py -p otl2latex.otl otl2latex.tex - pdflatex otl2latex - -DEVELOPMENT - otl2latex development is hosted at: - http://http://code.google.com/p/otl2latex/ diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.otl b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.otl deleted file mode 100644 index 3333e9f..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.otl +++ /dev/null @@ -1,95 +0,0 @@ -preamble - @author Serge Rey - @institute sjsrey@gmail.com - @instituteShort sjsrey@gmail.com - @title otl2latex - @subtitle User's Guide - @titleShort http://code.google.com/p/otl2latex/ - @date November 3, 2007 - @dateShort otl2latex -Introduction - What is otl2latex? - Translator - otl to tex - |otl2latex allows you to - |* prepare your document in a powerful outliner - |* generate \LaTeX\ markup of your content - Requirements - Operating Systems - Operating Systems Supported - |otl2latex has been used successfully on - |* Linux - |* Mac OS X - |* Windows - Software Required - Packages and Programs - |* Python http://www.python.org - |* \LaTeX - |* Beamer http://latex-beamer.sourceforge.net/ - |* The Vim Outliner http://bike-nomad.com/vim/vimoutliner.html -Usage - Basics - Usage - From the command line - | \texttt{python otl2latex.py -p filename.otl filename.tex} - | - Notes - |* \texttt{filename.tex} will be generated, you don't edit that one. - |* You can run all this from withing Vim (see Vim Mappings below). - Basics - Presentations/Beamer - |* Level 1 in the outline become sections - |* Level 2 in the outline become subsections - |* Level 3 in the outline become frame titles - |* Level 4 in the outline become block titles - |* Text in the outline is treated as \LaTeX\ markup - Using Bullets - | Placing a '*' at the begining of a line will tell otl2latex to begin an itemize list. otl2latex currently supports 3 levels of Itemization. - |* First Level - |** Second Level - |*** Third Level - |** Second Level - Advanced - Tips - |* Level 4 can be omitted - |* You will have no blocks on that frame - Vim mappings - Vim Mappings: .vimrc - Processing - |* ,b will generate a pdf file from your outline - |* ,nb will remove all empty lines in your otl file - |* ,p will run the current vim buffer through pdflatex - Vim Mappings: .vimrc - Lists - |* ,i on the first line will create an itemized list of a block of lines - |* ,t will mark a block as otl text - |* ,I itemize and mark block as otl text - |You need to have a blank line at the end of the block to apply these. - Vim Mappings: .vimrc - Figures - |\begin{itemize} - |\item ,f (insert mode) will generate stub for figures - |\end{itemize} - A figure - | \begin{center} - | \includegraphics[width=.8\linewidth]{otl2latex.png} - | \end{center} - A figure - |\begin{center} - |\includegraphics[width=.8\linewidth]{otl2latex.png} - |\end{center} - Future Extensions - Move to vim script - .vimrc to otl2latex.vim - |\begin{itemize} - |\item Currently we are just embedding mappings in .vimrc - |\item Ok for testing, not very polished for end user - |\end{itemize} - Reverse Engineering - latex2otl - |\begin{itemize} - |\item take a tex file - |\item generate the otl file - |\end{itemize} - - diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.pdf b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.pdf deleted file mode 100644 index 1c4d56a6cd3b60294e817fe90c0ac604eb6cc59f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102839 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�k&5d&YGSe+k$Yk2`MOexh%7BF`r6 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 Mvu&H2t~$^E0Y|6Z_5c6? diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.png b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.png deleted file mode 100644 index a1622baafb6b44b023792fd090f38d0ebfb7f71f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42112 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 -Version 0.1 (2007-01-21) -""" - -import os,sys - -class Line: - """Class for markup lines""" - def __init__(self, content): - ntabs=content.count("\t") - content=content.lstrip("\t") - level = ntabs - content.count("\t") - self.level=level - self.content = content - self.markup=0 - if content[0]=="|": - self.markup=1 - -#3 lines added here - self.bullet=0 - if len(content) > 2 and (content[2]=='*' or content[1]=='*'): - self.bullet=1 - #print "%d: %s"%(self.bullet,content) - -class Manager: - """Abstract class for LaTeX document classes""" - def __init__(self, content, fileOut): - self.content=content - self.fileOut=open(fileOut,'w') - self.parse() - self.fileOut.write(self.markup) - self.fileOut.close() - def parse(self): - self.lines=[ Line(line) for line in self.content] - preambleStart=0 - nl=len(self.lines) - id=zip(range(nl),self.lines) - level1=[i for i,line in id if line.level==0] - preambleEnd=level1[1] - preamble=self.lines[0:preambleEnd] - self.level1=level1 - preambleMarkup=[] - for line in preamble: - if line.content.count("@"): - tmp=line.content.split("@")[1] - tmp=tmp.split() - env=tmp[0] - content=" ".join(tmp[1:]) - mu="\\%s{%s}"%(env,content) - preambleMarkup.append(mu) - self.preamble=preambleMarkup - self.preambleLines=preamble - self.documentLines=self.lines[preambleEnd:] - - - - - -class Beamer(Manager): - """Manager for Beamer document class""" - def __init__(self, content,fileOut): - self.top1=""" -\documentclass[nototal,handout]{beamer} -\mode -{ - \usetheme{Madrid} - \setbeamercovered{transparent} -} - -\usepackage{verbatim} -\usepackage{fancyvrb} -\usepackage[english]{babel} -\usepackage[latin1]{inputenc} -\usepackage{times} -\usepackage{tikz} -\usepackage[T1]{fontenc} -\usepackage{graphicx} %sjr added -\graphicspath{{figures/}} -\usepackage{hyperref}""" - self.top2=""" -% Delete this, if you do not want the table of contents to pop up at -% the beginning of each subsection: -\AtBeginSubsection[] -{ - \\begin{frame} - \\frametitle{Outline} - \\tableofcontents[currentsection,currentsubsection] - \end{frame} -} - - -% If you wish to uncover everything in a step-wise fashion, uncomment -% the following command: -\\beamerdefaultoverlayspecification{<+->} -\\begin{document} -\\begin{frame} - \\titlepage -\end{frame} -\\begin{frame} - \\frametitle{Outline} - \\tableofcontents[pausesections] - % You might wish to add the option [pausesections] -\end{frame} -""" - self.bulletLevel = 0 - Manager.__init__(self, content, fileOut) - - def itemize(self,line): - nstars=line.content.count("*") - content=line.content.lstrip("|").lstrip().lstrip("*") - self.currentBLevel = nstars - content.count("*") - stuff=[] - if self.currentBLevel == self.bulletLevel and line.bullet: - mu='\\item '+line.content.lstrip("|").lstrip().lstrip("*") - elif line.bullet and self.currentBLevel > self.bulletLevel: - self.bulletLevel += 1 - stuff.append("\\begin{itemize}\n") - mu='\\item '+line.content.lstrip("|").lstrip().lstrip("*") - elif self.currentBLevel < self.bulletLevel and line.bullet: - self.bulletLevel -= 1 - stuff.append("\\end{itemize}\n") - mu='\\item '+line.content.lstrip("|").lstrip().lstrip("*") - elif self.currentBLevel < self.bulletLevel: - self.bulletLevel -= 1 - stuff.append("\\end{itemize}\n") - mu=line.content.lstrip("|") - else: - panic() - return stuff,mu - - def parse(self): - Manager.parse(self) - #print self.content - #print self.lines - #print self.level1 - #for info in self.preamble: - # print info - - # do my own preamble - field=("author ","instituteShort ","dateShort ","date ","subtitle ", - "title ", "institute ", "titleShort ") - pattern=["@"+token for token in field] - f=zip(field,pattern) - d={} - for field,pattern in f: - t=[line.content for line in self.preambleLines if line.content.count(pattern)] - if t: - d[field]= t[0].split(pattern)[1].strip() - else: - d[field]="" - preamble="\n\n\\author{%s}\n"%d['author '] - preamble+="\\institute[%s]{%s}\n"%(d['instituteShort '],d['institute ']) - preamble+="\\title[%s]{%s}\n"%(d['titleShort '],d['title ']) - preamble+="\\subtitle{%s}\n"%(d['subtitle ']) - preamble+="\\date[%s]{%s}\n"%(d['dateShort '],d['date ']) - - print self.preamble - self.preamble=preamble - - - body=[] - prev=0 - frameOpen=0 - blockOpen=0 - frameCount=0 - blockCount=0 - - for line in self.documentLines: - if line.level==0: - for i in range(0,self.bulletLevel): - self.bulletLevel -= 1 - body.append("\\end{itemize}\n") - if blockOpen: - body.append("\\end{block}") - blockOpen=0 - if frameOpen: - body.append("\\end{frame}") - frameOpen=0 - mu="\n\n\n\\section{%s}"%line.content.strip() - elif line.level==1: - for i in range(0,self.bulletLevel): - self.bulletLevel -= 1 - body.append("\\end{itemize}\n") - if blockOpen: - body.append("\\end{block}") - blockOpen=0 - if frameOpen: - body.append("\\end{frame}") - frameOpen=0 - mu="\n\n\\subsection{%s}"%line.content.strip() - elif line.level==2: - # check if this frame has blocks or is nonblocked - if line.markup: - if line.bullet or self.bulletLevel: - stuff,mu=self.itemize(line) - if len(stuff) > 0: - for i in stuff: - body.append(i) - else: - mu=line.content.lstrip("|") - else: - for i in range(0,self.bulletLevel): - self.bulletLevel -= 1 - body.append("\\end{itemize}\n") - if blockOpen: - body.append("\\end{block}") - blockOpen=0 - if frameOpen: - body.append("\\end{frame}") - else: - frameOpen=1 - # check for verbatim here - tmp=line.content.strip() - if tmp.count("@vb"): - tmp=tmp.split("@")[0] - mu="\n\n\\begin{frame}[containsverbatim]\n\t\\frametitle{%s}\n"%tmp - else: - mu="\n\n\\begin{frame}\n\t\\frametitle{%s}\n"%tmp - frameCount+=1 - elif line.level==3: - # check if it is a block or body content - if line.markup: - if line.bullet or self.bulletLevel: - stuff,mu=self.itemize(line) - if len(stuff) > 0: - for i in stuff: - body.append(i) - else: - mu=line.content.lstrip("\t") - mu=mu.lstrip("|") - else: - for i in range(0,self.bulletLevel): - self.bulletLevel -= 1 - body.append("\\end{itemize}\n") - #block title - if blockOpen: - body.append("\\end{block}") - else: - blockOpen=1 - mu="\n\\begin{block}{%s}\n"%line.content.strip() - blockCount+=1 - else: - mu="" - body.append(mu) - for i in range(0,self.bulletLevel): - self.bulletLevel -= 1 - body.append("\\end{itemize}\n") - if blockOpen: - body.append("\\end{block}") - if frameOpen: - body.append("\\end{frame}") - - self.body=" ".join(body) - self.markup=self.top1+self.preamble+self.top2 - self.markup+=self.body - self.markup+="\n\\end{document}\n" - print self.markup - -# Process command line arguments -args = sys.argv -nargs=len(args) -dispatch={} -dispatch['beamer']=Beamer -inputFileName=None -outputFileName=None - -def printUsage(): - print usage - sys.exit() - -if nargs==1: - printUsage() -else: - docType='beamer' - options=args[1] - if options.count("-"): - if options.count("a"): - docType='article' - elif options.count("b"): - docType='book' - if nargs==2: - printUsage() - elif nargs==3: - inputFileName=args[2] - elif nargs==4: - inputFileName=args[2] - outputFileName=args[3] - else: - printUsage() - elif nargs==2: - inputFileName=args[1] - elif nargs==3: - inputFileName=args[1] - outputFileName=args[3] - else: - printUsage() - # Dispatch to correct document class manager - fin=open(inputFileName,'r') - content=fin.readlines() - fin.close() - dispatch[docType](content,outputFileName) diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.tex b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.tex deleted file mode 100644 index 31f4766..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.tex +++ /dev/null @@ -1,223 +0,0 @@ - -\documentclass[nototal,handout]{beamer} -\mode -{ - \usetheme{Madrid} - \setbeamercovered{transparent} -} - -\usepackage{verbatim} -\usepackage{fancyvrb} -\usepackage[english]{babel} -\usepackage[latin1]{inputenc} -\usepackage{times} -\usepackage{tikz} -\usepackage[T1]{fontenc} -\usepackage{graphicx} %sjr added -\graphicspath{{figures/}} -\usepackage{hyperref} - -\author{Serge Rey} -\institute[sjsrey@gmail.com]{sjsrey@gmail.com} -\title[http://code.google.com/p/otl2latex/]{otl2latex} -\subtitle{User's Guide} -\date[otl2latex]{November 3, 2007} - -% Delete this, if you do not want the table of contents to pop up at -% the beginning of each subsection: -\AtBeginSubsection[] -{ - \begin{frame} - \frametitle{Outline} - \tableofcontents[currentsection,currentsubsection] - \end{frame} -} - - -% If you wish to uncover everything in a step-wise fashion, uncomment -% the following command: -\beamerdefaultoverlayspecification{<+->} -\begin{document} -\begin{frame} - \titlepage -\end{frame} -\begin{frame} - \frametitle{Outline} - \tableofcontents[pausesections] - % You might wish to add the option [pausesections] -\end{frame} - - - -\section{Introduction} - -\subsection{What is otl2latex?} - -\begin{frame} - \frametitle{Translator} - -\begin{block}{otl to tex} - otl2latex allows you to - \begin{itemize} - \item prepare your document in a powerful outliner - \item generate \LaTeX\ markup of your content - \end{itemize} - \end{block} \end{frame} - -\subsection{Requirements} - -\begin{frame} - \frametitle{Operating Systems} - -\begin{block}{Operating Systems Supported} - otl2latex has been used successfully on - \begin{itemize} - \item Linux - \item Mac OS X - \item Windows - \end{itemize} - \end{block} \end{frame} - -\begin{frame} - \frametitle{Software Required} - -\begin{block}{Packages and Programs} - \begin{itemize} - \item Python http://www.python.org - \item \LaTeX - \item Beamer http://latex-beamer.sourceforge.net/ - \item The Vim Outliner http://bike-nomad.com/vim/vimoutliner.html - \end{itemize} - \end{block} \end{frame} - - -\section{Usage} - -\subsection{Basics} - -\begin{frame} - \frametitle{Usage} - -\begin{block}{From the command line} - \texttt{python otl2latex.py -p filename.otl filename.tex} - - \end{block} -\begin{block}{Notes} - \begin{itemize} - \item \texttt{filename.tex} will be generated, you don't edit that one. - \item You can run all this from withing Vim (see Vim Mappings below). - \end{itemize} - \end{block} \end{frame} - -\begin{frame} - \frametitle{Basics} - -\begin{block}{Presentations/Beamer} - \begin{itemize} - \item Level 1 in the outline become sections - \item Level 2 in the outline become subsections - \item Level 3 in the outline become frame titles - \item Level 4 in the outline become block titles - \item Text in the outline is treated as \LaTeX\ markup - \end{itemize} - \end{block} -\begin{block}{Using Bullets} - Placing a '*' at the begining of a line will tell otl2latex to begin an itemize list. otl2latex currently supports 3 levels of Itemization. - \begin{itemize} - \item First Level - \begin{itemize} - \item Second Level - \begin{itemize} - \item Third Level - \end{itemize} - \item Second Level - \end{itemize} - \end{itemize} - \end{block} \end{frame} - -\begin{frame} - \frametitle{Advanced} - -\begin{block}{Tips} - \begin{itemize} - \item Level 4 can be omitted - \item You will have no blocks on that frame - \end{itemize} - \end{block} \end{frame} - -\subsection{Vim mappings} - -\begin{frame} - \frametitle{Vim Mappings: .vimrc} - -\begin{block}{Processing} - \begin{itemize} - \item ,b will generate a pdf file from your outline - \item ,nb will remove all empty lines in your otl file - \item ,p will run the current vim buffer through pdflatex - \end{itemize} - \end{block} \end{frame} - -\begin{frame} - \frametitle{Vim Mappings: .vimrc} - -\begin{block}{Lists} - \begin{itemize} - \item ,i on the first line will create an itemized list of a block of lines - \item ,t will mark a block as otl text - \item ,I itemize and mark block as otl text - \end{itemize} - You need to have a blank line at the end of the block to apply these. - \end{block} \end{frame} - -\begin{frame} - \frametitle{Vim Mappings: .vimrc} - -\begin{block}{Figures} - \begin{itemize} - \item ,f (insert mode) will generate stub for figures - \end{itemize} - \end{block} \end{frame} - -\begin{frame} - \frametitle{A figure} - \begin{center} - \includegraphics[width=.8\linewidth]{otl2latex.png} - \end{center} - \end{frame} - -\begin{frame} - \frametitle{A figure} - \begin{center} - \includegraphics[width=.8\linewidth]{otl2latex.png} - \end{center} - \end{frame} - -\subsection{Future Extensions} - -\begin{frame} - \frametitle{Move to vim script} - -\begin{block}{.vimrc to otl2latex.vim} - \begin{itemize} - \item Currently we are just embedding mappings in .vimrc - \item Ok for testing, not very polished for end user - \end{itemize} - \end{block} \end{frame} - -\begin{frame} - \frametitle{Reverse Engineering} - -\begin{block}{latex2otl} - \begin{itemize} - \item take a tex file - \item generate the otl file - \end{itemize} - \end{block} \end{frame} - - -\section{} - - -\section{} -\end{document} diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.toc b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.toc deleted file mode 100644 index ae333f6..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2latex/otl2latex.toc +++ /dev/null @@ -1,9 +0,0 @@ -\beamer@endinputifotherversion {3.07pt} -\select@language {english} -\beamer@sectionintoc {1}{Introduction}{3}{0}{1} -\beamer@subsectionintoc {1}{1}{What is otl2latex?}{3}{0}{1} -\beamer@subsectionintoc {1}{2}{Requirements}{4}{0}{1} -\beamer@sectionintoc {2}{Usage}{6}{0}{2} -\beamer@subsectionintoc {2}{1}{Basics}{6}{0}{2} -\beamer@subsectionintoc {2}{2}{Vim mappings}{9}{0}{2} -\beamer@subsectionintoc {2}{3}{Future Extensions}{14}{0}{2} diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2lyx.awk b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2lyx.awk deleted file mode 100644 index cc6e381..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2lyx.awk +++ /dev/null @@ -1,149 +0,0 @@ -#!/usr/bin/gawk -f - -# Copyright (C) 2007 by Steve Litt, all rights reserved. -# Licensed under the GNU General Public License, version 2. -# otl2lyx.awk version 0.1.1 pre-alpha -# 4/23/2007 -# Fixed insertion of other environments at bodytext to bodytext -# borders. -# -# USAGE: ./otl2lyx level-environment-table-file outline-file -# -# level-table-structure: -# 1: Top-level-environment-name -# 2: 2nd-level-environment-name -# 3: 3rd-level-environment-name -# 4: 4th-level-environment-name -# 5: 5th-level-environment-name -# 6: 6th-level-environment-name -# bodytext: environment-name-for-normal-text -# -# Example for a book: -# 1: Chapter -# 2: Section -# 3: Subsection -# 4: Subsubsection -# 5: Paragraph -# 6: Subparagraph -# 7: Garbage7 -# bodytext: Standard - - -BEGIN{ - FS=":[ \t]*" - OFS="\x09" - lastinbodytext=0 -} - -### BLOW OFF BLANKS OUTSIDE OF BODY TEXT -$0~/^[ \t]*$/ && inbodytext==0{ - next -} - -### FILL THE ENVIRONMENTS ARRAY ### -ARGIND==1{ - FS=":[ \t]*"; - sub(/[ \t]*$/,"",$2); - environments[$1] = $2; - next; -} - -FNR==101{ - for(i in environments) print "level=" i ", string=" environments[i]; -} - -### FIELD SEPARATOR IS TAB ON THE OUTLINE FILE ### -{FS="\x09"; } - -### INCREMENT OUTLINE ID NUMBER -{ol_id++} - -### CALCULATE LEVEL ### -{ - for(i=1;i<=NF;i++) - if($i == ""){ - } else { - break - } - this["level"] = i - if(ol_id == ol_id_first) - this["level"]-- -} - -### FIGURE TEXT ### -{ - this["text"] = "" - for(i=1;i<=NF;i++){ - if($i != ""){ - if(this["text"] == ""){ - this["text"] = this["text"] $i - } else { - this["text"] = this["text"] " " $i - } - } - } - sub(/^[ \t]+/, "", this["text"]); - sub(/[ \t]+$/, "", this["text"]); -} - -### SET BODYTEXT FLAGS ### -{ inbodytext = 0; newbodytext = 0; endbodytext = 0; btblankline=0; } - - -this["text"] ~ /^:[ \t]+[^ \t]/{ - inbodytext = 1; - sub(/^:[ \t]*/, "", this["text"]); - this["text"] = this["text"] " "; -} - -this["text"] == "" || this["text"] == ":"{ - this["text"] = ""; - inbodytext = lastinbodytext; - if(inbodytext == 1){ - endbodytext = 1; - newbodytext = 1; - btblankline = 1; - } -} - -lastinbodytext == 1 && inbodytext == 0{ - endbodytext = 1; -} - -lastinbodytext == 0 && inbodytext == 1{ - newbodytext = 1; -} - -{ lastinbodytext = inbodytext; } - - - -### QUOTE SINGLE BACKSLASHES FOR LATEX ### -{gsub(/\\/,"\r\\backslash\r", this["text"]);} - -### PRINT LYX CONTENT ### - -endbodytext == 1{ - print "\\end_layout" - print "" -} -newbodytext == 1{ - print "\\begin_layout " environments["bodytext"] -} -inbodytext == 1{ - if(btblankline == 0) print this["text"] -} - -inbodytext == 0{ - print "\\begin_layout " environments[this["level"]] - print this["text"] - print "\\end_layout" - print "" -} - -END{ - if(inbodytext == 1){ - print "\\end_layout" - print "" - } -} diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2ooimpress.py b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2ooimpress.py deleted file mode 100755 index 7d3ab67..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2ooimpress.py +++ /dev/null @@ -1,263 +0,0 @@ -#!/usr/bin/python2 -# otl2ooimpress.py -# needs otl2ooimpress.sh to work in an automated way -############################################################################# -# -# Tool for Vim Outliner files to Open Office Impress files. -# Copyright (C) 2003 by Noel Henson, all rights reserved. -# -# This tool is free software; you can redistribute it and/or -# modify it under the terms of the GNU Library General Public -# License as published by the Free Software Foundation; either -# version 2 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Library General Public -# License along with this library; if not, see -# . -# -############################################################################# -# ALPHA VERSION!!! - -########################################################################### -# Basic function -# -# This program accepts VO outline files and converts them -# to the zipped XML files required by Open Office Impress. -# -# 10 outline levels are supported. These loosely correspond to the -# HTML H1 through H9 tags. -# - - -########################################################################### -# include whatever mdules we need - -import sys -########################################################################### -# global variables - -level = 0 -inputFile = "" -outline = [] -flatoutline = [] -pageNumber = 0 -inPage = 0 -debug = 0 - -########################################################################### -# function definitions - - -# usage -# print the simplest form of help -# input: none -# output: simple command usage is printed on the console -def showUsage(): - print - print "Usage:" - print "otl2ooimpress.py [options] inputfile > outputfile" - print "" - print "output is on STDOUT" - print - - -# getArgs -# Check for input arguments and set the necessary switches -# input: none -# output: possible console output for help, switch variables may be set -def getArgs(): - global inputfile, debug - if (len(sys.argv) == 1): - showUsage() - sys.exit()() - else: - for i in range(len(sys.argv)): - if (i != 0): - if (sys.argv[i] == "-d"): - debug = 1 # test for debug flag - elif (sys.argv[i] == "-?"): # test for help flag - showUsage() # show the help - sys.exit() # exit - elif (sys.argv[i] == "--help"): - showUsage() - sys.exit() - elif (sys.argv[i] == "-h"): - showUsage() - sys.exit() - elif (sys.argv[i][0] == "-"): - print "Error! Unknown option. Aborting" - sys.exit() - else: # get the input file name - inputfile = sys.argv[i] - - -# getLineLevel -# get the level of the current line (count the number of tabs) -# input: linein - a single line that may or may not have tabs at the beginning -# output: returns a number 1 is the lowest -def getLineLevel(linein): - strstart = linein.lstrip() # find the start of text in line - x = linein.find(strstart) # find the text index in the line - n = linein.count("\t", 0, x) # count the tabs - return(n + 1) # return the count + 1 (for level) - - -# getLineTextLevel -# get the level of the current line (count the number of tabs) -# input: linein - a single line that may or may not have tabs at the beginning -# output: returns a number 1 is the lowest -def getLineTextLevel(linein): - strstart = linein.lstrip() # find the start of text in line - x = linein.find(strstart) # find the text index in the line - n = linein.count("\t", 0, x) # count the tabs - n = n + linein.count(" ", 0, x) # count the spaces - return(n + 1) # return the count + 1 (for level) - - -# colonStrip(line) -# stip a leading ':', if it exists -# input: line -# output: returns a string with a stipped ':' -def colonStrip(line): - if (line[0] == ":"): - return line[1:].lstrip() - else: - return line - - -# processLine -# process a single line -# input: linein - a single line that may or may not have tabs at the beginning -# level - an integer between 1 and 9 that show the current level -# (not to be confused with the level of the current line) -# output: through standard out -def processLine(linein): - global inPage, pageNumber - if (linein.lstrip() == ""): - print - return - if (getLineLevel(linein) == 1): - if (inPage == 1): - print '' - inPage = 0 - pageNumber += 1 - outstring = '' - print outstring - outstring = '' - print outstring - outstring = '' - outstring += linein.lstrip() - outstring += "" - print outstring - outstring = '' - print outstring - inPage = 1 - else: - outstring = '' - outstring += linein.lstrip() - outstring += '' - print outstring - - -# flatten -# Flatten a subsection of an outline. The index passed is the outline section -# title. All sublevels that are only one level deeper are indcluded in the -# current subsection. Then there is a recursion for those items listed in the -# subsection. Exits when the next line to be processed is of the same or lower -# outline level. -# (lower means shallower) -# input: idx - the index into the outline. The indexed line is the title. -# output: adds reformatted lines to flatoutline[] -def flatten(idx): - if (outline[idx] == ""): - return - if (len(outline) <= idx): - return - titleline = outline[idx] - titlelevel = getLineLevel(titleline) - if (getLineLevel(outline[idx + 1]) > titlelevel): - if (titleline[titlelevel - 1] != " "): - flatoutline.append(titleline.lstrip()) - exitflag = 0 - while (exitflag == 0): - if (idx < len(outline) - 1): - idx = idx + 1 - currlevel = getLineLevel(outline[idx]) - if (currlevel == titlelevel + 1): - if (currlevel == outline[idx].find(" ") + 1): - flatoutline.append("\t " + outline[idx].lstrip()) - else: - flatoutline.append("\t" + outline[idx].lstrip()) - elif (currlevel <= titlelevel): - exitflag = 1 - else: - exitflag = 1 - return - - -def printHeader(linein): - print''' - - - - ''' - - -def printFooter(): - print '' - print'' - - -def main(): - getArgs() - file = open(inputFile, "r") - linein = file.readline().strip() - outline.append(linein) - linein = file.readline().strip() - while linein != "": - outline.append("\t" + linein) - linein = file.readline().rstrip() - for i in range(0, len(outline) - 1): - flatten(i) - - printHeader(flatoutline[0]) - for i in range(0, len(flatoutline)): - processLine(flatoutline[i]) - printFooter() - - file.close() - -main() diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2ooimpress.sh b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2ooimpress.sh deleted file mode 100755 index 9e2432d..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2ooimpress.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -# otl2ooimpress.sh -# needs otl2ooimpress.py to work at all -############################################################################# -# -# Tool for Vim Outliner files to Open Office Impress files. -# Copyright (C) 2003 by Noel Henson, all rights reserved. -# -# This tool is free software; you can redistribute it and/or -# modify it under the terms of the GNU Library General Public -# License as published by the Free Software Foundation; either -# version 2 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Library General Public -# License along with this library; if not, see -# . -# -############################################################################# - -# Path to otl2ooimpress.py -MYPATH=$HOME/bin -# Path to rm -RMPATH=/bin -# Path to zip -ZIPPATH=/usr/bin - -$MYPATH/otl2ooimpress.py $1 > content.xml -$ZIPPATH/zip $1.sxi content.xml -$RMPATH/rm content.xml diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2table.py b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2table.py deleted file mode 100755 index 543792b..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl2table.py +++ /dev/null @@ -1,199 +0,0 @@ -#!/usr/bin/python2 -# otl2table.py -# convert a tab-formatted outline from VIM to tab-delimited table -# -# Copyright (c) 2004 Noel Henson All rights reserved -# -# ALPHA VERSION!!! - -########################################################################### -# Basic function -# -# This program accepts text outline files and converts them -# the tab-delimited text tables. -# This: -# Test -# Dog -# Barks -# Howls -# Cat -# Meows -# Yowls -# Becomes this: -# Test Dog Barks -# Test Dog Howls -# Test Cat Meows -# Test Cat Yowls -# -# This will make searching for groups of data and report generation easier. -# - - -########################################################################### -# include whatever mdules we need - -import sys -from string import * -#from time import * - -########################################################################### -# global variables - -level = 0 -inputFile = "" -formatMode = "tab" -noTrailing = 0 -columns = [] - -########################################################################### -# function definitions - -# usage -# print the simplest form of help -# input: none -# output: simple command usage is printed on the console - -def showUsage(): - print - print "Usage:" - print "otl2table.py [options] inputfile > outputfile" - print "Options" - print " -n Don't include trailing columns." - print " -t type Specify field separator type." - print " Types:" - print " tab - separate fields with tabs (default)" - print " csv - separate fields with ," - print " qcsv - separate fields with \",\"" - print " bullets - uses HTML tags \n$in\n" ); - } - $r->print( "\n" ); - } - $r->print( "\n\n" ); - } - - my $t1 = Time::HiRes::gettimeofday; - my $td = sprintf("%0.3f", $t1 - $t0); - $r->print("
OTL parsed in $td secs
\n") if $opt{timer}; - $r->print(< - -EHTML - - return OK; -} - -sub sorter -{ - my ($opt, $re) = @_; - return 0 unless $opt->{sorttype}; - my ($sa, $sb); - if ($opt->{sorttype} eq 'percent') { - $sa = $2 if $a =~ $re->{percent}; - $sb = $2 if $b =~ $re->{percent}; - return $opt->{sortrev} ? $sb <=> $sa : $sa <=> $sb; - } - else { - $sa = $1 if $a =~ $re->{linetext}; - $sb = $1 if $b =~ $re->{linetext}; - return $opt->{sortrev} ? $sb cmp $sa : $sa cmp $sb; - } -} - -1; - diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/README b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/README deleted file mode 100644 index ddc610d..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/README +++ /dev/null @@ -1,155 +0,0 @@ - - WHAT IS THIS? ---------------------------------------------------------------------- - -Vimoutliner already comes with some otl to HTML converters that work -quite well. I maintain a few different otl files, that are displayed -on a internal intranet - the step of converting to HTML on every little -change before upload was becoming mildly irritating, and countering my -near legendary laziness. - -This mod_perl handler teaches apache how to pretty print otl natively. - -Now, I can just edit the otl files directly - skip the conversion step -altogether, and let Apache make some delicious looking outlines. - - - INSTALLATION ---------------------------------------------------------------------- - -First of all, prerequisites! - - - apache2 - - mod_perl2 - - libapreq2 (Apache2::Request) - -Add the following lines in your httpd.conf, or in a -separate otl.conf in the apache Includes directory: - - ------------------------- - PerlSwitches -I/path/to/perl/libraries - PerlModule Apache::OTL - - - SetHandler perl-script - PerlResponseHandler Apache::OTL - - ------------------------- - -Doublecheck that your apreq2 module is setup to load, as well. - -That's it. Apache will now pretty-print all your otl files. - - - SETTINGS ---------------------------------------------------------------------- - -Settings for the otl_handler are stored on the first line of the otl -files themselves, prefixed by the 'user no wrap' character, '<'. See -the sample.otl for an example settings line. All settings are entirely -optional. - -title - Type: string - Default: filename - - The title of the OTL. Used as a header, and the html title. - If this is not set, the html title is derived from the filename. - - -style - Type: string - Default: none - - A path to css style(s). - Comma separated values load different files in order. - Media type defaults to 'screen', if the css name contains the - string 'print' anywhere, the media type is changed to print. - - :style=/css/otl_style.css,/css/print_style.css - -js - Type: string - Default: none - - Use javascript? If set, loads an external javascript library. - Comma separated values load diff files in order. - - -last_mod - Type: boolean - Default: 0 - - Show modification time of the otl file? - - -legend - Type: boolean - Default: 0 - - Display small legend for todo and done items? - - -sort - Type: boolean - Default: 0 - - Show sort links? - - -sorttype - Type: string - Default: none - - Default sorting method. Valid values are - percent - alpha - - -sortrev - Type: boolean - Default: 0 - - Should we default to reverse sorting? - - -counts - Type: boolean - Default: 0 - - Count and display sub items? - - -timer - Type: boolean - Default: 0 - - Display how long the parser took to generate the html? - - - - INCLUDED FILES ---------------------------------------------------------------------- - -/Apache/OTL.pm - The mod_perl content handler. - -/javascript/* - Example (but functional!) javascript. Create line numbers, - various eye candies, and clickable folds. - - This requires the 'jquery.js' library, also included. - -/sample.otl - An example vimoutliner file, with optional settings. - -/styles/* - "Theme" examples for customizing OTL display. - - - ACKNOWLEDGEMENTS ---------------------------------------------------------------------- - -Thanks to Nathan Dabney and -Michael Granger for their help and advice! - diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/devel-mode b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/devel-mode deleted file mode 100644 index f77cf6a..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/devel-mode +++ /dev/null @@ -1,5 +0,0 @@ -PerlModule Apache2::Reload -PerlInitHandler Apache2::Reload -PerlSetVar ReloadAll Off -PerlSetVar ReloadModules "Apache::OTL" -PerlSetVar ReloadConstantRedefineWarnings Off diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/javascript/jquery.js b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/javascript/jquery.js deleted file mode 100644 index 4384f4c..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/javascript/jquery.js +++ /dev/null @@ -1,12 +0,0 @@ -/* - * jQuery 1.0.2 - New Wave Javascript - * - * Copyright (c) 2006 John Resig (jquery.com) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * $Date: 2006-10-09 20:23:18 -0400 (Mon, 09 Oct 2006) $ - * $Rev: 1b5eb968d2c4 $ - */ - -eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('l(1Y 1O.6=="P"){1O.P=1O.P;6=q(a,c){l(a&&1Y a=="q"&&6.C.1T)v 6(15).1T(a);a=a||6.1k||15;l(a.2J)v 6(6.1X(a,[]));l(c&&c.2J)v 6(c).2j(a);l(1O==7)v 1f 6(a,c);u m=/^[^<]*(<.+>)[^>]*$/.36(a);l(m)a=6.31([m[1]]);7.1o(a.N==2y||a.D&&!a.1S&&a[0]!=P&&a[0].1S?6.1X(a,[]):6.2j(a,c));u C=1d[1d.D-1];l(C&&1Y C=="q")7.U(C)};l(1Y $!="P")6.3W$=$;u $=6;6.C=6.89={2J:"1.0.2",4u:q(){v 7.D},1o:q(26){l(26&&26.N==2y){7.D=0;[].1l.17(7,26);v 7}F v 26==P?6.1X(7,[]):7[26]},U:q(C,1h){v 6.U(7,C,1h)},8b:q(16){u 2c=-1;7.U(q(i){l(7==16)2c=i});v 2c},1r:q(1P,W,B){v 1P.N!=1N||W!=P?7.U(q(){l(W==P)H(u I 1q 1P)6.1r(B?7.1a:7,I,1P[I]);F 6.1r(B?7.1a:7,1P,W)}):6[B||"1r"](7[0],1P)},1g:q(1P,W){v 7.1r(1P,W,"20")},2V:q(e){e=e||7;u t="";H(u j=0;j0:14},2K:q(1h,1p,2N,C){u 3G=7.4u()>1;u a=6.31(1h);v 7.U(q(){u 16=7;l(1p&&7.2x.2h()=="60"&&a[0].2x.2h()!="61"){u 25=7.4R("25");l(!25.D){16=15.4E("25");7.44(16)}F 16=25[0]}H(u i=(2N<0?a.D-1:0);i!=(2N<0?2N:a.D);i+=2N){C.17(16,[3G?a[i].3D(V):a[i]])}})},28:q(a,1h){u C=1h&&1h[1h.D-1];u 2i=1h&&1h[1h.D-2];l(C&&C.N!=1v)C=Q;l(2i&&2i.N!=1v)2i=Q;l(!C){l(!7.3d)7.3d=[];7.3d.1l(7.1o());7.1o(a)}F{u 1U=7.1o();7.1o(a);l(2i&&a.D||!2i)7.U(2i||C).1o(1U);F 7.1o(1U).U(C)}v 7}};6.1L=6.C.1L=q(16,I){l(!I){I=16;16=7}H(u i 1q I)16[i]=I[i];v 16};6.1L({5C:q(){6.63=V;6.U(6.2l.5u,q(i,n){6.C[i]=q(a){u K=6.2t(7,n);l(a&&a.N==1N)K=6.19(a,K).r;v 7.28(K,1d)}});6.U(6.2l.2q,q(i,n){6.C[i]=q(){u a=1d;v 7.U(q(){H(u j=0;j"}F l(!a[i].1c("<3v")){1p="3v";a[i]="<1p>"+a[i]+""}F l(!a[i].1c("<3M")||!a[i].1c("<6r")){1p="3M";a[i]="<1p><25><3v>"+a[i]+""}u 1F=15.4E("1F");1F.2u=a[i];l(1p){1F=1F.1M;l(1p!="4j")1F=1F.1M;l(1p=="3M")1F=1F.1M}H(u j=0;j<1F.2e.D;j++)r.1l(1F.2e[j])}F l(a[i].2J||a[i].D&&!a[i].1S)H(u k=0;km[3]-0",4J:"m[3]-0==i",5o:"m[3]-0==i",2f:"i==0",1R:"i==r.D-1",52:"i%2==0",53:"i%2","4J-32":"6.1x(a,m[3]).1m","2f-32":"6.1x(a,0).1m","1R-32":"6.1x(a,0).1R","6v-32":"6.1x(a).D==1",5v:"a.2e.D",5A:"!a.2e.D",5r:"(a.7L||a.2u).1c(m[3])>=0",6w:"a.B!=\'1V\'&&6.1g(a,\'1t\')!=\'21\'&&6.1g(a,\'4e\')!=\'1V\'",1V:"a.B==\'1V\'||6.1g(a,\'1t\')==\'21\'||6.1g(a,\'4e\')==\'1V\'",7I:"!a.2R",2R:"a.2R",34:"a.34",4f:"a.4f || 6.1r(a, \'4f\')",2V:"a.B==\'2V\'",5G:"a.B==\'5G\'",5H:"a.B==\'5H\'",4l:"a.B==\'4l\'",4L:"a.B==\'4L\'",4n:"a.B==\'4n\'",5I:"a.B==\'5I\'",4m:"a.B==\'4m\'",48:"a.B==\'48\'",5B:"a.2x.41().4U(/5B|5O|6C|48/)"},".":"6.1e.3l(a,m[2])","@":{"=":"z==m[4]","!=":"z!=m[4]","^=":"z && !z.1c(m[4])","$=":"z && z.2U(z.D - m[4].D,m[4].D)==m[4]","*=":"z && z.1c(m[4])>=0","":"z"},"[":"6.2j(m[2],a).D"},3j:["\\\\.\\\\.|/\\\\.\\\\.","a.1n",">|/","6.1x(a.1M)","\\\\+","6.1x(a).3p","~",q(a){u r=[];u s=6.1x(a);l(s.n>0)H(u i=s.n;i=1)t=t.2U(t.1c("/"),t.D)}u K=[1k];u 1J=[];u 1R=Q;2d(t.D>0&&1R!=t){u r=[];1R=t;t=6.2I(t).1A(/^\\/\\//i,"");u 3k=14;H(u i=0;i<6.3j.D;i+=2){l(3k)51;u 2o=1f 3T("^("+6.3j[i]+")");u m=2o.36(t);l(m){r=K=6.2t(K,6.3j[i+1]);t=6.2I(t.1A(2o,""));3k=V}}l(!3k){l(!t.1c(",")||!t.1c("|")){l(K[0]==1k)K.3O();1J=6.1X(1J,K);r=K=[1k];t=" "+t.2U(1,t.D)}F{u 3P=/^([#.]?)([a-4X-9\\\\*3W-]*)/i;u m=3P.36(t);l(m[1]=="#"){u 4q=15.5z(m[2]);r=K=4q?[4q]:[];t=t.1A(3P,"")}F{l(!m[2]||m[1]==".")m[2]="*";H(u i=0;i<\\/2b>");u 2b=15.5z("5V");2b.2A=q(){l(7.2Y!="1I")v;7.1n.3g(7);6.1T()};2b=Q}F l(6.18.3e){6.4r=3R(q(){l(15.2Y=="62"||15.2Y=="1I"){56(6.4r);6.4r=Q;6.1T()}},10)}6.L.1Z(1O,"2T",6.1T)};l(6.18.1y)6(1O).3J(q(){u L=6.L,1i=L.1i;H(u B 1q 1i){u 3H=1i[B],i=3H.D;l(i>0)68 l(B!=\'3J\')L.22(3H[i-1],B);2d(--i)}});6.C.1L({4z:6.C.1C,1C:q(11,G){v 11?7.1W({1z:"1C",27:"1C",1j:"1C"},11,G):7.4z()},5W:6.C.1s,1s:q(11,G){v 11?7.1W({1z:"1s",27:"1s",1j:"1s"},11,G):7.5W()},6h:q(11,G){v 7.1W({1z:"1C"},11,G)},6j:q(11,G){v 7.1W({1z:"1s"},11,G)},6k:q(11,G){v 7.U(q(){u 4B=6(7).4o(":1V")?"1C":"1s";6(7).1W({1z:4B},11,G)})},84:q(11,G){v 7.1W({1j:"1C"},11,G)},6n:q(11,G){v 7.1W({1j:"1s"},11,G)},6q:q(11,2q,G){v 7.1W({1j:2q},11,G)},1W:q(I,11,G){v 7.1w(q(){7.2P=I;H(u p 1q I){u e=1f 6.2O(7,6.11(11,G),p);l(I[p].N==4M)e.2M(e.1m(),I[p]);F e[I[p]](I)}})},1w:q(B,C){l(!C){C=B;B="2O"}v 7.U(q(){l(!7.1w)7.1w={};l(!7.1w[B])7.1w[B]=[];7.1w[B].1l(C);l(7.1w[B].D==1)C.17(7)})}});6.1L({5i:q(e,p){l(e.4K)v;l(p=="1z"&&e.4D!=3f(6.20(e,p)))v;l(p=="27"&&e.4F!=3f(6.20(e,p)))v;u a=e.1a[p];u o=6.20(e,p,1);l(p=="1z"&&e.4D!=o||p=="27"&&e.4F!=o)v;e.1a[p]=e.3t?"":"4I";u n=6.20(e,p,1);l(o!=n&&n!="4I"){e.1a[p]=a;e.4K=V}},11:q(s,o){o=o||{};l(o.N==1v)o={1I:o};u 4N={6x:6z,6A:4H};o.2F=(s&&s.N==4M?s:4N[s])||4S;o.3o=o.1I;o.1I=q(){6.4P(7,"2O");l(o.3o&&o.3o.N==1v)o.3o.17(7)};v o},1w:{},4P:q(E,B){B=B||"2O";l(E.1w&&E.1w[B]){E.1w[B].3O();u f=E.1w[B][0];l(f)f.17(E)}},2O:q(E,2m,I){u z=7;z.o={2F:2m.2F||4S,1I:2m.1I,2p:2m.2p};z.R=E;u y=z.R.1a;z.a=q(){l(2m.2p)2m.2p.17(E,[z.2a]);l(I=="1j")6.1r(y,"1j",z.2a);F l(3f(z.2a))y[I]=3f(z.2a)+"5f";y.1t="2Q"};z.57=q(){v 3Z(6.1g(z.R,I))};z.1m=q(){u r=3Z(6.20(z.R,I));v r&&r>-6R?r:z.57()};z.2M=q(4t,2q){z.42=(1f 54()).55();z.2a=4t;z.a();z.3Y=3R(q(){z.2p(4t,2q)},13)};z.1C=q(p){l(!z.R.1G)z.R.1G={};z.R.1G[I]=7.1m();l(I=="1j")z.2M(z.R.1G[I],1);F z.2M(0,z.R.1G[I]);l(I!="1j")y[I]="6Z"};z.1s=q(){l(!z.R.1G)z.R.1G={};z.R.1G[I]=7.1m();z.o.1s=V;z.2M(z.R.1G[I],0)};l(!z.R.71)z.R.59=6.1g(z.R,"39");y.39="1V";z.2p=q(47,46){u t=(1f 54()).55();l(t>z.o.2F+z.42){56(z.3Y);z.3Y=Q;z.2a=46;z.a();z.R.2P[I]=V;u 1J=V;H(u i 1q z.R.2P)l(z.R.2P[i]!==V)1J=14;l(1J){y.39=z.R.59;l(z.o.1s)y.1t=\'21\';l(z.o.1s){H(u p 1q z.R.2P){l(p=="1j"&&6.18.1y)6.1r(y,p,z.R.1G[p]);F y[p]=z.R.1G[p]+"5f";l(p==\'1z\'||p==\'27\')6.5i(z.R,p)}}}l(1J&&z.o.1I&&z.o.1I.N==1v)z.o.1I.17(z.R)}F{u p=(t-7.42)/z.o.2F;z.2a=((-5t.7m(p*5t.7q)/2)+0.5)*(46-47)+47;z.a()}}}});6.C.1L({7v:q(M,1K,G){7.2T(M,1K,G,1)},2T:q(M,1K,G,1E){l(M.N==1v)v 7.3B("2T",M);G=G||q(){};u B="4d";l(1K){l(1K.N==1v){G=1K;1K=Q}F{1K=6.2C(1K);B="4x"}}u 3q=7;6.3C(B,M,1K,q(3r,12){l(12=="2w"||!1E&&12=="5s"){3q.5y(3r.2Z).U(G,[3r.2Z,12]);6("2b",3q).U(q(){l(7.3m)6.4v(7.3m);F 37.4i(1O,7.2V||7.7A||7.2u||"")})}F G.17(3q,[3r.2Z,12])},1E);v 7},7F:q(){v 6.2C(7)}});l(6.18.1y&&1Y 3b=="P")3b=q(){v 1f 7K(5J.5K.1c("7R 5")>=0?"7U.5P":"7W.5P")};1f q(){u e="4G,5M,5F,5D,5x".3y(",");H(u i=0;i-1)?"&":"?")+6.2C(J);6.3C("4d",M,Q,q(r,12){l(G)G(6.3n(r,B),12)},1E)},5Z:q(M,J,G,B){6.1o(M,J,G,B,1)},4v:q(M,G){6.1o(M,G,"2b")},64:q(M,J,G){l(G)6.1o(M,J,G,"3S");F{6.1o(M,J,"3S")}},6b:q(M,J,G,B){6.3C("4x",M,6.2C(J),q(r,12){l(G)G(6.3n(r,B),12)})},1u:0,6i:q(1u){6.1u=1u},38:{},3C:q(B,M,J,K,1E){l(!M){K=B.1I;u 2w=B.2w;u 2k=B.2k;u 49=B.49;u 1i=1Y B.1i=="85"?B.1i:V;u 1u=1Y B.1u=="6s"?B.1u:6.1u;u 1E=B.1E||14;J=B.J;M=B.M;B=B.B}l(1i&&!6.3I++)6.L.1Q("4G");u 4p=14;u O=1f 3b();O.6y(B||"4d",M,V);l(J)O.30("6D-6E","6F/x-6J-6L-6O");l(1E)O.30("6S-40-6V",6.38[M]||"6W, 6Y 70 72 3V:3V:3V 73");O.30("X-74-75","3b");l(O.78)O.30("7c","7g");u 2A=q(43){l(O&&(O.2Y==4||43=="1u")){4p=V;u 12=6.4y(O)&&43!="1u"?1E&&6.4Q(O,M)?"5s":"2w":"2k";l(12!="2k"){u 3F;3x{3F=O.4b("4T-40")}3h(e){}l(1E&&3F)6.38[M]=3F;l(2w)2w(6.3n(O,49),12);l(1i)6.L.1Q("5x")}F{l(2k)2k(O,12);l(1i)6.L.1Q("5D")}l(1i)6.L.1Q("5F");l(1i&&!--6.3I)6.L.1Q("5M");l(K)K(O,12);O.2A=q(){};O=Q}};O.2A=2A;l(1u>0)7X(q(){l(O){O.82();l(!4p)2A("1u");O=Q}},1u);O.65(J)},3I:0,4y:q(r){3x{v!r.12&&6l.6m=="4l:"||(r.12>=4H&&r.12<6B)||r.12==4W||6.18.3e&&r.12==P}3h(e){}v 14},4Q:q(O,M){3x{u 50=O.4b("4T-40");v O.12==4W||50==6.38[M]||6.18.3e&&O.12==P}3h(e){}v 14},3n:q(r,B){u 4k=r.4b("7G-B");u J=!B&&4k&&4k.1c("O")>=0;J=B=="O"||J?r.8j:r.2Z;l(B=="2b")37.4i(1O,J);l(B=="3S")37("J = "+J);v J},2C:q(a){u s=[];l(a.N==2y||a.2J){H(u i=0;i'; - $(this).prepend(str); - }); - - // attach folds - $(".outline ul li").toggle( - - // hide - function(){ - if ( $(this).children("ul").size() == 0 ) return; - $(this).children("ul").slideUp("slow"); - $(this).find(".linenum").addClass("linenum-folded"); - }, - - // show - function(){ - $(this).children("ul").slideDown("slow"); - $(this).find(".linenum").removeClass("linenum-folded"); - } - ); - -}); diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/javascript/theme3.js b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/javascript/theme3.js deleted file mode 100644 index e3b78cf..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/javascript/theme3.js +++ /dev/null @@ -1,22 +0,0 @@ -$(document).ready(function(){ - - // append content div - $("body").prepend("
test
"); - $("#content").hide(); - - // FIXME - document.width + document.height - $(".outline").click(function(){ - $("#content").html( $(this).html() ); - $("body").background("#7b7c8c"); - $("#content").show(); - }); - - $("#content").click(function(){ - $(this).hide(); - $("body").background("#acadc3"); - }); - - // re-activate links (the event is stomped on by the li event) - $(".outline a").click(function(){ window.location.href = this; return false; }); - -}); diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/sample.otl b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/sample.otl deleted file mode 100644 index aa2dc4e..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/sample.otl +++ /dev/null @@ -1,39 +0,0 @@ -<:title=Sample OTL list :counts=1 :timer=1 :style=styles/theme1.css :legend=1 :last_mod=1 - -: Theme examples: -: basic advanced advanced2 - -[_] 29% Things to get for party - [_] 25% Food - [_] Chips - [_] Dips - [X] Honey roasted peanuts - [_] Sausage - [_] 33% Party favors - [_] Hats - [_] Whistles - [X] Beer bong - -[_] 19% House projects - [_] 25% Paint - [_] 50% Buy supplies - [_] Paint - [X] Brushes - [X] Trays 2006-09-14 - [_] Overalls - [_] 0% Rooms done - [_] Bathroom - [_] Bedroom - : Red? - [_] 13% Upgrade electrical - [_] 2 circuits to computer room - [_] 40% Get equipment - [X] Romex wire - [_] Entry feed wire - : How much of this do I really need? I should probably go out to the street and measure stuff. - : Make sure the inspector has access to examine stuff on side of house. - [_] Service meter - [X] Grounding rods - [_] Breakers - [_] Learn about electricity - [_] Don't die diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/styles/theme1.css b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/styles/theme1.css deleted file mode 100644 index 090d945..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/styles/theme1.css +++ /dev/null @@ -1,88 +0,0 @@ - -body -{ - width: 600px; - font-size: 0.9em; - font-family: sans; -} - -ul -{ - list-style-type: none; - line-height: 1.5em; - padding-left: 20px; -} - -.date -{ - font-size: 0.6em; -} - -.outline -{ - margin-bottom: 30px; -} - -.percent -{ - color: blue; -} - -.comment, .counts -{ - font-size: 0.7em; - line-height: 1em; - padding-top: 2px; - margin-bottom: 5px; - font-family: sans; -} - -.comment_pre -{ - font-style: normal; - font-family: courier; - white-space: pre; -} - -.counts -{ - margin-left: 10px; -} - -.counts:before { content: "("; } -.counts:after { content: ")"; } - -.todo -{ - padding-left: 4px; -} - -.done -{ - background-color: #f4f4f4; - color: #777; - padding-left: 4px; -} - -.done:before -{ - font-size: 1.5em; - color: green; - content: "\2611 "; -} - -.todo:before -{ - font-size: 1.5em; - color: #777; - content: "\2610 "; -} - -.legend .todo, .legend .done { border: 0 } -.legend -{ - margin-bottom: 30px; - margin-top: 20px; -} - - diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/styles/theme2.css b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/styles/theme2.css deleted file mode 100644 index 869a876..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/styles/theme2.css +++ /dev/null @@ -1,152 +0,0 @@ - -body -{ - background-color: #444; - font: 11px/1.8em sans-serif; - margin: 0; - padding-bottom: 50px; - color: #ccc; -} - -a, a:visited -{ - text-decoration: none; - color: #7f9ab5; -} - -.header -{ - background-color: #aaa; - padding: 3px 0 3px 120px; - margin-top: 50px; - color: #3a5f85; - border-top: 5px solid #333; - font-size: 20px; - font-weight: bold; -} - -.last_mod -{ - padding-left: 120px; - background-color: #333; - border-bottom: 1px solid #000; - font-size: 0.85em; - color: #999; -} - -.percent -{ - display: none; - color: #7f9ab5; - font-weight: bold; - position: absolute; - left: 115px; -} - -.linenum -{ - color: #7f9ab5; - position: absolute; - left: 0; - font-size: 9px; - font-weight: normal; - font-style: normal; - width: 60px; - text-align: right; -} - -.linenum-folded -{ - color: #666; -} - -.timer -{ - color: #666; - position: absolute; - top: 5px; - right: 10px; -} - -.outline -{ - width: 400px; - margin: 20px 0 0 150px; - display: none; - cursor: pointer; -} - -.outline ul -{ - margin: 0; - padding: 0 10px 0 5px; - list-style-type: none; -} - -.outline ul li -{ - padding: 0 0 0 10px; - display: block; - color: #fff; - font-size: 14px; - font-weight: bold; -} - -.outline ul li:hover -{ - color: #fff; -} - -.outline ul li ul li -{ - border-left: 1px solid #666; - color: #ccc; - font-size: 11px; - font-weight: normal; -} - -.outline ul li ul li:hover -{ - border-left: 1px solid #aaa; -} - -.done -{ - color: #777 !important; - font-style: italic; -} - -.done:after -{ - font-size: 0.9em; - content: " (done)"; -} - -.comment -{ - padding-right: 2px !important; - font-style: italic; - border-top: 1px solid #666; - border-bottom: 1px solid #666; - border-right: 1px solid #666; -} - -.comment_pre -{ - font-style: normal; - font-family: courier; - white-space: pre; -} - -.comment:hover -{ - border-top: 1px solid #aaa; - border-bottom: 1px solid #aaa; - border-right: 1px solid #aaa; -} - -.selected -{ - background-color: #3d3d3d; -} - diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/styles/theme3.css b/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/styles/theme3.css deleted file mode 100644 index 4f8b25c..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otl_handler/styles/theme3.css +++ /dev/null @@ -1,109 +0,0 @@ - -body -{ - background-color: #acadc3; - font: 12px Verdana, sans-serif; - color: #000; - text-align: center; -} - -a, a:visited -{ - text-decoration: none; - color: blue; -} - -.header -{ - margin-top: 40px; - font-size: 2em; - font-weight: bold; -} - -.header:after { content: " ----|" } -.header:before { content: "|---- " } - -.last_mod { font-size: .85em; } -.percent { font-weight: bold; } - -.sort -{ - margin-bottom: 30px; - font-size: .85em; -} - -.outline -{ - cursor: pointer; - float: left; - padding: 20px; - border: 1px solid #8082a9; - margin-left: 10px; - background-color: #ccc; -} - -.outline:hover -{ - border: 1px solid #000; -} - -.outline ul, #content ul -{ - padding: 0; - margin: 0; - list-style-type: none; -} - -.outline ul li ul li { display: none; } - -#content ul li ul { padding-left: 20px; } - -#content ul li -{ - font-weight: bold; - font-size: 1.5em; - text-align: center; - color: #3a3d85; -} - -#content ul li ul li -{ - font-weight: normal; - text-align: left; - font-size: 10px; - color: #000; -} - -#content .done { color: #777; } -.comment { font-style: italic; } - -#content ul li .percent { color: #ff7e00; } -#content ul li ul li .percent { color: #000; } - -#content .comment -{ - font-style: italic; - border-left: 1px solid #999; - padding-left: 5px; - margin-bottom: 3px; -} - -#content .comment_pre -{ - font-style: normal; - font-family: courier; - white-space: pre; -} - -#content -{ - position: absolute; - left: 15%; - width: 60%; - height: 80%; - cursor: pointer; - background-color: #fff; - border: 2px solid #3a3d85; - padding: 10px; -} - diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otlgrep.py b/pack/acp/start/vimoutliner/vimoutliner/scripts/otlgrep.py deleted file mode 100755 index 7b2dea3..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otlgrep.py +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bin/python2 -# otlgrep.py -# grep an outline for a regex and return the branch with all the leaves. -# -# Copyright 2005 Noel Henson All rights reserved - -########################################################################### -# Basic function -# -# This program searches an outline file for a branch that contains -# a line matching the regex argument. The parent headings (branches) -# and the children (sub-branches and leaves) of the matching headings -# are returned. -# -# Examples -# -# Using this outline: -# -# Pets -# Indoor -# Cats -# Sophia -# Hillary -# Rats -# Finley -# Oliver -# Dogs -# Kirby -# Outdoor -# Dogs -# Kirby -# Hoover -# Goats -# Primrose -# Joey -# -# a grep for Sophia returns: -# -# Indoor -# Cats -# Sophia -# -# a grep for Dogs returns: -# -# Indoor -# Dogs -# Kirby -# Hoover -# Outdoor -# Dogs -# Kirby -# Hoover -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -########################################################################### -# include whatever mdules we need - -import sys -import re - -########################################################################### -# global variables - -debug = 0 -ignorecase = 0 -pattern = "" -inputfiles = [] - -########################################################################### -# function definitions# usage -# -# print debug statements -# input: string -# output: string printed to standard out - - -def dprint(*vals): - global debug - if debug != 0: - print vals - - -# usage -# print the simplest form of help -# input: none -# output: simple command usage is printed on the console -def showUsage(): - print """ - Usage: - otlgrep.py [options] pattern [file...] - Options - -i Ignore case - --help Show help. - [file...] is zero or more files to search. Wildcards are supported. - if no file is specified, input is expected on stdin. - output is on STDOUT - """ - - -# getArgs -# Check for input arguments and set the necessary switches -# input: none -# output: possible console output for help, switch variables may be set - -def getArgs(): - global debug, pattern, inputfiles, ignorecase - if (len(sys.argv) == 1): - showUsage() - sys.exit()() - else: - for i in range(len(sys.argv)): - if (i != 0): - if (sys.argv[i] == "-d"): - debug = 1 # test for debug flag - elif (sys.argv[i] == "-i"): - ignorecase = 1 # test for debug flag - elif (sys.argv[i] == "-?"): # test for help flag - showUsage() # show the help - sys.exit() # exit - elif (sys.argv[i] == "--help"): - showUsage() - sys.exit() - elif (sys.argv[i][0] == "-"): - print "Error! Unknown option. Aborting" - sys.exit() - else: # get the input file name - if (pattern == ""): - pattern = sys.argv[i] - else: - inputfiles.append(sys.argv[i]) - - -# getLineLevel -# get the level of the current line (count the number of tabs) -# input: linein - a single line that may or may not have tabs at the beginning -# output: returns a number 1 is the lowest -def getLineLevel(linein): - strstart = linein.lstrip() # find the start of text in line - x = linein.find(strstart) # find the text index in the line - n = linein.count("\t", 0, x) # count the tabs - return(n) # return the count + 1 (for level) - - -# processFile -# split an outline file -# input: file - the filehandle of the file we are splitting -# output: output files -def processFile(file): - global debug, pattern, ignorecase - - parents = [] - parentprinted = [] - for i in range(10): - parents.append("") - parentprinted.append(0) - - matchlevel = 0 - line = file.readline() # read the outline title - # and discard it - line = file.readline() # read the first parent heading - while (line != ""): - level = getLineLevel(line) - parents[level] = line - parentprinted[level] = 0 - if (ignorecase == 1): - linesearch = re.search(pattern, line.strip(), re.I) - else: - linesearch = re.search(pattern, line.strip()) - if (linesearch is not None): - matchlevel = level - for i in range(level): # print my ancestors - if (parentprinted[i] == 0): - print parents[i][:-1] - parentprinted[i] = 1 - print parents[level][:-1] # print myself - line = file.readline() - while (line != "") and (getLineLevel(line) > matchlevel): - print line[:-1] - line = file.readline() - else: - line = file.readline() - - -# main -# split an outline -# input: args and input file -# output: output files - -def main(): - global inputfiles, debug - getArgs() - if (len(inputfiles) == 0): - processFile(sys.stdin) - else: - for i in range(len(inputfiles)): - file = open(inputfiles[i], "r") - processFile(file) - file.close() - -main() diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otlhead.sh b/pack/acp/start/vimoutliner/vimoutliner/scripts/otlhead.sh deleted file mode 100755 index ea05fda..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otlhead.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -if [ "$#" -lt 1 ] ; then - echo " Usage: otlhead level < file" - echo " Keep the number of levels specified, remove the rest." - echo " Great for generating summaries." - echo " level - the number of levels to include" - echo " file - an otl file" - echo " input - standard in" - echo " output - standard out" - exit 0 -fi -sed "/^\(\t\)\{$1\}.*$/ { D }" diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otlsplit.py b/pack/acp/start/vimoutliner/vimoutliner/scripts/otlsplit.py deleted file mode 100755 index 2715e89..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otlsplit.py +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/python2 -# otlslit.py -# split an outline into several files. -# -# Copyright 2005 Noel Henson All rights reserved - -########################################################################### -# Basic function -# -# This program accepts text outline files and splits them into -# several smaller files. The output file names are produced from the -# heading names of the parents. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . - -########################################################################### -# include whatever mdules we need - -import sys -import re -########################################################################### -# global variables - -debug = 0 -subdir = "" -level = 1 -title = 0 -inputfile = "" - - -########################################################################### -# function definitions# usage -# -# print debug statements -# input: string -# output: string printed to standard out -def dprint(*vals): - global debug - if debug != 0: - print vals - - -# usage -# print the simplest form of help -# input: none -# output: simple command usage is printed on the console -def showUsage(): - print """ - Usage: - otlsplit.py [options] inputfile - Options - -l level The number of levels to split down to. The default is 1 - -D dir Specifiy a target directory for the output files - -t Include a title line (the parerent heading) in split files - -h Show help. - output is on STDOUT - """ - - -# getArgs -# Check for input arguments and set the necessary switches -# input: none -# output: possible console output for help, switch variables may be set -def getArgs(): - global debug, level, inputfile, title, subdir - if (len(sys.argv) == 1): - showUsage() - sys.exit()() - else: - for i in range(len(sys.argv)): - if (i != 0): - if (sys.argv[i] == "-d"): - debug = 1 # test for debug flag - elif (sys.argv[i] == "-?"): # test for help flag - showUsage() # show the help - sys.exit() # exit - elif (sys.argv[i] == "-l"): # test for the level flag - level = int(sys.argv[i + 1]) # get the level - i = i + 1 # increment the pointer - elif (sys.argv[i] == "-D"): # test for the subdir flag - subdir = sys.argv[i + 1] # get the subdir - i = i + 1 # increment the pointer - elif (sys.argv[i] == "-t"): - title = 1 # test for title flag - elif (sys.argv[i] == "--help"): - showUsage() - sys.exit() - elif (sys.argv[i] == "-h"): - showUsage() - sys.exit() - elif (sys.argv[i][0] == "-"): - print "Error! Unknown option. Aborting" - sys.exit() - else: # get the input file name - inputfile = sys.argv[i] - - -# getLineLevel -# get the level of the current line (count the number of tabs) -# input: linein - a single line that may or may not have tabs at the beginning -# output: returns a number 1 is the lowest -def getLineLevel(linein): - strstart = linein.lstrip() # find the start of text in line - x = linein.find(strstart) # find the text index in the line - n = linein.count("\t", 0, x) # count the tabs - return(n + 1) # return the count + 1 (for level) - - -# convertSensitiveChars -# get the level of the current line (count the number of tabs) -# input: line - a single line that may or may not have tabs at the beginning -# output: returns a string -def convertSensitiveChars(line): - line = re.sub('\W', '_', line.strip()) - return(line) - - -# makeFileName -# make a file name from the string array provided -# input: line - a single line that may or may not have tabs at the beginning -# output: returns a string -def makeFileName(nameParts): - global debug, level, subdir - - filename = "" - for i in range(level): - filename = filename + convertSensitiveChars(nameParts[i]).strip() + "-" - filename = filename[:-1] + ".otl" - if subdir != "": - filename = subdir + "/" + filename - return(filename.lower()) - - -# processFile -# split an outline file -# input: file - the filehandle of the file we are splitting -# output: output files -def processFile(ifile): - global debug, level, title - - nameparts = [] - for i in range(10): - nameparts.append("") - - outOpen = 0 - - line = ifile.readline() # read the outline title - # and discard it - line = ifile.readline() # read the first parent heading - dprint(level) - while (line != ""): - linelevel = getLineLevel(line) - if (linelevel < level): - if outOpen == 1: - ifile.close() - outOpen = 0 - nameparts[linelevel] = line - dprint(level, linelevel, line) - else: - if outOpen == 0: - ofile = open(makeFileName(nameparts), "w") - outOpen = 1 - if title == 1: - dprint("title:", title) - ofile.write(nameparts[level - 1]) - ofile.write(line[level:]) - line = file.readline() - - -# main -# split an outline -# input: args and input file -# output: output files -def main(): - global inputfile, debug - getArgs() - file = open(inputfile, "r") - processFile(file) - file.close() - -main() diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/otltail.sh b/pack/acp/start/vimoutliner/vimoutliner/scripts/otltail.sh deleted file mode 100755 index 82df8a0..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/otltail.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -if [ "$#" -lt 1 ] ; then - echo " Usage: otltail level < file" - echo " Remove the specified number of parent headings." - echo " This is a way to promote children. It is" - echo " useful for converting a single outline into a" - echo " number of pages for a web site or chapters for" - echo " a book." - echo " level - the number of levels to include" - echo " file - an otl file" - echo " input - standard in" - echo " output - standard out" - exit 0 -fi -sed "/^\(\t\)\{$1\}.*$/! { D }" | sed "s/^\(\t\)\{$1\}//" diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/2005.otl b/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/2005.otl deleted file mode 100644 index 5d93abe..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/2005.otl +++ /dev/null @@ -1,1472 +0,0 @@ -January 2005 - 2005_01_01 Sat - To do - Diary - Timesheet - 2005_01_02 Sun - To do - Diary - Timesheet - 2005_01_03 Mon - To do - Diary - Timesheet - 2005_01_04 Tue - To do - Diary - Timesheet - 2005_01_05 Wed - To do - Diary - Timesheet - 2005_01_06 Thu - To do - Diary - Timesheet - 2005_01_07 Fri - To do - Diary - Timesheet - 2005_01_08 Sat - To do - Diary - Timesheet - 2005_01_09 Sun - To do - Diary - Timesheet - 2005_01_10 Mon - To do - Diary - Timesheet - 2005_01_11 Tue - To do - Diary - Timesheet - 2005_01_12 Wed - To do - Diary - Timesheet - 2005_01_13 Thu - To do - Diary - Timesheet - 2005_01_14 Fri - To do - Diary - Timesheet - 2005_01_15 Sat - To do - Diary - Timesheet - 2005_01_16 Sun - To do - Diary - Timesheet - 2005_01_17 Mon - To do - Diary - Timesheet - 2005_01_18 Tue - To do - Diary - Timesheet - 2005_01_19 Wed - To do - Diary - Timesheet - 2005_01_20 Thu - To do - Diary - Timesheet - 2005_01_21 Fri - To do - Diary - Timesheet - 2005_01_22 Sat - To do - Diary - Timesheet - 2005_01_23 Sun - To do - Diary - Timesheet - 2005_01_24 Mon - To do - Diary - Timesheet - 2005_01_25 Tue - To do - Diary - Timesheet - 2005_01_26 Wed - To do - Diary - Timesheet - 2005_01_27 Thu - To do - Diary - Timesheet - 2005_01_28 Fri - To do - Diary - Timesheet - 2005_01_29 Sat - To do - Diary - Timesheet - 2005_01_30 Sun - To do - Diary - Timesheet - 2005_01_31 Mon - To do - Diary - Timesheet -February 2005 - 2005_02_01 Tue - To do - Diary - Timesheet - 2005_02_02 Wed - To do - Diary - Timesheet - 2005_02_03 Thu - To do - Diary - Timesheet - 2005_02_04 Fri - To do - Diary - Timesheet - 2005_02_05 Sat - To do - Diary - Timesheet - 2005_02_06 Sun - To do - Diary - Timesheet - 2005_02_07 Mon - To do - Diary - Timesheet - 2005_02_08 Tue - To do - Diary - Timesheet - 2005_02_09 Wed - To do - Diary - Timesheet - 2005_02_10 Thu - To do - Diary - Timesheet - 2005_02_11 Fri - To do - Diary - Timesheet - 2005_02_12 Sat - To do - Diary - Timesheet - 2005_02_13 Sun - To do - Diary - Timesheet - 2005_02_14 Mon - To do - Diary - Timesheet - 2005_02_15 Tue - To do - Diary - Timesheet - 2005_02_16 Wed - To do - Diary - Timesheet - 2005_02_17 Thu - To do - Diary - Timesheet - 2005_02_18 Fri - To do - Diary - Timesheet - 2005_02_19 Sat - To do - Diary - Timesheet - 2005_02_20 Sun - To do - Diary - Timesheet - 2005_02_21 Mon - To do - Diary - Timesheet - 2005_02_22 Tue - To do - Diary - Timesheet - 2005_02_23 Wed - To do - Diary - Timesheet - 2005_02_24 Thu - To do - Diary - Timesheet - 2005_02_25 Fri - To do - Diary - Timesheet - 2005_02_26 Sat - To do - Diary - Timesheet - 2005_02_27 Sun - To do - Diary - Timesheet - 2005_02_28 Mon - To do - Diary - Timesheet -March 2005 - 2005_03_01 Tue - To do - Diary - Timesheet - 2005_03_02 Wed - To do - Diary - Timesheet - 2005_03_03 Thu - To do - Diary - Timesheet - 2005_03_04 Fri - To do - Diary - Timesheet - 2005_03_05 Sat - To do - Diary - Timesheet - 2005_03_06 Sun - To do - Diary - Timesheet - 2005_03_07 Mon - To do - Diary - Timesheet - 2005_03_08 Tue - To do - Diary - Timesheet - 2005_03_09 Wed - To do - Diary - Timesheet - 2005_03_10 Thu - To do - Diary - Timesheet - 2005_03_11 Fri - To do - Diary - Timesheet - 2005_03_12 Sat - To do - Diary - Timesheet - 2005_03_13 Sun - To do - Diary - Timesheet - 2005_03_14 Mon - To do - Diary - Timesheet - 2005_03_15 Tue - To do - Diary - Timesheet - 2005_03_16 Wed - To do - Diary - Timesheet - 2005_03_17 Thu - To do - Diary - Timesheet - 2005_03_18 Fri - To do - Diary - Timesheet - 2005_03_19 Sat - To do - Diary - Timesheet - 2005_03_20 Sun - To do - Diary - Timesheet - 2005_03_21 Mon - To do - Diary - Timesheet - 2005_03_22 Tue - To do - Diary - Timesheet - 2005_03_23 Wed - To do - Diary - Timesheet - 2005_03_24 Thu - To do - Diary - Timesheet - 2005_03_25 Fri - To do - Diary - Timesheet - 2005_03_26 Sat - To do - Diary - Timesheet - 2005_03_27 Sun - To do - Diary - Timesheet - 2005_03_28 Mon - To do - Diary - Timesheet - 2005_03_29 Tue - To do - Diary - Timesheet - 2005_03_30 Wed - To do - Diary - Timesheet - 2005_03_31 Thu - To do - Diary - Timesheet -April 2005 - 2005_04_01 Fri - To do - Diary - Timesheet - 2005_04_02 Sat - To do - Diary - Timesheet - 2005_04_03 Sun - To do - Diary - Timesheet - 2005_04_04 Mon - To do - Diary - Timesheet - 2005_04_05 Tue - To do - Diary - Timesheet - 2005_04_06 Wed - To do - Diary - Timesheet - 2005_04_07 Thu - To do - Diary - Timesheet - 2005_04_08 Fri - To do - Diary - Timesheet - 2005_04_09 Sat - To do - Diary - Timesheet - 2005_04_10 Sun - To do - Diary - Timesheet - 2005_04_11 Mon - To do - Diary - Timesheet - 2005_04_12 Tue - To do - Diary - Timesheet - 2005_04_13 Wed - To do - Diary - Timesheet - 2005_04_14 Thu - To do - Diary - Timesheet - 2005_04_15 Fri - To do - Diary - Timesheet - 2005_04_16 Sat - To do - Diary - Timesheet - 2005_04_17 Sun - To do - Diary - Timesheet - 2005_04_18 Mon - To do - Diary - Timesheet - 2005_04_19 Tue - To do - Diary - Timesheet - 2005_04_20 Wed - To do - Diary - Timesheet - 2005_04_21 Thu - To do - Diary - Timesheet - 2005_04_22 Fri - To do - Diary - Timesheet - 2005_04_23 Sat - To do - Diary - Timesheet - 2005_04_24 Sun - To do - Diary - Timesheet - 2005_04_25 Mon - To do - Diary - Timesheet - 2005_04_26 Tue - To do - Diary - Timesheet - 2005_04_27 Wed - To do - Diary - Timesheet - 2005_04_28 Thu - To do - Diary - Timesheet - 2005_04_29 Fri - To do - Diary - Timesheet - 2005_04_30 Sat - To do - Diary - Timesheet -May 2005 - 2005_05_01 Sun - To do - Diary - Timesheet - 2005_05_02 Mon - To do - Diary - Timesheet - 2005_05_03 Tue - To do - Diary - Timesheet - 2005_05_04 Wed - To do - Diary - Timesheet - 2005_05_05 Thu - To do - Diary - Timesheet - 2005_05_06 Fri - To do - Diary - Timesheet - 2005_05_07 Sat - To do - Diary - Timesheet - 2005_05_08 Sun - To do - Diary - Timesheet - 2005_05_09 Mon - To do - Diary - Timesheet - 2005_05_10 Tue - To do - Diary - Timesheet - 2005_05_11 Wed - To do - Diary - Timesheet - 2005_05_12 Thu - To do - Diary - Timesheet - 2005_05_13 Fri - To do - Diary - Timesheet - 2005_05_14 Sat - To do - Diary - Timesheet - 2005_05_15 Sun - To do - Diary - Timesheet - 2005_05_16 Mon - To do - Diary - Timesheet - 2005_05_17 Tue - To do - Diary - Timesheet - 2005_05_18 Wed - To do - Diary - Timesheet - 2005_05_19 Thu - To do - Diary - Timesheet - 2005_05_20 Fri - To do - Diary - Timesheet - 2005_05_21 Sat - To do - Diary - Timesheet - 2005_05_22 Sun - To do - Diary - Timesheet - 2005_05_23 Mon - To do - Diary - Timesheet - 2005_05_24 Tue - To do - Diary - Timesheet - 2005_05_25 Wed - To do - Diary - Timesheet - 2005_05_26 Thu - To do - Diary - Timesheet - 2005_05_27 Fri - To do - Diary - Timesheet - 2005_05_28 Sat - To do - Diary - Timesheet - 2005_05_29 Sun - To do - Diary - Timesheet - 2005_05_30 Mon - To do - Diary - Timesheet - 2005_05_31 Tue - To do - Diary - Timesheet -June 2005 - 2005_06_01 Wed - To do - Diary - Timesheet - 2005_06_02 Thu - To do - Diary - Timesheet - 2005_06_03 Fri - To do - Diary - Timesheet - 2005_06_04 Sat - To do - Diary - Timesheet - 2005_06_05 Sun - To do - Diary - Timesheet - 2005_06_06 Mon - To do - Diary - Timesheet - 2005_06_07 Tue - To do - Diary - Timesheet - 2005_06_08 Wed - To do - Diary - Timesheet - 2005_06_09 Thu - To do - Diary - Timesheet - 2005_06_10 Fri - To do - Diary - Timesheet - 2005_06_11 Sat - To do - Diary - Timesheet - 2005_06_12 Sun - To do - Diary - Timesheet - 2005_06_13 Mon - To do - Diary - Timesheet - 2005_06_14 Tue - To do - Diary - Timesheet - 2005_06_15 Wed - To do - Diary - Timesheet - 2005_06_16 Thu - To do - Diary - Timesheet - 2005_06_17 Fri - To do - Diary - Timesheet - 2005_06_18 Sat - To do - Diary - Timesheet - 2005_06_19 Sun - To do - Diary - Timesheet - 2005_06_20 Mon - To do - Diary - Timesheet - 2005_06_21 Tue - To do - Diary - Timesheet - 2005_06_22 Wed - To do - Diary - Timesheet - 2005_06_23 Thu - To do - Diary - Timesheet - 2005_06_24 Fri - To do - Diary - Timesheet - 2005_06_25 Sat - To do - Diary - Timesheet - 2005_06_26 Sun - To do - Diary - Timesheet - 2005_06_27 Mon - To do - Diary - Timesheet - 2005_06_28 Tue - To do - Diary - Timesheet - 2005_06_29 Wed - To do - Diary - Timesheet - 2005_06_30 Thu - To do - Diary - Timesheet -July 2005 - 2005_07_01 Fri - To do - Diary - Timesheet - 2005_07_02 Sat - To do - Diary - Timesheet - 2005_07_03 Sun - To do - Diary - Timesheet - 2005_07_04 Mon - To do - Diary - Timesheet - 2005_07_05 Tue - To do - Diary - Timesheet - 2005_07_06 Wed - To do - Diary - Timesheet - 2005_07_07 Thu - To do - Diary - Timesheet - 2005_07_08 Fri - To do - Diary - Timesheet - 2005_07_09 Sat - To do - Diary - Timesheet - 2005_07_10 Sun - To do - Diary - Timesheet - 2005_07_11 Mon - To do - Diary - Timesheet - 2005_07_12 Tue - To do - Diary - Timesheet - 2005_07_13 Wed - To do - Diary - Timesheet - 2005_07_14 Thu - To do - Diary - Timesheet - 2005_07_15 Fri - To do - Diary - Timesheet - 2005_07_16 Sat - To do - Diary - Timesheet - 2005_07_17 Sun - To do - Diary - Timesheet - 2005_07_18 Mon - To do - Diary - Timesheet - 2005_07_19 Tue - To do - Diary - Timesheet - 2005_07_20 Wed - To do - Diary - Timesheet - 2005_07_21 Thu - To do - Diary - Timesheet - 2005_07_22 Fri - To do - Diary - Timesheet - 2005_07_23 Sat - To do - Diary - Timesheet - 2005_07_24 Sun - To do - Diary - Timesheet - 2005_07_25 Mon - To do - Diary - Timesheet - 2005_07_26 Tue - To do - Diary - Timesheet - 2005_07_27 Wed - To do - Diary - Timesheet - 2005_07_28 Thu - To do - Diary - Timesheet - 2005_07_29 Fri - To do - Diary - Timesheet - 2005_07_30 Sat - To do - Diary - Timesheet - 2005_07_31 Sun - To do - Diary - Timesheet -August 2005 - 2005_08_01 Mon - To do - Diary - Timesheet - 2005_08_02 Tue - To do - Diary - Timesheet - 2005_08_03 Wed - To do - Diary - Timesheet - 2005_08_04 Thu - To do - Diary - Timesheet - 2005_08_05 Fri - To do - Diary - Timesheet - 2005_08_06 Sat - To do - Diary - Timesheet - 2005_08_07 Sun - To do - Diary - Timesheet - 2005_08_08 Mon - To do - Diary - Timesheet - 2005_08_09 Tue - To do - Diary - Timesheet - 2005_08_10 Wed - To do - Diary - Timesheet - 2005_08_11 Thu - To do - Diary - Timesheet - 2005_08_12 Fri - To do - Diary - Timesheet - 2005_08_13 Sat - To do - Diary - Timesheet - 2005_08_14 Sun - To do - Diary - Timesheet - 2005_08_15 Mon - To do - Diary - Timesheet - 2005_08_16 Tue - To do - Diary - Timesheet - 2005_08_17 Wed - To do - Diary - Timesheet - 2005_08_18 Thu - To do - Diary - Timesheet - 2005_08_19 Fri - To do - Diary - Timesheet - 2005_08_20 Sat - To do - Diary - Timesheet - 2005_08_21 Sun - To do - Diary - Timesheet - 2005_08_22 Mon - To do - Diary - Timesheet - 2005_08_23 Tue - To do - Diary - Timesheet - 2005_08_24 Wed - To do - Diary - Timesheet - 2005_08_25 Thu - To do - Diary - Timesheet - 2005_08_26 Fri - To do - Diary - Timesheet - 2005_08_27 Sat - To do - Diary - Timesheet - 2005_08_28 Sun - To do - Diary - Timesheet - 2005_08_29 Mon - To do - Diary - Timesheet - 2005_08_30 Tue - To do - Diary - Timesheet - 2005_08_31 Wed - To do - Diary - Timesheet -September 2005 - 2005_09_01 Thu - To do - Diary - Timesheet - 2005_09_02 Fri - To do - Diary - Timesheet - 2005_09_03 Sat - To do - Diary - Timesheet - 2005_09_04 Sun - To do - Diary - Timesheet - 2005_09_05 Mon - To do - Diary - Timesheet - 2005_09_06 Tue - To do - Diary - Timesheet - 2005_09_07 Wed - To do - Diary - Timesheet - 2005_09_08 Thu - To do - Diary - Timesheet - 2005_09_09 Fri - To do - Diary - Timesheet - 2005_09_10 Sat - To do - Diary - Timesheet - 2005_09_11 Sun - To do - Diary - Timesheet - 2005_09_12 Mon - To do - Diary - Timesheet - 2005_09_13 Tue - To do - Diary - Timesheet - 2005_09_14 Wed - To do - Diary - Timesheet - 2005_09_15 Thu - To do - Diary - Timesheet - 2005_09_16 Fri - To do - Diary - Timesheet - 2005_09_17 Sat - To do - Diary - Timesheet - 2005_09_18 Sun - To do - Diary - Timesheet - 2005_09_19 Mon - To do - Diary - Timesheet - 2005_09_20 Tue - To do - Diary - Timesheet - 2005_09_21 Wed - To do - Diary - Timesheet - 2005_09_22 Thu - To do - Diary - Timesheet - 2005_09_23 Fri - To do - Diary - Timesheet - 2005_09_24 Sat - To do - Diary - Timesheet - 2005_09_25 Sun - To do - Diary - Timesheet - 2005_09_26 Mon - To do - Diary - Timesheet - 2005_09_27 Tue - To do - Diary - Timesheet - 2005_09_28 Wed - To do - Diary - Timesheet - 2005_09_29 Thu - To do - Diary - Timesheet - 2005_09_30 Fri - To do - Diary - Timesheet -October 2005 - 2005_10_01 Sat - To do - Diary - Timesheet - 2005_10_02 Sun - To do - Diary - Timesheet - 2005_10_03 Mon - To do - Diary - Timesheet - 2005_10_04 Tue - To do - Diary - Timesheet - 2005_10_05 Wed - To do - Diary - Timesheet - 2005_10_06 Thu - To do - Diary - Timesheet - 2005_10_07 Fri - To do - Diary - Timesheet - 2005_10_08 Sat - To do - Diary - Timesheet - 2005_10_09 Sun - To do - Diary - Timesheet - 2005_10_10 Mon - To do - Diary - Timesheet - 2005_10_11 Tue - To do - Diary - Timesheet - 2005_10_12 Wed - To do - Diary - Timesheet - 2005_10_13 Thu - To do - Diary - Timesheet - 2005_10_14 Fri - To do - Diary - Timesheet - 2005_10_15 Sat - To do - Diary - Timesheet - 2005_10_16 Sun - To do - Diary - Timesheet - 2005_10_17 Mon - To do - Diary - Timesheet - 2005_10_18 Tue - To do - Diary - Timesheet - 2005_10_19 Wed - To do - Diary - Timesheet - 2005_10_20 Thu - To do - Diary - Timesheet - 2005_10_21 Fri - To do - Diary - Timesheet - 2005_10_22 Sat - To do - Diary - Timesheet - 2005_10_23 Sun - To do - Diary - Timesheet - 2005_10_24 Mon - To do - Diary - Timesheet - 2005_10_25 Tue - To do - Diary - Timesheet - 2005_10_26 Wed - To do - Diary - Timesheet - 2005_10_27 Thu - To do - Diary - Timesheet - 2005_10_28 Fri - To do - Diary - Timesheet - 2005_10_29 Sat - To do - Diary - Timesheet - 2005_10_30 Sun - To do - Diary - Timesheet - 2005_10_31 Mon - To do - Diary - Timesheet -November 2005 - 2005_11_01 Tue - To do - Diary - Timesheet - 2005_11_02 Wed - To do - Diary - Timesheet - 2005_11_03 Thu - To do - Diary - Timesheet - 2005_11_04 Fri - To do - Diary - Timesheet - 2005_11_05 Sat - To do - Diary - Timesheet - 2005_11_06 Sun - To do - Diary - Timesheet - 2005_11_07 Mon - To do - Diary - Timesheet - 2005_11_08 Tue - To do - Diary - Timesheet - 2005_11_09 Wed - To do - Diary - Timesheet - 2005_11_10 Thu - To do - Diary - Timesheet - 2005_11_11 Fri - To do - Diary - Timesheet - 2005_11_12 Sat - To do - Diary - Timesheet - 2005_11_13 Sun - To do - Diary - Timesheet - 2005_11_14 Mon - To do - Diary - Timesheet - 2005_11_15 Tue - To do - Diary - Timesheet - 2005_11_16 Wed - To do - Diary - Timesheet - 2005_11_17 Thu - To do - Diary - Timesheet - 2005_11_18 Fri - To do - Diary - Timesheet - 2005_11_19 Sat - To do - Diary - Timesheet - 2005_11_20 Sun - To do - Diary - Timesheet - 2005_11_21 Mon - To do - Diary - Timesheet - 2005_11_22 Tue - To do - Diary - Timesheet - 2005_11_23 Wed - To do - Diary - Timesheet - 2005_11_24 Thu - To do - Diary - Timesheet - 2005_11_25 Fri - To do - Diary - Timesheet - 2005_11_26 Sat - To do - Diary - Timesheet - 2005_11_27 Sun - To do - Diary - Timesheet - 2005_11_28 Mon - To do - Diary - Timesheet - 2005_11_29 Tue - To do - Diary - Timesheet - 2005_11_30 Wed - To do - Diary - Timesheet -December 2005 - 2005_12_01 Thu - To do - Diary - Timesheet - 2005_12_02 Fri - To do - Diary - Timesheet - 2005_12_03 Sat - To do - Diary - Timesheet - 2005_12_04 Sun - To do - Diary - Timesheet - 2005_12_05 Mon - To do - Diary - Timesheet - 2005_12_06 Tue - To do - Diary - Timesheet - 2005_12_07 Wed - To do - Diary - Timesheet - 2005_12_08 Thu - To do - Diary - Timesheet - 2005_12_09 Fri - To do - Diary - Timesheet - 2005_12_10 Sat - To do - Diary - Timesheet - 2005_12_11 Sun - To do - Diary - Timesheet - 2005_12_12 Mon - To do - Diary - Timesheet - 2005_12_13 Tue - To do - Diary - Timesheet - 2005_12_14 Wed - To do - Diary - Timesheet - 2005_12_15 Thu - To do - Diary - Timesheet - 2005_12_16 Fri - To do - Diary - Timesheet - 2005_12_17 Sat - To do - Diary - Timesheet - 2005_12_18 Sun - To do - Diary - Timesheet - 2005_12_19 Mon - To do - Diary - Timesheet - 2005_12_20 Tue - To do - Diary - Timesheet - 2005_12_21 Wed - To do - Diary - Timesheet - 2005_12_22 Thu - To do - Diary - Timesheet - 2005_12_23 Fri - To do - Diary - Timesheet - 2005_12_24 Sat - To do - Diary - Timesheet - 2005_12_25 Sun - To do - Diary - Timesheet - 2005_12_26 Mon - To do - Diary - Timesheet - 2005_12_27 Tue - To do - Diary - Timesheet - 2005_12_28 Wed - To do - Diary - Timesheet - 2005_12_29 Thu - To do - Diary - Timesheet - 2005_12_30 Fri - To do - Diary - Timesheet - 2005_12_31 Sat - To do - Diary - Timesheet diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vimrc b/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vimrc deleted file mode 100644 index 7537878..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vimrc +++ /dev/null @@ -1,31 +0,0 @@ -" add the calendar tag file to the tag search stack -set tags^=~/Outlines/outline_calendar/vo_calendar_tags.tag - -" open the calendar at date -" a:1 is executed before the jump -function ToDate(date, ...) - let l:precmd = a:0>0 ? a:1 : "" - exec l:precmd - exec "tag " . a:date . "|normal zO" -endfunction - -" open the calendar at a requested date -" default is today -" a:1 is executed before the jump -function ToSomeDay(...) - let l:precmd = a:0>0 ? a:1 : "" - let l:today = strftime("%Y-%m-%d") - let l:date = input('Date To Goto (yyyy-mm-dd): ', today) - call ToDate(l:date, l:precmd) -endfunction - -" small case jumps use same window -nmap td :call ToDate(strftime("%Y-%m-%d")) -nmap ts :call ToSomeDay() -nmap tc :call ToDate(expand("")) - -" upper case jumps open new window -nmap tD :call ToDate(strftime("%Y-%m-%d"),"new") -nmap tS :call ToSomeDay("new") -nmap tC :call ToDate(expand(""),"new") - diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_ctags.conf b/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_ctags.conf deleted file mode 100644 index 579da09..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_ctags.conf +++ /dev/null @@ -1,9 +0,0 @@ ---langdef=outline ---langmap=outline:.otl ---regex-outline=/_tag_ set ([^ ]+)/_tag_\1/ ---regex-outline=/^\t+([1-9][0-9]{3})_([01][0-9])_([0-3][0-9])/\1-\2-\3/ - ---languages=-all,+outline ---recurse - ---totals=yes diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_generator.rb b/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_generator.rb deleted file mode 100755 index adbbc6f..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_generator.rb +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/ruby - -# usage: -# calendar_generator.rb - -# indent for months, days are indented one more level -# both 0 and 1 make sense -MONTHINDENT = 0 - - -# insert _tag_ todo and _tag_ done items under each day -# DIARY = ["Zu erledigen", "Tagebuch", "Abrechnen"] -# DIARY = [] # for empty days. -DIARY = ["To do", "Diary", "Timesheet"] # deluxe edition - - -# adapt to your preference -# Sunday should be first, Saturday last entry -# DAYNAMES = %w(So Mo Di Mi Do Fr Sa) -DAYNAMES = %w(Sun Mon Tue Wed Thu Fri Sat) - - -# January should be first, December last entry -# MONTHNAMES = %w(Januar Februar Mrz April Mai Juni Juli August September Oktober November Dezember) -MONTHNAMES = %w(January February March April May June July August September October November December) - -# you should not need to change anything below here -# but you are welcome to write equivalent functionality -# in your language of choice. -# ------------------------------------------------------------ -require "date" - -TAGFORMAT = "%.4d_%.2d_%.2d" - - -def indent(sublevel) - "\t"*(MONTHINDENT+sublevel) -end - -def month(date) - MONTHNAMES[date.month - 1] + - (MONTHINDENT == 0 ? " " + date.year.to_s : "") -end - -class Shelf - def initialize(path) - begin - @shelf = File.readlines(path) - rescue - @shelf = Array.new - end - @path = path - end - def parse - unless @books - @books = Hash.new - (0...@shelf.size).step(2) do |i| - @books[@shelf[i].strip] = @shelf[i+1].strip - end - end - end - def save() - File.open(@path, "w") do |out| - @books.sort.each do |key,value| - out.puts(key) - out.puts("\t" + value) - end if @books - end - end - def update(year) - re = /^_tag_calendar_#{year}/ - unless @shelf.any? { |str| re.match(str) } - parse - @books["_tag_calendar_#{year}"] = "#{year}.otl" - save - end - end -end - -def update_shelf(year) - shelf = Shelf.new(CALENDAR + "/vo_calendar_shelf.otl") - shelf.update(year) -end - -CALENDAR = ARGV.shift - -ARGV.each do |arg| - - File.open(CALENDAR + "/" + arg + ".otl", "w") do |out| - - update_shelf(arg) - year = arg.to_i - d = Date.new(year, 1, 1) - out.puts year if MONTHINDENT == 1 - - while d.year == year - out.puts indent(0) + month(d) - month = d.month - while d.month == month - out.puts indent(1) + (TAGFORMAT % [d.year, d.month, d.day]) + - " " + DAYNAMES[d.wday] - DIARY.each do |item| - out.puts indent(2) + item - end - d += 1 - end - end - - end -end diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_readme.otl b/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_readme.otl deleted file mode 100644 index 5761781..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_readme.otl +++ /dev/null @@ -1,195 +0,0 @@ -Outline Calendar 1.3 - What's new - in 1.3 - vimrc-script by Lee Bigelow for easy calendar access - small modifications to this outline - update from 1.2.2 - edit tagfile path in outline_calendar/vimrc - add 'source .../outline_calendar/vimrc' to your ~/.vimrc - in 1.2.2 - changed personal _tag_ set definition - : it may appear anywhere, but takes only next space-delimited - : word into account. The advantage is that I can set a tag - : behind a calendar date and jump to the current week via - : _tag_kalender - in 1.2.1 - removed spurious underscores in td function - in 1.2 - use ~/.vimoutlinerrc to avoid tagfile collisions - ,,d-dates usable as links into calendar - calendar dates (almost) without syntactic noise - update to documentation - in 1.1 - we are almost votl_maketags.pl-compatible again - you can use vo_calendar_shelf.otl to attach your calendar shelf to your outline tree - files follow vimoutliner naming convention - all installation files are kept within one directory - minor refinements to console user interface - defaults and samples are in English now - Prerequisites - ruby - used for generating the skeleton calendar and the shelf - could be replaced by perl, awk, python, ... - maybe even by a shell script or a small forth program ;-) - bash - use of special variable expansion in shell-frontend - ctags - create the tags-file for interoutline links and calendar access - regex support necessary - $ ctags --version - : Exuberant Ctags 5.5.1, Copyright (C) 1996-2003 Darren Hiebert - : Compiled: Aug 15 2003, 21:06:30 - : Addresses: , http://ctags.sourceforge.net - : Optional compiled features: +wildcards, +regex - vimoutliner - you should already have it - Known incompatibilities - none - Installation and Configuration - Installation - I recommend keeping all Outlines in one directory - it's easier on ctags - move the distribution folder there - : $ mv outline_calendar ~/Outlines - add another tag file to vim's lookup table - the following line should go into $HOME/.vimrc - : source ~/Outlines/outline_calendar/vimrc - configure the various scripts (see below) - source vo_calendar_ui.sh into your shell - $HOME/.bashrc is probably a good place for this - something like the following should do it - $ . $HOME/Outlines/outline_calendar/vo_calendar_ui.sh - you're ready to run - try - $ calgen 2005 2006 2007 - : you get three yearly calendars plus a shelf to - : access them through _tag_xxx linking - $ tagvout - : this should create a tag file inside the outline - : calendar directory - $ td - : now vimoutliner should be positioned on today - $ vim - in normal mode type \tS - enter a date after the prompt and hit return - the calendar should open in a new window - Configure the calendar layout in vo_calendar_generator.rb - Month layout - with MONTHINDENT=1 - 2006 - January - _2006-01-01_ Sun - _2006-01-02_ Mon - or with MONTHINDENT=0 - January 2006 - _2006-01-01_ Sun - _2006-01-02_ Mon - Optional diary headings for each day - with DIARY=[] - _2006-01-01_ Sun - _2006-01-02_ Mon - with DIARY=["Todo", "Billing", "Personal notes"] - _2006-01-01_ Sun - Todo - Billing - Personal notes - _2006-01-02_ Mon - Todo - Billing - Personal notes - change the language of the calendar - DAYNAMES - names of weekdays starting with Sunday - MONTHNAMES - names of months - calendar skeletons - need not be generated with the ruby script - but we do have an "API" to keep things compatible - : I suggest an approach that can be executed in - : the same way as my ruby script. If you did it - : with perl, you could call the script - : vo_calendar_generator.pl. - : Its first command line parameter should be the - : directory, where the calendar files are stored, - : the remaining parameters denote the years, for which - : calendar skeletons should be generated. - calendar shelf - do not edit manually, a really stupid parser (tm) is reading this - : it contains the _tag_ format links into the various - : yearly calendars. It is "parsed" (if you can call it - : that) to insert a newly created calendar in the correct - : position. - Configure the directory layout in vo_calendar_ui.sh - See the comments there for further explanations - Ideally you only have to set the variable OUTLINES, but YMMV - Configure tag harvesting in vo_calendar_ctags.conf - it should not need any changes - if it does, "man 1 ctags" is your friend - what it does, line by line - define a new language called outline - outline handling rules are applied only to .otl files - recognise headings starting with "_tag_ set " - everything after "_tag_ set " is considered as tag content - : this provides an alternative way of defining tags - : for both interoutline and intraoutline jumps. - : It can safely be removed without harming the - : outline calendar. - : If you keep it, your non-calendar tags will be - : stored in the calendar tagfile, too, but this should - : not be a problem. - recognise headings starting with a yyyy_mm_dd date - Underscore as date separator - are distinct from ,,d dates - date stamps will not be jumped to - date stamps will only be jumped from - they are mangled to hyphens as tag marker - plain ,,d dates can be used to enter the calendar from anywhere - all dates typed by you are in ISO-format yyyy-mm-dd - only tag outline files - handle files in subdirectories, too - show some impressive statistics - Usage - administrative - once: install and configure (see above) - rarely: generate a new calendar - $ calgen 2005 2006 2007 - this will go a long way - often: refresh the tag file - $ tagvout - you might even want to put it in your crontab - don't rely on shell functions there, use plain commands - modulo local changes the crontab entry would look like this: - : */10 * * * * /usr/bin/ctags -f $HOME/.vimoutliner/vo_tags.tag --options=$HOME/Outlines/outline_calendar/vo_calendar_ctags.conf $HOME/Outlines &> /dev/null - refresh tag file every 10 minutes - remove the configuration line --totals, you won't need it there - open calendar from running shell - edit today's calendar entries - $ td - : vimoutliner should open on today - : if you're running X, you'll get a gvim, otherwise a vim - : you'll be on today's entry - move around, add some items to the outline - move cursor on a ISO-format date yyyy-mm-dd and it - edit any available day - $ td 2005-05-04 - : release day - open calendar from running vim session - mappings for normal mode - \td and \tD - jump to today - \tc and \tC - jump to the date at the cursor position - \ts and \tS - ask for date to jump to - Notes - the mappings are defined as t... - the uppercase variant opens a new window within the current session - Author(s) - (c) Stefan Schmiedl 2005-05-04 - Contributors: - Lee Bigelow brought the \t? functions into existence - License - thou shalt neither sue nor blame me - it's worth what you paid for it - thou can do whatever else thou want to do with it - just remember to have fun on the way diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_shelf.otl b/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_shelf.otl deleted file mode 100644 index d8224b0..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_shelf.otl +++ /dev/null @@ -1,6 +0,0 @@ -_tag_calendar_2003 - 2003.otl -_tag_calendar_2004 - 2004.otl -_tag_calendar_2005 - 2005.otl diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_ui.sh b/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_ui.sh deleted file mode 100755 index 0d5b911..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_calendar/vo_calendar_ui.sh +++ /dev/null @@ -1,39 +0,0 @@ -# parent folder of all outlines -OUTLINES=$HOME/Outlines - -# folder for calendar files -# should be a subfolder of $OUTLINES -CALENDAR=$OUTLINES/outline_calendar - -# file for calendar tags -CALENDARTAGS=$CALENDAR/vo_calendar_tags.tag - -# folders to tag for interoutline links and calendar access -# if $CALENDAR is not below $OUTLINES, you need -# TAGFOLDERS=($OUTLINES $CALENDAR) -TAGFOLDERS=($OUTLINES) - -# script to generate calendar skeletons -CALGENSCRIPT=$CALENDAR/vo_calendar_generator.rb - -# option file for ctags -CTAGSOPTIONS=$CALENDAR/vo_calendar_ctags.conf - - -# you should not need to change anything below here -# that's what all the variables above are for -# ------------------------------------------------------------ - -function td() { - local date - date=${1:-`date +%Y-%m-%d`} - ${DISPLAY:+g}vim -c ":ta $date" $CALENDAR/${date%%-*}.otl -} - -function tagvout() { - ctags -f $CALENDARTAGS --options=$CTAGSOPTIONS ${TAGFOLDERS[*]} -} - -function calgen() { - $CALGENSCRIPT $CALENDAR $* -} diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/freemind.py b/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/freemind.py deleted file mode 100755 index 99bebf8..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/freemind.py +++ /dev/null @@ -1,198 +0,0 @@ -#!/usr/bin/python2 - -''' -usage: - freemind.py -o [fmt] , where ofmt selects output format: {otl,mm} - -freemind.py -o otl : - Read in an freemind XML .mm file and generate a outline file - compatable with vim-outliner. -freemind.py -o mm : - Read in an otl file and generate an XML mind map viewable in freemind - -NOTE: - Make sure that you check that round trip on your file works. - -Author: Julian Ryde -''' -import sys -import getopt -import codecs - -import otl -import xml.etree.ElementTree as et -from xml.etree.ElementTree import XMLParser - -debug = False - - -class Outline: # The target object of the parser - depth = -1 - indent = '\t' - current_tag = None - - def start(self, tag, attrib): # Called for each opening tag. - self.depth += 1 - self.current_tag = tag - # print the indented heading - if tag == 'node' and self.depth > 1: - #if 'tab' in attrib['TEXT']: - #import pdb; pdb.set_trace() - print (self.depth - 2) * self.indent + attrib['TEXT'] - - def end(self, tag): # Called for each closing tag. - self.depth -= 1 - self.current_tag = None - - def data(self, data): - if self.current_tag == 'p': - bodyline = data.rstrip('\r\n') - bodyindent = (self.depth - 5) * self.indent + ": " - #textlines = textwrap.wrap(bodytext, width=77-len(bodyindent), - # break_on_hyphens=False) - #for line in textlines: - print bodyindent + bodyline - - def close(self): # Called when all data has been parsed. - pass - - -def mm2otl(*arg, **kwarg): - fname = arg[0][0] - file = codecs.open(fname, 'r', encoding='utf-8') - - filelines = file.readlines() - outline = Outline() - parser = XMLParser(target=outline, encoding='utf-8') - parser.feed(filelines[0].encode('utf-8')) - parser.close() - - -# TODO body text with manual breaks -# TODO commandline arguments for depth, maxlength etc. -# TODO do not read whole file into memory? -# TODO handle decreasing indent by more than one tab -# TODO handle body text lines sometimes not ending with space - -depth = 99 - - -def attach_note(node, textlines): - et.ElementTree - # Format should look like - # - # - # - # - # %s - # - # - # - notenode = et.SubElement(node, 'richcontent') - notenode.set('TYPE', 'NOTE') - htmlnode = et.SubElement(notenode, 'html') - bodynode = et.SubElement(htmlnode, 'body') - for line in textlines: - pnode = et.SubElement(bodynode, 'p') - pnode.text = line - - -def otl2mm(*arg, **kwarg): - fname = arg[0][0] - - # node ID should be based on the line number of line in the - # otl file for easier debugging - #for lineno, line in enumerate(open(fname)): - # enumerate starts at 0 I want to start at 1 - # FIXME freemind.py|107| W806 local variable 'lineno' is assigned to but never used - lineno = 0 - - mapnode = et.Element('map') - mapnode.set('version', '0.9.0') - - topnode = et.SubElement(mapnode, 'node') - topnode.set('TEXT', fname) - - parents = [mapnode, topnode] - - #left_side = True # POSITION="right" - - # read otl file into memory - filelines = codecs.open(fname, 'r', encoding='utf-8') - - # first handle the body texts turn it into a list of headings - # with associated body text for each one this is because the - # body text especially multi-line is what makes it awkward. - headings = [] - bodytexts = [] - for line in filelines: - if otl.is_heading(line): - headings.append(line) - bodytexts.append([]) - else: - # TODO this ': ' removal should go in otl.py? - bodytexts[-1].append(line.lstrip()[2:] + '\n') - - #import pdb; pdb.set_trace() - oldheading = '' - for heading, bodytext in zip(headings, bodytexts): - if debug: - print heading, bodytext - - level = otl.level(heading) - oldlevel = otl.level(oldheading) - - if level == oldlevel: - pass - elif level > oldlevel: - # about to go down in the hierarchy so add this line - # as a parent to the stack - # FIXME freemind.py|149| W802 undefined name 'node' - parents.append(node) - elif level < oldlevel: - # about to go up in the hierarchy so remove parents from the stack - leveldiff = oldlevel - level - parents = parents[:-leveldiff] - - node = et.SubElement(parents[-1], 'node') - node.set('TEXT', heading.lstrip().rstrip('\r\n')) - #if len(bodytext) > 0: - attach_note(node, bodytext) - - oldheading = heading - - xmltree = et.ElementTree(mapnode) - xmltree.write(sys.stdout, 'utf-8') - print - - -def usage(): - print "usage: %s -[mo] " % (sys.argv[0]) - - -def main(): - args = sys.argv - try: - opts, args = getopt.getopt(sys.argv[1:], 'moh', [""]) - except getopt.GetoptError, err: - usage() - print str(err) - sys.exit(2) - - for o, a in opts: - if o == "-m": - otl2mm(args) - elif o == "-o": - mm2otl(args) - elif o == "-h": - usage() - sys.exit(0) - else: - usage() - assert False, "unhandled option: %s" % o - return args - -if __name__ == "__main__": - main() - -# vim: set noet : diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/freemind_outline.py b/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/freemind_outline.py deleted file mode 100644 index 5930cfb..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/freemind_outline.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/python2 -'''Converts a freemind xml .mm file to an outline file compatable with vim -outliner. - -Make sure that you check that round trip on your file works. - -Author: Julian Ryde -''' -import sys -from xml.etree.ElementTree import XMLParser -import textwrap -import codecs - -class Outline: # The target object of the parser - depth = -1 - indent = '\t' - current_tag = None - def start(self, tag, attrib): # Called for each opening tag. - self.depth += 1 - self.current_tag = tag - # print the indented heading - if tag == 'node' and self.depth > 1: - #if 'tab' in attrib['TEXT']: - #import pdb; pdb.set_trace() - print (self.depth-2)*self.indent + attrib['TEXT'] - def end(self, tag): # Called for each closing tag. - self.depth -= 1 - self.current_tag = None - def data(self, data): - if self.current_tag == 'p': - bodyline = data.rstrip('\r\n') - bodyindent = (self.depth-5)*self.indent + ": " - #textlines = textwrap.wrap(bodytext, width=77-len(bodyindent), break_on_hyphens=False) - #for line in textlines: - print bodyindent + bodyline - - def close(self): # Called when all data has been parsed. - pass - -outline = Outline() -parser = XMLParser(target=outline, encoding='utf-8') - -fname = sys.argv[1] -file = codecs.open(fname, 'r', encoding='utf-8') -filelines = file.readlines(); -print "filelines", type(filelines[0]), filelines[0] -parser.feed(filelines[0].encode('utf-8')) -parser.close() diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/otl.py b/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/otl.py deleted file mode 100644 index 9268fdc..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/otl.py +++ /dev/null @@ -1,26 +0,0 @@ -# Some integer IDs -# headings are 1, 2, 3, .... -bodynowrap = -1 # ; -bodywrap = 0 # : - -def level(line): - '''return the heading level 1 for top level and down and 0 for body text''' - if line.lstrip().find(':')==0: return bodywrap - if line.lstrip().find(';')==0: return bodynowrap - strstart = line.lstrip() # find the start of text in lin - x = line.find(strstart) # find the text index in the line - n = line.count("\t",0,x) # count the tabs - return(n+1) # return the count + 1 (for level) - -def is_bodywrap(line): - return level(line) == bodywrap - -def is_bodynowrap(line): - return level(line) == bodynowrap - -def is_heading(line): - return level(line) > 0 - -def is_body(line): - return not is_heading(line) - diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/outline_freemind.py b/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/outline_freemind.py deleted file mode 100755 index cea78da..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/outline_freemind.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/python2 -'''Read in an otl file and generate an xml mind map viewable in freemind - -Make sure that you check that round trip on your file works. - -Author: Julian Ryde -''' - -import sys -import os -import xml.etree.ElementTree as et -import otl -import codecs - -fname = sys.argv[1] -max_length = 40 -depth = 99 - -debug = False - -# TODO body text with manual breaks -# TODO commandline arguments for depth, maxlength etc. -# TODO do not read whole file into memory? -# TODO handle decreasing indent by more than one tab -# TODO handle body text lines sometimes not ending with space - -otlfile = open(fname) -indent = ' ' - -def attach_note(node, textlines): - et.ElementTree - # Format should look like - # - # - # - # - # %s - # - # - # - notenode = et.SubElement(node, 'richcontent') - notenode.set('TYPE', 'NOTE') - htmlnode = et.SubElement(notenode, 'html') - headnode = et.SubElement(htmlnode, 'head') - bodynode = et.SubElement(htmlnode, 'body') - for line in textlines: - pnode = et.SubElement(bodynode, 'p') - pnode.text = line - -# node ID should be based on the line number of line in the otl file for easier -# debugging -#for lineno, line in enumerate(open(fname)): -# enumerate starts at 0 I want to start at 1 -lineno = 0 - -mapnode = et.Element('map') -mapnode.set('version', '0.9.0') - -topnode = et.SubElement(mapnode, 'node') -topnode.set('TEXT', fname) - -parents = [mapnode, topnode] - -#left_side = True # POSITION="right" - -# read otl file into memory -filelines = codecs.open(fname, 'r', encoding='utf-8') - -# remove those that are too deep or body text and pesky end of line characters -#filelines = [line.rstrip('\r\n') for line in filelines if otl.level(line) <= depth] -#filelines = [line for line in filelines if otl.is_heading(line)] - -# first handle the body texts turn it into a list of headings with associated -# body text for each one this is because the body text especially multi-line is -# what makes it awkward. -headings = [] -bodytexts = [] -for line in filelines: - if otl.is_heading(line): - headings.append(line) - bodytexts.append([]) - else: - # TODO this ': ' removal should go in otl.py? - bodytexts[-1].append(line.lstrip()[2:] + '\n') - -#import pdb; pdb.set_trace() -oldheading = '' -for heading, bodytext in zip(headings, bodytexts): - if debug: print heading, bodytext - - level = otl.level(heading) - oldlevel = otl.level(oldheading) - - if level == oldlevel: - pass - elif level > oldlevel: - # about to go down in the hierarchy so add this line as a parent to the - # stack - parents.append(node) - elif level < oldlevel: - # about to go up in the hierarchy so remove parents from the stack - leveldiff = oldlevel - level - parents = parents[:-leveldiff] - - node = et.SubElement(parents[-1], 'node') - node.set('TEXT', heading.lstrip().rstrip('\r\n')) - #if len(bodytext) > 0: - attach_note(node, bodytext) - - oldheading = heading - -xmltree = et.ElementTree(mapnode) -xmltree.write(sys.stdout, 'utf-8') -print diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/test.otl b/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/test.otl deleted file mode 100644 index dd918c6..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/test.otl +++ /dev/null @@ -1,27 +0,0 @@ -A - : This is some early multi-line body text which should wrap. This is some - : early multi-line body text which should wrap. This is some early - : multi-line body text which should wrap. - a - : single line body text - b - 1 - c -B - d - 2 - 3 - 4 -C - -This is a very long heading line that should be longer than the wrap width and so tests this case -Heading with a tab in the middle - : body text with tab in it -Body text with empy line in it - : First line - : - : Third line -Difficult characters - [_] ' " & -Last line body text - : This is a last line of body text diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/test.sh b/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/test.sh deleted file mode 100755 index 15607a1..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/outline_freemind/test.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -tmp=/tmp -dirname=`dirname $0` -fname=$dirname/test.otl -[ -n "$1" ] && fname=$1 - -$dirname/freemind.py -m $fname > $tmp/test.mm -$dirname/freemind.py -o $tmp/test.mm > $tmp/return.otl -diff -Nur $fname $tmp/return.otl diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/vo2html.rb b/pack/acp/start/vimoutliner/vimoutliner/scripts/vo2html.rb deleted file mode 100644 index a4faa03..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/vo2html.rb +++ /dev/null @@ -1,329 +0,0 @@ -#! /usr/bin/ruby - -# = Synopsis -# -# vo2xo: Converts VIM Outliner files to HTML slides. -# -# = Usage -# -# vo2html [OPTION] input-file -# -# -?, --help: show help -# -# -h, --head file-name: -# insert the contents of the named file within the HTML HEAD element. -# -# -b, --body file-name: -# insert the contents of the named file just after the start of the HTML BODY element. -# -# -t, --tail file-name: -# insert the contents of the named file just before the end the HTML BODY element. -# -# input-file: The VIM Outliner file to be converted. - -# LICENSE -# Copyright (C) 2006 Bruce Perens -# -# This license incorporates by reference the terms of GPL Version 3 or, at -# your choice, any later version of the GPL published by the Free Software -# Foundation, Inc. of Boston, MA, USA. -# -# You may not modify this license. You must preserve it and the accompanying -# copyright declaration in any whole or fragmentary verisons of the software -# to which they apply. -# -require 'getoptlong' -require 'rdoc/usage' -require 'rubygems' -require 'builder' -gem 'ruby-mp3info' -require 'mp3info' - -class OutlineParser -private - LeadingTabPattern = /^(\t*)(.*)$/.freeze - ColonPattern = /^:[ \t]*(.*)$/.freeze - -protected - def initialize(file) - @file = file - @pushback = nil - @nesting = 0 - end - - # Get a line, with push-back. - def get_line - if (line = @pushback) - @pushback = nil - return line - else - return @file.gets - end - end - - # Recursive parser for VIM Outliner. - # - # Meant to be called from itself when nesting increases - it calls its - # callers "nest" method, which calls "parse". This fits well with nesting - # output paradigms like that of Builder::XmlMarkup. - # - # Returns when nesting decreases, or if got_heading is set, just before the - # next top-level heading in the input stream. You should iteratively call - # parse() until more() returns false. This facilitates per-heading handling - # such as in the Xoxo converter, which uses first-level heading to demarcate - # the boundaries of slides. - # - # got_heading: If set, this will return just before the next top-level - # heading, leaving it in the push-back. - # - def parse(got_heading = false) - - while (line = get_line()) - m = line.match(LeadingTabPattern) - n = m[1].length # This line's nesting level. - after_tabs = m[2] # Content after zero or more leading tabs. - - # Drop empty lines, and lines with only tabs. - next if after_tabs == '' - - if n != @nesting # The nesting level changes with this line. - previous = @nesting - @nesting = n - @pushback = line - - # If nesting increases, recursively parse it through nest(). - # If nesting decreases, return to nest(), which will in turn - # return here. Both of these can be true in sequence! Nest() - # detects when a nesting level is closed by looking ahead one - # line and then pushing it back. That line can be one or MORE - # levels lesser than the current nesting level. - # - nest(n) if n > previous - return true if n < previous - elsif - if (p = after_tabs.match(ColonPattern)) and p[1].length > 0 - text(p[1], n) - else - if got_heading and n == 0 - @pushback = line - return true # Return before the next top-level heading. - end - - got_heading = true - heading(after_tabs, n) - end - end - end - false - end - -public -# Simple parser that returns true if there is any remaining content - # and leaves that content in the push-back. - # The return value is the content minus any leading tabs. - # - # Usage - # Return true if there is more content: - # if more - # Return the content of the next line to be read. - # more - # - # The second form is used to get the document title from the first line - # in the file. - # - def more - while (line = get_line()) - if (m = line.match(LeadingTabPattern)) and m[2].length > 0 - @pushback = line - return m[2] - end - end - false - end - -end - -class OutlineToHTML < OutlineParser -private - Type = [ :DOCTYPE, - :html, - :PUBLIC, - '-//W3C//DTD XHTML 1.0 Strict//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd' - ].freeze - - def wrap(nesting) - if nesting > 1 - @x.li { yield } - else - yield - end - end - -protected - def heading(text, nesting) - if nesting == 0 - @x.h1(text) - else - @x.li(text) - end - end - - def nest(nesting) - wrap(nesting) { @x.ul(:class => "list-#{nesting}") { parse(true) } } - end - - def text(t, nesting) - @x.p(t) - end - -public - def initialize(input_file, head_insert, body_insert, tail_insert) - @head_insert = head_insert.read if head_insert - @body_insert = body_insert.read if body_insert - @tail_insert = tail_insert.read if tail_insert - super(input_file) - end - - def convert - n = 0 - presentation_title = more - - while (title = more) - audio_filename = "#{n + 1}.mp3" - next_audio_filename = "#{n + 2}.mp3" - - @x = ::Builder::XmlMarkup.new(:indent => 2) - @x.declare!(*Type) - @x.html { - body_parameters = {} - - @x.head { - if title != presentation_title - @x.title("#{presentation_title} - #{title}") - else - @x.title("#{presentation_title}") - end - - @x << eval('"' + @head_insert + '"') if @head_insert - - if File.exists?(audio_filename) - seconds = nil - - Mp3Info.open(audio_filename) { |mp3| - seconds = mp3.length.ceil + 1 - } - - parameters = { - :'http-equiv' => 'refresh', - :content => "#{seconds};url=#{n + 2}.html" - } - @x.meta(parameters) - if File.exists?(next_audio_filename) - program = "function Preload() { a = new Image(); a.src = '#{next_audio_filename}'; p = new Image(); p.src = '#{n + 2}.html' }" - @x.script(program, :language => 'JavaScript') - body_parameters[:onload] = "Preload()" - end - end - } - @x.body(body_parameters) { - @x << eval('"' + @body_insert + '"') if @body_insert - attributes = { :class => 'content' } - # Fix: I don't yet know if this is the last slide, so I can't - # decide whether to do this onclick action or not. - # Oops. We have to generate the body tag after its contents. - # This might be awkward to do within Builder. - attributes[:onclick] = "document.location='#{n + 2}.html'" - @x.div(attributes) { - parse(false) - } - @x.div(:class => 'bottom') { - @x << eval('"' + @tail_insert + '"') if @tail_insert - - @x.div(:class => 'navbar-wrapper') { - @x.ul(:class => 'navbar') { - @x.li(:class => 'previous') { - if n > 0 - @x.a('Previous', :href => "#{n}.html") - end - } - - @x.li(:class => 'top') { - @x.a(presentation_title, :href => "1.html") - } - - @x.li(:class => 'next') { - if more - @x.a('Next', :href => "#{n + 2}.html") - end - } - } - } - if File.exists?(audio_filename) - @x.object(:type => 'audio/mpeg', :data => audio_filename, :width => "95%", :height => 42) { - message = "Your web browser isn't configured correctly to play the audio file #{audio_filename}, and thus you are missing the sound-track to this program." - - @x.param(:name => 'autoplay', :value => true) - @x.param(:name => 'playcount', :value => 1) - @x.param(:name => 'showcontrols', :value => false) - @x.param(:name => 'showdisplay', :value => false) - @x.span(message, :class => 'error') - } - end - } - } - } - File.open("#{n += 1}.html", "w") { |f| - f.write(@x.target!) - } - @x = nil - end - end - -end - - -opts = GetoptLong.new( - [ '--help', '-?', GetoptLong::NO_ARGUMENT ], - [ '--head', '-h', GetoptLong::REQUIRED_ARGUMENT ], - [ '--body', '-b', GetoptLong::REQUIRED_ARGUMENT ], - [ '--tail', '-t', GetoptLong::REQUIRED_ARGUMENT ] -) - -head_insert = nil -body_insert = nil -tail_insert = nil - -begin - opts.each do |opt, arg| - case opt - when '--help' - RDoc::usage - when '--head' - head_insert = File.new(arg, 'r') - when '--body' - body_insert = File.new(arg, 'r') - when '--tail' - tail_insert = File.new(arg, 'r') - end - end - - if ARGV.length != 1 - RDoc::usage - exit 0 - end - - input_file = File.new(ARGV[0], 'r') -rescue Exception => error - $stderr.print("Error: #{error}\n") - exit(1) -end - -c = OutlineToHTML.new(input_file, head_insert, body_insert, tail_insert) -if not c.more - $stderr.write("Error: Input file contains no content.\n") - exit(1) -end - -c.convert -exit(0) diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/vo2odp.rb b/pack/acp/start/vimoutliner/vimoutliner/scripts/vo2odp.rb deleted file mode 100644 index 963fcf3..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/vo2odp.rb +++ /dev/null @@ -1,415 +0,0 @@ -#! /usr/bin/ruby - -# = Synopsis -# -# vo2xo: Converts VIM Outliner files to OpenDocument presentations. -# -# = Usage -# -# vo2odp [OPTION] input-file output-file -# -# -?, --help: show help -# -# input-file: The VIM Outliner file to be converted. - -# LICENSE -# Copyright (C) 2006 Bruce Perens -# -# You may apply the terms of GPL Version 3 or, at your choice, any later -# version of the GPL published by the Free Software Foundation, Inc. of -# Boston, MA, USA, to this software. -# -# You may not modify this license. You must preserve it and the accompanying -# copyright declaration in any whole or fragmentary verisons of the software -# to which they apply. -# -require 'getoptlong' -require 'rdoc/usage' -require 'rubygems' -require_gem 'builder' -require_gem 'rubyzip' -require 'zip/zipfilesystem' - -class OutlineParser -private - LeadingTabPattern = /^(\t*)(.*)$/.freeze - ColonPattern = /^:[ \t]*(.*)$/.freeze - -protected - def initialize(file) - @file = file - @pushback = nil - @nesting = 0 - end - - # Get a line, with push-back. - def get_line - if (line = @pushback) - @pushback = nil - return line - else - return @file.gets - end - end - - # Recursive parser for VIM Outliner. - # - # Meant to be called from itself when nesting increases - it calls its - # callers "nest" method, which calls "parse". This fits well with nesting - # output paradigms like that of Builder::XmlMarkup. - # - # Returns when nesting decreases, or if got_heading is set, just before the - # next top-level heading in the input stream. You should iteratively call - # parse() until more() returns false. This facilitates per-heading handling - # such as in the Xoxo converter, which uses first-level heading to demarcate - # the boundaries of slides. - # - # got_heading: If set, this will return just before the next top-level - # heading, leaving it in the push-back. - # - def parse(got_heading = false) - - while (line = get_line()) - m = line.match(LeadingTabPattern) - n = m[1].length # This line's nesting level. - after_tabs = m[2] # Content after zero or more leading tabs. - - # Drop empty lines, and lines with only tabs. - next if after_tabs == '' - - if n != @nesting # The nesting level changes with this line. - previous = @nesting - @nesting = n - @pushback = line - - # If nesting increases, recursively parse it through nest(). - # If nesting decreases, return to nest(), which will in turn - # return here. Both of these can be true in sequence! Nest() - # detects when a nesting level is closed by looking ahead one - # line and then pushing it back. That line can be one or MORE - # levels lesser than the current nesting level. - # - nest(n) if n > previous - return true if n < previous - elsif - if (p = after_tabs.match(ColonPattern)) and p[1].length > 0 - text(p[1], n) - else - if got_heading and n == 0 - @pushback = line - return true # Return before the next top-level heading. - end - - got_heading = true - heading(after_tabs, n) - end - end - end - false - end - -public - # Simple parser that return true if there is any remaining content - # and leaves that content in the push-back. - # The return value is the content minus any leading tabs. - # - # Usage - # Return true if there is more content: - # if more - # Return the content of the next line to be read. - # more - # - # The second form is used to get the document title from the first line - # in the file. - # - def more - while (line = get_line()) - if (m = line.match(LeadingTabPattern)) and m[2].length > 0 - @pushback = line - return m[2] - end - end - false - end - -end - -module OpenDocument -end -module OpenDocument::Presentation -private - DocumentAttributes = { - :'office:version' => '1.0', - :'xmlns:anim' => 'urn:oasis:names:tc:opendocument:xmlns:animation:1.0', - :'xmlns:chart' => 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0', - :'xmlns:dc' => 'http://purl.org/dc/elements/1.1/', - :'xmlns:dom' => 'http://www.w3.org/2001/xml-events', - :'xmlns:dr3d' => 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0', - :'xmlns:draw' => 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0', - :'xmlns:fo' => 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0', - :'xmlns:form' => 'urn:oasis:names:tc:opendocument:xmlns:form:1.0', - :'xmlns:math' => 'http://www.w3.org/1998/Math/MathML', - :'xmlns:meta' => 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0', - :'xmlns:number' => 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0', - :'xmlns:office' => 'urn:oasis:names:tc:opendocument:xmlns:office:1.0', - :'xmlns:ooo' => 'http://openoffice.org/2004/office', - :'xmlns:oooc' => 'http://openoffice.org/2004/calc', - :'xmlns:ooow' => 'http://openoffice.org/2004/writer', - :'xmlns:presentation' => 'urn:oasis:names:tc:opendocument:xmlns:presentation:1.0', - :'xmlns:script' => 'urn:oasis:names:tc:opendocument:xmlns:script:1.0', - :'xmlns:smil' => 'urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0', - :'xmlns:style' => 'urn:oasis:names:tc:opendocument:xmlns:style:1.0', - :'xmlns:svg' => 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0', - :'xmlns:table' => 'urn:oasis:names:tc:opendocument:xmlns:table:1.0', - :'xmlns:text' => 'urn:oasis:names:tc:opendocument:xmlns:text:1.0', - :'xmlns:xforms' => 'http://www.w3.org/2002/xforms', - :'xmlns:xlink' => 'http://www.w3.org/1999/xlink', - :'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema', - :'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', - }.freeze - - - # Bullet style for a particular indentation level. - def bullet_style(x, level, char, space_before, label_width, font_size) - x.tag!('text:list-level-style-bullet', :'text:level' => level, - :'text:bullet-char' => char) { - if level > 1 - x.tag!('style:list-level-properties', - :'text:space-before' => space_before, - :'text:min-label-width' => label_width) - end - x.tag!('style:text-properties', :'fo:font-family' => 'StarSymbol', - :'style:use-window-font-color' => 'true', :'fo:font-size' => font_size) - } - end - - # Paragraph style for a particular level. - def paragraph_style(x, name, left_margin, text_indent) - x.tag!('style:style', :'style:name' => name, - :'style:family' => 'paragraph') { - x.tag!('style:paragraph-properties', :'fo:margin-left' => left_margin, - :'fo:margin-right' => '0cm', :'fo:text-indent' => text_indent) - - } - end - - # Presentation style. - def presentation_style(x, name, parent, min_font_height, additional = {}) - x.tag!('style:style', :'style:name' => name, - :'style:family' => 'presentation', - :'style:parent-style-name' => parent) { - x.tag!('style:graphic-properties', {:'draw:fill-color' => '#ffffff', - :'fo:min-height' => min_font_height}.merge(additional)) - } - end - - # OpenOffice automatic styles. - # I started with a normal output file of OpenOffice, and attempted to compress - # the information: not for efficiency, but to make it understandable. The - # output should be close to identical. - # - def automatic_styles(x) - x.tag!('office:automatic-styles') { - - shared = { :'presentation:display-footer' => 'true', - :'presentation:display-page-number' => 'false', - :'presentation:display-date-time' => 'true' } - - x.tag!('style:style', :'style:name' => 'dp1', :'style:family' => 'drawing-page') { - x.tag!('style:drawing-page-properties', - { :'presentation:background-visible' => 'true', - :'presentation:background-objects-visible' => 'true' }.merge(shared)) - } - x.tag!('style:style', :'style:name' => 'dp2', :'style:family' => 'drawing-page') { - x.tag!('style:drawing-page-properties', - { :'presentation:display-header' => 'true' }.merge(shared)) - } - - x.tag!('style:style', :'style:name' => 'gr1', :'style:family' => 'graphic') { - x.tag!('style:graphic-properties', :'style:protect' => 'size') - } - - presentation_style(x, 'pr1', 'Default-title', '3.256cm') - presentation_style(x, 'pr2', 'Default-outline1', '13.609cm') - presentation_style(x, 'pr3', 'Default-notes', '12.573cm', - :'draw:auto-grow-height' => 'true') - - paragraph_style(x, 'P1', '0cm', '0cm') - paragraph_style(x, 'P2', '1.2cm', '-0.9cm') - paragraph_style(x, 'P3', '0.6cm', '-0.6cm') - - x.tag!('text:list-style', :'style:name' => 'L1') { - 1.upto(9) { |n| - bullet_style(x, n, :'â—', "#{(n - 1) * 0.6}cm", '0.6cm', - '45%') - } - } - x.tag!('text:list-style', :'style:name' => 'L2') { - bullet_style(x, 1, :'â—', '0.6cm', '0.9cm', '45%') - bullet_style(x, 2, :'–', '1.6cm', '0.8cm', '75%') - bullet_style(x, 3, :'â—', '3.0cm', '0.6cm', '45%') - bullet_style(x, 4, :'–', '4.2cm', '0.6cm', '75%') - bullet_style(x, 5, :'â—', '5.4cm', '0.6cm', '45%') - bullet_style(x, 6, :'â—', '6.6cm', '0.6cm', '45%') - bullet_style(x, 7, :'â—', '7.8cm', '0.6cm', '45%') - bullet_style(x, 8, :'â—', '9.0cm', '0.6cm', '45%') - bullet_style(x, 9, :'â—', '10.2cm', '0.6cm', '45%') - } - } - end - -public - def wrap(x) - x.instruct! - x.tag!('office:document-content', DocumentAttributes) { - automatic_styles(x) - x.tag!('office:body') { - x.tag!('office:presentation') { - yield(x) - } - } - } - x - end -end - -class OpenDocument::Manifest -public - def add(path, type) - @files[path] = type - end - - def content - x = Builder::XmlMarkup.new(:indent => 2) - x.instruct! - x.tag!('manifest:manifest', - :'xmlns:manifest' => 'urn:oasis:names:tc:opendocument:xmlns:manifest:1.0') { - x.tag!('manifest:file-entry', - :'manifest:media-type' => \ - 'application/vnd.oasis.opendocument.presentation', - :'manifest:full-path' => '/') - @files.each { |k, v| - x.tag!('manifest:file-entry', :'manifest:media-type' => v, - :'manifest:full-path' => k) - } - } - x.target! - end - - def initialize - @files = {} - end -end - -class OutlineToODP < OutlineParser - include OpenDocument::Presentation - -protected - def nest_headings(text, nesting, recurse) - @x.tag!('text:list-item') { - if recurse == 0 - @x.tag!('text:p', :'text:style-name' => "P#{nesting + 1}") { - @x << text - @x << "\n" - } - else - @x.tag!('text:list') { nest_headings(text, nesting, recurse - 1) } - end - } - end - - def heading(text, nesting) - if nesting == 0 - @x.tag!('draw:page', :'draw:name' => text, :'draw:style-name' => 'dp1', - :'draw:master-page-name' => 'Default', - :'presentation:presentation-page-layout-name' => 'AL1T2') { - @x.tag!('draw:frame', :'presentation:style-name' => 'pr1', - :'draw:layer' => 'layout', :'svg:width' => '25.199cm', - :'svg:height' => '3.256cm', :'svg:x' => '1.4cm', :'svg:y' => '0.962cm', - :'presentation:class' => 'title', :'presentation:placeholder' => true) { - @x.tag!('draw:text-box') { - @x.tag!('text:p', :'text:style-name' => 'P1') { - @x << text - @x << "\n" - } - } - } - @x.tag!('draw:frame', :'presentation:style-name' => 'pr2', - :'draw:layer' => 'layout', :'svg:width' => '25.199cm', - :'svg:height' => '13.609cm', :'svg:x' => '1.4cm', :'svg:y' => '4.914cm', - :'presentation:class' => 'outline', :'presentation:placeholder' => true) { - @x.tag!('draw:text-box') { - parse(true) - } - } - } - else - @x.tag!('text:list', :'text:style-name' => 'L2') { - nest_headings(text, nesting, nesting - 1) - } - end - end - - def nest(nesting) - parse(true) - end - - def text(t, nesting) - end - -public - def initialize(input_file) - super(input_file) - end - - def convert - @x = Builder::XmlMarkup.new(:indent => 2) - wrap(@x) { - while more - parse(false) - end - } - @x.target! - end -end - - -opts = GetoptLong.new( - [ '--help', '-?', GetoptLong::NO_ARGUMENT ] -) - -begin - opts.each do |opt, arg| - case opt - when '--help' - RDoc::usage - end - end - - if ARGV.length != 2 - RDoc::usage - exit 0 - end - - input_file = File.new(ARGV[0], 'r') - output_file = Zip::ZipFile.open(ARGV[1], Zip::ZipFile::CREATE) -rescue Exception => error - $stderr.print("Error: #{error}\n") - exit(1) -end - -c = OutlineToODP.new(input_file) -if not c.more - $stderr.write("Error: Input file contains no content.\n") - exit(1) -end - - manifest = OpenDocument::Manifest.new - output_file.file.open('content.xml', 'w') { |f| f.write(c.convert) } - manifest.add('content.xml', 'text/xml') - output_file.dir.mkdir('META-INF') - output_file.file.open('META-INF/manifest.xml', 'w') { |f| - f.write(manifest.content) - } - output_file.close -exit(0) diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/vo2xo.rb b/pack/acp/start/vimoutliner/vimoutliner/scripts/vo2xo.rb deleted file mode 100644 index 4c59000..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/vo2xo.rb +++ /dev/null @@ -1,239 +0,0 @@ -#! /usr/bin/ruby - -# = Synopsis -# -# vo2xo: Converts VIM Outliner files to Xoxo presentations. -# -# = Usage -# -# vo2xo [OPTION] input-file -# -# -?, --help: show help -# -# -b, --body file-name: -# insert the contents of the named file at the start of the HTML BODY element. -# -# -h, --head file-name: -# insert the contents of the named file within the HTML HEAD element. -# -# input-file: The VIM Outliner file to be converted. - -# LICENSE -# Copyright (C) 2006 Bruce Perens -# -# This license incorporates by reference the terms of GPL Version 3 or, at -# your choice, any later version of the GPL published by the Free Software -# Foundation, Inc. of Boston, MA, USA. -# -# You may not modify this license. You must preserve it and the accompanying -# copyright declaration in any whole or fragmentary verisons of the software -# to which they apply. -# -require 'getoptlong' -require 'rdoc/usage' -require 'rubygems' -require_gem 'builder' - -class OutlineParser -private - LeadingTabPattern = /^(\t*)(.*)$/.freeze - ColonPattern = /^:[ \t]*(.*)$/.freeze - -protected - def initialize(file) - @file = file - @pushback = nil - @nesting = 0 - end - - # Get a line, with push-back. - def get_line - if (line = @pushback) - @pushback = nil - return line - else - return @file.gets - end - end - - # Recursive parser for VIM Outliner. - # - # Meant to be called from itself when nesting increases - it calls its - # callers "nest" method, which calls "parse". This fits well with nesting - # output paradigms like that of Builder::XmlMarkup. - # - # Returns when nesting decreases, or if got_heading is set, just before the - # next top-level heading in the input stream. You should iteratively call - # parse() until more() returns false. This facilitates per-heading handling - # such as in the Xoxo converter, which uses first-level heading to demarcate - # the boundaries of slides. - # - # got_heading: If set, this will return just before the next top-level - # heading, leaving it in the push-back. - # - def parse(got_heading = false) - - while (line = get_line()) - m = line.match(LeadingTabPattern) - n = m[1].length # This line's nesting level. - after_tabs = m[2] # Content after zero or more leading tabs. - - # Drop empty lines, and lines with only tabs. - next if after_tabs == '' - - if n != @nesting # The nesting level changes with this line. - previous = @nesting - @nesting = n - @pushback = line - - # If nesting increases, recursively parse it through nest(). - # If nesting decreases, return to nest(), which will in turn - # return here. Both of these can be true in sequence! Nest() - # detects when a nesting level is closed by looking ahead one - # line and then pushing it back. That line can be one or MORE - # levels lesser than the current nesting level. - # - nest(n) if n > previous - return true if n < previous - elsif - if (p = after_tabs.match(ColonPattern)) and p[1].length > 0 - text(p[1], n) - else - if got_heading and n == 0 - @pushback = line - return true # Return before the next top-level heading. - end - - got_heading = true - heading(after_tabs, n) - end - end - end - false - end - -public - # Simple parser that return true if there is any remaining content - # and leaves that content in the push-back. - # The return value is the content minus any leading tabs. - # - # Usage - # Return true if there is more content: - # if more - # Return the content of the next line to be read. - # more - # - # The second form is used to get the document title from the first line - # in the file. - # - def more - while (line = get_line()) - if (m = line.match(LeadingTabPattern)) and m[2].length > 0 - @pushback = line - return m[2] - end - end - false - end - -end - -class OutlineToXoxo < OutlineParser -private - Type = [ :DOCTYPE, - :html, - :PUBLIC, - '-//W3C//DTD XHTML 1.0 Strict//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd' - ].freeze - - -protected - def heading(text, nesting) - if nesting == 0 - @x.h1(text) - else - @x.li { @x.tag!("h#{nesting + 1}", text) } - end - end - - def nest(nesting) - if nesting == 1 - @x.ul { parse(true) } - else - @x.li(:class => 'nesting') { @x.ul { parse(true) } } - end - end - - def text(t, nesting) - @x.p(t) - end - -public - def initialize(input_file, head_insert, body_insert) - @head_insert = head_insert - @body_insert = body_insert - super(input_file) - end - - def convert - @x = Builder::XmlMarkup.new(:indent => 2) - @x.declare!(*Type) - @x.html { - @x.head { - @x.title(more) - @x << @head_insert.read if @head_insert - } - @x.body { - @x << @body_insert.read if @body_insert - @x.ul { - @x.li(:class => "slide") { parse(false) } while more - } - } - } - @x.target! - end - -end - - -opts = GetoptLong.new( - [ '--help', '-?', GetoptLong::NO_ARGUMENT ], - [ '--body', '-b', GetoptLong::REQUIRED_ARGUMENT ], - [ '--head', '-h', GetoptLong::REQUIRED_ARGUMENT ] -) - -body_insert = nil -head_insert = nil - -begin - opts.each do |opt, arg| - case opt - when '--help' - RDoc::usage - when '--body' - body_insert = File.new(arg, 'r') - when '--head' - head_insert = File.new(arg, 'r') - end - end - - if ARGV.length != 1 - RDoc::usage - exit 0 - end - - input_file = File.new(ARGV[0], 'r') -rescue Exception => error - $stderr.print("Error: #{error}\n") - exit(1) -end - -c = OutlineToXoxo.new(input_file, head_insert, body_insert) -if not c.more - $stderr.write("Error: Input file contains no content.\n") - exit(1) -end - -$stdout.write(c.convert) -exit(0) diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/votl_maketags.1 b/pack/acp/start/vimoutliner/vimoutliner/scripts/votl_maketags.1 deleted file mode 100644 index 7a1c60b..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/votl_maketags.1 +++ /dev/null @@ -1,50 +0,0 @@ -.\" Hey, EMACS: -*- nroff -*- -.\" First parameter, NAME, should be all caps -.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection -.\" other parameters are allowed: see man(7), man(1) -.TH vo_maketags 1 "August 13, 2003" -.\" Please adjust this date whenever revising the manpage. -.\" -.\" Some roff macros, for reference: -.\" .nh disable hyphenation -.\" .hy enable hyphenation -.\" .ad l left justify -.\" .ad b justify to both left and right margins -.\" .nf disable filling -.\" .fi enable filling -.\" .br insert line break -.\" .sp insert n+1 empty lines -.\" for manpage-specific macros, see man(7) -.SH NAME -vo_maketags \- build TAGS for vim outliner -.SH SYNOPSIS -.B vo_maketags -.RI [ filename ] -.SH DESCRIPTION -This manual page documents briefly the -.B vo_maketags -Perl script. -.PP -.B vo_maketags -is a -.BR perl (1) -script that creates tag file which works with -.B vimoutliner -.RB ( vim (1) -plugin for editing outlines). -.SH OPTIONS -.B vo_maketags -script called just with filename of the processed outline, which -is a top of the hierarchy of linked outlines. -.SH SEE ALSO -.BR vim (1) -.ig -.br -The script is fully documented on -.UR http://www.vimoutliner.org -http://www.vimoutliner.org -.UE -.. -.SH AUTHOR -This manual page was written by Matej Cepl , -for the Debian GNU/Linux system (but may be used by others). diff --git a/pack/acp/start/vimoutliner/vimoutliner/scripts/votl_maketags.pl b/pack/acp/start/vimoutliner/vimoutliner/scripts/votl_maketags.pl deleted file mode 100644 index ff6d3ee..0000000 --- a/pack/acp/start/vimoutliner/vimoutliner/scripts/votl_maketags.pl +++ /dev/null @@ -1,338 +0,0 @@ -#!/usr/bin/perl -w -# ####################################################################### -# votl_maketags.pl: Vim outline tagging system, main program, version 0.3.5 -# Copyright (C) 2001-2003, 2011 by Steve Litt (slitt@troubleshooters.com) -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see . -# -# Steve Litt, slitt@troubleshooters.com, http://www.troubleshooters.com -# ####################################################################### - -# ####################################################################### -# ####################################################################### -# ####################################################################### -# HISTORY -# V0.1.0 Pre-alpha -# Starting at a "top level" indent-defined Vim outline, this -# program finds all "tags" defined as headlines starting with -# _tag_, and containing a subheadline containing the file -# to which the tag should jump. This program creates a tags -# file. -#Steve Litt, 5/28/2001 -#End of version 0.1.0 -# -# V0.1.1 Pre-alpha -# Bug fixes, including ../ resolution -# -#Steve Litt, 5/28/2001 -#End of version 0.1.1 -# -# -# V0.1.2 Pre-alpha -# More bug fixes, and facility to create a new outline -# file from a tag whose corresponding file doesn't yet -# exist. -#Steve Litt, 5/30/2001 -#End of version 0.1.2 -# -# V0.1.3 Pre-alpha -# More bug fixes. This was the first version released -# file from a tag whose corresponding file doesn't yet -# exist. -#Steve Litt, 6/01/2001 -#End of version 0.1.3 -# -# V0.2.0 Pre-alpha -#Steve Litt, 12/03/2002 -# This file unchanged. The overall Vimoutliner version -# 0.2.0 has extensive improvements, including intuitive -# collapse/expand. -#End of version 0.2.0 -#END OF HISTORY -# -# -# V0.1.2 Pre-alpha -# More bug fixes, and facility to create a new outline -# file from a tag whose corresponding file doesn't yet -# exist. -#Steve Litt, 5/30/2001 -#End of version 0.1.2 -# V0.3.5 release 20110303 -# Changed vo_tags.tag directory from -# $HOME/.vimoutliner/ -# to -# $HOME/.vim/vimoutliner/ -#Steve Litt, 3/3/2011 -#End of version 0.3.5 release 20110303 -#END OF HISTORY -# -# ####################################################################### - - -use strict; -use vars qw($TAGFILENAME); -use Cwd; - -$TAGFILENAME = $ENV{"HOME"} . "/.vim/vimoutliner/vo_tags.tag"; -##### OLD LOCATION BELOW, REMOVE IN 0.3.6, COMMENT FOR NOW -#$TAGFILENAME = $ENV{"HOME"} . "/.vimoutliner/vo_tags.tag"; - -sub process1Outline($$); #Early prototype the recursive routine -sub makeDirectory($); #Early prototype the recursive routine - -sub makeTagFileStartingAt($) - { - unless(@ARGV == 1) - { - usage(); - die; - } - my($absoluteFileName) = deriveAbsoluteFileName(Cwd::cwd(), $_[0]); - - my(%processedFiles) = (); - recordFileAsProcessed($absoluteFileName,\%processedFiles); - unlink $TAGFILENAME; - process1Outline($absoluteFileName, \%processedFiles); - sortAndDeleteDupsFromTagFile(); - } - -sub sortAndDeleteDupsFromTagFile() - { - my($TEMPTAGFILENAME) = "$ENV{'HOME'}/temptagfile.tag"; - system("sort $TAGFILENAME | uniq > $TEMPTAGFILENAME"); - system("rm $TAGFILENAME"); - system("mv $TEMPTAGFILENAME $TAGFILENAME"); - } - - -sub process1Outline($$) - { - my($fileName) = $_[0]; - my($processedFilesHashRef) = $_[1]; - - unless(fileExists($fileName)) - { - makeDirectory($fileName); - makeEmptyFile($fileName); - } - - print "Begin processing file $fileName.\n"; - - my($baseDirectory) = getBaseDirectory($fileName); - my(%tags) = getTagsFromFile($fileName); - my(@tagKeys) = keys(%tags); - my($tagKey); - foreach $tagKey (@tagKeys) - { - my($absoluteFileName); - if(isAbsoluteFilePath($tags{$tagKey})) - { - $absoluteFileName = $tags{$tagKey}; - } - else - { - $absoluteFileName = - deriveAbsoluteFileName($baseDirectory, $tags{$tagKey}); - } - appendTagToTagFile($tagKey,$absoluteFileName); - if(notProcessedYet($absoluteFileName, $processedFilesHashRef)) - { - recordFileAsProcessed($absoluteFileName,$processedFilesHashRef); - process1Outline($absoluteFileName, $processedFilesHashRef); - } - } - } - -sub appendTagToTagFile($$) - { - open(TAGFILE, ">>$TAGFILENAME"); - print TAGFILE "$_[0] $_[1] :1\n"; - close(TAGFILE); - } - - -sub makeEmptyFile($) - { - open(OUTLINEFILE, ">" . $_[0]); - close(OUTLINEFILE); - } - - -sub makeDirectory($) - { - my($completeFileName) = $_[0]; - my($directoryName) = ($completeFileName =~ m/^(.*?)[^\/]*$/); - unless($directoryName eq "") - { - my($temp) = ($directoryName =~ m/^(.*).$/); - makeDirectory($temp); - print "Creating $directoryName..."; - if(mkdir $directoryName) - { - print " succeeded.\n"; - } - else - { - print " no action: $!.\n"; - } - } - } - -sub fileExists($) - { - my($outlineFileName) = $_[0]; - my($success) = open(OUTLINEFILE, "<" . $outlineFileName); - if($success) - { - close(OUTLINEFILE); - return(1); - } - else - { - return(0); - } - } - -sub getTagsFromFile($) - { - my($outlineFileName) = $_[0]; - my(%tags); - my($tagString) = ""; - my($success) = open(OUTLINEFILE, "<" . $outlineFileName); - unless($success) - { - print "Failed to open $outlineFileName\n"; - return(()); - } - while() - { - my($line) = $_; - chomp($line); - if($line =~ m/^\s*(_tag_\S+)/) - { - $tagString = $1; - } - elsif($tagString ne "") - { - $line =~ m/^\s*(\S+)/; - my($filename) = $1; - $tags{$tagString} = - deriveAbsoluteFileName(getBaseDirectory($_[0]), $1); - $tagString = ""; - } - } - return(%tags); - } - -sub recordFileAsProcessed($$) - { - my($absoluteFileName) = $_[0]; - my($processedFilesHashRef) = $_[1]; - ${$processedFilesHashRef}{$absoluteFileName} = "1"; - } - -sub notProcessedYet($$) - { - my($absoluteFileName) = $_[0]; - my(%processedFiles) = %{$_[1]}; - if(defined($processedFiles{$absoluteFileName})) - { - return(0); - } - else - { - return(1); - } - } - -sub dia($) - { - print "dia " . $_[0] . "\n"; - } - - -sub isAbsoluteFilePath($) - { - if($_[0] =~ m/^\//) - { - return 1; - } - else - { - return 0; - } - } - -sub getFileNameOnly($) - { - my($fileString); - if ($_[0] =~ m/.+\/(.*)$/) - { - $fileString= $1 - } - else - { - $fileString = $_[0]; - } - - return $fileString; - } - -sub getBaseDirectory($) - { - my($dirString) = ($_[0] =~ m/(.+\/).*$/); - return $dirString; - } - -sub deriveAbsoluteFileName($$) - { - my($absoluteFileName); - my($baseDirectory) = $_[0]; - my($passedFileName) = $_[1]; - unless($baseDirectory =~ m/\/$/) - { - $baseDirectory= $baseDirectory . "/"; - } - if($passedFileName =~ m/^\//) - { - $absoluteFileName = $passedFileName; - } - else - { - $absoluteFileName = $baseDirectory . $passedFileName; - } - - $absoluteFileName =~ s/\/\.\//\//g; #remove all "./"; - deleteDoubleDots($absoluteFileName); - - return($absoluteFileName); - } - -sub deleteDoubleDots($) - { - while($_[0] =~ m/\.\./) - { - $_[0] =~ s/\/[^\/]*\/\.\.//; - } - } - -sub usage() - { - print "\nUsage is:\n"; - print "otltags topLevelOutlineFileName\n\n"; - } - - -makeTagFileStartingAt($ARGV[0]) - diff --git a/pack/acp/start/vimoutliner/vimoutlinerrc b/pack/acp/start/vimoutliner/vimoutlinerrc deleted file mode 100644 index 12aaed0..0000000 --- a/pack/acp/start/vimoutliner/vimoutlinerrc +++ /dev/null @@ -1,67 +0,0 @@ -"Extra configurations and mappings ****************************************** -"This mapping is fold-level and fold-state dependent -"map dd p -"map dd P - -"Common Plugins -" The vo_modules_load variable holds name of all VO modules you want to load. -" If you do not want to load any VO modules leave it blank - -" This setting loads the checkboxes, tags and smart_paste plugins as default. -let g:vo_modules_load = "checkbox:tags:smart_paste" - -" Uncomment the following line to enable the math plugin. -"let g:vo_modules_load .= ':math' - -" Uncomment the following line to enable new hoisting. -" let g:vo_modules_load .= ':newhoist' - -" Uncomment the following line to enable the format plugin. -"let g:vo_modules_load .= ':format' - -" Uncomment the following line to enable clocking. -"let g:vo_modules_load .= ':clock' - -"User Preferences *************************************************** -"let maplocalleader = ',,' " uncomment for compatibility with - " previous versions of VO - -"setlocal ignorecase " searches ignore case -"setlocal smartcase " searches use smart case -"setlocal wrapmargin=5 -"setlocal tw=78 -"setlocal tabstop=4 " tabstop and shiftwidth must match -"setlocal shiftwidth=4 " values from 2 to 8 work well -"setlocal background=dark " for dark backgrounds -"setlocal nowrap - -" colorscheme votl_light " set a VO specific colorscheme - -"Checkbox Tags -" Tags can contain any word characters (:help word) -" tags must not contain whitespace -" tags must be unique -" there can be no intersections between lists -" 'high', 'High', and 'HIGH' are considered to be unique and nonintersecting -" each sub-list represents a unique circular 'ring' of tags -" currently, these options do not affect checkboxes -" status indicators like DONE, NOT DONE and CANCELED are -" refelected in the checkbox state: [X], [_] and [-], respectively -" each tag is a [] block, just like a checkbox; chosen for possible future integration -" each tag must be delimited by whitespace -" [TODO] [Feature] <-- this -" [TODO][Feature] <-- not this - -let g:cbTags = [ -\ ['TODO','FEEDBACK','VERIFY','DELEGATED','HOLDING'] -\,['Feature','Enhancement','Bug'] -\,['Low','Normal','High','URGENT'] -\,['@Home','@Lab','@Work','@Shopping'] -\] - - -"Hoisting *********************************************************** -"Uncomment and set to 1 to debug hoisting -"let g:hoistParanoia=0 - -" vim: filetype=vim diff --git a/plugins.md b/plugins.md index 62ad145..36634f7 100644 --- a/plugins.md +++ b/plugins.md @@ -10,14 +10,9 @@ Git submodules are slow, so handle this manually. * [goyo.vim](https://github.com/junegunn/goyo.vim) * [gruvbox](https://github.com/morhetz/gruvbox) -* [jellybeans.vim](https://github.com/nanotech/jellybeans.vim) * [limelight.vim](https://github.com/junegunn/limelight.vim) -* [minimalist](https://github.com/dikiaap/minimalist) * [mom.vim](https://github.com/vim-scripts/mom.vim) -* [rust.vim](https://github.com/rust-lang/rust.vim) * [vim-go](https://github.com/fatih/vim-go) -* [vim-orgmode](https://github.com/jceb/vim-orgmode) * [vim-ps1](https://github.com/PProvost/vim-ps1) * [vim-speeddating](https://github.com/tpope/vim-speeddating) * [vim-surround](https://github.com/tpope/vim-surround) -* [vimoutliner](https://github.com/vimoutliner/vimoutliner)