#+TITLE: Neotree layer

#+TAGS: file tree|layer

[[file:img/neotree.png]]

* Table of Contents                     :TOC_5_gh:noexport:
- [[#description][Description]]
  - [[#features][Features:]]
- [[#install][Install]]
- [[#configuration][Configuration]]
  - [[#neotree-theme][NeoTree Theme]]
  - [[#neotree-source-control-integration][NeoTree Source Control Integration]]
- [[#usage][Usage]]
  - [[#neotree-mode-line][NeoTree mode-line]]
- [[#key-bindings][Key bindings]]
  - [[#neotree-navigation][NeoTree navigation]]
  - [[#opening-files-with-neotree][Opening files with NeoTree]]
  - [[#other-neotree-key-bindings][Other NeoTree key bindings]]

* Description
This layer setups a file tree navigator buffer using Neotree (replacing the Treemacs layer).

** Features:
- intuitive evil key bindings integration
- supports multiple themes
- transient state by pressing on ~?~
- version-control integration

* Install
To use this configuration layer, add it to your =~/.spacemacs=. You will need to
add =neotree= to the existing =dotspacemacs-configuration-layers= list in this
file.

* Configuration
** NeoTree Theme
You can change the NeoTree theme by using the setting =neo-theme=. Possible
values are:

| Setting   | Description                                                      |
|-----------+------------------------------------------------------------------|
| =classic= | Use an icon to display items - only suitable for gui mode.       |
| =ascii=   | The simplest style, it will use =x=, =-= to display fold status. |
| =arrow=   | Use unicode arrows to display fold status.                       |
| =icons=   | Use [[https://github.com/domtronn/all-the-icons.el][all-the-icons]] packages and fonts                             |
| =nerd=    | Use the NERDTree indentation mode and arrows.                    |

The default is =classic=.

Use =nerd= if you want it to look most like NERDTree in VIM. For example:

#+BEGIN_SRC emacs-lisp
  (setq neo-theme 'nerd)
#+END_SRC

** NeoTree Source Control Integration
If you would like NeoTree to show source control information, you can use the
setting =neo-vc-integration=. It is a list containing the possible values:

| Setting | Description                                                               |
|---------+---------------------------------------------------------------------------|
| =face=  | Show information by changing the color of the file/directory name.        |
| =char=  | Show information with a character to the left of the file/directory name. |

The default is =nil= (do not show source control information), which is recommended.

For example,

#+BEGIN_SRC emacs-lisp
  (setq neo-vc-integration '(face))
#+END_SRC

*Note*: At this time, it is not recommended to set this to anything other
than =nil=. Otherwise, it will become very slow with larger source trees.
See [[https://github.com/jaypei/emacs-neotree/issues/126]] for more information.

* Usage
This layer provides a quick and simple way to navigate in an unknown project
file tree with [[https://github.com/jaypei/emacs-neotree][NeoTree]].

To toggle the =NeoTree= buffer, press ~SPC f t~ or ~SPC p t~ (the latter opens
NeoTree with the root set to the projectile project root).

To select the NeoTree window, press ~SPC 0~. The NeoTree window always has the
number =0= so it does not shift the current number of the other windows.

VCS integration is supported, the file color will change depending on its
current state. With default =spacemacs-dark= theme:
- green: new file
- purple: modified file

** NeoTree mode-line
The mode-line has the following format =[x/y] d (D:a, F:b)= where:
- =x= is the index of the current selected file or directory
- =y= the total number of items (file and directory) in the current directory
- =d= the name of the current directory
- =a= the number of directories in the current directory
- =b= the number of files in the current directory

* Key bindings
** NeoTree navigation
Navigation is centered on the ~hjkl~ keys with the hope of providing a fast
navigation experience like in [[http://ranger.nongnu.org/][ranger]]:

| Key binding  | Description                                                                   |
|--------------+-------------------------------------------------------------------------------|
| ~h~          | collapse expanded directory or go to parent node                              |
| ~H~          | select previous sibling                                                       |
| ~j~          | select next file or directory                                                 |
| ~J~          | select next expanded directory on level down                                  |
| ~k~          | select previous file or directory                                             |
| ~K~          | select parent directory, when reaching the root change it to parent directory |
| ~l~ or ~RET~ | expand directory                                                              |
| ~L~          | select next sibling                                                           |
| ~R~          | make a directory the root directory                                           |

*Note*: Point is automatically set to the first letter of a node for a smoother
experience.

** Opening files with NeoTree
By default a file is opened in the last active window. It is possible to choose
window number where to open a file by using a numeric argument, for instance
~2 l~ or ~2 RET~ will open the current file in window 2. It is also possible to
open the file in a split window with ~|~ and ~-~:

| Key binding      | Description                               |
|------------------+-------------------------------------------|
| ~l~ or ~RET~     | open file in last active window           |
| ~# l~ or ~# RET~ | open file in window number =#=            |
| ~¦~              | open file in an vertically split window   |
| ~-~              | open file in an horizontally split window |

** Other NeoTree key bindings

| Key binding | Description                     |
|-------------+---------------------------------|
| ~TAB~       | toggle stretching of the buffer |
| ~c~         | create a node                   |
| ~C~         | copy a node                     |
| ~d~         | delete a node                   |
| ~gr~        | refresh                         |
| ~s~         | toggle showing of hidden files  |
| ~q~ or ~fd~ | hide =NeoTree= buffer           |
| ~r~         | rename a node                   |
| ~?~         | show help                       |
