diff --git a/README.md b/README.md index 6dc1e0e..e8d99fd 100644 --- a/README.md +++ b/README.md @@ -1 +1,26 @@ -# Smart Whole line completion +# Line Suffix completion + +Like vim's [whole line completion][0], but works even if the start of the line +does not fully match. + +## Example + +```javascript +var foo = SomeBigName(arg1, arg2, arg3) + +# now when creating a similar variable, the mapping completes rest of the line. + +var bar = Some +var bar = SomeBigName(arg1, arg2, arg3) +``` + +## TODO + +- [ ] Convert to proper vim plugin. For now, `source /path/to/lc.vim` +- [ ] Use and add option to disable mapping by default +- [ ] Make the min length of suffix configurable. Now 2 +- [ ] Add tests for GetLongestSuffix +- [ ] Use better algorithm for GetLongestSuffix +- [ ] Add doc + +[0]: https://vimhelp.org/insert.txt.html#compl-whole-line diff --git a/lc.vim b/lc.vim index 8445975..59703a9 100644 --- a/lc.vim +++ b/lc.vim @@ -22,26 +22,23 @@ enddef # echo GetLongestSuffix("hello world foo bar blah", "foo world")->assert_equal("o world") # echo v:errors -def GetMatch(base: string, line: string, add_base: bool): Item +def GetMatch(base: string, line: string): Item const s = GetLongestSuffix(line, base) const idx = stridx(line, s) const slen = strlen(s) const m = strpart(line, idx + slen) - if add_base - return Item.new(slen, base .. m) - endif - return Item.new(slen, m) + return Item.new(slen, base .. m) enddef -def GetMatches(base: string, add_base: bool): list +def GetMatches(base: string): list return getbufinfo() ->filter( (_, bf) => bf.listed ) ->map( (_, buf) => getbufline(buf["bufnr"], 1, "$")) ->flattennew() ->sort() ->uniq() - ->map( (_, v) => GetMatch(base, v, add_base) ) - ->filter( (_, m) => m.len > 3 ) + ->map( (_, v) => GetMatch(base, v) ) + ->filter( (_, m) => m.len > 2 ) ->sort( (x, y) => y.len - x.len ) ->map( (_, m) => m.val ) enddef @@ -50,13 +47,9 @@ def LineSuffixCompl(findstart: bool, base: string): any if findstart return 0 endif - return GetMatches(base, true) + return GetMatches(base) enddef -def DoLSCmpl() - GetMatches(getline('.'), false)->complete(col('.')) -enddef - -inoremap =DoLSCmpl() +inoremap GetMatches(getline('.'))->complete(1) set completefunc=LineSuffixCompl