annotate src/textformat.c @ 33879:d418c82f02a4 v9.0.2149

patch 9.0.2149: [security]: use-after-free in exec_instructions() Commit: https://github.com/vim/vim/commit/5dd41d4b6370b7b7d09d691f9252b3899c66102a Author: Christian Brabandt <cb@256bit.org> Date: Mon Dec 4 22:52:23 2023 +0100 patch 9.0.2149: [security]: use-after-free in exec_instructions() Problem: [security]: use-after-free in exec_instructions() Solution: get tv pointer again [security]: use-after-free in exec_instructions() exec_instructions may access freed memory, if the GA_GROWS_FAILS() re-allocates memory. When this happens, the typval tv may still point to now already freed memory. So let's get that pointer again and compare it with tv. If those two pointers differ, tv is now invalid and we have to refresh the tv pointer. closes: #13621 Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Sun, 10 Dec 2023 15:16:17 +0100
parents 0839c759c9d1
children a522c6c0127b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2 *
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4 *
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
8 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
9
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
10 /*
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11 * textformat.c: text formatting functions
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
12 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
13
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
14 #include "vim.h"
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
16 static int did_add_space = FALSE; // auto_format() added an extra space
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
17 // under the cursor
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
18
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
19 #define WHITECHAR(cc) (VIM_ISWHITE(cc) && (!enc_utf8 || !utf_iscomposing(utf_ptr2char(ml_get_cursor() + 1))))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
20
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
21 /*
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
22 * Return TRUE if format option 'x' is in effect.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
23 * Take care of no formatting when 'paste' is set.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
24 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
25 int
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
26 has_format_option(int x)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
27 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
28 if (p_paste)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
29 return FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
30 return (vim_strchr(curbuf->b_p_fo, x) != NULL);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
31 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
32
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
33 /*
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
34 * Format text at the current insert position.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
35 *
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
36 * If the INSCHAR_COM_LIST flag is present, then the value of second_indent
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
37 * will be the comment leader length sent to open_line().
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
38 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
39 void
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
40 internal_format(
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
41 int textwidth,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
42 int second_indent,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
43 int flags,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
44 int format_only,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
45 int c) // character to be inserted (can be NUL)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
46 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
47 int cc;
20695
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
48 int skip_pos;
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
49 int save_char = NUL;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
50 int haveto_redraw = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
51 int fo_ins_blank = has_format_option(FO_INS_BLANK);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
52 int fo_multibyte = has_format_option(FO_MBYTE_BREAK);
20695
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
53 int fo_rigor_tw = has_format_option(FO_RIGOROUS_TW);
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
54 int fo_white_par = has_format_option(FO_WHITE_PAR);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
55 int first_line = TRUE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
56 colnr_T leader_len;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
57 int no_leader = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
58 int do_comments = (flags & INSCHAR_DO_COM);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
59 #ifdef FEAT_LINEBREAK
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
60 int has_lbr = curwin->w_p_lbr;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
61
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
62 // make sure win_lbr_chartabsize() counts correctly
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
63 curwin->w_p_lbr = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
64 #endif
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
65
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
66 // When 'ai' is off we don't want a space under the cursor to be
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
67 // deleted. Replace it with an 'x' temporarily.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
68 if (!curbuf->b_p_ai && !(State & VREPLACE_FLAG))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
69 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
70 cc = gchar_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
71 if (VIM_ISWHITE(cc))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
72 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
73 save_char = cc;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
74 pchar_cursor('x');
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
75 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
76 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
77
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
78 // Repeat breaking lines, until the current line is not too long.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
79 while (!got_int)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
80 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
81 int startcol; // Cursor column at entry
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
82 int wantcol; // column at textwidth border
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
83 int foundcol; // column for start of spaces
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
84 int end_foundcol = 0; // column for start of word
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
85 colnr_T len;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
86 colnr_T virtcol;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
87 int orig_col = 0;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
88 char_u *saved_text = NULL;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
89 colnr_T col;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
90 colnr_T end_col;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
91 int wcc; // counter for whitespace chars
26516
9596c652420b patch 8.2.3787: no proper formatting of a C line comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 26448
diff changeset
92 int did_do_comment = FALSE;
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
93
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
94 virtcol = get_nolist_virtcol()
29404
87980a7936e7 patch 9.0.0044: typos in comments, wrapping lines
Bram Moolenaar <Bram@vim.org>
parents: 28982
diff changeset
95 + char2cells(c != NUL ? c : gchar_cursor());
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
96 if (virtcol <= (colnr_T)textwidth)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
97 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
98
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
99 if (no_leader)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
100 do_comments = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
101 else if (!(flags & INSCHAR_FORMAT)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
102 && has_format_option(FO_WRAP_COMS))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
103 do_comments = TRUE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
104
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
105 // Don't break until after the comment leader
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
106 if (do_comments)
28767
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
107 {
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
108 char_u *line = ml_get_curline();
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
109
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
110 leader_len = get_leader_len(line, NULL, FALSE, TRUE);
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
111 if (leader_len == 0 && curbuf->b_p_cin)
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
112 {
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
113 int comment_start;
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
114
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
115 // Check for a line comment after code.
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
116 comment_start = check_linecomment(line);
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
117 if (comment_start != MAXCOL)
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
118 {
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
119 leader_len = get_leader_len(
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
120 line + comment_start, NULL, FALSE, TRUE);
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
121 if (leader_len != 0)
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
122 leader_len += comment_start;
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
123 }
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
124 }
7bbd859b2a48 patch 8.2.4908: no text formatting for // comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 27309
diff changeset
125 }
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
126 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
127 leader_len = 0;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
128
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
129 // If the line doesn't start with a comment leader, then don't
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
130 // start one in a following broken line. Avoids that a %word
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
131 // moved to the start of the next line causes all following lines
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
132 // to start with %.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
133 if (leader_len == 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
134 no_leader = TRUE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
135 if (!(flags & INSCHAR_FORMAT)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
136 && leader_len == 0
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
137 && !has_format_option(FO_WRAP))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
138
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
139 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
140 if ((startcol = curwin->w_cursor.col) == 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
141 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
142
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
143 // find column of textwidth border
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
144 coladvance((colnr_T)textwidth);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
145 wantcol = curwin->w_cursor.col;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
146
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
147 curwin->w_cursor.col = startcol;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
148 foundcol = 0;
20695
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
149 skip_pos = 0;
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
150
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
151 // Find position to break at.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
152 // Stop at first entered white when 'formatoptions' has 'v'
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
153 while ((!fo_ins_blank && !has_format_option(FO_INS_VI))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
154 || (flags & INSCHAR_FORMAT)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
155 || curwin->w_cursor.lnum != Insstart.lnum
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
156 || curwin->w_cursor.col >= Insstart.col)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
157 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
158 if (curwin->w_cursor.col == startcol && c != NUL)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
159 cc = c;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
160 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
161 cc = gchar_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
162 if (WHITECHAR(cc))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
163 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
164 // remember position of blank just before text
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
165 end_col = curwin->w_cursor.col;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
166
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
167 // find start of sequence of blanks
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
168 wcc = 0;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
169 while (curwin->w_cursor.col > 0 && WHITECHAR(cc))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
170 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
171 dec_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
172 cc = gchar_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
173
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
174 // Increment count of how many whitespace chars in this
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
175 // group; we only need to know if it's more than one.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
176 if (wcc < 2)
28809
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28773
diff changeset
177 wcc++;
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
178 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
179 if (curwin->w_cursor.col == 0 && WHITECHAR(cc))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
180 break; // only spaces in front of text
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
181
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
182 // Don't break after a period when 'formatoptions' has 'p' and
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
183 // there are less than two spaces.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
184 if (has_format_option(FO_PERIOD_ABBR) && cc == '.' && wcc < 2)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
185 continue;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
186
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
187 // Don't break until after the comment leader
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
188 if (curwin->w_cursor.col < leader_len)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
189 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
190 if (has_format_option(FO_ONE_LETTER))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
191 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
192 // do not break after one-letter words
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
193 if (curwin->w_cursor.col == 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
194 break; // one-letter word at begin
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
195 // do not break "#a b" when 'tw' is 2
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
196 if (curwin->w_cursor.col <= leader_len)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
197 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
198 col = curwin->w_cursor.col;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
199 dec_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
200 cc = gchar_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
201
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
202 if (WHITECHAR(cc))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
203 continue; // one-letter, continue
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
204 curwin->w_cursor.col = col;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
205 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
206
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
207 inc_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
208
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
209 end_foundcol = end_col + 1;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
210 foundcol = curwin->w_cursor.col;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
211 if (curwin->w_cursor.col <= (colnr_T)wantcol)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
212 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
213 }
26807
c1e083481f5d patch 8.2.3932: C line comment not formatted properly
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
214 else if ((cc >= 0x100 || !utf_allow_break_before(cc))
c1e083481f5d patch 8.2.3932: C line comment not formatted properly
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
215 && fo_multibyte)
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
216 {
20695
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
217 int ncc;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
218 int allow_break;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
219
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
220 // Break after or before a multi-byte character.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
221 if (curwin->w_cursor.col != startcol)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
222 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
223 // Don't break until after the comment leader
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
224 if (curwin->w_cursor.col < leader_len)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
225 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
226 col = curwin->w_cursor.col;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
227 inc_cursor();
20695
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
228 ncc = gchar_cursor();
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
229
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
230 allow_break =
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
231 (enc_utf8 && utf_allow_break(cc, ncc))
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
232 || enc_dbcs;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
233
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
234 // If we have already checked this position, skip!
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
235 if (curwin->w_cursor.col != skip_pos && allow_break)
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
236 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
237 foundcol = curwin->w_cursor.col;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
238 end_foundcol = foundcol;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
239 if (curwin->w_cursor.col <= (colnr_T)wantcol)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
240 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
241 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
242 curwin->w_cursor.col = col;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
243 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
244
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
245 if (curwin->w_cursor.col == 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
246 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
247
20695
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
248 ncc = cc;
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
249 col = curwin->w_cursor.col;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
250
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
251 dec_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
252 cc = gchar_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
253
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
254 if (WHITECHAR(cc))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
255 continue; // break with space
20695
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
256 // Don't break until after the comment leader.
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
257 if (curwin->w_cursor.col < leader_len)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
258 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
259
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
260 curwin->w_cursor.col = col;
20695
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
261 skip_pos = curwin->w_cursor.col;
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
262
20695
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
263 allow_break =
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
264 (enc_utf8 && utf_allow_break(cc, ncc))
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
265 || enc_dbcs;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
266
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
267 // Must handle this to respect line break prohibition.
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
268 if (allow_break)
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
269 {
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
270 foundcol = curwin->w_cursor.col;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
271 end_foundcol = foundcol;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
272 }
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
273 if (curwin->w_cursor.col <= (colnr_T)wantcol)
20695
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
274 {
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
275 int ncc_allow_break =
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
276 (enc_utf8 && utf_allow_break_before(ncc)) || enc_dbcs;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
277
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
278 if (allow_break)
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
279 break;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
280 if (!ncc_allow_break && !fo_rigor_tw)
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
281 {
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
282 // Enable at most 1 punct hang outside of textwidth.
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
283 if (curwin->w_cursor.col == startcol)
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
284 {
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
285 // We are inserting a non-breakable char, postpone
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
286 // line break check to next insert.
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
287 end_foundcol = foundcol = 0;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
288 break;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
289 }
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
290
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
291 // Neither cc nor ncc is NUL if we are here, so
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
292 // it's safe to inc_cursor.
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
293 col = curwin->w_cursor.col;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
294
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
295 inc_cursor();
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
296 cc = ncc;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
297 ncc = gchar_cursor();
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
298 // handle insert
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
299 ncc = (ncc != NUL) ? ncc : c;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
300
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
301 allow_break =
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
302 (enc_utf8 && utf_allow_break(cc, ncc))
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
303 || enc_dbcs;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
304
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
305 if (allow_break)
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
306 {
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
307 // Break only when we are not at end of line.
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
308 end_foundcol = foundcol =
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
309 ncc == NUL? 0 : curwin->w_cursor.col;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
310 break;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
311 }
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
312 curwin->w_cursor.col = col;
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
313 }
cea8ae407452 patch 8.2.0901: formatting CJK text isn't optimal
Bram Moolenaar <Bram@vim.org>
parents: 20237
diff changeset
314 }
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
315 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
316 if (curwin->w_cursor.col == 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
317 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
318 dec_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
319 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
320
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
321 if (foundcol == 0) // no spaces, cannot break line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
322 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
323 curwin->w_cursor.col = startcol;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
324 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
325 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
326
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
327 // Going to break the line, remove any "$" now.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
328 undisplay_dollar();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
329
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
330 // Offset between cursor position and line break is used by replace
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28767
diff changeset
331 // stack functions. MODE_VREPLACE does not use this, and backspaces
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
332 // over the text instead.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
333 if (State & VREPLACE_FLAG)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
334 orig_col = startcol; // Will start backspacing from here
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
335 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
336 replace_offset = startcol - end_foundcol;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
337
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
338 // adjust startcol for spaces that will be deleted and
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
339 // characters that will remain on top line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
340 curwin->w_cursor.col = foundcol;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
341 while ((cc = gchar_cursor(), WHITECHAR(cc))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
342 && (!fo_white_par || curwin->w_cursor.col < startcol))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
343 inc_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
344 startcol -= curwin->w_cursor.col;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
345 if (startcol < 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
346 startcol = 0;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
347
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
348 if (State & VREPLACE_FLAG)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
349 {
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28767
diff changeset
350 // In MODE_VREPLACE state, we will backspace over the text to be
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
351 // wrapped, so save a copy now to put on the next line.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
352 saved_text = vim_strsave(ml_get_cursor());
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
353 curwin->w_cursor.col = orig_col;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
354 if (saved_text == NULL)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
355 break; // Can't do it, out of memory
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
356 saved_text[startcol] = NUL;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
357
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
358 // Backspace over characters that will move to the next line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
359 if (!fo_white_par)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
360 backspace_until_column(foundcol);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
361 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
362 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
363 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
364 // put cursor after pos. to break line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
365 if (!fo_white_par)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
366 curwin->w_cursor.col = foundcol;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
367 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
368
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
369 // Split the line just before the margin.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
370 // Only insert/delete lines, but don't really redraw the window.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
371 open_line(FORWARD, OPENLINE_DELSPACES + OPENLINE_MARKFIX
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
372 + (fo_white_par ? OPENLINE_KEEPTRAIL : 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
373 + (do_comments ? OPENLINE_DO_COM : 0)
28972
864fa5276e78 patch 8.2.5008: when 'formatoptions' contains "/" wrongly wrapping comment
Bram Moolenaar <Bram@vim.org>
parents: 28942
diff changeset
374 + OPENLINE_FORMAT
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
375 + ((flags & INSCHAR_COM_LIST) ? OPENLINE_COM_LIST : 0)
26516
9596c652420b patch 8.2.3787: no proper formatting of a C line comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 26448
diff changeset
376 , ((flags & INSCHAR_COM_LIST) ? second_indent : old_indent),
9596c652420b patch 8.2.3787: no proper formatting of a C line comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 26448
diff changeset
377 &did_do_comment);
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
378 if (!(flags & INSCHAR_COM_LIST))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
379 old_indent = 0;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
380
26516
9596c652420b patch 8.2.3787: no proper formatting of a C line comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 26448
diff changeset
381 // If a comment leader was inserted, may also do this on a following
9596c652420b patch 8.2.3787: no proper formatting of a C line comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 26448
diff changeset
382 // line.
9596c652420b patch 8.2.3787: no proper formatting of a C line comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 26448
diff changeset
383 if (did_do_comment)
9596c652420b patch 8.2.3787: no proper formatting of a C line comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 26448
diff changeset
384 no_leader = FALSE;
9596c652420b patch 8.2.3787: no proper formatting of a C line comment after a statement
Bram Moolenaar <Bram@vim.org>
parents: 26448
diff changeset
385
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
386 replace_offset = 0;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
387 if (first_line)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
388 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
389 if (!(flags & INSCHAR_COM_LIST))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
390 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
391 // This section is for auto-wrap of numeric lists. When not
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
392 // in insert mode (i.e. format_lines()), the INSCHAR_COM_LIST
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
393 // flag will be set and open_line() will handle it (as seen
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
394 // above). The code here (and in get_number_indent()) will
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
395 // recognize comments if needed...
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
396 if (second_indent < 0 && has_format_option(FO_Q_NUMBER))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
397 second_indent =
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
398 get_number_indent(curwin->w_cursor.lnum - 1);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
399 if (second_indent >= 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
400 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
401 if (State & VREPLACE_FLAG)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
402 change_indent(INDENT_SET, second_indent,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
403 FALSE, NUL, TRUE);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
404 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
405 if (leader_len > 0 && second_indent - leader_len > 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
406 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
407 int i;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
408 int padding = second_indent - leader_len;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
409
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
410 // We started at the first_line of a numbered list
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
411 // that has a comment. the open_line() function has
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
412 // inserted the proper comment leader and positioned
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
413 // the cursor at the end of the split line. Now we
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
414 // add the additional whitespace needed after the
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
415 // comment leader for the numbered list.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
416 for (i = 0; i < padding; i++)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
417 ins_str((char_u *)" ");
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
418 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
419 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
420 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
421 (void)set_indent(second_indent, SIN_CHANGED);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
422 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
423 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
424 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
425 first_line = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
426 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
427
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
428 if (State & VREPLACE_FLAG)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
429 {
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28767
diff changeset
430 // In MODE_VREPLACE state we have backspaced over the text to be
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
431 // moved, now we re-insert it into the new line.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
432 ins_bytes(saved_text);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
433 vim_free(saved_text);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
434 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
435 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
436 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
437 // Check if cursor is not past the NUL off the line, cindent
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
438 // may have added or removed indent.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
439 curwin->w_cursor.col += startcol;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
440 len = (colnr_T)STRLEN(ml_get_curline());
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
441 if (curwin->w_cursor.col > len)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
442 curwin->w_cursor.col = len;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
443 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
444
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
445 haveto_redraw = TRUE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
446 set_can_cindent(TRUE);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
447 // moved the cursor, don't autoindent or cindent now
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
448 did_ai = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
449 did_si = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
450 can_si = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
451 can_si_back = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
452 line_breakcheck();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
453 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
454
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
455 if (save_char != NUL) // put back space after cursor
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
456 pchar_cursor(save_char);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
457
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
458 #ifdef FEAT_LINEBREAK
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
459 curwin->w_p_lbr = has_lbr;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
460 #endif
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
461 if (!format_only && haveto_redraw)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
462 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
463 update_topline();
29732
89e1d67814a9 patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents: 29660
diff changeset
464 redraw_curbuf_later(UPD_VALID);
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
465 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
466 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
467
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
468 /*
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
469 * Blank lines, and lines containing only the comment leader, are left
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
470 * untouched by the formatting. The function returns TRUE in this
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
471 * case. It also returns TRUE when a line starts with the end of a comment
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
472 * ('e' in comment flags), so that this line is skipped, and not joined to the
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
473 * previous line. A new paragraph starts after a blank line, or when the
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
474 * comment leader changes -- webb.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
475 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
476 static int
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
477 fmt_check_par(
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
478 linenr_T lnum,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
479 int *leader_len,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
480 char_u **leader_flags,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
481 int do_comments)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
482 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
483 char_u *flags = NULL; // init for GCC
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
484 char_u *ptr;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
485
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
486 ptr = ml_get(lnum);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
487 if (do_comments)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
488 *leader_len = get_leader_len(ptr, leader_flags, FALSE, TRUE);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
489 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
490 *leader_len = 0;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
491
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
492 if (*leader_len > 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
493 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
494 // Search for 'e' flag in comment leader flags.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
495 flags = *leader_flags;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
496 while (*flags && *flags != ':' && *flags != COM_END)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
497 ++flags;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
498 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
499
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
500 return (*skipwhite(ptr + *leader_len) == NUL
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
501 || (*leader_len > 0 && *flags == COM_END)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
502 || startPS(lnum, NUL, FALSE));
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
503 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
504
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
505 /*
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
506 * Return TRUE if line "lnum" ends in a white character.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
507 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
508 static int
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
509 ends_in_white(linenr_T lnum)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
510 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
511 char_u *s = ml_get(lnum);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
512 size_t l;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
513
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
514 if (*s == NUL)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
515 return FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
516 // Don't use STRLEN() inside VIM_ISWHITE(), SAS/C complains: "macro
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
517 // invocation may call function multiple times".
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
518 l = STRLEN(s) - 1;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
519 return VIM_ISWHITE(s[l]);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
520 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
521
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
522 /*
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
523 * Return TRUE if the two comment leaders given are the same. "lnum" is
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
524 * the first line. White-space is ignored. Note that the whole of
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
525 * 'leader1' must match 'leader2_len' characters from 'leader2' -- webb
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
526 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
527 static int
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
528 same_leader(
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
529 linenr_T lnum,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
530 int leader1_len,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
531 char_u *leader1_flags,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
532 int leader2_len,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
533 char_u *leader2_flags)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
534 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
535 int idx1 = 0, idx2 = 0;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
536 char_u *p;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
537 char_u *line1;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
538 char_u *line2;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
539
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
540 if (leader1_len == 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
541 return (leader2_len == 0);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
542
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
543 // If first leader has 'f' flag, the lines can be joined only if the
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
544 // second line does not have a leader.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
545 // If first leader has 'e' flag, the lines can never be joined.
26771
fc859aea8cec patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents: 26516
diff changeset
546 // If first leader has 's' flag, the lines can only be joined if there is
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
547 // some text after it and the second line has the 'm' flag.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
548 if (leader1_flags != NULL)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
549 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
550 for (p = leader1_flags; *p && *p != ':'; ++p)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
551 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
552 if (*p == COM_FIRST)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
553 return (leader2_len == 0);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
554 if (*p == COM_END)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
555 return FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
556 if (*p == COM_START)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
557 {
31807
defef01ac8ea patch 9.0.1236: code in same_leader() can be simplified
Bram Moolenaar <Bram@vim.org>
parents: 31786
diff changeset
558 int line_len = (int)STRLEN(ml_get(lnum));
31786
4eb7db656c4a patch 9.0.1225: reading past the end of a line when formatting text
Bram Moolenaar <Bram@vim.org>
parents: 30645
diff changeset
559 if (line_len <= leader1_len)
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
560 return FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
561 if (leader2_flags == NULL || leader2_len == 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
562 return FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
563 for (p = leader2_flags; *p && *p != ':'; ++p)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
564 if (*p == COM_MIDDLE)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
565 return TRUE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
566 return FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
567 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
568 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
569 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
570
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
571 // Get current line and next line, compare the leaders.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
572 // The first line has to be saved, only one line can be locked at a time.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
573 line1 = vim_strsave(ml_get(lnum));
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
574 if (line1 != NULL)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
575 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
576 for (idx1 = 0; VIM_ISWHITE(line1[idx1]); ++idx1)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
577 ;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
578 line2 = ml_get(lnum + 1);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
579 for (idx2 = 0; idx2 < leader2_len; ++idx2)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
580 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
581 if (!VIM_ISWHITE(line2[idx2]))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
582 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
583 if (line1[idx1++] != line2[idx2])
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
584 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
585 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
586 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
587 while (VIM_ISWHITE(line1[idx1]))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
588 ++idx1;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
589 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
590 vim_free(line1);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
591 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
592 return (idx2 == leader2_len && idx1 == leader1_len);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
593 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
594
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
595 /*
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
596 * Return TRUE when a paragraph starts in line "lnum". Return FALSE when the
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
597 * previous line is in the same paragraph. Used for auto-formatting.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
598 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
599 static int
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
600 paragraph_start(linenr_T lnum)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
601 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
602 char_u *p;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
603 int leader_len = 0; // leader len of current line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
604 char_u *leader_flags = NULL; // flags for leader of current line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
605 int next_leader_len; // leader len of next line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
606 char_u *next_leader_flags; // flags for leader of next line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
607 int do_comments; // format comments
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
608
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
609 if (lnum <= 1)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
610 return TRUE; // start of the file
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
611
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
612 p = ml_get(lnum - 1);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
613 if (*p == NUL)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
614 return TRUE; // after empty line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
615
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
616 do_comments = has_format_option(FO_Q_COMS);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
617 if (fmt_check_par(lnum - 1, &leader_len, &leader_flags, do_comments))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
618 return TRUE; // after non-paragraph line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
619
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
620 if (fmt_check_par(lnum, &next_leader_len, &next_leader_flags, do_comments))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
621 return TRUE; // "lnum" is not a paragraph line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
622
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
623 if (has_format_option(FO_WHITE_PAR) && !ends_in_white(lnum - 1))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
624 return TRUE; // missing trailing space in previous line.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
625
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
626 if (has_format_option(FO_Q_NUMBER) && (get_number_indent(lnum) > 0))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
627 return TRUE; // numbered item starts in "lnum".
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
628
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
629 if (!same_leader(lnum - 1, leader_len, leader_flags,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
630 next_leader_len, next_leader_flags))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
631 return TRUE; // change of comment leader.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
632
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
633 return FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
634 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
635
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
636 /*
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
637 * Called after inserting or deleting text: When 'formatoptions' includes the
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
638 * 'a' flag format from the current line until the end of the paragraph.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
639 * Keep the cursor at the same position relative to the text.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
640 * The caller must have saved the cursor line for undo, following ones will be
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
641 * saved here.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
642 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
643 void
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
644 auto_format(
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
645 int trailblank, // when TRUE also format with trailing blank
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
646 int prev_line) // may start in previous line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
647 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
648 pos_T pos;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
649 colnr_T len;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
650 char_u *old;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
651 char_u *new, *pnew;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
652 int wasatend;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
653 int cc;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
654
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
655 if (!has_format_option(FO_AUTO))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
656 return;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
657
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
658 pos = curwin->w_cursor;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
659 old = ml_get_curline();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
660
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
661 // may remove added space
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
662 check_auto_format(FALSE);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
663
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
664 // Don't format in Insert mode when the cursor is on a trailing blank, the
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
665 // user might insert normal text next. Also skip formatting when "1" is
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
666 // in 'formatoptions' and there is a single character before the cursor.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
667 // Otherwise the line would be broken and when typing another non-white
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
668 // next they are not joined back together.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
669 wasatend = (pos.col == (colnr_T)STRLEN(old));
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
670 if (*old != NUL && !trailblank && wasatend)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
671 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
672 dec_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
673 cc = gchar_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
674 if (!WHITECHAR(cc) && curwin->w_cursor.col > 0
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
675 && has_format_option(FO_ONE_LETTER))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
676 dec_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
677 cc = gchar_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
678 if (WHITECHAR(cc))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
679 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
680 curwin->w_cursor = pos;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
681 return;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
682 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
683 curwin->w_cursor = pos;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
684 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
685
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
686 // With the 'c' flag in 'formatoptions' and 't' missing: only format
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
687 // comments.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
688 if (has_format_option(FO_WRAP_COMS) && !has_format_option(FO_WRAP)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
689 && get_leader_len(old, NULL, FALSE, TRUE) == 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
690 return;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
691
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
692 // May start formatting in a previous line, so that after "x" a word is
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
693 // moved to the previous line if it fits there now. Only when this is not
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
694 // the start of a paragraph.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
695 if (prev_line && !paragraph_start(curwin->w_cursor.lnum))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
696 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
697 --curwin->w_cursor.lnum;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
698 if (u_save_cursor() == FAIL)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
699 return;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
700 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
701
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
702 // Do the formatting and restore the cursor position. "saved_cursor" will
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
703 // be adjusted for the text formatting.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
704 saved_cursor = pos;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
705 format_lines((linenr_T)-1, FALSE);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
706 curwin->w_cursor = saved_cursor;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
707 saved_cursor.lnum = 0;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
708
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
709 if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
710 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
711 // "cannot happen"
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
712 curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
713 coladvance((colnr_T)MAXCOL);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
714 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
715 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
716 check_cursor_col();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
717
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
718 // Insert mode: If the cursor is now after the end of the line while it
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
719 // previously wasn't, the line was broken. Because of the rule above we
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
720 // need to add a space when 'w' is in 'formatoptions' to keep a paragraph
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
721 // formatted.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
722 if (!wasatend && has_format_option(FO_WHITE_PAR))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
723 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
724 new = ml_get_curline();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
725 len = (colnr_T)STRLEN(new);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
726 if (curwin->w_cursor.col == len)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
727 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
728 pnew = vim_strnsave(new, len + 2);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
729 pnew[len] = ' ';
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
730 pnew[len + 1] = NUL;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
731 ml_replace(curwin->w_cursor.lnum, pnew, FALSE);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
732 // remove the space later
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
733 did_add_space = TRUE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
734 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
735 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
736 // may remove added space
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
737 check_auto_format(FALSE);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
738 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
739
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
740 check_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
741 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
742
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
743 /*
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
744 * When an extra space was added to continue a paragraph for auto-formatting,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
745 * delete it now. The space must be under the cursor, just after the insert
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
746 * position.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
747 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
748 void
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
749 check_auto_format(
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
750 int end_insert) // TRUE when ending Insert mode
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
751 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
752 int c = ' ';
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
753 int cc;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
754
31825
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
755 if (!did_add_space)
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
756 return;
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
757
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
758 cc = gchar_cursor();
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
759 if (!WHITECHAR(cc))
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
760 // Somehow the space was removed already.
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
761 did_add_space = FALSE;
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
762 else
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
763 {
31825
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
764 if (!end_insert)
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
765 {
31825
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
766 inc_cursor();
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
767 c = gchar_cursor();
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
768 dec_cursor();
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
769 }
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
770 if (c != NUL)
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
771 {
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
772 // The space is no longer at the end of the line, delete it.
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
773 del_char(FALSE);
0d27ddce621d patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31807
diff changeset
774 did_add_space = FALSE;
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
775 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
776 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
777 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
778
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
779 /*
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
780 * Find out textwidth to be used for formatting:
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
781 * if 'textwidth' option is set, use it
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
782 * else if 'wrapmargin' option is set, use curwin->w_width - 'wrapmargin'
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
783 * if invalid value, use 0.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
784 * Set default to window width (maximum 79) for "gq" operator.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
785 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
786 int
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
787 comp_textwidth(
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
788 int ff) // force formatting (for "gq" command)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
789 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
790 int textwidth;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
791
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
792 textwidth = curbuf->b_p_tw;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
793 if (textwidth == 0 && curbuf->b_p_wm)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
794 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
795 // The width is the window width minus 'wrapmargin' minus all the
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
796 // things that add to the margin.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
797 textwidth = curwin->w_width - curbuf->b_p_wm;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
798 if (cmdwin_type != 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
799 textwidth -= 1;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
800 #ifdef FEAT_FOLDING
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
801 textwidth -= curwin->w_p_fdc;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
802 #endif
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
803 #ifdef FEAT_SIGNS
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
804 if (signcolumn_on(curwin))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
805 textwidth -= 1;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
806 #endif
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
807 if (curwin->w_p_nu || curwin->w_p_rnu)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
808 textwidth -= 8;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
809 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
810 if (textwidth < 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
811 textwidth = 0;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
812 if (ff && textwidth == 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
813 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
814 textwidth = curwin->w_width - 1;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
815 if (textwidth > 79)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
816 textwidth = 79;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
817 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
818 return textwidth;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
819 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
820
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
821 /*
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
822 * Implementation of the format operator 'gq'.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
823 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
824 void
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
825 op_format(
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
826 oparg_T *oap,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
827 int keep_cursor) // keep cursor on same text char
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
828 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
829 long old_line_count = curbuf->b_ml.ml_line_count;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
830
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
831 // Place the cursor where the "gq" or "gw" command was given, so that "u"
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
832 // can put it back there.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
833 curwin->w_cursor = oap->cursor_start;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
834
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
835 if (u_save((linenr_T)(oap->start.lnum - 1),
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
836 (linenr_T)(oap->end.lnum + 1)) == FAIL)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
837 return;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
838 curwin->w_cursor = oap->start;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
839
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
840 if (oap->is_VIsual)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
841 // When there is no change: need to remove the Visual selection
29732
89e1d67814a9 patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents: 29660
diff changeset
842 redraw_curbuf_later(UPD_INVERTED);
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
843
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 20695
diff changeset
844 if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
845 // Set '[ mark at the start of the formatted area
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
846 curbuf->b_op_start = oap->start;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
847
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
848 // For "gw" remember the cursor position and put it back below (adjusted
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
849 // for joined and split lines).
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
850 if (keep_cursor)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
851 saved_cursor = oap->cursor_start;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
852
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
853 format_lines(oap->line_count, keep_cursor);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
854
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
855 // Leave the cursor at the first non-blank of the last formatted line.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
856 // If the cursor was moved one line back (e.g. with "Q}") go to the next
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
857 // line, so "." will do the next lines.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
858 if (oap->end_adjusted && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
859 ++curwin->w_cursor.lnum;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
860 beginline(BL_WHITE | BL_FIX);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
861 old_line_count = curbuf->b_ml.ml_line_count - old_line_count;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
862 msgmore(old_line_count);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
863
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 20695
diff changeset
864 if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0)
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
865 // put '] mark on the end of the formatted area
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
866 curbuf->b_op_end = curwin->w_cursor;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
867
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
868 if (keep_cursor)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
869 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
870 curwin->w_cursor = saved_cursor;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
871 saved_cursor.lnum = 0;
28982
5478246aa14b patch 8.2.5013: after text formatting cursor may be in an invalid position
Bram Moolenaar <Bram@vim.org>
parents: 28972
diff changeset
872
5478246aa14b patch 8.2.5013: after text formatting cursor may be in an invalid position
Bram Moolenaar <Bram@vim.org>
parents: 28972
diff changeset
873 // formatting may have made the cursor position invalid
5478246aa14b patch 8.2.5013: after text formatting cursor may be in an invalid position
Bram Moolenaar <Bram@vim.org>
parents: 28972
diff changeset
874 check_cursor();
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
875 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
876
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
877 if (oap->is_VIsual)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
878 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
879 win_T *wp;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
880
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
881 FOR_ALL_WINDOWS(wp)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
882 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
883 if (wp->w_old_cursor_lnum != 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
884 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
885 // When lines have been inserted or deleted, adjust the end of
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
886 // the Visual area to be redrawn.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
887 if (wp->w_old_cursor_lnum > wp->w_old_visual_lnum)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
888 wp->w_old_cursor_lnum += old_line_count;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
889 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
890 wp->w_old_visual_lnum += old_line_count;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
891 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
892 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
893 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
894 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
895
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
896 #if defined(FEAT_EVAL) || defined(PROTO)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
897 /*
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
898 * Implementation of the format operator 'gq' for when using 'formatexpr'.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
899 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
900 void
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
901 op_formatexpr(oparg_T *oap)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
902 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
903 if (oap->is_VIsual)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
904 // When there is no change: need to remove the Visual selection
29732
89e1d67814a9 patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents: 29660
diff changeset
905 redraw_curbuf_later(UPD_INVERTED);
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
906
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
907 if (fex_format(oap->start.lnum, oap->line_count, NUL) != 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
908 // As documented: when 'formatexpr' returns non-zero fall back to
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
909 // internal formatting.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
910 op_format(oap, FALSE);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
911 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
912
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
913 int
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
914 fex_format(
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
915 linenr_T lnum,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
916 long count,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
917 int c) // character to be inserted
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
918 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
919 int use_sandbox = was_set_insecurely((char_u *)"formatexpr",
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
920 OPT_LOCAL);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
921 int r;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
922 char_u *fex;
27309
391011658d95 patch 8.2.4183: cannot use an import in 'formatexpr'
Bram Moolenaar <Bram@vim.org>
parents: 26807
diff changeset
923 sctx_T save_sctx = current_sctx;
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
924
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
925 // Set v:lnum to the first line number and v:count to the number of lines.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
926 // Set v:char to the character to be inserted (can be NUL).
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
927 set_vim_var_nr(VV_LNUM, lnum);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
928 set_vim_var_nr(VV_COUNT, count);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
929 set_vim_var_char(c);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
930
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
931 // Make a copy, the option could be changed while calling it.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
932 fex = vim_strsave(curbuf->b_p_fex);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
933 if (fex == NULL)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
934 return 0;
27309
391011658d95 patch 8.2.4183: cannot use an import in 'formatexpr'
Bram Moolenaar <Bram@vim.org>
parents: 26807
diff changeset
935 current_sctx = curbuf->b_p_script_ctx[BV_FEX];
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
936
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
937 // Evaluate the function.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
938 if (use_sandbox)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
939 ++sandbox;
30598
37aa9fd2ed72 patch 9.0.0634: evaluating "expr" options has more overhead than needed
Bram Moolenaar <Bram@vim.org>
parents: 29732
diff changeset
940 r = (int)eval_to_number(fex, TRUE);
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
941 if (use_sandbox)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
942 --sandbox;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
943
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
944 set_vim_var_string(VV_CHAR, NULL, -1);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
945 vim_free(fex);
27309
391011658d95 patch 8.2.4183: cannot use an import in 'formatexpr'
Bram Moolenaar <Bram@vim.org>
parents: 26807
diff changeset
946 current_sctx = save_sctx;
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
947
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
948 return r;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
949 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
950 #endif
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
951
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
952 /*
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
953 * Format "line_count" lines, starting at the cursor position.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
954 * When "line_count" is negative, format until the end of the paragraph.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
955 * Lines after the cursor line are saved for undo, caller must have saved the
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
956 * first line.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
957 */
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
958 void
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
959 format_lines(
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
960 linenr_T line_count,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
961 int avoid_fex) // don't use 'formatexpr'
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
962 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
963 int max_len;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
964 int is_not_par; // current line not part of parag.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
965 int next_is_not_par; // next line not part of paragraph
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
966 int is_end_par; // at end of paragraph
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
967 int prev_is_end_par = FALSE;// prev. line not part of parag.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
968 int next_is_start_par = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
969 int leader_len = 0; // leader len of current line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
970 int next_leader_len; // leader len of next line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
971 char_u *leader_flags = NULL; // flags for leader of current line
26807
c1e083481f5d patch 8.2.3932: C line comment not formatted properly
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
972 char_u *next_leader_flags = NULL; // flags for leader of next line
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
973 int do_comments; // format comments
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
974 int do_comments_list = 0; // format comments with 'n' or '2'
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
975 int advance = TRUE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
976 int second_indent = -1; // indent for second line (comment
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
977 // aware)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
978 int do_second_indent;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
979 int do_number_indent;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
980 int do_trail_white;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
981 int first_par_line = TRUE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
982 int smd_save;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
983 long count;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
984 int need_set_indent = TRUE; // set indent of next paragraph
26448
748793fcb4e2 patch 8.2.3754: undesired changing of the indent of the first formatted line
Bram Moolenaar <Bram@vim.org>
parents: 26167
diff changeset
985 linenr_T first_line = curwin->w_cursor.lnum;
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
986 int force_format = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
987 int old_State = State;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
988
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
989 // length of a line to force formatting: 3 * 'tw'
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
990 max_len = comp_textwidth(TRUE) * 3;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
991
33753
0839c759c9d1 patch 9.0.2100: CI: test_termdebug fails
Christian Brabandt <cb@256bit.org>
parents: 31825
diff changeset
992 // check for 'q', '2', 'n' and 'w' in 'formatoptions'
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
993 do_comments = has_format_option(FO_Q_COMS);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
994 do_second_indent = has_format_option(FO_Q_SECOND);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
995 do_number_indent = has_format_option(FO_Q_NUMBER);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
996 do_trail_white = has_format_option(FO_WHITE_PAR);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
997
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
998 // Get info about the previous and current line.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
999 if (curwin->w_cursor.lnum > 1)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1000 is_not_par = fmt_check_par(curwin->w_cursor.lnum - 1
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1001 , &leader_len, &leader_flags, do_comments);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1002 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1003 is_not_par = TRUE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1004 next_is_not_par = fmt_check_par(curwin->w_cursor.lnum
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1005 , &next_leader_len, &next_leader_flags, do_comments);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1006 is_end_par = (is_not_par || next_is_not_par);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1007 if (!is_end_par && do_trail_white)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1008 is_end_par = !ends_in_white(curwin->w_cursor.lnum - 1);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1009
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1010 curwin->w_cursor.lnum--;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1011 for (count = line_count; count != 0 && !got_int; --count)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1012 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1013 // Advance to next paragraph.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1014 if (advance)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1015 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1016 curwin->w_cursor.lnum++;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1017 prev_is_end_par = is_end_par;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1018 is_not_par = next_is_not_par;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1019 leader_len = next_leader_len;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1020 leader_flags = next_leader_flags;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1021 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1022
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1023 // The last line to be formatted.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1024 if (count == 1 || curwin->w_cursor.lnum == curbuf->b_ml.ml_line_count)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1025 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1026 next_is_not_par = TRUE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1027 next_leader_len = 0;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1028 next_leader_flags = NULL;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1029 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1030 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1031 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1032 next_is_not_par = fmt_check_par(curwin->w_cursor.lnum + 1
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1033 , &next_leader_len, &next_leader_flags, do_comments);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1034 if (do_number_indent)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1035 next_is_start_par =
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1036 (get_number_indent(curwin->w_cursor.lnum + 1) > 0);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1037 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1038 advance = TRUE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1039 is_end_par = (is_not_par || next_is_not_par || next_is_start_par);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1040 if (!is_end_par && do_trail_white)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1041 is_end_par = !ends_in_white(curwin->w_cursor.lnum);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1042
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1043 // Skip lines that are not in a paragraph.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1044 if (is_not_par)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1045 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1046 if (line_count < 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1047 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1048 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1049 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1050 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1051 // For the first line of a paragraph, check indent of second line.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1052 // Don't do this for comments and empty lines.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1053 if (first_par_line
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1054 && (do_second_indent || do_number_indent)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1055 && prev_is_end_par
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1056 && curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1057 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1058 if (do_second_indent && !LINEEMPTY(curwin->w_cursor.lnum + 1))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1059 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1060 if (leader_len == 0 && next_leader_len == 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1061 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1062 // no comment found
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1063 second_indent =
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1064 get_indent_lnum(curwin->w_cursor.lnum + 1);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1065 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1066 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1067 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1068 second_indent = next_leader_len;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1069 do_comments_list = 1;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1070 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1071 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1072 else if (do_number_indent)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1073 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1074 if (leader_len == 0 && next_leader_len == 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1075 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1076 // no comment found
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1077 second_indent =
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1078 get_number_indent(curwin->w_cursor.lnum);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1079 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1080 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1081 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1082 // get_number_indent() is now "comment aware"...
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1083 second_indent =
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1084 get_number_indent(curwin->w_cursor.lnum);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1085 do_comments_list = 1;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1086 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1087 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1088 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1089
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1090 // When the comment leader changes, it's the end of the paragraph.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1091 if (curwin->w_cursor.lnum >= curbuf->b_ml.ml_line_count
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1092 || !same_leader(curwin->w_cursor.lnum,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1093 leader_len, leader_flags,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1094 next_leader_len, next_leader_flags))
26807
c1e083481f5d patch 8.2.3932: C line comment not formatted properly
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1095 {
c1e083481f5d patch 8.2.3932: C line comment not formatted properly
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1096 // Special case: If the next line starts with a line comment
c1e083481f5d patch 8.2.3932: C line comment not formatted properly
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1097 // and this line has a line comment after some text, the
c1e083481f5d patch 8.2.3932: C line comment not formatted properly
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1098 // paragraph doesn't really end.
c1e083481f5d patch 8.2.3932: C line comment not formatted properly
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1099 if (next_leader_flags == NULL
c1e083481f5d patch 8.2.3932: C line comment not formatted properly
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1100 || STRNCMP(next_leader_flags, "://", 3) != 0
c1e083481f5d patch 8.2.3932: C line comment not formatted properly
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1101 || check_linecomment(ml_get_curline()) == MAXCOL)
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1102 is_end_par = TRUE;
26807
c1e083481f5d patch 8.2.3932: C line comment not formatted properly
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1103 }
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1104
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1105 // If we have got to the end of a paragraph, or the line is
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1106 // getting long, format it.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1107 if (is_end_par || force_format)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1108 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1109 if (need_set_indent)
26167
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1110 {
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1111 int indent = 0; // amount of indent needed
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1112
26448
748793fcb4e2 patch 8.2.3754: undesired changing of the indent of the first formatted line
Bram Moolenaar <Bram@vim.org>
parents: 26167
diff changeset
1113 // Replace indent in first line of a paragraph with minimal
748793fcb4e2 patch 8.2.3754: undesired changing of the indent of the first formatted line
Bram Moolenaar <Bram@vim.org>
parents: 26167
diff changeset
1114 // number of tabs and spaces, according to current options.
748793fcb4e2 patch 8.2.3754: undesired changing of the indent of the first formatted line
Bram Moolenaar <Bram@vim.org>
parents: 26167
diff changeset
1115 // For the very first formatted line keep the current
748793fcb4e2 patch 8.2.3754: undesired changing of the indent of the first formatted line
Bram Moolenaar <Bram@vim.org>
parents: 26167
diff changeset
1116 // indent.
748793fcb4e2 patch 8.2.3754: undesired changing of the indent of the first formatted line
Bram Moolenaar <Bram@vim.org>
parents: 26167
diff changeset
1117 if (curwin->w_cursor.lnum == first_line)
748793fcb4e2 patch 8.2.3754: undesired changing of the indent of the first formatted line
Bram Moolenaar <Bram@vim.org>
parents: 26167
diff changeset
1118 indent = get_indent();
28942
6cdf55afaae9 patch 8.2.4993: smart/C/lisp indenting is optional
Bram Moolenaar <Bram@vim.org>
parents: 28809
diff changeset
1119 else if (curbuf->b_p_lisp)
26167
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1120 indent = get_lisp_indent();
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1121 else
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1122 {
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1123 if (cindent_on())
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1124 {
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1125 indent =
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1126 # ifdef FEAT_EVAL
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1127 *curbuf->b_p_inde != NUL ? get_expr_indent() :
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1128 # endif
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1129 get_c_indent();
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1130 }
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1131 else
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1132 indent = get_indent();
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1133 }
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1134 (void)set_indent(indent, SIN_CHANGED);
7108cee19a2c patch 8.2.3615: wrong indent in first line if re-formatting with indent expr
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1135 }
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1136
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1137 // put cursor on last non-space
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28767
diff changeset
1138 State = MODE_NORMAL; // don't go past end-of-line
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1139 coladvance((colnr_T)MAXCOL);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1140 while (curwin->w_cursor.col && vim_isspace(gchar_cursor()))
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1141 dec_cursor();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1142
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1143 // do the formatting, without 'showmode'
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28767
diff changeset
1144 State = MODE_INSERT; // for open_line()
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1145 smd_save = p_smd;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1146 p_smd = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1147 insertchar(NUL, INSCHAR_FORMAT
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1148 + (do_comments ? INSCHAR_DO_COM : 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1149 + (do_comments && do_comments_list
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1150 ? INSCHAR_COM_LIST : 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1151 + (avoid_fex ? INSCHAR_NO_FEX : 0), second_indent);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1152 State = old_State;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1153 p_smd = smd_save;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1154 second_indent = -1;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1155 // at end of par.: need to set indent of next par.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1156 need_set_indent = is_end_par;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1157 if (is_end_par)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1158 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1159 // When called with a negative line count, break at the
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1160 // end of the paragraph.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1161 if (line_count < 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1162 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1163 first_par_line = TRUE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1164 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1165 force_format = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1166 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1167
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1168 // When still in same paragraph, join the lines together. But
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1169 // first delete the leader from the second line.
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1170 if (!is_end_par)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1171 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1172 advance = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1173 curwin->w_cursor.lnum++;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1174 curwin->w_cursor.col = 0;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1175 if (line_count < 0 && u_save_cursor() == FAIL)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1176 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1177 if (next_leader_len > 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1178 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1179 (void)del_bytes((long)next_leader_len, FALSE, FALSE);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1180 mark_col_adjust(curwin->w_cursor.lnum, (colnr_T)0, 0L,
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1181 (long)-next_leader_len, 0);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1182 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1183 else if (second_indent > 0) // the "leader" for FO_Q_SECOND
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1184 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1185 int indent = getwhitecols_curline();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1186
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1187 if (indent > 0)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1188 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1189 (void)del_bytes(indent, FALSE, FALSE);
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1190 mark_col_adjust(curwin->w_cursor.lnum,
29660
e134ff00be57 patch 9.0.0170: various minor code formatting issues
Bram Moolenaar <Bram@vim.org>
parents: 29404
diff changeset
1191 (colnr_T)0, 0L, (long)-indent, 0);
20237
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1192 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1193 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1194 curwin->w_cursor.lnum--;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1195 if (do_join(2, TRUE, FALSE, FALSE, FALSE) == FAIL)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1196 {
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1197 beep_flush();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1198 break;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1199 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1200 first_par_line = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1201 // If the line is getting long, format it next time
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1202 if (STRLEN(ml_get_curline()) > (size_t)max_len)
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1203 force_format = TRUE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1204 else
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1205 force_format = FALSE;
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1206 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1207 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1208 line_breakcheck();
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1209 }
918245588b50 patch 8.2.0674: some source files are too big
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1210 }