To: vim_dev@googlegroups.com Subject: Patch 7.4.397 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.397 Problem: Matchparen only uses the topmost syntax item. Solution: Go through the syntax stack to find items. (James McCoy) Also use getcurpos() when possible. Files: runtime/plugin/matchparen.vim *** ../vim-7.4.396/runtime/plugin/matchparen.vim 2014-06-17 17:48:21.772628007 +0200 --- runtime/plugin/matchparen.vim 2014-08-06 19:02:04.967128364 +0200 *************** *** 1,6 **** " Vim plugin for showing matching parens " Maintainer: Bram Moolenaar ! " Last Change: 2014 Jun 17 " Exit quickly when: " - this plugin was already loaded (or disabled) --- 1,6 ---- " Vim plugin for showing matching parens " Maintainer: Bram Moolenaar ! " Last Change: 2014 Jul 19 " Exit quickly when: " - this plugin was already loaded (or disabled) *************** *** 54,67 **** let c_col = col('.') let before = 0 ! let c = getline(c_lnum)[c_col - 1] let plist = split(&matchpairs, '.\zs[:,]') let i = index(plist, c) if i < 0 " not found, in Insert mode try character before the cursor if c_col > 1 && (mode() == 'i' || mode() == 'R') let before = 1 ! let c = getline(c_lnum)[c_col - 2] let i = index(plist, c) endif if i < 0 --- 54,68 ---- let c_col = col('.') let before = 0 ! let text = getline(c_lnum) ! let c = text[c_col - 1] let plist = split(&matchpairs, '.\zs[:,]') let i = index(plist, c) if i < 0 " not found, in Insert mode try character before the cursor if c_col > 1 && (mode() == 'i' || mode() == 'R') let before = 1 ! let c = text[c_col - 2] let i = index(plist, c) endif if i < 0 *************** *** 87,100 **** " Find the match. When it was just before the cursor move it there for a " moment. if before > 0 ! let save_cursor = winsaveview() call cursor(c_lnum, c_col - before) endif ! " When not in a string or comment ignore matches inside them. " We match "escape" for special items, such as lispEscapeSpecial. ! let s_skip ='synIDattr(synID(line("."), col("."), 0), "name") ' . ! \ '=~? "string\\|character\\|singlequote\\|escape\\|comment"' execute 'if' s_skip '| let s_skip = 0 | endif' " Limit the search to lines visible in the window. --- 88,114 ---- " Find the match. When it was just before the cursor move it there for a " moment. if before > 0 ! let has_getcurpos = exists("*getcurpos") ! if has_getcurpos ! " getcurpos() is more efficient but doesn't exist before 7.4.313. ! let save_cursor = getcurpos() ! else ! let save_cursor = winsaveview() ! endif call cursor(c_lnum, c_col - before) endif ! " Build an expression that detects whether the current cursor position is in ! " certain syntax types (string, comment, etc.), for use as searchpairpos()'s ! " skip argument. " We match "escape" for special items, such as lispEscapeSpecial. ! let s_skip = '!empty(filter(map(synstack(line("."), col(".")), ''synIDattr(v:val, "name")''), ' . ! \ '''v:val =~? "string\\|character\\|singlequote\\|escape\\|comment"''))' ! " If executing the expression determines that the cursor is currently in ! " one of the syntax types, then we want searchpairpos() to find the pair ! " within those syntax types (i.e., not skip). Otherwise, the cursor is ! " outside of the syntax types and s_skip should keep its value so we skip any ! " matching pair inside the syntax types. execute 'if' s_skip '| let s_skip = 0 | endif' " Limit the search to lines visible in the window. *************** *** 147,153 **** endtry if before > 0 ! call winrestview(save_cursor) endif " If a match is found setup match highlighting. --- 161,171 ---- endtry if before > 0 ! if has_getcurpos ! call setpos('.', save_cursor) ! else ! call winrestview(save_cursor) ! endif endif " If a match is found setup match highlighting. *** ../vim-7.4.396/src/version.c 2014-08-06 18:17:03.475147780 +0200 --- src/version.c 2014-08-06 19:06:44.627126354 +0200 *************** *** 743,744 **** --- 743,746 ---- { /* Add new patch number below this line */ + /**/ + 397, /**/ -- Often you're less important than your furniture. If you think about it, you can get fired but your furniture stays behind, gainfully employed at the company that didn't need _you_ anymore. (Scott Adams - The Dilbert principle) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///