Skip to content

Commit

Permalink
Add support for custom text formatter options
Browse files Browse the repository at this point in the history
Resolves #39
  • Loading branch information
andweeb committed Oct 19, 2021
1 parent 84bf652 commit 11adcec
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 21 deletions.
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,13 @@ require("presence"):setup({
buttons = true, -- Configure Rich Presence button(s), either a boolean to enable/disable, a static table (`{{ label = "<label>", url = "<url>" }, ...}`, or a function(buffer: string, repo_url: string|nil): table)

-- Rich Presence text options
editing_text = "Editing %s", -- Format string rendered when an editable file is loaded in the buffer
file_explorer_text = "Browsing %s", -- Format string rendered when browsing a file explorer
git_commit_text = "Committing changes", -- Format string rendered when commiting changes in git
plugin_manager_text = "Managing plugins", -- Format string rendered when managing plugins
reading_text = "Reading %s", -- Format string rendered when a read-only or unmodifiable file is loaded in the buffer
workspace_text = "Working on %s", -- Workspace format string (either string or function(git_project_name: string|nil, buffer: string): string)
line_number_text = "Line %s out of %s", -- Line number format string (for when enable_line_number is set to true)
editing_text = "Editing %s", -- Format string rendered when an editable file is loaded in the buffer (either string or function(filename: string): string)
file_explorer_text = "Browsing %s", -- Format string rendered when browsing a file explorer (either string or function(file_explorer_name: string): string)
git_commit_text = "Committing changes", -- Format string rendered when committing changes in git (either string or function(filename: string): string)
plugin_manager_text = "Managing plugins", -- Format string rendered when managing plugins (either string or function(plugin_manager_name: string): string)
reading_text = "Reading %s", -- Format string rendered when a read-only or unmodifiable file is loaded in the buffer (either string or function(filename: string): string)
workspace_text = "Working on %s", -- Format string rendered when in a git repository (either string or function(project_name: string|nil, filename: string): string)
line_number_text = "Line %s out of %s", -- Format string rendered when `enable_line_number` is set to true (either string or function(line_number: number, line_count: number): string)
})
```

Expand Down
35 changes: 21 additions & 14 deletions lua/presence/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -442,28 +442,39 @@ function Presence.get_file_extension(path)
return path:match("^.+%.(.+)$")
end

-- Format any status text via options and support custom formatter functions
function Presence:format_status_text(status_type, ...)
local option_name = string.format("%s_text", status_type)
local text_option = self.options[option_name]
if type(text_option) == "function" then
return text_option(...)
else
return string.format(text_option, ...)
end
end

-- Get the status text for the current buffer
function Presence:get_status_text(filename)
local file_explorer = file_explorers[vim.bo.filetype:match "[^%d]+"]
or file_explorers[(filename or ""):match "[^%d]+"]
local plugin_manager = plugin_managers[vim.bo.filetype]

if file_explorer then
return string.format(self.options.file_explorer_text, file_explorer)
return self:format_status_text("file_explorer", file_explorer)
elseif plugin_manager then
return string.format(self.options.plugin_manager_text, plugin_manager)
return self:format_status_text("plugin_manager", plugin_manager)
end

if not filename or filename == "" then return nil end

if vim.bo.modifiable and not vim.bo.readonly then
if vim.bo.filetype == "gitcommit" then
return string.format(self.options.git_commit_text, filename)
return self:format_status_text("git_commit", filename)
elseif filename then
return string.format(self.options.editing_text, filename)
return self:format_status_text("editing", filename)
end
elseif filename then
return string.format(self.options.reading_text, filename)
return self:format_status_text("reading", filename)
end
end

Expand Down Expand Up @@ -819,11 +830,9 @@ function Presence:update_for_buffer(buffer, should_debounce)

local line_number = vim.api.nvim_win_get_cursor(0)[1]
local line_count = vim.api.nvim_buf_line_count(0)
local line_number_text = self.options.line_number_text
local line_number_text = self:format_status_text("line_number", line_number, line_count)

activity.details = type(line_number_text) == "function"
and line_number_text(line_number, line_count)
or string.format(line_number_text, line_number, line_count)
activity.details = line_number_text

self.workspace = nil
self.last_activity = {
Expand All @@ -835,14 +844,10 @@ function Presence:update_for_buffer(buffer, should_debounce)
}
else
-- Include project details if available and if the user hasn't set the enable_line_number option
local workspace_text = self.options.workspace_text

if project_name then
self.log:debug(string.format("Detected project: %s", project_name))

activity.details = type(workspace_text) == "function"
and workspace_text(project_name, buffer)
or string.format(workspace_text, project_name)
activity.details = self:format_status_text("workspace", project_name, buffer)

self.workspace = project_path
self.last_activity = {
Expand Down Expand Up @@ -879,6 +884,8 @@ function Presence:update_for_buffer(buffer, should_debounce)
-- When no project is detected, set custom workspace text if:
-- * The custom function returns custom workspace text
-- * The configured workspace text does not contain a directive
-- (can't use the `format_status_text` method here)
local workspace_text = self.options.workspace_text
if type(workspace_text) == "function" then
local custom_workspace_text = workspace_text(nil, buffer)
if custom_workspace_text then
Expand Down

0 comments on commit 11adcec

Please sign in to comment.