diff options
| author | Jafar Al-Gharaibeh <jafar@atcorp.com> | 2023-02-07 10:43:27 -0600 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-07 10:43:27 -0600 | 
| commit | 2285f5aca8e58643314708aea9cda3c6aaa1b80b (patch) | |
| tree | 1d832da437f48b913e89e23531e3d87141dde63d | |
| parent | 6e1ae0137df6b8e5771510a32c0bd80ee0536564 (diff) | |
| parent | 40e98aa8c80f9e0a7ae2fed254eece9f8d03ba70 (diff) | |
Merge pull request #12722 from opensourcerouting/vim-xrefbase_8.5
tools: add `GotoXref` vim script
| -rw-r--r-- | tools/frr.vim | 41 | 
1 files changed, 41 insertions, 0 deletions
diff --git a/tools/frr.vim b/tools/frr.vim index 86aa0c0e3f..7cc248f4cf 100644 --- a/tools/frr.vim +++ b/tools/frr.vim @@ -34,3 +34,44 @@ endfunction  " auto-apply the above based on path rules  "autocmd BufRead,BufNewFile /home/.../frr/*.[ch] call CStyleFRR() + +" only load xref file once, remember on script-scope +let s:xrefjson = "" +let s:xrefpath = "" + +" call directly to force reload with :call FRRLoadXrefJson() +function! FRRLoadXrefJson() abort +	let s:xrefpath = findfile("frr.xref", ".;") +	if empty(s:xrefpath) +		throw "frr.xref JSON file not found in current or parent directories" +	endif +	let xreflines = readfile(s:xrefpath) +	let s:xrefjson = json_decode(join(xreflines, "\n")) +endfunction + +function! FRRXrefJson() abort +	if empty(s:xrefjson) +		call FRRLoadXrefJson() +	endif +	return s:xrefjson +endfunction + +function! FRRGotoXref(ident) abort +	let refs = FRRXrefJson()["refs"] +	if has_key(refs, a:ident) +		" TODO: in rare cases, one ID may occur in multiple places. +		" Add some UI for that.  (This happens if the exact same +		" format string is logged in multiple places in the same +		" file.) +		let loc = refs[a:ident][0] +		let basepath = fnamemodify(s:xrefpath, ":p:h") +		let path = fnamemodify(basepath . "/" . loc["file"], ":.") +		execute "e ".fnameescape(path) +		execute ":".loc["line"] +	else +		echoerr printf("cannot find xref with ID %s", a:ident) +	endif +endfunction + +" invoke as :GotoXref 23456-ABCDE +command! -bang -nargs=1 GotoXref :call FRRGotoXref(<q-args>)  | 
