Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add option to share Magma between buffers #106

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 23 additions & 4 deletions rplugin/python3/magma/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,16 @@ class Magma:

options: MagmaOptions

magma_buffers: Dict[str, MagmaBuffer]

def __init__(self, nvim: Nvim):
self.nvim = nvim
self.initialized = False

self.canvas = None
self.buffers = {}
self.timer = None
self.magma_buffers = {}

def _initialize(self) -> None:
assert not self.initialized
Expand Down Expand Up @@ -136,8 +139,16 @@ def _ask_for_choice(
else:
return options[index - 1]

def _initialize_buffer(self, kernel_name: str) -> MagmaBuffer:
def _initialize_buffer(self, kernel_name: str, shared: bool) -> MagmaBuffer:
assert self.canvas is not None
if shared:
magma = self.magma_buffers.get(kernel_name)
if magma is not None:
magma.add_nvim_buffer(self.nvim.current.buffer)
self.buffers[self.nvim.current.buffer.number] = magma

return magma

magma = MagmaBuffer(
self.nvim,
self.canvas,
Expand All @@ -148,18 +159,26 @@ def _initialize_buffer(self, kernel_name: str) -> MagmaBuffer:
kernel_name,
)

# Can only share one instance of a kernel
self.magma_buffers[kernel_name] = magma
self.buffers[self.nvim.current.buffer.number] = magma

return magma

@pynvim.command("MagmaInit", nargs="?", sync=True, complete='file') # type: ignore
@pynvim.command("MagmaInit", nargs="*", sync=True, complete='file') # type: ignore
@nvimui # type: ignore
def command_init(self, args: List[str]) -> None:
self._initialize_if_necessary()

if args:
args = args[0].split(" ")
kernel_name = args[0]
self._initialize_buffer(kernel_name)
shared = False
if len(args) > 1:
shared = True
print(args)

self._initialize_buffer(kernel_name, shared)
else:
PROMPT = "Select the kernel to launch:"
available_kernels = get_available_kernels()
Expand Down Expand Up @@ -384,7 +403,7 @@ def command_load(self, args: List[str]) -> None:
MagmaIOError.assert_has_key(data, "kernel", str)
kernel_name = data["kernel"]

magma = self._initialize_buffer(kernel_name)
magma = self._initialize_buffer(kernel_name, shared=False)

load(magma, data)

Expand Down
90 changes: 49 additions & 41 deletions rplugin/python3/magma/magmabuffer.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Optional, Dict
from typing import Optional, Dict, List
from queue import Queue
import hashlib

Expand All @@ -19,7 +19,7 @@ class MagmaBuffer:
canvas: Canvas
highlight_namespace: int
extmark_namespace: int
buffer: Buffer
buffers: List[Buffer]

runtime: JupyterRuntime

Expand Down Expand Up @@ -47,7 +47,7 @@ def __init__(
self.canvas = canvas
self.highlight_namespace = highlight_namespace
self.extmark_namespace = extmark_namespace
self.buffer = buffer
self.buffers = [buffer]

self._doautocmd("MagmaInitPre")

Expand All @@ -65,6 +65,9 @@ def __init__(

self._doautocmd("MagmaInitPost")

def add_nvim_buffer(self, buffer: Buffer) -> None:
self.buffers.append(buffer)

def _doautocmd(self, autocmd: str) -> None:
assert " " not in autocmd
self.nvim.command(f"doautocmd User {autocmd}")
Expand Down Expand Up @@ -153,12 +156,13 @@ def clear_interface(self) -> None:
if self.updating_interface:
return

self.nvim.funcs.nvim_buf_clear_namespace(
self.buffer.number,
self.highlight_namespace,
0,
-1,
)
for buffer in self.buffers:
self.nvim.funcs.nvim_buf_clear_namespace(
buffer.number,
self.highlight_namespace,
0,
-1,
)
# and self.nvim.funcs.winbufnr(self.display_window) != -1:
if self.selected_cell is not None and self.selected_cell in self.outputs:
self.outputs[self.selected_cell].clear_interface()
Expand Down Expand Up @@ -194,9 +198,12 @@ def delete_cell(self) -> None:
del self.outputs[self.selected_cell]

def update_interface(self) -> None:
if self.buffer.number != self.nvim.current.buffer.number:
buffer_numbers = [
buffer.number for buffer in self.buffers
]
if self.nvim.current.buffer.number not in buffer_numbers:
return
if self.buffer.number != self.nvim.current.window.buffer.number:
if self.nvim.current.window.buffer.number not in buffer_numbers:
return

self.clear_interface()
Expand All @@ -220,41 +227,42 @@ def update_interface(self) -> None:
self.updating_interface = False

def _show_selected(self, span: Span) -> None:
if span.begin.lineno == span.end.lineno:
self.nvim.funcs.nvim_buf_add_highlight(
self.buffer.number,
self.highlight_namespace,
self.options.cell_highlight_group,
span.begin.lineno,
span.begin.colno,
span.end.colno,
)
else:
self.nvim.funcs.nvim_buf_add_highlight(
self.buffer.number,
self.highlight_namespace,
self.options.cell_highlight_group,
span.begin.lineno,
span.begin.colno,
-1,
)
for lineno in range(span.begin.lineno + 1, span.end.lineno):
for buffer in self.buffers:
if span.begin.lineno == span.end.lineno:
self.nvim.funcs.nvim_buf_add_highlight(
self.buffer.number,
buffer.number,
self.highlight_namespace,
self.options.cell_highlight_group,
lineno,
0,
span.begin.lineno,
span.begin.colno,
span.end.colno,
)
else:
self.nvim.funcs.nvim_buf_add_highlight(
buffer.number,
self.highlight_namespace,
self.options.cell_highlight_group,
span.begin.lineno,
span.begin.colno,
-1,
)
self.nvim.funcs.nvim_buf_add_highlight(
self.buffer.number,
self.highlight_namespace,
self.options.cell_highlight_group,
span.end.lineno,
0,
span.end.colno,
)
for lineno in range(span.begin.lineno + 1, span.end.lineno):
self.nvim.funcs.nvim_buf_add_highlight(
buffer.number,
self.highlight_namespace,
self.options.cell_highlight_group,
lineno,
0,
-1,
)
self.nvim.funcs.nvim_buf_add_highlight(
buffer.number,
self.highlight_namespace,
self.options.cell_highlight_group,
span.end.lineno,
0,
span.end.colno,
)

if self.should_open_display_window:
self.outputs[span].show(span.end)
Expand Down