1 -- Edit and review GitHub issues and pull requests
2 -- from the comfort of your favorite editor
3 -- https://github.com/pwntester/octo.nvim
9 require("octo").setup({
10 use_local_fs = false, -- use local files on right side of reviews
11 enable_builtin = false, -- shows a list of builtin actions when no action is provided
12 default_remote = { "upstream", "origin" }, -- order to try remotes
13 default_merge_method = "merge", -- default merge method which should be used for both `Octo pr merge` and merging from picker, could be `merge`, `rebase` or `squash`
14 default_delete_branch = false, -- whether to delete branch when merging pull request with either `Octo pr merge` or from picker (can be overridden with `delete`/`nodelete` argument to `Octo pr merge`)
15 ssh_aliases = {}, -- SSH aliases. e.g. `ssh_aliases = {["github.com-work"] = "github.com"}`. The key part will be interpreted as an anchored Lua pattern.
16 picker = "telescope", -- or "fzf-lua" or "snacks" or "default"
18 use_emojis = false, -- only used by "fzf-lua" picker for now
19 search_static = true, -- Whether to use static search results (true) or dynamic search (false)
20 mappings = { -- mappings for the pickers
21 open_in_browser = { lhs = "<C-b>", desc = "open issue in browser" },
22 copy_url = { lhs = "<C-y>", desc = "copy url to system clipboard" },
23 copy_sha = { lhs = "<C-e>", desc = "copy commit SHA to system clipboard" },
24 checkout_pr = { lhs = "<C-o>", desc = "checkout pull request" },
25 merge_pr = { lhs = "<C-r>", desc = "merge pull request" },
27 snacks = { -- snacks specific config
28 actions = { -- custom actions for specific snacks pickers (array of tables)
29 issues = { -- actions for the issues picker
30 -- { name = "my_issue_action", fn = function(picker, item) print("Issue action:", vim.inspect(item)) end, lhs = "<leader>a", desc = "My custom issue action" },
32 pull_requests = { -- actions for the pull requests picker
33 -- { name = "my_pr_action", fn = function(picker, item) print("PR action:", vim.inspect(item)) end, lhs = "<leader>b", desc = "My custom PR action" },
35 notifications = {}, -- actions for the notifications picker
36 issue_templates = {}, -- actions for the issue templates picker
37 search = {}, -- actions for the search picker
38 -- ... add actions for other pickers as needed
42 comment_icon = "▎", -- comment marker
43 outdated_icon = " ", -- outdated indicator
44 resolved_icon = " ", -- resolved indicator
45 reaction_viewer_hint_icon = " ", -- marker for user reactions
46 commands = {}, -- additional subcommands made available to `Octo` command
47 users = "search", -- Users for assignees or reviewers. Values: "search" | "mentionable" | "assignable"
48 user_icon = " ", -- user icon
49 ghost_icon = " ", -- ghost icon
50 copilot_icon = " ", -- copilot icon
51 timeline_marker = " ", -- timeline marker
52 timeline_indent = " ", -- timeline indentation
53 use_timeline_icons = true, -- toggle timeline icons
54 timeline_icons = { -- the default icons based on timelineItems
57 comment_deleted = " ",
69 cross_reference = " ",
76 automatic_base_change_succeeded = " ",
77 base_ref_changed = " ",
78 merged = { " ", "OctoPurple" },
80 closed = { " ", "OctoRed" },
81 completed = { " ", "OctoPurple" },
82 not_planned = { " ", "OctoGrey" },
83 duplicate = { " ", "OctoGrey" },
85 reopened = { " ", "OctoGreen" },
87 review_requested = " ",
89 right_bubble_delimiter = "", -- bubble delimiter
90 left_bubble_delimiter = "", -- bubble delimiter
91 github_hostname = "", -- GitHub Enterprise host
92 snippet_context_lines = 4, -- number or lines around commented lines
93 gh_cmd = "gh", -- Command to use when calling Github CLI
94 gh_env = {}, -- extra environment variables to pass on to GitHub CLI, can be a table or function returning a table
95 timeout = 5000, -- timeout for requests between the remote server
96 default_to_projects_v2 = false, -- use projects v2 for the `Octo card ...` command by default. Both legacy and v2 commands are available under `Octo cardlegacy ...` and `Octo cardv2 ...` respectively.
97 -- Also disable sending v2 events into Github API.
99 use_signcolumn = false, -- show "modified" marks on the sign column
100 use_signstatus = true, -- show "modified" marks on the status column
103 order_by = { -- criteria to sort results of `Octo issue list`
104 field = "CREATED_AT", -- either COMMENTS, CREATED_AT or UPDATED_AT (https://docs.github.com/en/graphql/reference/enums#issueorderfield)
105 direction = "DESC", -- either DESC or ASC (https://docs.github.com/en/graphql/reference/enums#orderdirection)
109 auto_show_threads = true, -- automatically show comment threads on cursor move
110 focus = "right", -- focus right buffer on diff open
123 order_by = { -- criteria to sort the results of `Octo pr list`
124 field = "CREATED_AT", -- either COMMENTS, CREATED_AT or UPDATED_AT (https://docs.github.com/en/graphql/reference/enums#issueorderfield)
125 direction = "DESC", -- either DESC or ASC (https://docs.github.com/en/graphql/reference/enums#orderdirection)
127 always_select_remote_on_create = false, -- always give prompt to select base remote repo when creating PRs
128 use_branch_name_as_title = false, -- sets branch name to be the name for the PR
131 current_repo_only = false, -- show notifications for current repo only
134 size = 10, -- changed files panel rows
135 use_icons = true, -- use web-devicons in file panel (if false, nvim-web-devicons does not need to be installed)
137 colors = { -- used for highlight groups (see Colors section below)
142 dark_red = "#da3633",
144 dark_green = "#238636",
146 dark_yellow = "#735c0f",
148 dark_blue = "#0366d6",
151 mappings_disable_default = false, -- disable default mappings if true, but will still adapt user mappings
154 discussion_options = { lhs = "<CR>", desc = "show discussion options" },
155 open_in_browser = { lhs = "<C-b>", desc = "open discussion in browser" },
156 copy_url = { lhs = "<C-y>", desc = "copy url to system clipboard" },
157 add_comment = { lhs = "<localleader>ca", desc = "add comment" },
158 add_reply = { lhs = "<localleader>cr", desc = "add reply" },
159 delete_comment = { lhs = "<localleader>cd", desc = "delete comment" },
160 add_label = { lhs = "<localleader>la", desc = "add label" },
161 remove_label = { lhs = "<localleader>ld", desc = "remove label" },
162 next_comment = { lhs = "]c", desc = "go to next comment" },
163 prev_comment = { lhs = "[c", desc = "go to previous comment" },
164 react_hooray = { lhs = "<localleader>rp", desc = "add/remove 🎉 reaction" },
165 react_heart = { lhs = "<localleader>rh", desc = "add/remove ❤️ reaction" },
166 react_eyes = { lhs = "<localleader>re", desc = "add/remove 👀 reaction" },
167 react_thumbs_up = { lhs = "<localleader>r+", desc = "add/remove 👍 reaction" },
168 react_thumbs_down = { lhs = "<localleader>r-", desc = "add/remove 👎 reaction" },
169 react_rocket = { lhs = "<localleader>rr", desc = "add/remove 🚀 reaction" },
170 react_laugh = { lhs = "<localleader>rl", desc = "add/remove 😄 reaction" },
171 react_confused = { lhs = "<localleader>rc", desc = "add/remove 😕 reaction" },
174 expand_step = { lhs = "o", desc = "expand workflow step" },
175 open_in_browser = { lhs = "<C-b>", desc = "open workflow run in browser" },
176 refresh = { lhs = "<C-r>", desc = "refresh workflow" },
177 rerun = { lhs = "<C-o>", desc = "rerun workflow" },
178 rerun_failed = { lhs = "<C-f>", desc = "rerun failed workflow" },
179 cancel = { lhs = "<C-x>", desc = "cancel workflow" },
180 copy_url = { lhs = "<C-y>", desc = "copy url to system clipboard" },
183 issue_options = { lhs = "<CR>", desc = "show issue options" },
184 close_issue = { lhs = "<localleader>ic", desc = "close issue" },
185 reopen_issue = { lhs = "<localleader>io", desc = "reopen issue" },
186 list_issues = { lhs = "<localleader>il", desc = "list open issues on same repo" },
187 reload = { lhs = "<C-r>", desc = "reload issue" },
188 open_in_browser = { lhs = "<C-b>", desc = "open issue in browser" },
189 copy_url = { lhs = "<C-y>", desc = "copy url to system clipboard" },
190 add_assignee = { lhs = "<localleader>aa", desc = "add assignee" },
191 remove_assignee = { lhs = "<localleader>ad", desc = "remove assignee" },
192 create_label = { lhs = "<localleader>lc", desc = "create label" },
193 add_label = { lhs = "<localleader>la", desc = "add label" },
194 remove_label = { lhs = "<localleader>ld", desc = "remove label" },
195 goto_issue = { lhs = "<localleader>gi", desc = "navigate to a local repo issue" },
196 add_comment = { lhs = "<localleader>ca", desc = "add comment" },
197 add_reply = { lhs = "<localleader>cr", desc = "add reply" },
198 delete_comment = { lhs = "<localleader>cd", desc = "delete comment" },
199 next_comment = { lhs = "]c", desc = "go to next comment" },
200 prev_comment = { lhs = "[c", desc = "go to previous comment" },
201 react_hooray = { lhs = "<localleader>rp", desc = "add/remove 🎉 reaction" },
202 react_heart = { lhs = "<localleader>rh", desc = "add/remove ❤️ reaction" },
203 react_eyes = { lhs = "<localleader>re", desc = "add/remove 👀 reaction" },
204 react_thumbs_up = { lhs = "<localleader>r+", desc = "add/remove 👍 reaction" },
205 react_thumbs_down = { lhs = "<localleader>r-", desc = "add/remove 👎 reaction" },
206 react_rocket = { lhs = "<localleader>rr", desc = "add/remove 🚀 reaction" },
207 react_laugh = { lhs = "<localleader>rl", desc = "add/remove 😄 reaction" },
208 react_confused = { lhs = "<localleader>rc", desc = "add/remove 😕 reaction" },
211 pr_options = { lhs = "<CR>", desc = "show PR options" },
212 checkout_pr = { lhs = "<localleader>po", desc = "checkout PR" },
213 merge_pr = { lhs = "<localleader>pm", desc = "merge PR" },
214 squash_and_merge_pr = { lhs = "<localleader>psm", desc = "squash and merge PR" },
215 rebase_and_merge_pr = { lhs = "<localleader>prm", desc = "rebase and merge PR" },
217 lhs = "<localleader>pq",
218 desc = "merge commit PR and add to merge queue (Merge queue must be enabled in the repo)",
220 squash_and_merge_queue = {
221 lhs = "<localleader>psq",
222 desc = "squash and add to merge queue (Merge queue must be enabled in the repo)",
224 rebase_and_merge_queue = {
225 lhs = "<localleader>prq",
226 desc = "rebase and add to merge queue (Merge queue must be enabled in the repo)",
228 list_commits = { lhs = "<localleader>pc", desc = "list PR commits" },
229 list_changed_files = { lhs = "<localleader>pf", desc = "list PR changed files" },
230 show_pr_diff = { lhs = "<localleader>pd", desc = "show PR diff" },
231 add_reviewer = { lhs = "<localleader>va", desc = "add reviewer" },
232 remove_reviewer = { lhs = "<localleader>vd", desc = "remove reviewer request" },
233 close_issue = { lhs = "<localleader>ic", desc = "close PR" },
234 reopen_issue = { lhs = "<localleader>io", desc = "reopen PR" },
235 list_issues = { lhs = "<localleader>il", desc = "list open issues on same repo" },
236 reload = { lhs = "<C-r>", desc = "reload PR" },
237 open_in_browser = { lhs = "<C-b>", desc = "open PR in browser" },
238 copy_url = { lhs = "<C-y>", desc = "copy url to system clipboard" },
239 goto_file = { lhs = "gf", desc = "go to file" },
240 add_assignee = { lhs = "<localleader>aa", desc = "add assignee" },
241 remove_assignee = { lhs = "<localleader>ad", desc = "remove assignee" },
242 create_label = { lhs = "<localleader>lc", desc = "create label" },
243 add_label = { lhs = "<localleader>la", desc = "add label" },
244 remove_label = { lhs = "<localleader>ld", desc = "remove label" },
245 goto_issue = { lhs = "<localleader>gi", desc = "navigate to a local repo issue" },
246 add_comment = { lhs = "<localleader>ca", desc = "add comment" },
247 add_reply = { lhs = "<localleader>cr", desc = "add reply" },
248 delete_comment = { lhs = "<localleader>cd", desc = "delete comment" },
249 next_comment = { lhs = "]c", desc = "go to next comment" },
250 prev_comment = { lhs = "[c", desc = "go to previous comment" },
251 react_hooray = { lhs = "<localleader>rp", desc = "add/remove 🎉 reaction" },
252 react_heart = { lhs = "<localleader>rh", desc = "add/remove ❤️ reaction" },
253 react_eyes = { lhs = "<localleader>re", desc = "add/remove 👀 reaction" },
254 react_thumbs_up = { lhs = "<localleader>r+", desc = "add/remove 👍 reaction" },
255 react_thumbs_down = { lhs = "<localleader>r-", desc = "add/remove 👎 reaction" },
256 react_rocket = { lhs = "<localleader>rr", desc = "add/remove 🚀 reaction" },
257 react_laugh = { lhs = "<localleader>rl", desc = "add/remove 😄 reaction" },
258 react_confused = { lhs = "<localleader>rc", desc = "add/remove 😕 reaction" },
259 review_start = { lhs = "<localleader>vs", desc = "start a review for the current PR" },
260 review_resume = { lhs = "<localleader>vr", desc = "resume a pending review for the current PR" },
261 resolve_thread = { lhs = "<localleader>rt", desc = "resolve PR thread" },
262 unresolve_thread = { lhs = "<localleader>rT", desc = "unresolve PR thread" },
265 goto_issue = { lhs = "<localleader>gi", desc = "navigate to a local repo issue" },
266 add_comment = { lhs = "<localleader>ca", desc = "add comment" },
267 add_reply = { lhs = "<localleader>cr", desc = "add reply" },
268 add_suggestion = { lhs = "<localleader>sa", desc = "add suggestion" },
269 delete_comment = { lhs = "<localleader>cd", desc = "delete comment" },
270 next_comment = { lhs = "]c", desc = "go to next comment" },
271 prev_comment = { lhs = "[c", desc = "go to previous comment" },
272 select_next_entry = { lhs = "]q", desc = "move to next changed file" },
273 select_prev_entry = { lhs = "[q", desc = "move to previous changed file" },
274 select_first_entry = { lhs = "[Q", desc = "move to first changed file" },
275 select_last_entry = { lhs = "]Q", desc = "move to last changed file" },
276 select_next_unviewed_entry = { lhs = "]u", desc = "move to next unviewed changed file" },
277 select_prev_unviewed_entry = { lhs = "[u", desc = "move to previous unviewed changed file" },
278 close_review_tab = { lhs = "<C-c>", desc = "close review tab" },
279 react_hooray = { lhs = "<localleader>rp", desc = "add/remove 🎉 reaction" },
280 react_heart = { lhs = "<localleader>rh", desc = "add/remove ❤️ reaction" },
281 react_eyes = { lhs = "<localleader>re", desc = "add/remove 👀 reaction" },
282 react_thumbs_up = { lhs = "<localleader>r+", desc = "add/remove 👍 reaction" },
283 react_thumbs_down = { lhs = "<localleader>r-", desc = "add/remove 👎 reaction" },
284 react_rocket = { lhs = "<localleader>rr", desc = "add/remove 🚀 reaction" },
285 react_laugh = { lhs = "<localleader>rl", desc = "add/remove 😄 reaction" },
286 react_confused = { lhs = "<localleader>rc", desc = "add/remove 😕 reaction" },
287 resolve_thread = { lhs = "<localleader>rt", desc = "resolve PR thread" },
288 unresolve_thread = { lhs = "<localleader>rT", desc = "unresolve PR thread" },
291 approve_review = { lhs = "<C-a>", desc = "approve review", mode = { "n", "i" } },
292 comment_review = { lhs = "<C-m>", desc = "comment review", mode = { "n", "i" } },
293 request_changes = { lhs = "<C-r>", desc = "request changes review", mode = { "n", "i" } },
294 close_review_tab = { lhs = "<C-c>", desc = "close review tab", mode = { "n", "i" } },
297 submit_review = { lhs = "<localleader>vs", desc = "submit review" },
298 discard_review = { lhs = "<localleader>vd", desc = "discard review" },
299 add_review_comment = {
300 lhs = "<localleader>ca",
301 desc = "add a new review comment",
304 add_review_suggestion = {
305 lhs = "<localleader>sa",
306 desc = "add a new review suggestion",
309 focus_files = { lhs = "<localleader>e", desc = "move focus to changed file panel" },
310 toggle_files = { lhs = "<localleader>b", desc = "hide/show changed files panel" },
311 next_thread = { lhs = "]t", desc = "move to next thread" },
312 prev_thread = { lhs = "[t", desc = "move to previous thread" },
313 select_next_entry = { lhs = "]q", desc = "move to next changed file" },
314 select_prev_entry = { lhs = "[q", desc = "move to previous changed file" },
315 select_first_entry = { lhs = "[Q", desc = "move to first changed file" },
316 select_last_entry = { lhs = "]Q", desc = "move to last changed file" },
317 select_next_unviewed_entry = { lhs = "]u", desc = "move to next unviewed changed file" },
318 select_prev_unviewed_entry = { lhs = "[u", desc = "move to previous unviewed changed file" },
319 close_review_tab = { lhs = "<C-c>", desc = "close review tab" },
320 toggle_viewed = { lhs = "<localleader><space>", desc = "toggle viewer viewed state" },
321 goto_file = { lhs = "gf", desc = "go to file" },
324 submit_review = { lhs = "<localleader>vs", desc = "submit review" },
325 discard_review = { lhs = "<localleader>vd", desc = "discard review" },
326 next_entry = { lhs = "j", desc = "move to next changed file" },
327 prev_entry = { lhs = "k", desc = "move to previous changed file" },
328 select_entry = { lhs = "<cr>", desc = "show selected changed file diffs" },
329 refresh_files = { lhs = "R", desc = "refresh changed files panel" },
330 focus_files = { lhs = "<localleader>e", desc = "move focus to changed file panel" },
331 toggle_files = { lhs = "<localleader>b", desc = "hide/show changed files panel" },
332 select_next_entry = { lhs = "]q", desc = "move to next changed file" },
333 select_prev_entry = { lhs = "[q", desc = "move to previous changed file" },
334 select_first_entry = { lhs = "[Q", desc = "move to first changed file" },
335 select_last_entry = { lhs = "]Q", desc = "move to last changed file" },
336 select_next_unviewed_entry = { lhs = "]u", desc = "move to next unviewed changed file" },
337 select_prev_unviewed_entry = { lhs = "[u", desc = "move to previous unviewed changed file" },
338 close_review_tab = { lhs = "<C-c>", desc = "close review tab" },
339 toggle_viewed = { lhs = "<localleader><space>", desc = "toggle viewer viewed state" },
342 read = { lhs = "<localleader>nr", desc = "mark notification as read" },
343 done = { lhs = "<localleader>nd", desc = "mark notification as done" },
344 unsubscribe = { lhs = "<localleader>nu", desc = "unsubscribe from notifications" },
347 repo_options = { lhs = "<CR>", desc = "show repo options" },
348 create_issue = { lhs = "<localleader>ic", desc = "create issue" },
349 create_discussion = { lhs = "<localleader>dc", desc = "create discussion" },
350 contributing_guidelines = { lhs = "<localleader>cg", desc = "view contributing guidelines" },
351 open_in_browser = { lhs = "<C-b>", desc = "open repo in browser" },
354 open_in_browser = { lhs = "<C-b>", desc = "open release in browser" },