Skip to content

Commit bf76a01

Browse files
committed
feat: .local/state db location and misc
1 parent a720117 commit bf76a01

File tree

9 files changed

+93
-45
lines changed

9 files changed

+93
-45
lines changed

lua/blink/cmp/accept.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ local utils = {}
22

33
local function accept(item)
44
local sources = require('blink.cmp.sources')
5-
local fuzzy = require('blink.cmp.fuzzy')
5+
local fuzzy = require('blink.cmp.fuzzy.lib')
66

77
local text_edit = item.textEdit
88
if text_edit ~= nil then

lua/blink/cmp/fuzzy/init.lua

+46-24
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66

77

88

9+
10+
11+
typedef struct {
12+
const int32_t *ptr;
13+
size_t len;
14+
size_t capacity;
15+
} blink_fuzzy__Vec_int32_t;
916
typedef struct {
1017
const uint32_t *ptr;
1118
size_t len;
@@ -16,13 +23,11 @@ typedef struct {
1623
size_t len;
1724
size_t capacity;
1825
} blink_fuzzy__Vec___string_ptr;
19-
20-
21-
typedef struct {
22-
const int32_t *ptr;
23-
size_t len;
24-
size_t capacity;
25-
} blink_fuzzy__Vec_int32_t;
26+
int32_t init_db(
27+
const char *,
28+
int8_t*);
29+
int32_t __gc_init_db(
30+
int8_t);
2631
int32_t fuzzy(
2732
const char *,
2833
const blink_fuzzy__Vec___string_ptr*,
@@ -51,28 +56,11 @@ int32_t __gc_get_lines_words(
5156

5257

5358

54-
local __const_c_typename___string_ptr = ffi.typeof("const char *[?]")
55-
local __c_function_argument___string_ptr = ffi.typeof("const char *[?]")
56-
local __c_mut_function_argument___string_ptr = ffi.typeof("char *[?]")
57-
58-
5959
local __const_c_typename_uint32_t = ffi.typeof("const uint32_t[?]")
6060
local __c_function_argument_uint32_t = ffi.typeof("uint32_t[?]")
6161
local __c_mut_function_argument_uint32_t = ffi.typeof("uint32_t[?]")
6262

6363

64-
local __typename_Vec_uint32_t = ffi.metatype("blink_fuzzy__Vec_uint32_t", {})
65-
local __const_c_typename_Vec_uint32_t = ffi.typeof("const blink_fuzzy__Vec_uint32_t[?]")
66-
local __c_function_argument_Vec_uint32_t = ffi.typeof("const blink_fuzzy__Vec_uint32_t*[?]")
67-
local __c_mut_function_argument_Vec_uint32_t = ffi.typeof("blink_fuzzy__Vec_uint32_t*[?]")
68-
69-
70-
local __typename_Vec___string_ptr = ffi.metatype("blink_fuzzy__Vec___string_ptr", {})
71-
local __const_c_typename_Vec___string_ptr = ffi.typeof("const blink_fuzzy__Vec___string_ptr[?]")
72-
local __c_function_argument_Vec___string_ptr = ffi.typeof("const blink_fuzzy__Vec___string_ptr*[?]")
73-
local __c_mut_function_argument_Vec___string_ptr = ffi.typeof("blink_fuzzy__Vec___string_ptr*[?]")
74-
75-
7664
local __const_c_typename_bool = ffi.typeof("const int8_t[?]")
7765
local __c_function_argument_bool = ffi.typeof("int8_t[?]")
7866
local __c_mut_function_argument_bool = ffi.typeof("int8_t[?]")
@@ -83,11 +71,45 @@ local __c_function_argument_int32_t = ffi.typeof("int32_t[?]")
8371
local __c_mut_function_argument_int32_t = ffi.typeof("int32_t[?]")
8472

8573

74+
local __const_c_typename___string_ptr = ffi.typeof("const char *[?]")
75+
local __c_function_argument___string_ptr = ffi.typeof("const char *[?]")
76+
local __c_mut_function_argument___string_ptr = ffi.typeof("char *[?]")
77+
78+
8679
local __typename_Vec_int32_t = ffi.metatype("blink_fuzzy__Vec_int32_t", {})
8780
local __const_c_typename_Vec_int32_t = ffi.typeof("const blink_fuzzy__Vec_int32_t[?]")
8881
local __c_function_argument_Vec_int32_t = ffi.typeof("const blink_fuzzy__Vec_int32_t*[?]")
8982
local __c_mut_function_argument_Vec_int32_t = ffi.typeof("blink_fuzzy__Vec_int32_t*[?]")
9083

84+
85+
local __typename_Vec_uint32_t = ffi.metatype("blink_fuzzy__Vec_uint32_t", {})
86+
local __const_c_typename_Vec_uint32_t = ffi.typeof("const blink_fuzzy__Vec_uint32_t[?]")
87+
local __c_function_argument_Vec_uint32_t = ffi.typeof("const blink_fuzzy__Vec_uint32_t*[?]")
88+
local __c_mut_function_argument_Vec_uint32_t = ffi.typeof("blink_fuzzy__Vec_uint32_t*[?]")
89+
90+
91+
local __typename_Vec___string_ptr = ffi.metatype("blink_fuzzy__Vec___string_ptr", {})
92+
local __const_c_typename_Vec___string_ptr = ffi.typeof("const blink_fuzzy__Vec___string_ptr[?]")
93+
local __c_function_argument_Vec___string_ptr = ffi.typeof("const blink_fuzzy__Vec___string_ptr*[?]")
94+
local __c_mut_function_argument_Vec___string_ptr = ffi.typeof("blink_fuzzy__Vec___string_ptr*[?]")
95+
96+
function M.init_db(
97+
db_path)
98+
local __typeof = __c_mut_function_argument_bool
99+
local __ret_ptr = __typeof(1, {})
100+
local status = rust.init_db(
101+
(function(value) return value end)(db_path),
102+
__ret_ptr
103+
)
104+
if status ~= 0 then
105+
error("init_db failed with status "..status)
106+
end
107+
local __ret = __ret_ptr[0]
108+
109+
local f = function(value) return value ~= 0 end
110+
return f(__ret)
111+
end
112+
91113
function M.fuzzy(
92114
needle,
93115
haystack,

lua/blink/cmp/fuzzy/lib.lua

+15-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,20 @@ local fuzzy = {
22
rust = require('blink.cmp.fuzzy'),
33
}
44

5-
fuzzy.filter_items = function(needle, items)
5+
function fuzzy.init_db(db_path)
6+
fuzzy.rust.init_db(db_path)
7+
return fuzzy
8+
end
9+
10+
function fuzzy.fuzzy(needle, haystack, haystack_score_offsets, nearby_words, max_items)
11+
return fuzzy.rust.fuzzy(needle, haystack, haystack_score_offsets, nearby_words, max_items)
12+
end
13+
14+
function fuzzy.access(item) fuzzy.rust.access(item) end
15+
16+
function fuzzy.get_lines_words(lines) return fuzzy.rust.get_lines_words(lines) end
17+
18+
function fuzzy.filter_items(needle, items)
619
-- convert to table of strings
720
local haystack = {}
821
local haystack_score_offsets = {}
@@ -28,7 +41,7 @@ fuzzy.filter_items = function(needle, items)
2841
return filtered_items
2942
end
3043

31-
fuzzy.get_query = function()
44+
function fuzzy.get_query()
3245
local bufnr = vim.api.nvim_get_current_buf()
3346
local current_line = vim.api.nvim_win_get_cursor(0)[1] - 1
3447
local current_col = vim.api.nvim_win_get_cursor(0)[2] - 1

lua/blink/cmp/fuzzy/src/lib.rs

+16-5
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,37 @@ pub mod extern_ffi {
1010
use regex::Regex;
1111
use std::cmp::Reverse;
1212
use std::collections::HashSet;
13-
use std::sync::{Arc, Mutex};
13+
use std::sync::RwLock;
1414

1515
lazy_static! {
1616
static ref REGEX: Regex = Regex::new(r"[A-Za-z][A-Za-z0-9]{2,50}").unwrap();
17-
static ref FRECENCY_CWD: Arc<Mutex<FrecencyTracker>> =
18-
Arc::new(Mutex::new(FrecencyTracker::new("/home/saghen/frecency.db")));
17+
static ref FRECENCY: RwLock<Option<FrecencyTracker>> = RwLock::new(None);
1918
}
2019

2120
struct Item {
2221
index: u32,
2322
score: u32,
2423
}
2524

25+
pub fn init_db(db_path: String) -> bool {
26+
let mut frecency = FRECENCY.write().unwrap();
27+
if frecency.is_some() {
28+
return false;
29+
}
30+
*frecency = Some(FrecencyTracker::new(&db_path));
31+
true
32+
}
33+
2634
pub fn fuzzy(
2735
needle: String,
2836
haystack: Vec<String>,
2937
haystack_score_offsets: Vec<i32>,
3038
nearby_words: Vec<String>,
3139
max_items: u32,
3240
) -> Vec<u32> {
33-
let frecency = FRECENCY_CWD.lock().unwrap();
41+
let frecency_handle = FRECENCY.read().unwrap();
42+
let frecency = frecency_handle.as_ref().unwrap();
43+
3444
let nearby_words = nearby_words
3545
.iter()
3646
.map(|s| s.as_str())
@@ -63,7 +73,8 @@ pub mod extern_ffi {
6373
}
6474

6575
pub fn access(item: String) -> bool {
66-
let mut frecency = FRECENCY_CWD.lock().unwrap();
76+
let mut frecency_handle = FRECENCY.write().unwrap();
77+
let mut frecency = frecency_handle.as_mut().unwrap();
6778
frecency.access(item.as_str()).unwrap();
6879
true
6980
}

lua/blink/cmp/init.lua

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,19 @@ m.setup = function(opts)
2222
-- fuzzy combines smith waterman with frecency
2323
-- and bonus from proximity words but I'm still working
2424
-- on tuning the weights
25-
m.fuzzy = require('blink.cmp.fuzzy.lib')
25+
m.fuzzy = require('blink.cmp.fuzzy.lib').init_db(vim.fn.stdpath('data') .. '/blink/cmp/fuzzy.db')
2626

2727
m.trigger.listen_on_show(function(context) m.sources.completions(context) end)
2828
m.trigger.listen_on_hide(function()
2929
m.sources.cancel_completions()
3030
m.windows.autocomplete.close()
3131
end)
32-
m.sources.listen_on_completions(function(items)
32+
m.sources.listen_on_completions(function(context, items)
3333
-- avoid adding 1-4ms to insertion latency by scheduling for later
3434
vim.schedule(function()
3535
local filtered_items = m.fuzzy.filter_items(utils.get_query(), items)
3636
if #filtered_items > 0 then
37-
m.windows.autocomplete.open_with_items(filtered_items)
37+
m.windows.autocomplete.open_with_items(context, filtered_items)
3838
else
3939
m.windows.autocomplete.close()
4040
end

lua/blink/cmp/sources/buffer.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ local function words_to_items(words)
4747
end
4848

4949
local function run_sync(buf_text, callback)
50-
callback(words_to_items(require('blink.cmp.fuzzy').get_lines_words(buf_text)))
50+
callback(words_to_items(require('blink.cmp.fuzzy.lib').get_lines_words(buf_text)))
5151
end
5252

5353
local function run_async(buf_text, callback)
5454
local worker = uv.new_work(
55-
function(items) return table.concat(require('blink.cmp.fuzzy').get_lines_words(items), '\n') end,
55+
function(items) return table.concat(require('blink.cmp.fuzzy.lib').get_lines_words(items), '\n') end,
5656
function(words)
5757
local items = words_to_items(vim.split(words, '\n'))
5858
vim.schedule(function() callback(items) end)

lua/blink/cmp/sources/init.lua

+4-4
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,15 @@ function sources.completions(context)
8181
sources.in_flight_id[source_name] = -1
8282

8383
sources.add_source_completions(source_name, items, cursor_column)
84-
if not sources.some_in_flight() then sources.send_completions() end
84+
if not sources.some_in_flight() then sources.send_completions(context) end
8585
end)
8686
end)
8787
end
8888
end
8989

9090
-- no completions will be in flight if none of them ran,
9191
-- so we send the completions
92-
if not sources.some_in_flight() then sources.send_completions() end
92+
if not sources.some_in_flight() then sources.send_completions(context) end
9393
end
9494

9595
function sources.add_source_completions(source_name, source_items, cursor_column)
@@ -108,7 +108,7 @@ function sources.some_in_flight()
108108
return false
109109
end
110110

111-
function sources.send_completions()
111+
function sources.send_completions(context)
112112
local sources_items = sources.sources_items
113113
-- apply source filters
114114
for _, source in pairs(sources.registered) do
@@ -121,7 +121,7 @@ function sources.send_completions()
121121
vim.list_extend(flattened_items, response.items)
122122
end
123123

124-
sources.on_completions_callback(flattened_items)
124+
sources.on_completions_callback(context, flattened_items)
125125
end
126126

127127
function sources.cancel_completions()

lua/blink/cmp/windows/documentation.lua

+4-4
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,20 @@ function docs.show_item(item)
3131
end
3232

3333
sources.resolve(item, function(resolved_item)
34-
if resolved_item.documentation == nil then
34+
item = resolved_item or item
35+
if item.documentation == nil then
3536
docs.win:close()
3637
return
3738
end
3839

39-
-- todo: respect .kind (MarkupKind) which is markdown or plaintext
4040
local doc_lines = {}
41-
for s in resolved_item.documentation.value:gmatch('[^\r\n]+') do
41+
for s in item.documentation.value:gmatch('[^\r\n]+') do
4242
table.insert(doc_lines, s)
4343
end
4444
vim.api.nvim_buf_set_lines(docs.win:get_buf(), 0, -1, true, doc_lines)
4545
vim.api.nvim_set_option_value('modified', false, { buf = docs.win:get_buf() })
4646

47-
local filetype = resolved_item.documentation.kind == 'markdown' and 'markdown' or 'plaintext'
47+
local filetype = item.documentation.kind == 'markdown' and 'markdown' or 'plaintext'
4848
if filetype ~= vim.api.nvim_get_option_value('filetype', { buf = docs.win:get_buf() }) then
4949
vim.api.nvim_set_option_value('filetype', filetype, { buf = docs.win:get_buf() })
5050
end

lua/blink/cmp/windows/lib.lua

+2
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ function win:update_position(relative_to, offset)
8282
local cursor_col = cursor[2]
8383

8484
-- set width to current content width, bounded by min and max
85+
-- todo: should be determined based on the items since we format the items to the current width
86+
-- so the get_content_width() will always be the window width
8587
local width = math.max(math.min(self:get_content_width(), config.max_width), config.min_width)
8688
vim.api.nvim_win_set_width(winnr, width)
8789

0 commit comments

Comments
 (0)