diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-10-16 08:56:26 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-16 08:56:26 +0800 |
commit | 0b71960ab1bcbcc42f2d6abba4c72cd6ac3c840b (patch) | |
tree | ba17ea551188576f660573127e34275f87dc54b0 /src/nvim/indent.c | |
parent | bc798dfd8cea9a5f93461e05dcb8409b6d96afc0 (diff) | |
parent | c8fbf39d474b1140bee10edbcf36305ea49bf863 (diff) | |
download | rneovim-0b71960ab1bcbcc42f2d6abba4c72cd6ac3c840b.tar.gz rneovim-0b71960ab1bcbcc42f2d6abba4c72cd6ac3c840b.tar.bz2 rneovim-0b71960ab1bcbcc42f2d6abba4c72cd6ac3c840b.zip |
Merge pull request #20677 from zeertzjq/vim-9.0.0761
vim-patch:9.0.{0761,0762,0764}: 'lispoptions'
Diffstat (limited to 'src/nvim/indent.c')
-rw-r--r-- | src/nvim/indent.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/nvim/indent.c b/src/nvim/indent.c index 3f5a8afbc1..3f08aa7043 100644 --- a/src/nvim/indent.c +++ b/src/nvim/indent.c @@ -15,6 +15,7 @@ #include "nvim/eval.h" #include "nvim/extmark.h" #include "nvim/indent.h" +#include "nvim/indent_c.h" #include "nvim/mark.h" #include "nvim/memline.h" #include "nvim/memory.h" @@ -1144,3 +1145,45 @@ static int lisp_match(char_u *p) } return false; } + +/// Re-indent the current line, based on the current contents of it and the +/// surrounding lines. Fixing the cursor position seems really easy -- I'm very +/// confused what all the part that handles Control-T is doing that I'm not. +/// "get_the_indent" should be get_c_indent, get_expr_indent or get_lisp_indent. +void fixthisline(IndentGetter get_the_indent) +{ + int amount = get_the_indent(); + + if (amount >= 0) { + change_indent(INDENT_SET, amount, false, 0, true); + if (linewhite(curwin->w_cursor.lnum)) { + did_ai = true; // delete the indent if the line stays empty + } + } +} + +/// Return true if 'indentexpr' should be used for Lisp indenting. +/// Caller may want to check 'autoindent'. +bool use_indentexpr_for_lisp(void) +{ + return curbuf->b_p_lisp + && *curbuf->b_p_inde != NUL + && strcmp(curbuf->b_p_lop, "expr:1") == 0; +} + +/// Fix indent for 'lisp' and 'cindent'. +void fix_indent(void) +{ + if (p_paste) { + return; // no auto-indenting when 'paste' is set + } + if (curbuf->b_p_lisp && curbuf->b_p_ai) { + if (use_indentexpr_for_lisp()) { + do_c_expr_indent(); + } else { + fixthisline(get_lisp_indent); + } + } else if (cindent_on()) { + do_c_expr_indent(); + } +} |