]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
runtime(go): add section movement mappings to ftplugin
authorRob B <github@0x7e.net>
Wed, 2 Jul 2025 16:46:44 +0000 (18:46 +0200)
committerChristian Brabandt <cb@256bit.org>
Wed, 2 Jul 2025 16:47:50 +0000 (18:47 +0200)
closes: #17641

Signed-off-by: Rob B <github@0x7e.net>
Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime/ftplugin/go.vim

index f3cae02065e81958b84aab00400cc3771f731f16..e3f947c091c3fc0708722d617e659718efb02678 100644 (file)
@@ -6,6 +6,7 @@
 " 2025 Mar 07 by Vim Project (add formatprg and keywordprg option #16804)
 " 2025 Mar 18 by Vim Project (use :term for 'keywordprg' #16911)
 " 2025 Apr 16 by Vim Project (set 'cpoptions' for line continuation, #17121)
+" 2025 Jul 02 by Vim Project (add section movement mappings #17641)
 
 if exists('b:did_ftplugin')
   finish
@@ -29,10 +30,10 @@ let b:undo_ftplugin = 'setl fo< com< cms< fp< kp<'
 
 if get(g:, 'go_recommended_style', 1)
   setlocal noexpandtab softtabstop=0 shiftwidth=0
-  let b:undo_ftplugin ..= ' | setl et< sts< sw<'
+  let b:undo_ftplugin .= ' | setl et< sts< sw<'
 endif
 
-if !exists('*' .. expand('<SID>') .. 'GoKeywordPrg')
+if !exists('*' . expand('<SID>') . 'GoKeywordPrg')
   func! s:GoKeywordPrg()
     let temp_isk = &l:iskeyword
     setl iskeyword+=.
@@ -49,6 +50,35 @@ if !exists('*' .. expand('<SID>') .. 'GoKeywordPrg')
   endfunc
 endif
 
+if !exists("no_plugin_maps") && !exists("no_go_maps")
+  noremap <silent> <buffer> ]] <Cmd>call <SID>GoFindSection('next_start', v:count1)<CR>
+  noremap <silent> <buffer> ][ <Cmd>call <SID>GoFindSection('next_end', v:count1)<CR>
+  noremap <silent> <buffer> [[ <Cmd>call <SID>GoFindSection('prev_start', v:count1)<CR>
+  noremap <silent> <buffer> [] <Cmd>call <SID>GoFindSection('prev_end', v:count1)<CR>
+  let b:undo_ftplugin .= ''
+                      \ . '| unmap <buffer> ]]'
+                      \ . '| unmap <buffer> ]['
+                      \ . '| unmap <buffer> [['
+                      \ . '| unmap <buffer> []'
+endif
+
+function! <SID>GoFindSection(dir, count)
+  mark '
+  let c = a:count
+  while c > 0
+    if a:dir == 'next_start'
+      keepjumps call search('^\(type\|func\)\>', 'W')
+    elseif a:dir == 'next_end'
+      keepjumps call search('^}', 'W')
+    elseif a:dir == 'prev_start'
+      keepjumps call search('^\(type\|func\)\>', 'bW')
+    elseif a:dir == 'prev_end'
+      keepjumps call search('^}', 'bW')
+    endif
+    let c -= 1
+  endwhile
+endfunction
+
 let &cpo = s:cpo_save
 unlet s:cpo_save