diff options
author | Bram Moolenaar <Bram@vim.org> | 2010-07-11 17:23:02 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2010-07-11 17:23:02 +0200 |
commit | 3acfc30409eb8e3721d888f2e7111111057fe937 (patch) | |
tree | 22ca3ab3536417810973c22fd67caf32bf453945 | |
parent | 9028b10dfe3a00e505bf1b720f515dab91913b5e (diff) | |
download | vim-3acfc30409eb8e3721d888f2e7111111057fe937.zip |
Improve Javascript indenting. Add "J" flag to 'cino'. (Hari Kumar G)
-rw-r--r-- | runtime/doc/indent.txt | 18 | ||||
-rw-r--r-- | runtime/doc/todo.txt | 3 | ||||
-rw-r--r-- | runtime/indent/javascript.vim | 1 | ||||
-rw-r--r-- | src/edit.c | 5 | ||||
-rw-r--r-- | src/misc1.c | 57 | ||||
-rw-r--r-- | src/proto/misc1.pro | 2 |
6 files changed, 63 insertions, 23 deletions
diff --git a/runtime/doc/indent.txt b/runtime/doc/indent.txt index 355c90996..410fe38ea 100644 --- a/runtime/doc/indent.txt +++ b/runtime/doc/indent.txt @@ -431,6 +431,24 @@ assume a 'shiftwidth' of 4. } }); < + *javascript-cinoptions* *javascript-indenting* + JN Indent JavaScript object declarations correctly by not confusing + them with labels. The value 'N' is currently unused but must be + non-zero (e.g. 'J1'). > + + var bar = { + foo: { + that: this, + some: ok, + }, + "bar":{ + a : 2, + b: "123abc", + x: 4, + "y": 5 + } + } +< )N Vim searches for unclosed parentheses at most N lines away. This limits the time needed to search for parentheses. (default 20 lines). diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index 838fca9f2..60cc35555 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1089,11 +1089,10 @@ Patch to support horizontal scroll wheel in GTK. Untested. (Bjorn Winckler, Vim 7.3: -- soon: remove UF_VERSION_CRYPT_PREV and UF_VERSION_PREV. +- Soon: remove UF_VERSION_CRYPT_PREV and UF_VERSION_PREV. - Conceal feature: no update when moving to another window. (Dominique Pelle, 2010 Jul 5) Vince will look into it. Patches to possibly include: -- Patch to support :browse for more commands. (Lech Lorens, 2009 Jul 18) - Patch to improve javascript indenting. (Hari Kumar G, 2010 May 22) - Patch to use return value of 'formatexpr'. (James Vega, 2010 Jun 16) - Patch for gtk main_loop() to enable GtkFileChooser. (James Vega, 2010 Jun 28) diff --git a/runtime/indent/javascript.vim b/runtime/indent/javascript.vim index cf4a4f3ce..a83d34b11 100644 --- a/runtime/indent/javascript.vim +++ b/runtime/indent/javascript.vim @@ -11,5 +11,6 @@ let b:did_indent = 1 " C indenting is not too bad. setlocal cindent +setlocal cinoptions+=j1,J1 let b:undo_indent = "setl cin<" diff --git a/src/edit.c b/src/edit.c index 3ee76553c..2db06cf0c 100644 --- a/src/edit.c +++ b/src/edit.c @@ -7545,7 +7545,8 @@ in_cinkeys(keytyped, when, line_is_empty) if (try_match && keytyped == ':') { p = ml_get_curline(); - if (cin_iscase(p) || cin_isscopedecl(p) || cin_islabel(30)) + if (cin_iscase(p, FALSE) || cin_isscopedecl(p) + || cin_islabel(30)) return TRUE; /* Need to get the line again after cin_islabel(). */ p = ml_get_curline(); @@ -7554,7 +7555,7 @@ in_cinkeys(keytyped, when, line_is_empty) && p[curwin->w_cursor.col - 2] == ':') { p[curwin->w_cursor.col - 1] = ' '; - i = (cin_iscase(p) || cin_isscopedecl(p) + i = (cin_iscase(p, FALSE) || cin_isscopedecl(p) || cin_islabel(30)); p = ml_get_curline(); p[curwin->w_cursor.col - 1] = ':'; diff --git a/src/misc1.c b/src/misc1.c index 24b8521c6..31511249b 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -5050,7 +5050,7 @@ cin_islabel(ind_maxcomment) /* XXX */ curwin->w_cursor = cursor_save; if (cin_isterminated(line, TRUE, FALSE) || cin_isscopedecl(line) - || cin_iscase(line) + || cin_iscase(line, TRUE) || (cin_islabel_skip(&line) && cin_nocode(line))) return TRUE; return FALSE; @@ -5089,8 +5089,9 @@ cin_isinit(void) * Recognize a switch label: "case .*:" or "default:". */ int -cin_iscase(s) +cin_iscase(s, strict) char_u *s; + int strict; /* Allow relaxed check of case statement for JS */ { s = cin_skipcomment(s); if (STRNCMP(s, "case", 4) == 0 && !vim_isIDc(s[4])) @@ -5106,11 +5107,17 @@ cin_iscase(s) return TRUE; } if (*s == '\'' && s[1] && s[2] == '\'') - s += 2; /* skip over '.' */ + s += 2; /* skip over ':' */ else if (*s == '/' && (s[1] == '*' || s[1] == '/')) return FALSE; /* stop at comment */ else if (*s == '"') - return FALSE; /* stop at string */ + { + /* JS etc. */ + if (strict) + return FALSE; /* stop at string */ + else + return TRUE; + } } return FALSE; } @@ -5169,7 +5176,7 @@ after_label(l) { if (l[1] == ':') /* skip over "::" for C++ */ ++l; - else if (!cin_iscase(l + 1)) + else if (!cin_iscase(l + 1, FALSE)) break; } else if (*l == '\'' && l[1] && l[2] == '\'') @@ -5227,7 +5234,8 @@ skip_label(lnum, pp, ind_maxcomment) curwin->w_cursor.lnum = lnum; l = ml_get_curline(); /* XXX */ - if (cin_iscase(l) || cin_isscopedecl(l) || cin_islabel(ind_maxcomment)) + if (cin_iscase(l, FALSE) || cin_isscopedecl(l) + || cin_islabel(ind_maxcomment)) { amount = get_indent_nolabel(lnum); l = after_label(ml_get_curline()); @@ -6174,6 +6182,11 @@ get_c_indent() int ind_java = 0; /* + * not to confuse JS object properties with labels + */ + int ind_js = 0; + + /* * handle blocked cases correctly */ int ind_keep_case_label = 0; @@ -6286,6 +6299,7 @@ get_c_indent() case 'g': ind_scopedecl = n; break; case 'h': ind_scopedecl_code = n; break; case 'j': ind_java = n; break; + case 'J': ind_js = n; break; case 'l': ind_keep_case_label = n; break; case '#': ind_hash_comment = n; break; } @@ -6296,6 +6310,10 @@ get_c_indent() /* remember where the cursor was when we started */ cur_curpos = curwin->w_cursor; + /* if we are at line 1 0 is fine, right? */ + if (cur_curpos.lnum == 1) + return 0; + /* Get a copy of the current contents of the line. * This is required, because only the most recent line obtained with * ml_get is valid! */ @@ -6330,9 +6348,9 @@ get_c_indent() } /* - * Is it a non-case label? Then that goes at the left margin too. + * Is it a non-case label? Then that goes at the left margin too unless JS flag is set. */ - else if (cin_islabel(ind_maxcomment)) /* XXX */ + else if (!ind_js && cin_islabel(ind_maxcomment)) /* XXX */ { amount = 0; } @@ -6783,7 +6801,8 @@ get_c_indent() * ldfd) { * } */ - if (ind_keep_case_label && cin_iscase(skipwhite(ml_get_curline()))) + if ((ind_keep_case_label + && cin_iscase(skipwhite(ml_get_curline()), FALSE))) amount = get_indent(); else amount = skip_label(lnum, &l, ind_maxcomment); @@ -6861,7 +6880,7 @@ get_c_indent() lookfor_break = FALSE; - if (cin_iscase(theline)) /* it's a switch() label */ + if (cin_iscase(theline, FALSE)) /* it's a switch() label */ { lookfor = LOOKFOR_CASE; /* find a previous switch() label */ amount += ind_case; @@ -6922,7 +6941,7 @@ get_c_indent() * initialization) */ if (cont_amount > 0) amount = cont_amount; - else + else if (!ind_js) amount += ind_continuation; break; } @@ -7046,7 +7065,7 @@ get_c_indent() * If this is a switch() label, may line up relative to that. * If this is a C++ scope declaration, do the same. */ - iscase = cin_iscase(l); + iscase = cin_iscase(l, FALSE); if (iscase || cin_isscopedecl(l)) { /* we are only looking for cpp base class @@ -7170,7 +7189,7 @@ get_c_indent() /* * Ignore jump labels with nothing after them. */ - if (cin_islabel(ind_maxcomment)) + if (!ind_js && cin_islabel(ind_maxcomment)) { l = after_label(ml_get_curline()); if (l == NULL || cin_nocode(l)) @@ -7281,7 +7300,7 @@ get_c_indent() */ curwin->w_cursor = *trypos; l = ml_get_curline(); - if (cin_iscase(l) || cin_isscopedecl(l)) + if (cin_iscase(l, FALSE) || cin_isscopedecl(l)) { ++curwin->w_cursor.lnum; curwin->w_cursor.col = 0; @@ -7312,9 +7331,11 @@ get_c_indent() * Get indent and pointer to text for current line, * ignoring any jump label. XXX */ - cur_amount = skip_label(curwin->w_cursor.lnum, + if (!ind_js) + cur_amount = skip_label(curwin->w_cursor.lnum, &l, ind_maxcomment); - + else + cur_amount = get_indent(); /* * If this is just above the line we are indenting, and it * starts with a '{', line it up with this line. @@ -7640,7 +7661,7 @@ term_again: */ curwin->w_cursor = *trypos; l = ml_get_curline(); - if (cin_iscase(l) || cin_isscopedecl(l)) + if (cin_iscase(l, FALSE) || cin_isscopedecl(l)) { ++curwin->w_cursor.lnum; curwin->w_cursor.col = 0; @@ -7657,7 +7678,7 @@ term_again: * stat; * } */ - iscase = (ind_keep_case_label && cin_iscase(l)); + iscase = (ind_keep_case_label && cin_iscase(l, FALSE)); /* * Get indent and pointer to text for current line, diff --git a/src/proto/misc1.pro b/src/proto/misc1.pro index e7a820f3e..2a7b87ee9 100644 --- a/src/proto/misc1.pro +++ b/src/proto/misc1.pro @@ -76,7 +76,7 @@ char_u *FullName_save __ARGS((char_u *fname, int force)); pos_T *find_start_comment __ARGS((int ind_maxcomment)); void do_c_expr_indent __ARGS((void)); int cin_islabel __ARGS((int ind_maxcomment)); -int cin_iscase __ARGS((char_u *s)); +int cin_iscase __ARGS((char_u *s, int strict)); int cin_isscopedecl __ARGS((char_u *s)); int get_c_indent __ARGS((void)); int get_expr_indent __ARGS((void)); |