Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitaba9e8c

Browse files
committed
feat(provider): add basic built-in terminal
1 parentb985ecf commitaba9e8c

File tree

7 files changed

+109
-6
lines changed

7 files changed

+109
-6
lines changed

‎README.md‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,22 @@ You can manually run `opencode` inside Neovim's CWD however you like and `openco
107107

108108
If`opencode.nvim` can't find an existing`opencode`, it uses the configured provider (defaulting based on availability) to manage one for you.
109109

110+
<details>
111+
<summary><ahref="https://neovim.io/doc/user/terminal.html">Neovim terminal</a></summary>
112+
113+
```lua
114+
vim.g.opencode_opts= {
115+
provider= {
116+
enabled="terminal",
117+
terminal= {
118+
-- ...
119+
}
120+
}
121+
}
122+
```
123+
124+
</details>
125+
110126
<details>
111127
<summary><ahref="https://github.com/folke/snacks.nvim/blob/main/docs/terminal.md">snacks.terminal</a></summary>
112128

‎lua/opencode/config.lua‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ local defaults = {
125125

126126
returnfalse
127127
end)(),
128+
terminal= {
129+
split="right",
130+
width=math.floor(vim.o.columns*0.35),
131+
},
128132
snacks= {
129133
auto_close=true,-- Close the terminal when `opencode` exits
130134
win= {
@@ -188,7 +192,7 @@ M.provider = (function()
188192
provider=provider_or_opts
189193
elseifprovider_or_optsandprovider_or_opts.enabledthen
190194
-- Resolve the built-in provider.
191-
---@typeboolean,opencode.provider.Snacks|opencode.provider.Tmux
195+
---@typeboolean,opencode.Provider
192196
localok,resolved_provider=pcall(require,"opencode.provider."..provider_or_opts.enabled)
193197
ifnotokthen
194198
vim.notify(

‎lua/opencode/provider/init.lua‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
---`opencode.nvim` will append `--port <port>` if not already present and `opts.port` is set.
1313
---@fieldcmd?string
1414
---
15+
---@fieldnew?fun(opts:table):opencode.Provider
16+
---
1517
---Toggle `opencode`.
1618
---@fieldtoggle?fun(self:opencode.Provider)
1719
---
@@ -39,9 +41,10 @@
3941
--- - `"kitty"` if in a `kitty` session with remote control enabled
4042
--- - `"wezterm"` if in a `wezterm` window
4143
--- - `"tmux"` if in a `tmux` session
42-
--- - `false`
43-
---@fieldenabled?"snacks"|"kitty"|"wezterm"|"tmux"|false
44+
--- - `"terminal"` as a fallback
45+
---@fieldenabled?"terminal"|"snacks"|"kitty"|"wezterm"|"tmux"|false
4446
---
47+
---@fieldterminal?opencode.provider.terminal.Opts
4548
---@fieldsnacks?opencode.provider.snacks.Opts
4649
---@fieldkitty?opencode.provider.kitty.Opts
4750
---@fieldwezterm?opencode.provider.wezterm.Opts
@@ -72,6 +75,7 @@ function M.list()
7275
require("opencode.provider.kitty"),
7376
require("opencode.provider.wezterm"),
7477
require("opencode.provider.tmux"),
78+
require("opencode.provider.terminal"),
7579
}
7680
end
7781

‎lua/opencode/provider/kitty.lua‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
---@classopencode.provider.Kitty:opencode.Provider
44
---
55
---@fieldoptsopencode.provider.kitty.Opts
6-
---@fieldwindow_id?number The`kitty`window ID where`opencode`is running(internal use only).
6+
---
7+
---The `kitty` window ID where `opencode` is running (internal use only).
8+
---@fieldwindow_id?number
79
localKitty= {}
810
Kitty.__index=Kitty
911
Kitty.name="kitty"

‎lua/opencode/provider/terminal.lua‎

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
---Provide an embedded `opencode` via a [Neovim terminal](https://neovim.io/doc/user/terminal.html) buffer.
2+
---@classopencode.provider.Terminal:opencode.Provider
3+
---
4+
---@fieldoptsopencode.provider.terminal.Opts
5+
---
6+
---@fieldbufnr?integer
7+
---@fieldwinid?integer
8+
localTerminal= {}
9+
Terminal.__index=Terminal
10+
Terminal.name="terminal"
11+
12+
---@classopencode.provider.terminal.Opts:vim.api.keyset.win_config
13+
14+
functionTerminal.new(opts)
15+
localself=setmetatable({},Terminal)
16+
self.opts=optsor {}
17+
self.winid=nil
18+
self.bufnr=nil
19+
returnself
20+
end
21+
22+
functionTerminal.health()
23+
returntrue
24+
end
25+
26+
---Start if not running, else hide/show the window.
27+
functionTerminal:toggle()
28+
ifself.bufnr==nilthen
29+
self:start()
30+
else
31+
ifself.winid~=nilandvim.api.nvim_win_is_valid(self.winid)then
32+
-- Hide the window
33+
vim.api.nvim_win_hide(self.winid)
34+
self.winid=nil
35+
elseifself.bufnr~=nilandvim.api.nvim_buf_is_valid(self.bufnr)then
36+
-- Show the window
37+
localprevious_win=vim.api.nvim_get_current_win()
38+
self.winid=vim.api.nvim_open_win(self.bufnr,true,self.opts)
39+
vim.api.nvim_set_current_win(previous_win)
40+
end
41+
end
42+
end
43+
44+
---Open a window with a terminal buffer.
45+
functionTerminal:start()
46+
ifself.bufnr==nilthen
47+
localprevious_win=vim.api.nvim_get_current_win()
48+
49+
self.bufnr=vim.api.nvim_create_buf(true,false)
50+
self.winid=vim.api.nvim_open_win(self.bufnr,true,self.opts)
51+
-- FIX: There's a few empty columns on the right side of the terminal until it's redrawn, at least for me.
52+
vim.fn.jobstart(self.cmd, {
53+
term=true,
54+
on_exit=function()
55+
self.winid=nil
56+
self.bufnr=nil
57+
end,
58+
})
59+
60+
vim.api.nvim_set_current_win(previous_win)
61+
end
62+
end
63+
64+
---Close the window, delete the buffer.
65+
functionTerminal:stop()
66+
ifself.winid~=nilandvim.api.nvim_win_is_valid(self.winid)then
67+
vim.api.nvim_win_close(self.winid,true)
68+
self.winid=nil
69+
end
70+
ifself.bufnr~=nilandvim.api.nvim_buf_is_valid(self.bufnr)then
71+
vim.api.nvim_buf_delete(self.bufnr, {force=true })
72+
end
73+
end
74+
75+
returnTerminal

‎lua/opencode/provider/tmux.lua‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
---@classopencode.provider.Tmux:opencode.Provider
33
---
44
---@fieldoptsopencode.provider.tmux.Opts
5-
---@fieldpane_id?string The`tmux`pane ID where`opencode`is running(internal use only).
5+
---
6+
---The `tmux` pane ID where `opencode` is running (internal use only).
7+
---@fieldpane_id?string
68
localTmux= {}
79
Tmux.__index=Tmux
810
Tmux.name="tmux"

‎lua/opencode/provider/wezterm.lua‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Wezterm.name = "wezterm"
2020
---
2121
---Rather than splitting the active pane, split the entire window
2222
---@fieldtop_level?boolean
23-
---
23+
2424
---@paramopts?opencode.provider.wezterm.Opts
2525
---@returnopencode.provider.Wezterm
2626
functionWezterm.new(opts)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp