├── .github └── workflows │ ├── neovim.yml │ └── vim.yml ├── LICENSE ├── README.md ├── autoload ├── jumptoline.vim └── jumptoline │ ├── popupwin.vim │ └── utils.vim ├── doc ├── jumptoline.txt └── tags ├── jumptoline.gif └── plugin └── jumptoline.vim /.github/workflows/neovim.yml: -------------------------------------------------------------------------------- 1 | name: neovim 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-latest 9 | 10 | steps: 11 | - uses: actions/checkout@v2 12 | - uses: rhysd/action-setup-vim@v1 13 | with: 14 | neovim: true 15 | version: nightly 16 | - name: Run unit tests 17 | run: | 18 | nvim --version 19 | nvim -u NONE -N --noplugin -c "set rtp+=." -c "call jumptoline#run_tests()" -c "qa!" 20 | if test -f test.log; then exit 1; fi 21 | -------------------------------------------------------------------------------- /.github/workflows/vim.yml: -------------------------------------------------------------------------------- 1 | name: vim 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-latest 9 | 10 | steps: 11 | - uses: actions/checkout@v2 12 | - uses: rhysd/action-setup-vim@v1 13 | with: 14 | version: nightly 15 | - name: Run unit tests 16 | run: | 17 | vim --version 18 | vim -u NONE -N --noplugin -c "set rtp+=." -c "call jumptoline#run_tests()" -c "qa!" 19 | if test -f test.log; then exit 1; fi 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Naruhiko Nishino 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # vim-jumptoline 3 | [![vim](https://github.com/rbtnn/vim-jumptoline/workflows/vim/badge.svg)](https://github.com/rbtnn/vim-jumptoline/actions?query=workflow%3Avim) 4 | [![neovim](https://github.com/rbtnn/vim-jumptoline/workflows/neovim/badge.svg)](https://github.com/rbtnn/vim-jumptoline/actions?query=workflow%3Aneovim) 5 | 6 | This plugin provides to jump to the line if cursorline includes a filename with lnum such as a line of build errors. 7 | 8 | ![](https://raw.githubusercontent.com/rbtnn/vim-jumptoline/master/jumptoline.gif) 9 | 10 | ## Concepts 11 | 12 | * This plugin supports Vim and Neovim. If your Vim has `+popupwin` feature, use `popup_menu()` instead of `inputlist()`. 13 | * This plugin does not provide to customize user-settings. 14 | * This plugin provides only one command. 15 | 16 | ## Installation 17 | 18 | This is an example of installation using [vim-plug](https://github.com/junegunn/vim-plug). 19 | 20 | ``` 21 | Plug 'rbtnn/vim-jumptoline' 22 | ``` 23 | 24 | ## Usage 25 | 26 | ### :JumpToLine[!] 27 | 28 | Jump to the line if cursorline matches one of the following patterns. 29 | If no match is found on the quickfix window, use the information under the cursor of quickfix. 30 | When ! is given, open the file directly. It does not call `popup_menu()` and `inputlist()`. 31 | 32 | You map a key to `:JumpToLine` in your .vimrc, then it's so useful for jumpping. 33 | 34 | ``` 35 | nnoremap :JumpToLine 36 | ``` 37 | 38 | ## Patterns 39 | 40 | __QuickFix on Vim__ 41 | ``` 42 | xxx.vim|1006 col 8| call system(prog) 43 | xxx.vim|1006 col 8 error| call system(prog) 44 | xxx.vim|| 45 | ``` 46 | 47 | __MSBuild__ 48 | ``` 49 | C:\Users\rbtnn\Desktop\main.vb(923,21): warning BC42021: ... 50 | ``` 51 | 52 | __VC__ 53 | ``` 54 | C:\Users\rbtnn\Desktop\main.vb(923): warning BC42021: ... 55 | ``` 56 | 57 | __C#,F#__ 58 | ``` 59 | main.cs(9,10): error CS1002: ; expected 60 | ``` 61 | 62 | __Python__ 63 | ``` 64 | File "./prog.py", line 1, in 65 | ``` 66 | 67 | __Ruby__ 68 | ``` 69 | prog.rb:1:in `
': undefined local variable or method `aaaa' for main:Object (NameError) 70 | ``` 71 | 72 | __Rust__ 73 | ``` 74 | --> src\main.rs:7:42 75 | ``` 76 | 77 | __Go,gcc,Clang__ 78 | ``` 79 | prog.go:1:1: expected 'package', found aaaaaa 80 | ``` 81 | 82 | __ripgrep__ 83 | ``` 84 | C:/Go/LICENSE:20 85 | ``` 86 | 87 | __path only__ 88 | ``` 89 | C:/Go/LICENSE 90 | ``` 91 | 92 | ## License 93 | 94 | Distributed under MIT License. See LICENSE. 95 | -------------------------------------------------------------------------------- /autoload/jumptoline.vim: -------------------------------------------------------------------------------- 1 | 2 | if !exists('g:jumptoline#new_window') 3 | let g:jumptoline#new_window = 'new window' 4 | lockvar g:jumptoline#new_window 5 | endif 6 | if !exists('g:jumptoline#new_tabpage') 7 | let g:jumptoline#new_tabpage = 'new tabpage' 8 | lockvar g:jumptoline#new_tabpage 9 | endif 10 | 11 | let s:ps = [ 12 | \ { 'type' : 'quickfix', 'regex' : '^\([^|]*\)|\(\(\d\+\)\( col \(\d\+\)\)\?[^|]*\)\?|', 'path_i' : 1, 'lnum_i' : 3, 'col_i' : 5, }, 13 | \ { 'type' : 'msbuild,C#,F#', 'regex' : '^\s*\(.*\)(\(\d\+\),\(\d\+\)):.*$', 'path_i' : 1, 'lnum_i' : 2, 'col_i' : 3, }, 14 | \ { 'type' : 'VC', 'regex' : '^\s*\(.*\)(\(\d\+\))\s*:.*$', 'path_i' : 1, 'lnum_i' : 2, }, 15 | \ { 'type' : 'Rust', 'regex' : '^\s*--> \(.*\.rs\):\(\d\+\):\(\d\+\)$', 'path_i' : 1, 'lnum_i' : 2, 'col_i' : 3, }, 16 | \ { 'type' : 'Python', 'regex' : '^\s*File "\([^"]*\)", line \(\d\+\),.*$', 'path_i' : 1, 'lnum_i' : 2, }, 17 | \ { 'type' : 'Ruby', 'regex' : '^\s*\(.*.rb\):\(\d\+\):.*$', 'path_i' : 1, 'lnum_i' : 2, }, 18 | \ { 'type' : 'Go,gcc,Clang,ripgrep,', 'regex' : '^\s*\(.\{-}\):\(\d\+\)\(:\(\d\+\):\)\?.*$', 'path_i' : 1, 'lnum_i' : 2, 'col_i' : 4, }, 19 | \ { 'type' : 'path_only', 'regex' : '^\s*\([^|]\+\)\s*$', 'path_i' : 1, }, 20 | \ ] 21 | 22 | let s:TEST_LOG = expand(':h:h:gs?\?/?') . '/test.log' 23 | 24 | function! jumptoline#exec(line, ...) abort 25 | let q_bang = get(a:000, 0, '') 26 | let found = v:false 27 | for d in jumptoline#matches(a:line) 28 | for fullpath in jumptoline#utils#find_thefile(d['path']) 29 | call s:choose_awin(q_bang, -1, fullpath, d['lnum'], d['col']) 30 | let found = v:true 31 | break 32 | endfor 33 | endfor 34 | if !found && (&filetype == 'qf') 35 | let x = get(getqflist(), line('.') - 1, {}) 36 | if !empty(x) 37 | call s:choose_awin(q_bang, x['bufnr'], '', x['lnum'], x['col']) 38 | endif 39 | endif 40 | endfunction 41 | 42 | function! jumptoline#matches(line) abort 43 | let ds = [] 44 | let best_match_point = 0 45 | for p in s:ps 46 | let m = matchlist(a:line, p['regex']) 47 | if !empty(m) 48 | let path = m[p['path_i']] 49 | 50 | let lnum = 0 51 | if has_key(p, 'lnum_i') 52 | let lnum = str2nr(m[p['lnum_i']]) 53 | endif 54 | 55 | let col = 0 56 | if has_key(p, 'col_i') 57 | let col = str2nr(m[p['col_i']]) 58 | endif 59 | 60 | let d = { 61 | \ 'path' : path, 62 | \ 'lnum' : lnum, 63 | \ 'col' : col, 64 | \ } 65 | if -1 == index(ds, d) 66 | let point = (0 < lnum) + (0 < col) + filereadable(path) 67 | 68 | if point < best_match_point 69 | continue 70 | elseif best_match_point < point 71 | let best_match_point = point 72 | let ds = [d] 73 | else 74 | let ds += [d] 75 | endif 76 | endif 77 | endif 78 | endfor 79 | return ds 80 | endfunction 81 | 82 | function! jumptoline#run_tests() abort 83 | if filereadable(s:TEST_LOG) 84 | call delete(s:TEST_LOG) 85 | endif 86 | 87 | let v:errors = [] 88 | 89 | call assert_equal( 90 | \ [{ 'lnum': 0, 'col': 0, 'path': 'xxx.vim'}], 91 | \ jumptoline#matches('xxx.vim||')) 92 | call assert_equal( 93 | \ [{ 'lnum': 1006, 'col': 8, 'path': 'xxx.vim'}], 94 | \ jumptoline#matches('xxx.vim|1006 col 8 error| call system(prog)')) 95 | call assert_equal( 96 | \ [{ 'lnum': 1006, 'col': 8, 'path': 'xxx.vim'}], 97 | \ jumptoline#matches('xxx.vim|1006 col 8| call system(prog)')) 98 | call assert_equal( 99 | \ [{ 'lnum': 923, 'col': 21, 'path': 'C:\Users\rbtnn\Desktop\main.vb'}], 100 | \ jumptoline#matches('C:\Users\rbtnn\Desktop\main.vb(923,21): warning BC42021: ...')) 101 | call assert_equal( 102 | \ [{ 'lnum': 923, 'col': 0, 'path': 'C:\Users\rbtnn\Desktop\main.vb'}], 103 | \ jumptoline#matches('C:\Users\rbtnn\Desktop\main.vb(923): warning BC42021: ...')) 104 | call assert_equal( 105 | \ [{ 'lnum': 9, 'col': 10, 'path': 'main.cs'}], 106 | \ jumptoline#matches('main.cs(9,10): error CS1002: ; expected')) 107 | call assert_equal( 108 | \ [{ 'lnum': 1, 'col': 0, 'path': './prog.py'}], 109 | \ jumptoline#matches('File "./prog.py", line 1, in ')) 110 | call assert_equal( 111 | \ [{ 'lnum': 1, 'col': 0, 'path': 'prog.rb'}], 112 | \ jumptoline#matches('prog.rb:1:in `
'': undefined local variable or method `aaaa'' for ...')) 113 | call assert_equal( 114 | \ [{ 'lnum': 7, 'col': 42, 'path': 'src\main.rs'}], 115 | \ jumptoline#matches('--> src\main.rs:7:42')) 116 | call assert_equal( 117 | \ [{ 'lnum': 1, 'col': 1, 'path': 'prog.go'}], 118 | \ jumptoline#matches('prog.go:1:1: expected ''package'', found aaaaaa')) 119 | call assert_equal( 120 | \ [{ 'lnum': 20, 'col': 0, 'path': 'C:/Go/LICENSE'}], 121 | \ jumptoline#matches('C:/Go/LICENSE:20 aaaaaa')) 122 | call assert_equal( 123 | \ [{ 'lnum': 33, 'col': 0, 'path': 'README.md'}], 124 | \ jumptoline#matches('README.md:33||')) 125 | 126 | if !empty(v:errors) 127 | call writefile(v:errors, s:TEST_LOG) 128 | for err in v:errors 129 | echohl Error 130 | echo err 131 | echohl None 132 | endfor 133 | endif 134 | endfunction 135 | 136 | function! jumptoline#callback(line, bnr, fullpath, lnum, col) abort 137 | if a:line == g:jumptoline#new_window 138 | new 139 | elseif a:line == g:jumptoline#new_tabpage 140 | tabnew 141 | else 142 | let wnr = matchstr(a:line, '^\d\+') 143 | if !empty(wnr) 144 | execute wnr .. 'wincmd w' 145 | endif 146 | endif 147 | if !jumptoline#utils#same_buffer(bufnr(), a:bnr, a:fullpath) 148 | if -1 == a:bnr 149 | execute printf('edit %s', a:fullpath) 150 | else 151 | execute printf('%dbuffer', a:bnr) 152 | endif 153 | endif 154 | call jumptoline#utils#adjust_and_setpos(a:lnum, a:col) 155 | normal! zz 156 | endfunction 157 | 158 | function! jumptoline#winnrlist(bnr, fullpath) 159 | let ws = [] 160 | for x in jumptoline#utils#get_target_wininfos(a:bnr, a:fullpath) 161 | if x['quickfix'] 162 | let name = '[quickfix]' 163 | elseif x['loclist'] 164 | let name = '[loclist]' 165 | elseif 'help' == getbufvar(x['bufnr'], '&buftype') 166 | let name = '[help]' 167 | else 168 | let name = bufname(x['bufnr']) 169 | if empty(name) 170 | let name = '[No Name]' 171 | endif 172 | endif 173 | let mark = ' ' 174 | if x['winnr'] == winnr('#') 175 | let mark = '#' 176 | elseif x['bufnr'] == bufnr() 177 | let mark = '%' 178 | endif 179 | let modified = '' 180 | if x['modified'] 181 | let modified = '[+]' 182 | endif 183 | let ws += [printf('%d %s %s%s', x['winnr'], mark, name, modified)] 184 | endfor 185 | return ws 186 | endfunction 187 | 188 | function! s:choose_awin(q_bang, bnr, fullpath, lnum, col) abort 189 | if has('popupwin') 190 | call jumptoline#popupwin#hide_popupwin_term() 191 | endif 192 | if '!' == a:q_bang 193 | call jumptoline#callback('', a:bnr, a:fullpath, a:lnum, a:col) 194 | else 195 | let title = 'Choose a window to open' 196 | let candidates = jumptoline#winnrlist(a:bnr, a:fullpath) + [g:jumptoline#new_window, g:jumptoline#new_tabpage] 197 | if has('popupwin') && !get(g:, 'jumptoline_debug', 0) 198 | call jumptoline#popupwin#open(title, candidates, a:bnr, a:fullpath, a:lnum, a:col) 199 | else 200 | let lines = [] 201 | for can in candidates 202 | let lines += [printf('%d) %s', len(lines) + 1, can)] 203 | endfor 204 | let n = inputlist([title] + lines) 205 | if 0 < n 206 | call jumptoline#callback(candidates[n - 1], a:bnr, a:fullpath, a:lnum, a:col) 207 | endif 208 | endif 209 | endif 210 | endfunction 211 | 212 | -------------------------------------------------------------------------------- /autoload/jumptoline/popupwin.vim: -------------------------------------------------------------------------------- 1 | 2 | if !has('popupwin') 3 | finish 4 | endif 5 | 6 | let s:jumptoline_border_winnr = -1 7 | 8 | function! jumptoline#popupwin#open(title, candidates, bnr, fullpath, lnum, col) abort 9 | call popup_menu(a:candidates, #{ 10 | \ title: a:title, 11 | \ callback: function('s:callback', [(a:bnr), (a:fullpath), (a:lnum), (a:col)]), 12 | \ filter: function('s:filter'), 13 | \ padding: [1,1,1,1], 14 | \ }) 15 | let xs = jumptoline#utils#get_target_wininfos(a:bnr, a:fullpath) 16 | if 0 < len(xs) 17 | call s:set_border(xs[0]['winnr']) 18 | endif 19 | endfunction 20 | 21 | function! jumptoline#popupwin#hide_popupwin_term() abort 22 | if exists('*popup_list') && exists('*popup_close') 23 | for winid in popup_list() 24 | if getwininfo(winid)[0]['terminal'] 25 | call popup_close(winid) 26 | endif 27 | endfor 28 | endif 29 | endfunction 30 | 31 | function! s:clear_border() abort 32 | if -1 != s:jumptoline_border_winnr 33 | call popup_close(s:jumptoline_border_winnr) 34 | let s:jumptoline_border_winnr = -1 35 | endif 36 | endfunction 37 | 38 | function! s:callback(bnr, fullpath, lnum, col, winid, key) abort 39 | call s:clear_border() 40 | if 0 < a:key 41 | let line = getbufline(winbufnr(a:winid), a:key)[0] 42 | call jumptoline#callback(line, a:bnr, a:fullpath, a:lnum, a:col) 43 | endif 44 | endfunction 45 | 46 | function! s:set_border(winnr) abort 47 | let ws = filter(getwininfo(), { i,x -> (x['tabnr'] == tabpagenr()) && (a:winnr == x['winnr']) }) 48 | if 1 == len(ws) 49 | let winfo = ws[0] 50 | let b = 2 51 | let w = winfo['width'] - b 52 | let h = winfo['height'] - b 53 | let s:jumptoline_border_winnr = popup_create('', #{ 54 | \ line: winfo['winrow'], 55 | \ col: winfo['wincol'], 56 | \ mask: [[b, w + 1, b, h + 1]], 57 | \ minwidth: w, 58 | \ minheight: h, 59 | \ border: [], 60 | \ borderchars: [' ',' ',' ',' ',' ',' ',' ',' '], 61 | \ borderhighlight: ['Error'], 62 | \ }) 63 | endif 64 | endfunction 65 | 66 | function! s:filter(winid, key) abort 67 | call s:clear_border() 68 | let lnum = line('.', a:winid) 69 | let maxlnum = line('$', a:winid) 70 | if a:key == 'j' 71 | let lnum += 1 72 | if maxlnum < lnum 73 | let lnum = maxlnum 74 | endif 75 | endif 76 | if a:key == 'k' 77 | let lnum -= 1 78 | if lnum < 1 79 | let lnum = 1 80 | endif 81 | endif 82 | let line = getbufline(winbufnr(a:winid), lnum, lnum)[0] 83 | let wnr = matchstr(line, '^\d\+') 84 | if 0 < wnr 85 | call s:set_border(wnr) 86 | endif 87 | return popup_filter_menu(a:winid, a:key) 88 | endfunction 89 | 90 | -------------------------------------------------------------------------------- /autoload/jumptoline/utils.vim: -------------------------------------------------------------------------------- 1 | 2 | function! jumptoline#utils#same_buffer(target, bnr, fullpath) 3 | return (a:bnr == a:target) || (bufnr(a:fullpath) == a:target) 4 | endfunction 5 | 6 | function! jumptoline#utils#get_target_wininfos(bnr, fullpath) abort 7 | let xs = [] 8 | for x in getwininfo() 9 | let x['modified'] = getbufvar(x['bufnr'], '&modified', 0) 10 | if (x['tabnr'] == tabpagenr()) && (!x['terminal']) && (jumptoline#utils#same_buffer(x['bufnr'], a:bnr, a:fullpath) || !x['modified']) 11 | let xs += [x] 12 | endif 13 | endfor 14 | return xs 15 | endfunction 16 | 17 | function! jumptoline#utils#adjust_and_setpos(lnum, col) 18 | if (0 < a:lnum) || (0 < a:col) 19 | call setpos('.', [0, a:lnum, a:col, 0]) 20 | endif 21 | endfunction 22 | 23 | function! jumptoline#utils#find_thefile(target) 24 | try 25 | let path = expand(a:target, v:true) 26 | if filereadable(path) 27 | return [path] 28 | endif 29 | for info in getwininfo() 30 | for s in [fnamemodify(bufname(info['bufnr']), ':p:h'), getcwd(info['winnr'], info['tabnr'])] 31 | let xs = split(s, '[\/]') 32 | for n in reverse(range(0, len(xs) - 1)) 33 | let path = expand(join(xs[:n] + [(a:target)], '/')) 34 | if filereadable(path) 35 | return [path] 36 | endif 37 | endfor 38 | endfor 39 | endfor 40 | catch 41 | endtry 42 | return [] 43 | endfunction 44 | 45 | -------------------------------------------------------------------------------- /doc/jumptoline.txt: -------------------------------------------------------------------------------- 1 | *jumptoline.txt* jump to the line if a line included a filename with lnum. 2 | 3 | Author : rbtnn 4 | LICENSE: MIT license (see LICENSE.txt) 5 | 6 | CONTENTS *jumptoline-contents* 7 | 8 | Concepts |jumptoline-concepts| 9 | Commands |jumptoline-commands| 10 | Functions |jumptoline-functions| 11 | Patterns |jumptoline-patterns| 12 | 13 | 14 | 15 | ============================================================================== 16 | Concepts *jumptoline-concepts* 17 | 18 | * This plugin supports Vim and Neovim. If your Vim has |popupwin| feature, use 19 | |popup_menu()| instead of |inputlist()|. 20 | * This plugin does not provide to customize user-settings. 21 | * This plugin provides only one command. 22 | 23 | 24 | 25 | ============================================================================== 26 | Commands *jumptoline-commands* 27 | 28 | *:JumpToLine* 29 | :JumpToLine[!] Jump to the line if cursorline matches one of the following 30 | |jumptoline-patterns|. If no match is found on the quickfix 31 | window, use the information under the cursor of quickfix. 32 | When ! is given, open the file directly. It does not call 33 | |popup_menu()| and |inputlist()|. 34 | 35 | You map a key to :JumpToLine in your .vimrc, then it's so 36 | useful for jumpping. 37 | > 38 | nnoremap :JumpToLine 39 | < 40 | 41 | 42 | ============================================================================== 43 | Functions *jumptoline-functions* 44 | 45 | jumptoline#exec({line}) *jumptoline#exec()* 46 | Jump to the line if {line} matches one of the following 47 | |jumptoline-patterns|. 48 | 49 | NOTE |:JumpToLine| equals to `jumptoline#exec(getline('.'))`. 50 | 51 | 52 | 53 | ============================================================================== 54 | Patterns *jumptoline-patterns* 55 | 56 | QuickFix on Vim 57 | > 58 | xxx.vim|1006 col 8| call system(prog) 59 | xxx.vim|1006 col 8 error| call system(prog) 60 | xxx.vim|| 61 | < 62 | 63 | MSBuild 64 | > 65 | C:\Users\rbtnn\Desktop\main.vb(923,21): warning BC42021: ... 66 | < 67 | 68 | VC 69 | > 70 | C:\Users\rbtnn\Desktop\main.vb(923): warning BC42021: ... 71 | < 72 | 73 | C#,F# 74 | > 75 | main.cs(9,10): error CS1002: ; expected 76 | < 77 | 78 | Python 79 | > 80 | File "./prog.py", line 1, in 81 | < 82 | 83 | Ruby 84 | > 85 | prog.rb:1:in `
': undefined local variable or method `aaaa' for ... 86 | < 87 | 88 | Rust 89 | > 90 | --> src\main.rs:7:42 91 | < 92 | 93 | Go,gcc,Clang 94 | > 95 | prog.go:1:1: expected 'package', found aaaaaa 96 | < 97 | 98 | ripgrep 99 | > 100 | C:/Go/LICENSE:20 101 | < 102 | 103 | path only 104 | > 105 | C:/Go/LICENSE 106 | < 107 | 108 | 109 | 110 | ============================================================================== 111 | vim:tw=78:ts=8:ft=help:norl:noet:fen:fdl=0: 112 | -------------------------------------------------------------------------------- /doc/tags: -------------------------------------------------------------------------------- 1 | :JumpToLine jumptoline.txt /*:JumpToLine* 2 | jumptoline#exec() jumptoline.txt /*jumptoline#exec()* 3 | jumptoline-commands jumptoline.txt /*jumptoline-commands* 4 | jumptoline-concepts jumptoline.txt /*jumptoline-concepts* 5 | jumptoline-contents jumptoline.txt /*jumptoline-contents* 6 | jumptoline-functions jumptoline.txt /*jumptoline-functions* 7 | jumptoline-patterns jumptoline.txt /*jumptoline-patterns* 8 | jumptoline.txt jumptoline.txt /*jumptoline.txt* 9 | -------------------------------------------------------------------------------- /jumptoline.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rbtnn/vim-jumptoline/1f95a52a4ca936591e2d42410d6519dac0b1346e/jumptoline.gif -------------------------------------------------------------------------------- /plugin/jumptoline.vim: -------------------------------------------------------------------------------- 1 | 2 | let g:loaded_jumptoline = 1 3 | 4 | command! -bang -nargs=0 -bar JumpToLine :call jumptoline#exec(getline('.'), ) 5 | 6 | --------------------------------------------------------------------------------