Mercurial > vim
annotate runtime/indent/hamster.vim @ 32876:522f16e3e058 v9.0.1747
patch 9.0.1747: screenpos() may cause unnecessary redraw
Commit: https://github.com/vim/vim/commit/6235a109c48ff2559eca3b16578c429ffb61eadc
Author: zeertzjq <zeertzjq@outlook.com>
Date: Sat Aug 19 14:12:42 2023 +0200
patch 9.0.1747: screenpos() may cause unnecessary redraw
Problem: screenpos() may cause unnecessary redraw.
Solution: Don't unnecessarily reset VALID_WROW flag.
VALID_WROW flag is only used by two functions: validate_cursor() and
cursor_valid(), and cursor_valid() is only used once in ex_sleep().
When adjust_plines_for_skipcol() was first added in patch 9.0.0640, it
was called in two functions: comp_botline() and curs_rows().
- comp_botline() is called in two places:
- onepage(), which resets VALID_WROW flag immediately afterwards.
- validate_botline_win(), where resetting a VALID_ flag is strange.
- curs_rows() is called in two places:
- curs_columns(), which sets VALID_WROW flag afterwards.
- validate_cline_row(), which is only used by GUI mouse focus.
Therefore resetting VALID_WROW there doesn't seem to do anything useful.
Also, a w_skipcol check (which resets VALID_WROW flag) was added to
check_cursor_moved() in patch 9.0.0734, which seems to make more sense
than resetting that flag in the middle of a computation.
While at it make adjust_plines_for_skipcol() and textpos2screenpos() a
bit less confusing:
- Make adjust_plines_for_skipcol() return "off" instead of "n - off".
- Use 0-based "row" in textpos2screenpos() until W_WINROW is added.
closes: #12832
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 19 Aug 2023 14:30:02 +0200 |
parents | 3b34837f4538 |
children |
rev | line source |
---|---|
1125 | 1 " Vim indent file |
2 " Language: Hamster Script | |
25973 | 3 " Version: 2.0.6.1 |
4 " Last Change: 2021 Oct 11 | |
5 " Maintainer: David Fishburn <dfishburn dot vim at gmail dot com> | |
6 " Download: https://www.vim.org/scripts/script.php?script_id=1099 | |
7 " | |
8 " 2.0.6.1 (Oct 2021) | |
9 " Added b:undo_indent | |
10 " Added cpo check | |
11 " | |
1125 | 12 |
13 " Only load this indent file when no other was loaded. | |
14 if exists("b:did_indent") | |
15 finish | |
16 endif | |
17 let b:did_indent = 1 | |
18 | |
19 setlocal indentkeys+==~if,=~else,=~endif,=~endfor,=~endwhile | |
20 setlocal indentkeys+==~do,=~until,=~while,=~repeat,=~for,=~loop | |
21 setlocal indentkeys+==~sub,=~endsub | |
22 | |
25973 | 23 let b:undo_indent = "setl indentkeys<" |
24 | |
1125 | 25 " Define the appropriate indent function but only once |
26 setlocal indentexpr=HamGetFreeIndent() | |
27 if exists("*HamGetFreeIndent") | |
28 finish | |
29 endif | |
30 | |
25973 | 31 let s:keepcpo = &cpo |
32 set cpo&vim | |
33 | |
1125 | 34 function HamGetIndent(lnum) |
35 let ind = indent(a:lnum) | |
36 let prevline=getline(a:lnum) | |
37 | |
38 " Add a shiftwidth to statements following if, else, elseif, | |
39 " case, select, default, do, until, while, for, start | |
40 if prevline =~? '^\s*\<\(if\|else\%(if\)\?\|for\|repeat\|do\|while\|sub\)\>' | |
11518 | 41 let ind = ind + shiftwidth() |
1125 | 42 endif |
43 | |
44 " Subtract a shiftwidth from else, elseif, end(if|while|for), until | |
45 let line = getline(v:lnum) | |
46 if line =~? '^\s*\(else\|elseif\|loop\|until\|end\%(if\|while\|for\|sub\)\)\>' | |
11518 | 47 let ind = ind - shiftwidth() |
1125 | 48 endif |
49 | |
50 return ind | |
51 endfunction | |
52 | |
53 function HamGetFreeIndent() | |
54 " Find the previous non-blank line | |
55 let lnum = prevnonblank(v:lnum - 1) | |
56 | |
57 " Use zero indent at the top of the file | |
58 if lnum == 0 | |
59 return 0 | |
60 endif | |
61 | |
62 let ind=HamGetIndent(lnum) | |
63 return ind | |
64 endfunction | |
65 | |
25973 | 66 " Restore: |
67 let &cpo = s:keepcpo | |
68 unlet s:keepcpo | |
69 | |
1125 | 70 " vim:sw=2 tw=80 |