changeset 4:512eaa56c7db

First pass at documentation.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 20 Jul 2014 14:25:23 -0700
parents 60adce96ac2d
children 12f4f50f4d3a
files doc/autotags.txt
diffstat 1 files changed, 294 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/doc/autotags.txt	Sun Jul 20 14:25:09 2014 -0700
+++ b/doc/autotags.txt	Sun Jul 20 14:25:23 2014 -0700
@@ -1,4 +1,297 @@
+*autotags.txt*  Automatic ctags management for VIM
 
-TODO
+      ___           ___                         ___     
+     /\  \         /\  \                       /\  \    
+    /::\  \        \:\  \         ___         /::\  \   
+   /:/\:\  \        \:\  \       /\__\       /:/\:\  \  
+  /:/ /::\  \   ___  \:\  \     /:/  /      /:/  \:\  \ 
+ /:/_/:/\:\__\ /\  \  \:\__\   /:/__/      /:/__/ \:\__\
+ \:\/:/  \/__/ \:\  \ /:/  /  /::\  \      \:\  \ /:/  /
+  \::/__/       \:\  /:/  /  /:/\:\  \      \:\  /:/  / 
+   \:\  \        \:\/:/  /   \/__\:\  \      \:\/:/  /  
+    \:\__\        \::/  /         \:\__\      \::/  /   
+     \/__/         \/__/          _\/__/       \/__/    
+                   /\  \         /\__\         /\__\    
+      ___         /::\  \       /:/ _/_       /:/ _/_   
+     /\__\       /:/\:\  \     /:/ /\  \     /:/ /\  \  
+    /:/  /      /:/ /::\  \   /:/ /::\  \   /:/ /::\  \ 
+   /:/__/      /:/_/:/\:\__\ /:/__\/\:\__\ /:/_/:/\:\__\
+  /::\  \      \:\/:/  \/__/ \:\  \ /:/  / \:\/:/ /:/  /
+ /:/\:\  \      \::/__/       \:\  /:/  /   \::/ /:/  / 
+ \/__\:\  \      \:\  \        \:\/:/  /     \/_/:/  /  
+      \:\__\      \:\__\        \::/  /        /:/  /   
+       \/__/       \/__/         \/__/         \/__/    
+
+
+                AUTOTAGS REFERENCE MANUAL
+                    by Ludovic Chabant
+
+                                                *autotags*
+
+1. Introduction             |autotags-intro|
+2. Commands                 |autotags-commands|
+3. Status Line              |autotags-status-line|
+4. Global Settings          |autotags-settings|
+
+=============================================================================
+1. Introduction                                 *autotags-intro*
+
+Autotags is a plugin that takes care of the much needed management of tags
+files in VIM. It will (re)generate tag files as you work while staying
+completely out of your way. It will even do its best to keep those tag files
+out of your way too. It has no dependencies and just works.
+
+In order to generate tag files, Autotags will have to figure out what's in
+your project. To do this, it will locate well-known project root markers like
+SCM folders (.git, .hg, etc.), any custom tags you define (with
+|autotags_project_root|), and even things you may have defined already with
+other plugins, like CtrlP.
+
+If the current file you're editing is found to be in such a project, Autotags
+will make sure the tag file for that project is up to date. Then, as you work
+in files in that project, it will partially re-generate the tag file. Every
+time you save, it will silently, in the background, update the tags for that
+file.
+
+Usually, ctags can only append tags to an existing tag file, so Autotags
+removes the tags for the current file first, to make sure the tag file is
+always consistent with the source code.
+
+Also, Autotags is clever enough to not stumble upon itself by triggering
+multiple ctags processes if you save files to fast, or your project is really
+big.
+
+There are some similar VIM plugins out there ("vim-tags", "vim-autotag",
+"vim-automatic-ctags", etc.). They all fail on one or more of the requirements
+I set for myself with Autotags:
+
+* No other dependency than running VIM: no Python, Ruby, or whatever.
+* Cross-platform: should work on at least Mac and Windows.
+* Incremental tags generation: don't re-generate the whole project all the
+  time. This may be fine for small projects, but it doesn't scale.
+* External process management: if the ctags process is taking a long time,
+  don't run another one because I saved the file again.
+* Keep the tag file consistent: don't just append the current file's tags to
+  the tag file, otherwise you will still "see" tags for deleted or renamed
+  classes and functions.
+* Automatically create the tag file: you open something from a freshly forked
+  project, it should start indexing it automatically, just in Sublime Text or
+  Visual Studio or any other IDE.
+
+
+=============================================================================
+2. Commands                                     *autotags-commands*
+
+                                                *autotags-global-commands*
+The following commands are always available, whatever buffer you currently
+have open:
+
+                                                *:AutotagsGenerate*
+:AutotagsGenerate {tagsfile}
+                        Generates a tag file named {tagsfile}. Tags will be
+                        generated for all the files in the same directory as
+                        {tagsfile} and below (i.e. recursive from {tagsfile}'s
+                        own directory).
+
+
+                                                *autotags-project-commands*
+The following commands are only available in buffers that have been found to
+belong to a project that should be managed by Autotags. See
+|autotags_project_root| for how Autotags figures out the project a file
+belongs to. When not project is found (i.e. the file is not under any of the
+known project markers), Autotags is disabled for that buffer, and the
+following commands and remarks don't apply.
+
+The tag file that Autotags creates and manages will be named after
+|autotags_tagfile|, relative to the project's root directory. When Autotags
+finds a valid project root, it will prepend the tag file's path to 'tags',
+unless |autotags_auto_set_tags| is set to 0. This is to make sure Vim will use
+that file first.
+
+If a file managed by Autotags is opened and no tag file already exists,
+Autotags will start generating it right away in the background, unless 
+|autotags_generate_on_missing| is set to 0. If you have a large project, you
+may want to know when Autotags is generating tags: see
+|autotags-status-line| to display an indicator in your status line.
+
+When a file managed by Autotags is saved, the tag file will be incrementally
+updated, i.e. references to the recently saved file are removed, and that file
+is re-parsed for tags, with the result being merged into the tag file. This
+makes the tag file 100% consistent with the latest changes. This doesn't
+happen however if |autotags_generate_on_write| is set to 0, in which case you
+have to run |AutotagsUpdate| manually.
+
+
+                                                *:AutotagsUpdate*
+:AutotagsUpdate
+                        Forces an update of the current tag file with the
+                        current buffer. If tags are already being generated,
+                        you will be notified and the command will abort.
+
+:AutotagsUpdate!
+                        Like |AutotagsUpdate|, but updates the current tags
+                        file with the whole project instead of just the
+                        current buffer.
+
+
+Some debugging/troubleshooting commands are also available.
+
+                                                *:AutotagsToggleEnabled*
+:AutotagsToggleEnabled
+                        Disables and re-enables Autotags.
+                        When Autotags is disabled, it won't update your tag
+                        file when you save a buffer. It will however still
+                        look for project markers as you open new buffers so
+                        that they can start working again when you re-enable
+                        Autotags.
+
+                                                *AutotagsToggleTrace*
+:AutotagsToggleTrace
+                        If you want to keep an eye on what Autotags is doing,
+                        you can enable tracing. This will show messages every
+                        time Autotags does something. It can get annoying
+                        quickly, since it will require you to press a key to
+                        dismiss those messages, but it can be useful to
+                        troubleshoot a problem.
+                        In addition to messages in Vim, it will also make
+                        Autotags redirect the output of the tag generation
+                        script to a `.log` file in the project root.
+
+                                                *:AutotagsUnlock*
+:AutotagsUnlock
+                        Autotags uses a `.lock` file to know when tag
+                        generation is running. If something goes wrong with
+                        that process, that lock file could be left behind. You
+                        could just remove it manually from the root of your
+                        project, but you can also run |:AutotagsUnlock| so
+                        that Vim does it for you.
+                        If you find that you need to use this more than a
+                        couple times ever, there's probably a bug with
+                        Autotags, or something otherwise wrong or unexpected
+                        with your system. Please file a bug.
+
+=============================================================================
+3.  Status Line                                 *autotags-status-line*
+
+Tag file generation can take a while if you're working on a project big
+enough. In that case, you may want to know when `ctags` is running, so you
+have a heads up if some of the tags aren't recognized yet.
+
+                                                *autotags#statusline()*
+You can display and indicator of tag generation progress in your |status-line|
+with the following function: >
+        :set statusline+=%{autotags#statusline()}
+
+This won't print anything unless Autotags figures that `ctags` is running in
+the background. This is done by checking a `.lock` file next to the tag file,
+but there's also some optimization before that to not slow down Vim. Note that
+the `.lock` file can sometimes be left around incorrectly by the background
+process, and you may need to clean it up. See |:AutotagsUnlock|.
+
+When Autotags thinks `ctags` is still running, it will print the string
+"TAGS" by default. You can customize it: >
+        :set statusline+=%{autotags#statusline('[Generating...]')}
+
+This will print the string "[Generating...]" when tags are being generated.
+
+
+=============================================================================
+4. Global Settings                              *autotags-settings*
+
+The following settings can be defined in your |vimrc| to change the default
+behaviour of Autotags.
+
+                                                *autotags_enabled*
+g:autotags_enabled
+                        Defines whether Autotags should be enabled. When
+                        disabled, Autotags will still scan for project root
+                        markers when opening buffers. This is so that when you
+                        re-enable Autotags, you won't have some buffers
+                        mysteriously working while others (those open last)
+                        don't.
+                        Defaults to 1.
+
+                                                *autotags_executable*
+g:autotags_executable
+                        Specifies the ctags executable to launch.
+                        Defaults to `ctags`.
+
+                                                *autotags_tagfile*
+g:autotags_tagfile
+                        Specifies the name of the tag file to create. This
+                        will be appended to the project's root. See
+                        |autotags_project_root| for how Autotags locates the
+                        project.
+                        Defaults to `tags`.
+
+                                                *autotags_project_root*
+g:autotags_project_root
+                        When a buffer is loaded, Autotags will figure out if
+                        it's part of a project that should have tags managed
+                        automatically. To do this, it looks for "root markers"
+                        in the current file's directory and its parent
+                        directories. If it finds any of those markers,
+                        Autotags will be enabled for the project, and a tags
+                        file named after |autotags_tagfile| will be created at
+                        the project root.
+                        Defaults to `[]` (an empty |List|).
+                        A list of default markers will always be appended to
+                        the user-defined ones: ['.git', '.hg', '.bzr',
+                        '_darcs'].
+
+                                                *autotags_exclude*
+g:autotags_exclude
+                        A list of file patterns to pass to the
+                        |autotags_executable| so that they will be excluded
+                        from parsing for the tags generation.
+                        Defaults to `[]` (an empty |List|).
+                        Patterns defined in 'wildignore' will also be given as
+                        exclude patterns to the `ctags` executable.
+
+                                                *autotags_auto_set_tags*
+g:autotags_auto_set_tags
+                        If set to 1, Autotags will automatically prepend
+                        'tags' with the exact path to the tag file for the
+                        current project. See |autotags_project_root| for how
+                        Autotags locates the project.
+                        When set to 0, Autotags doesn't change 'tags', and
+                        this means that whatever tag file it generates may
+                        not be picked up by Vim. See |tagfiles()| to know what
+                        tag files Vim knows about.
+                        Defaults to 1.
+
+                                                *autotags_generate_on_missing*
+g:autotags_generate_on_missing
+                        If set to 1, Autotags will start generating an initial
+                        tag file if a file is open in a project where no tags
+                        file is found. See |autotags_project_root| for how
+                        Autotags locates the project.
+                        When set to 0, Autotags will only generate the first
+                        time the file is saved (if
+                        |autotags_generate_on_write| is set to 1), or when
+                        |AutotagsUpdate| or |AutotagsGenerate| is run.
+                        Defaults to 1.
+
+                                                *autotags_generate_on_write*
+g:autotags_generate_on_write
+                        If set to 1, Autotags will update the current
+                        project's tag file when a file inside that project is
+                        saved. See |autotags_project_root| for how Autotags
+                        locates the project.
+                        When set to 0, Autotags won't do anything on save.
+                        This means that the project's tag file won't reflect
+                        the latest changes, and you will have to run
+                        |AutotagsUpdate| manually.
+                        Defaults to 1.
+
+                                                *autotags_background_update*
+g:autotags_background_update
+                        Specifies whether the process that updates the tags
+                        file should be run in the background or in the
+                        foreground. If run in the foreground, Vim will block
+                        until the process is complete.
+                        Defaults to 1.
+
+
 
  vim:tw=78:et:ft=help:norl: