20250118.1737193804

This commit is contained in:
fz0x1 2025-01-18 10:50:04 +01:00
parent 8a3b7f577a
commit e6ca1a41e7
Signed by: fz0x1
GPG key ID: 6F81647BE1B459F4
17 changed files with 43 additions and 398 deletions

View file

@ -1,50 +1,5 @@
local zettelkasten_dir = require("core.options").zettelkasten_dir
local pkm_dir = require("core.options").pkm_dir
-- inserting a link with a title
vim.api.nvim_set_keymap(
"n",
"<leader>mdp",
":lua require('utils.helpers').InsertMarkdownURL()<CR>",
{ silent = true, noremap = true }
)
-- formattig a markdown table
vim.api.nvim_set_keymap("n", "<leader>ftt", ":TableFormat<CR>", { silent = true, noremap = true })
-- inserting zettelkasten id (eton)
vim.api.nvim_set_keymap(
"n",
"<leader>fl",
":lua require('utils.helpers').insert_zk_id()<CR>",
{ silent = true, noremap = true }
)
-- inserting markdown link with uniq name
vim.api.nvim_set_keymap(
"n",
"<leader>vwl",
":lua require('utils.wiki_link').insert_link_with_unique_id()<CR>",
{ silent = true, noremap = true }
)
-- vim.api.nvim_create_user_command("SearchZettelTitle", function()
-- M.search_raw_title({ search_dir = "/Users/fz0x1/Dropbox/TextSync/PKM/00-zettelkasten/" })
-- end, {})
-- mapvimkey("<leader>fm", "SearchZettelTitle", "Search by zettel title")
vim.api.nvim_set_keymap(
"n",
"<leader>fm",
":lua require('utils.telescope_addons').search_raw_title({ search_dir = '"
.. zettelkasten_dir
.. "', type = 'zettel' })<CR>",
{ silent = true, noremap = true }
)
vim.api.nvim_set_keymap(
"n",
"<leader>fk",
":lua require('utils.telescope_addons').search_raw_title({ search_dir = '" .. pkm_dir .. "' })<CR>",
{ silent = true, noremap = true }
)
vim.opt_local.textwidth = 80
vim.opt_local.colorcolumn = "80"
-- vim.opt_local.wrap = true

View file

@ -51,10 +51,3 @@ local api = vim.api
-- Comments
api.nvim_set_keymap("n", "<C-_>", "gtc", { noremap = false })
api.nvim_set_keymap("v", "<C-_>", "goc", { noremap = false })
-- Zen mode
api.nvim_set_keymap("n", "<leader>tw", ":Twilight<CR>", {})
api.nvim_set_keymap("n", "<leader>zm", ":ZenMode<CR>", {})
-- back to the "parent" buffer
api.nvim_set_keymap("n", "<BS>", "<C-^>", { noremap = true, silent = true })

View file

@ -1,13 +1,16 @@
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git",
"clone",
"--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable", -- latest stable release
lazypath,
})
if not (vim.uv or vim.loop).fs_stat(lazypath) then
local lazyrepo = "https://github.com/folke/lazy.nvim.git"
local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
if vim.v.shell_error ~= 0 then
vim.api.nvim_echo({
{ "Failed to clone lazy.nvim:\n", "ErrorMsg" },
{ out, "WarningMsg" },
{ "\nPress any key to exit..." },
}, true, {})
vim.fn.getchar()
os.exit(1)
end
end
vim.opt.rtp:prepend(lazypath)
@ -33,6 +36,7 @@ local opts = {
"zipPlugin",
},
},
checker = { enabled = true },
change_detection = {
notify = false,
},

View file

@ -1,7 +1,5 @@
local opt = vim.opt
local api = vim.api
local M = {}
-- local api = vim.api
-- Tab / Indentation
opt.tabstop = 4
@ -47,6 +45,7 @@ vim.opt.wildignore:append({
"*/dist/*",
"*/venv/*",
"*/__pycache__/*",
"*/.stfolder/*",
})
opt.splitkeep = "cursor"
opt.shell = "zsh"
@ -67,8 +66,6 @@ opt.iskeyword:append("-")
opt.mouse = ""
opt.clipboard:append("unnamedplus")
opt.modifiable = true
-- opt.guicursor =
-- "n-v-c:block,i-ci-ve:block,r-cr:hor20,o:hor50,a:blinkwait700-blinkoff400-blinkon250-Cursor/lCursor,sm:block-blinkwait175-blinkoff150-blinkon175"
opt.encoding = "UTF-8"
opt.fileencoding = "utf-8"
opt.cursorline = false
@ -150,9 +147,3 @@ vim.opt.langmap = {
"Ю>",
"Ё/",
}
M.zettelkasten_dir = vim.fn.expand("~/PKM/01 - zettelkasten/")
M.resources_dir = vim.fn.expand("~/PKM/05 - resources/")
M.pkm_dir = vim.fn.expand("~/PKM/")
return M

View file

@ -152,9 +152,9 @@ local config = function()
mapping = cmp.mapping.preset.insert({
-- ['<C-p>'] = cmp.mapping.select_prev_item(cmp_select),
["<Tab>"] = cmp.mapping.select_next_item(cmp_select),
["<C-n>"] = cmp.mapping.select_next_item(cmp_select),
-- ["<C-n>"] = cmp.mapping.select_next_item(cmp_select),
["<CR>"] = cmp.mapping.confirm({ select = true }),
["<C-Space>"] = cmp.mapping.complete(),
-- ["<C-Space>"] = cmp.mapping.complete(),
["<C-f>"] = cmp.mapping(function(fallback)
if luasnip.jumpable(1) then
luasnip.jump(1)

View file

@ -38,36 +38,6 @@ local config = {
extensions = {},
}
-- local function ins_left(component)
-- table.insert(config.sections.lualine_c, component)
-- end
-- local function ins_right(component)
-- table.insert(config.sections.lualine_x, 1, component)
-- end
-- ins_right({
-- -- Lsp server name .
-- function()
-- local msg = "No Active Lsp"
-- -- local buf_ft = vim.api.nvim_buf_get_option(0, "filetype")
-- local buf_ft = vim.bo.filetype
-- local clients = vim.lsp.get_clients()
-- if next(clients) == nil then
-- return msg
-- end
-- for _, client in ipairs(clients) do
-- local filetypes = client.config.filetypes
-- if filetypes and vim.fn.index(filetypes, buf_ft) ~= -1 then
-- return client.name
-- end
-- end
-- return msg
-- end,
-- icon = " LSP:",
-- color = { fg = "#ff6b6b" },
-- })
return {
"nvim-lualine/lualine.nvim",
lazy = false,

View file

@ -1,10 +0,0 @@
return {
lazy = false,
"iamcco/markdown-preview.nvim",
cmd = { "MarkdownPreviewToggle", "MarkdownPreview", "MarkdownPreviewStop" },
ft = { "markdown" },
build = "cd app && yarn install",
init = function()
vim.g.mkdp_filetypes = { "markdown" }
end,
}

View file

@ -1,4 +1,3 @@
-- TODO what is it for lol?
return {
"godlygeek/tabular",
lazy = false,

View file

@ -1,3 +1,4 @@
return {
"folke/twilight.nvim",
lazy = false,
}

View file

@ -12,5 +12,4 @@ return {
-- refer to the configuration section below
},
},
{ "folke/neodev.nvim" },
}

View file

@ -1,22 +0,0 @@
return {
{
ft = "markdown",
"folke/zen-mode.nvim",
opts = {
window = {
backdrop = 1,
options = {
number = false,
},
},
plugins = {
options = {
laststatus = 1,
},
alacritty = {
enabled = true,
},
},
},
},
}

View file

@ -1,63 +0,0 @@
local mapvimkey = require("utils.keymapper").mapvimkey
local M = {}
function M.InsertMarkdownURL()
local url = vim.fn.getreg("+")
if url == "" then
return
end
local cmd = "curl -L " .. vim.fn.shellescape(url) .. " 2>/dev/null"
local handle = io.popen(cmd)
if not handle then
return
end
local html = handle:read("*a")
handle:close()
local title = ""
local pattern = "<title[^>]*>(.-)</title>"
local m = string.match(html, pattern)
if m then
title = m
end
if title ~= "" then
title = title:gsub("%[", "(")
title = title:gsub("%]", ")")
local markdownLink = "[" .. title .. "](" .. url .. ")"
vim.api.nvim_put({ markdownLink }, "", true, true)
-- vim.api.nvim_command("call append(line('.'), '" .. markdownLink .. "')")
else
print("Title not found for link")
end
end
-- inserting zettelkasten link with an id
function M.insert_zk_id()
local handle = io.popen("eton zk id")
local id = handle:read("*a")
handle:close()
id = id:gsub("%s+", "")
local insert_text = string.format("[](%s.md)", id)
vim.api.nvim_put({ insert_text }, "c", true, true)
vim.api.nvim_feedkeys("i", "n", true)
end
function M.get_relative_path(from, to)
local from_dir = vim.fn.fnamemodify(from, ":p:h")
local to_file = vim.fn.fnamemodify(to, ":p")
local from_parts = vim.split(from_dir, "/")
local to_parts = vim.split(to_file, "/")
while #from_parts > 0 and #to_parts > 0 and from_parts[1] == to_parts[1] do
table.remove(from_parts, 1)
table.remove(to_parts, 1)
end
local relative_path = string.rep("../", #from_parts) .. table.concat(to_parts, "/")
return relative_path
end
return M

View file

@ -1,140 +0,0 @@
local finders = require("telescope.finders")
local previewers = require("telescope.previewers")
local action_state = require("telescope.actions.state")
local conf = require("telescope.config").values
local pickers = require("telescope.pickers")
local actions = require("telescope.actions")
local helpers = require("utils.helpers")
local M = {}
local function paste_titled_link()
return function(prompt_bufnr)
actions.close(prompt_bufnr)
local current_file = vim.fn.expand("%:p")
local selection = action_state.get_selected_entry()
local parts = vim.split(selection.value, ":")
local filename_part = parts[1]
-- local filename_and_category = vim.split(filename_part, "/")
local relative_path = helpers.get_relative_path(current_file, filename_part)
local title = parts[#parts]:match("^%s*(.-)%s*$")
-- remove `#` from header name if it regular wiki
title = title:gsub("^%s*#%s*", "")
relative_path = relative_path:gsub(" ", "%%20")
local link = "[" .. title .. "](" .. relative_path .. ")"
vim.api.nvim_put({ link }, "", true, true)
end
end
--
-- local function paste_link()
-- return function(prompt_bufnr)
-- actions.close(prompt_bufnr)
-- local selection = action_state.get_selected_entry()
-- print(selection.value)
-- local filename_part = vim.split(selection.value, ":")[1]
-- local link = "[[../" .. filename_part .. "]]"
-- vim.api.nvim_put({ link }, "", true, true)
-- end
-- end
--
-- M.copy_filename_to_clipboard = function(prompt_bufnr)
-- local selection = action_state.get_selected_entry()
-- local filename_part = vim.split(selection.value, ":")[1]
-- vim.fn.setreg("*", filename_part)
-- vim.fn.setreg("+", filename_part)
-- print("Copied filename: " .. filename_part)
-- actions.close(prompt_bufnr)
-- end
M.search_raw_title = function(opts)
opts = opts or {}
local search_dir = opts.search_dir or "."
pickers
.new(opts, {
prompt_title = "Search ETON",
finder = finders.new_job(function(prompt)
if not prompt then
return nil
end
-- Adjust the rg command to search for raw_title in all files
local cmd = {
"rg",
"--no-heading",
"--color=never",
"--with-filename",
"--line-number",
"-i",
"-m",
"1",
"title:.*" .. prompt,
search_dir,
}
if opts.type ~= "zettel" then
cmd[9] = "^#.*" .. prompt
end
return cmd
end, opts.entry_maker or function(entry)
local filename, lnum, header
if opts.type ~= "zettel" then
filename, lnum, header = entry:match("([^:]+):(%d+):#%s*(.*)")
else
filename, lnum, header = entry:match("([^:]+):(%d+):title:(.*)")
end
if not filename then
return nil
end
-- Получаем только базовое имя файла
local basename = filename:match("^.+/(.+)$") or filename
return {
value = entry,
ordinal = basename .. " " .. (header or ""),
display = basename .. " - " .. (header or ""),
filename = filename,
lnum = tonumber(lnum),
}
end),
previewer = previewers.new_buffer_previewer({
define_preview = function(self, entry, status)
conf.buffer_previewer_maker(entry.filename, self.state.bufnr, {
bufname = self.state.bufname,
winid = self.state.winid,
preview = self.state.preview,
})
-- vim.api.nvim_buf_call(self.state.bufnr, function()
-- vim.fn.cursor(entry.lnum, 0)
-- vim.cmd("normal! zz")
-- end)
end,
}),
sorter = conf.generic_sorter(opts),
attach_mappings = function(_, map)
-- map("n", "<c-i>", paste_titled_link())
-- map("i", "<c-i>", paste_titled_link())
map("n", "<c-u>", paste_titled_link())
map("i", "<c-u>", paste_titled_link())
actions.select_default:replace(function()
local selection = action_state.get_selected_entry()
actions.close(_)
vim.cmd("vsplit " .. selection.filename)
vim.fn.cursor(selection.lnum, 0)
end)
return true
end,
})
:find()
end
-- vim.api.nvim_create_user_command("SearchZettelTitle", function()
-- M.search_raw_title({ search_dir = "/Users/fz0x1/Dropbox/TextSync/PKM/00-zettelkasten/" })
-- end, {})
-- mapvimkey("<leader>fm", "SearchZettelTitle", "Search by zettel title")
return M

View file

@ -1,44 +0,0 @@
local options = require("core.options")
local M = {}
local function generate_id(length)
local chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
local id = ""
for i = 1, length do
local rand = math.random(#chars)
id = id .. chars:sub(rand, rand)
end
return id
end
local function file_exists(directory, filename)
local filepath = directory .. "/" .. filename
local file = io.open(filepath, "r")
if file then
io.close(file)
return true
else
return false
end
end
local function generate_unique_id(directory, length)
local id
repeat
id = generate_id(length)
until not file_exists(directory, id .. ".md")
return id
end
function M.insert_link_with_unique_id()
local id_length = 8
local unique_id = generate_unique_id(options.resources_dir, id_length)
local link = string.format("[name](%s.md)", unique_id)
vim.api.nvim_put({ link }, "c", true, true)
end
return M

View file

@ -10,8 +10,8 @@ set -g mode-keys vi
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-pipe "pbcopy"
# set -g default-terminal tmux-256color
set -g default-terminal xterm-256color
set -g default-terminal tmux-256color
# set -g default-terminal xterm-256color
set -sa terminal-features ',alacritty:RGB'
set -ga terminal-overrides ",*256col*:Tc"

View file

@ -19,6 +19,11 @@ from pathlib import Path
DB_NAME = Path("metadata.db")
TZ = 1
TOOLS = ("jrnl", "sqlite3")
for t in TOOLS:
if not shutil.which(t):
raise FileNotFoundError(f"There is no existing path for '{t}'")
class Config:
@ -33,6 +38,15 @@ class Config:
def validate(cls):
if not cls.memo_token or not cls.memo_url:
sys.exit("Missing MEMOS_TOKEN or MEMOS_URL environment variables.")
elif not cls.openweathermap_api_key:
sys.exit("Missing openweather api key")
elif ( # TODO need more complex checking
not cls.owntracks_creds
or not cls.owntracks_url
or not cls.geo_user
or not cls.geo_device
):
sys.exit("Missing OwnTracks data")
Config.validate()
@ -300,7 +314,6 @@ def doctor():
if check_diary:
dt = datetime.fromtimestamp(m[1], tz=timezone(timedelta(hours=TZ)))
diary_datetime = dt.strftime("%Y/%m/%d at %I:%M:%S %p")
# print(diary_datetime)
try:
result = subprocess.run(
["jrnl", diary_name, "-on", diary_datetime],
@ -386,16 +399,17 @@ def export():
)
try:
subprocess.run(
result = subprocess.run(
f'printf "%s %s" "{convert_diary_date(create_time)}" {content} | jrnl {diary_name}',
shell=True,
capture_output=True,
text=True,
check=True,
)
print(result.stderr)
except subprocess.CalledProcessError as e:
print(f"Error writing to journal: {e.stderr}")
continue
raise
delete_entity(f"{Config.memo_url}/api/v1/{memo['name']}", headers)
@ -412,12 +426,7 @@ def insert():
"Usage: script.py insert <diary_name> [bulk|single (default)] 'content'"
)
# TODO is this really need?
# if len(sys.argv) == 5 and sys.argv[3] != "single":
# sys.exit("Invalid usage for bulk insert.")
diary_name = sys.argv[2]
# do backup ever!
insert_type = (
"bulk" if len(sys.argv) > 3 and sys.argv[3] == "bulk" else "single"
)
@ -453,13 +462,14 @@ def insert():
print("There is no text")
sys.exit(1)
try:
subprocess.run(
result = subprocess.run(
f'printf "%s %s" "{convert_diary_date(datenow_timestamp)}" {content} | jrnl {diary_name}',
shell=True,
capture_output=True,
text=True,
check=True,
)
print(result.stderr)
except subprocess.CalledProcessError as e:
print(f"Error inserting single entry: {e.stderr}")
raise
@ -478,13 +488,14 @@ def insert():
content = shlex.quote(file.read())
if hash != make_hash(temp_file_path):
try:
subprocess.run(
result = subprocess.run(
f'printf "%s %s" "{convert_diary_date(datenow_timestamp)}" {content} | jrnl {diary_name}',
shell=True,
capture_output=True,
text=True,
check=True,
)
print(result.stderr)
except subprocess.CalledProcessError as e:
print(
f"Error during bulk import: {e.stderr}, file: {temp_file_path}"
@ -505,6 +516,7 @@ def insert():
if __name__ == "__main__":
try:
# I want to know if I'm connected...
fetch_data(url="https://google.com", rjson=False, log=False)
...
except Exception as e:

View file

@ -2,7 +2,7 @@
Description=Таймер для Promnesia Index
[Timer]
OnUnitActiveSec=60min
OnUnitActiveSec=60m
[Install]
WantedBy=timers.target