diff options
Diffstat (limited to 'doc/julia-vim.txt')
-rw-r--r-- | doc/julia-vim.txt | 399 |
1 files changed, 399 insertions, 0 deletions
diff --git a/doc/julia-vim.txt b/doc/julia-vim.txt new file mode 100644 index 00000000..3f09e3bd --- /dev/null +++ b/doc/julia-vim.txt @@ -0,0 +1,399 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1 + +*julia-vim.txt* Support for Julia in Vim + +Author: Carlo Baldassi <carlobaldassi@gmail.com> +License: MIT license {{{ + 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. +}}} + +CONTENTS *julia-vim* + +Introduction |julia-vim-introduction| +Block-wise movements/objects |julia-vim-blocks| + Keyword-oriented movements |julia-vim-blocks-move| + Block-oriented movements |julia-vim-blocks-moveblock| + Block text objects |julia-vim-blocks-objects| + Variables |julia-vim-blocks-variables| +Referring to documents |julia-vim-doc| +Extras |julia-vim-extras| +Customizations |julia-vim-options| +About |julia-vim-about| + +============================================================================== +INTRODUCTION *julia-vim-introduction* + +The julia-vim plug-in provides: + - basic support for editing Julia files (automatic filetype detection, + indentation, syntax highlighting) + - support for the |matchit| plugin + - support for Julia block-wise movements (i.e. jumping around between + Julia blocks like if/end, function/end etc.) and block text-objects + - facilities for conversion of LaTeX entries to Unicode symbols which mimic + and extend what the Julia REPL and the IJulia notebook interface do. + Optionally, this functionality can be used with all file types, not + just Julia files. See |julia-vim-L2U|. + - a keymapping |K| to refer julia documents. + +This help file documents: 1) the block-wise movements and objects, how they +work and what variables can be used to enable/disable/tweak them; 2) The +documentation lookup facility; 3) Some extra functions and customization +options. +The LaTeX-to-Unicode facilities are documented in |julia-vim-L2U|. + +============================================================================== +BLOCK-WISE MOVEMENTS AND BLOCK TEXT OBJECTS *julia-vim-blocks* + +In Julia, all blocks start with a keyword (`module`, `function`, `if`, `for`, +`while`, `type`, etc.) and end with the `end` keyword. + +This plug-in adds support for the |matchit| plugin, such that pressing |%| while +on a block keyword will jump to the other keywords pertaining to the same +block. For example, if the cursor is at the beginning of the following code: +> + if a == 1 + if b > 0 + println("yes") + end + else + println("no") + end +< +then pressing |%| will jump to the `else` keyword, pressing it again will jump +to `end`, and pressing it again will go back to the first `if`. + +Note that the matchit plugin is normally distributed with ViM, but it is +disabled by default. To enable it, add this line to your |.vimrc| file: +> + runtime macros/matchit.vim +< +The julia-vim plug-in also adds commands to jump around block keywords in +normal, operator-pending and visual modes (see |vim-modes|). These are somehow +similar to the |]]| and |]m| mappings when used in C and Java files, +respectively, but are more powerful. These commands also require that the +matchit plugin is enabled. + +There are two families of block movements, keyword-oriented (see +|julia-vim-blocks-move|) and block-oriented (see +|julia-vim-blocks-blockmove|). + +Finally, this plug-in also adds block |text-objects| special mappings, so that +whole blocks can be manipulated as a whole when in visual mode or +operator-pending mode, see |julia-vim-block-objects|. + +The block movements and block objects mappings can be collectively disabled, +see |g:julia_blocks|, and customized, see |g:julia_blocks_mappings|. + +NOTE: in all cases, macros at the beginning of a block are considered as part +of the block itself. For example, in this code: +> + @inbounds for i = 1:5 + s += v[i] + end +< +the block begins at `@inbounds`. + +------------------------------------------------------------------------------ +KEYWORD-ORIENTED MOVEMENTS *julia-vim-blocks-move* + +These movements jump to the following/preceding block keyword, and they +differentiate between begin keywords and end keywords. Some block keywords can +also be used outside blocks (e.g. `for` in comprehensions, or `end` within +indexing expressions): these instances are ignored by these commands. + +The following movements are provided: + + *julia_]j* *julia_]J* *julia_[j* *julia_[J* +move_n : jumps to the next begin keyword. By default, it is mapped to `]j`. +move_N : jumps to the next end keyword. By default, it is mapped to `]J`. +move_p : jumps to the preceding begin keyword. By default, it is mapped to `[j`. +move_P : jumps to the preceding end keyword. By default, it is mapped to `[J`. + +Use |g:julia_blocks_mappings| to customize the mappings. + +------------------------------------------------------------------------------ +BLOCK-ORIENTED MOVEMENTS *julia-vim-blocks-moveblock* + +These movements are like keyword-oriented movements (|julia-vim-blocks-move|), +except that they ignore nested blocks within the block where the cursor is. +For example, given the following code (with line annotations): +> + 1 while true + 2 a += 1 + 3 if a > 5 + 4 break + 5 end + 6 end + 7 if b == 2 + 8 return + 9 end +< +if the cursor is on line 2, these movements will ignore the inner +`if/end` block (lines 3 to 5). You would then be able to jump directly +to lines 1 (with `[[`), 6 (with `][`), 7 (with `]]`), or 9 (with `2][`). + +The following movements are provided: + + *julia_]]* *julia_][* *julia_[[* *julia_[]* +moveblock_n : gets out from the current block (if any) and jumps to the next + begin keyword. (Similar to |w| for word movements.) By default, + it is mapped to `]]`. +moveblock_N : jumps to the end of the current block, if any. If the cursor is + already at the end of a block, jumps to the end of the following + block at the same level of the current one, or at the end of the + enclosing block. (Similar to |e| for word movements.) By + default, it is mapped to `][`. +moveblock_p : jumps to the beginning of the current block, if any. If the + cursor is already at the beginning of a block, jumps to the + beginning of the preceding block at the same level of the + current one, or at the beginning of the enclosing block. + (Similar to |b| for word movements.) By default, it is mapped to + `[[`. +moveblock_P : gets out from the current block (if any) and jumps to the + preceding end keyword. (Similar to |ge| for word movements.) + By default, it is mapped to `[]`. + +Use |g:julia_blocks_mappings| to customize the mappings. + +------------------------------------------------------------------------------ +BLOCK TEXT OBJECTS *julia-vim-blocks-objects* + +The julia-vim plug-in extends the ViM |text-objects| by defining special +mappings which allow to operate on blocks as a whole when in visual mode +or operator-pending mode. The default mappings use `aj` and `ij` to refer to +these objects. +For example, given the following code (with line annotations): +> + 1 while true + 2 a += 1 + 3 if a > 5 + 4 break + 5 end + 6 end +< +if the cursor is on `break` on line 4, pressing `vaj` will select the whole +inner `if` block (lines 3 to 5), and pressing `aj` again will select the whole +`while` block (lines 1 to 6). The same effect could have been obtained with a +counter, i.e. using `v2aj`. If the cursor were initially on line 2, the whole +`while` block would have been selected with the first `vaj`. Using `daj` would +delete a block, `caj` would delete it and leave ViM in insert mode, `=aj` +would indent it, etc. +Starting from line 2, pressing `vij` wuold only select the inner part of the +`while` block (lines 2 to 5). + +The following mappings are provided: + + *julia_aj* *julia_ij* +select_a : the block which contains the cursor, including its delimiters. + By default, this is mapped to `aj`. Repeated application (e.g. + `vajaj`) selects the enclosing blocks. A counter can be used to + the same effect as repetition (e.g. `v2aj`). +select_i : same as select_a, but only selects the lines included between the + delimiters. Thus, this does not work with single-line blocks. + By default, this is mapped to `ij`. Repeated application (e.g. + `vijij`) has no effect, but using a counter has the same effect as + using "select_a" and then selecting the inner part of the outermost + block. For example, with the default mappings, `v3ij` is the same as + `v3ajij`, or `vajajajij`. + +Use |g:julia_blocks_mappings| to customize the mappings. + +The following auxiliary function is only mapped to normal mode: + + *julia_whereami* +whereami : this mapping prints the first line of the current block on the + command line. If invoked repeatedly, or if given a count, it prints + the first line of the enclosing blocks, like `select_a`. If followed + by `select_a`, the selection, or operation, will refer to the last + block printed. By default, it is not mapped to any key, but a + mapping can be easily provided in |g:julia_blocks_mappings|. It is + possible to obtain the string, instead of having it printed, by + calling the function `julia_blocks#whereami()`. In such case, use + the function `julia_blocks#select_reset()` to reset the block + nesting level. + +------------------------------------------------------------------------------ +VARIABLES *julia-vim-blocks-variables* + + *g:julia_blocks* +g:julia_blocks + + Determines whether to map block-wise movements and objects. If + unspecified, it is on. You can disable the feature by default + by inserting the line +> + let g:julia_blocks = 0 +< + in your |.vimrc| file. + + *g:julia_blocks_mappings* +g:julia_blocks_mappings + + Custom mapping for block-wise movements. This must be a |dict| + associating movements to key combinations. Use empty strings + to disable individual mappings. The following is equivalent + to the default mappings (see |julia-vim-blocks-moveblock|, + |julia-vim-blocks-move| and |julia-vim-blocks-objects|): +> + let g:julia_blocks_mappings = { + \ "move_n" : "]j", + \ "move_N" : "]J", + \ "move_p" : "[j", + \ "move_P" : "[J", + \ + \ "moveblock_n" : "]]", + \ "moveblock_N" : "][", + \ "moveblock_p" : "[[", + \ "moveblock_P" : "[]", + \ + \ "select_a" : "aj", + \ "select_i" : "ij", + \ + \ "whereami" : "", + \ } +< + You can change individual mappings by writing something like + this in your |.vimrc| file: +> + let g:julia_blocks_mappings = { + \ "move_N" : "]n", + \ "move_P" : "[n", + \ "whereami" : "<Leader>j", + \ } +< + Or you can disable individual mappings by writing something like + this in your |.vimrc| file: +> + let g:julia_blocks_mappings = { + \ "moveblock_n" : "", + \ "moveblock_p" : "", + \ } +< + All unspecified entries keep their default value. + + +============================================================================== +REFERRING TO DOCUMENTATION *julia-vim-doc* + + *julia-vim-K* +K + Look up documentation for the keyword under the cursor. If found, + a preview window with the documentation is opened. + + This also works for keywords within the opened preview window, + allowing effortless browsing of the documentation. + + (This is not really a key mapping, but uses the built-in + |keywordprg|-mechanism in vim; see |K| if you're curious). + + + *<Plug>(JuliaDocPrompt)* +<Plug>(JuliaDocPrompt) + Open a prompt for keyword documentation lookup. If you don't use |?| + for backward search, you can use the following to make `?` work like + in the Julia REPL: +> + autocmd FileType julia nmap <buffer> ? <Plug>(JuliaDocPrompt) +< + Apply |:augroup| as needed. + + + *:JuliaDoc* +:JuliaDoc {keyword} + Look up documentation for {keyword}. + + +============================================================================== +EXTRAS *julia-vim-extras* + + + *julia#toggle_function_blockassign* + *julia#function_block2assign* + *julia#function_assign2block* +julia#toggle_function_blockassign() +julia#function_block2assign() +julia#function_assign2block() + + These functions allow to transform function definitions + between block format and assignment format. For example, + these two definitions are equivalent: +> + function test(x, y) + x + 2y + end + + test(x, y) = x + 2y +< + You can use the function `julia#toggle_function_blockassign()` + to switch between the two forms (the cursor needs to be on the + first line of the block form). This functionality requires + that the |matchit| plugin is loaded. Only three-line function + blocks like the one in the example are recognized. When + changing the block form into the assignment form, `return` + statements are removed; if the result is empty, `nothing` is + substituted. Leading macros (e.g. `@inline` or `@compat`) are + recognized and preserved by the transformation. + + In order to make this functionality practical, it is advisable + to map it to some key combination, e.g.: +> + noremap <Leader>fb :call julia#toggle_function_blockassign()<CR> +< + +============================================================================== +CUSTOMIZATIONS *julia-vim-options* + +The following options allows customizing some aspects of the plugin. + + *g:julia_spellcheck_docstrings* +g:julia_spellcheck_docstrings + + Determines whether to enable spell-checking for docstrings, + i.e. triple quoted strings that start in the first column. See + |spell|. Default: on (set to `1`). + + *g:julia_spellcheck_strings* +g:julia_spellcheck_strings + + Determines whether to enable spell-checking for all strings. + See |spell|. Default: off (set to `0`). + + *g:julia_spellcheck_comments* +g:julia_spellcheck_comments + + Determines whether to enable spell-checking for comments. See + |spell|. Default: on (set to `1`). + + *g:julia_highlight_operators* +g:julia_highlight_operators + + Determines whether to apply syntax highlighting to operators. + Default: on (set to `1`). + + +============================================================================== +ABOUT *julia-vim-about* + +Grab the latest version or report a bug on GitHub: + +http://github.com/JuliaEditorSupport/julia-vim + + vim:tw=78:et:ft=help:norl: + +endif |