31 lines
		
	
	
		
			745 B
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			745 B
		
	
	
	
		
			VimL
		
	
	
	
	
	
| vim9script
 | |
| 
 | |
| def GetMatch(base: string, line: string): list<any>
 | |
|     var s = base
 | |
|     while stridx(line, s) == -1
 | |
|         s = strpart(s, 1)
 | |
|         if strlen(s) == 0
 | |
|             return [0, ""]
 | |
|         endif
 | |
|     endwhile
 | |
|     const idx = stridx(line, s)
 | |
|     const slen = strlen(s)
 | |
|     return [slen, base .. strpart(line, idx + slen)]
 | |
| enddef
 | |
| 
 | |
| def LineSuffixCompl(findstart: bool, base: string): any
 | |
|     if findstart
 | |
|         return 0
 | |
|     endif
 | |
|     return  getbufinfo()
 | |
|         ->map( (_, buf) => getbufline(buf["bufnr"], 1, "$"))
 | |
|         ->flattennew()
 | |
|         ->sort()
 | |
|         ->uniq()
 | |
|         ->map( (_, v) => GetMatch(base, v) )
 | |
|         ->sort( (x, y) => y[0] - x[0] )
 | |
|         ->map( (_, v) => v[1] )
 | |
| enddef
 | |
| 
 | |
| setlocal completefunc=LineSuffixCompl
 |