This package provides:
This package consumes:
Made for Pulsar!
This package was written specifically for Pulsar and did not exist in the Atom package repository.
A package provide an interactive coding environment that supports Python, R, JavaScript and other Jupyter kernels.

To install hydrogen-next search for hydrogen-next in the Install pane of the Pulsar settings or run ppm install hydrogen-next. Alternatively, you can run ppm install asiloisad/pulsar-hydrogen-next to install a package directly from the GitHub repository.
Hydrogen & hydrogen-next core features:
Enhancements exclusive to hydrogen-next:
jmp and zeromq now use latest versions.hydrogen-run.cell-navigation.hydrogen-cell-separator as markers.if/elif/else and try/except/else/finally.hydrogen-next:open-examples.When you run code without a selection, hydrogen-next intelligently detects what to execute based on cursor position.
(), [], {}| Cursor Position | What Gets Executed |
|---|---|
On def/class line |
Entire function/class (with decorators) |
On @decorator line |
Decorated function/class |
On if/elif/else line |
Entire if-elif-else chain |
On try/except/finally line |
Entire try block |
On for/while line |
Loop with optional else |
On with/match line |
Entire block |
| Inside body | Single line only |
| Cursor Position | What Gets Executed |
|---|---|
On line ending with [, (, { |
Entire bracket block |
On line starting with ], ), } |
Entire bracket block |
| Inside bracket block | Single line only |
# Cursor on "if" → executes entire if-elif-else
if x > 0:
print("positive")
elif x < 0:
print("negative")
else:
print("zero")
# Cursor on "print" inside body → executes only that line
if x > 0:
print("positive") # ← cursor here = single line
# Cursor on "[" → executes entire list
data = [
1,
2,
3,
]
# Cursor on "2," inside list → executes only "2,"
data = [
1,
2, # ← cursor here = single line
3,
]
This allows you to execute entire blocks from control lines, while still being able to inspect individual lines inside bodies.
Hydrogen-next provides a service API for other packages to interact with Jupyter kernels.
In your package.json:
{
"consumedServices": {
"hydrogen.provider": {
"versions": {
"^1.3.0": "consumeHydrogen"
}
}
}
}
In your package:
module.exports = {
consumeHydrogen(hydrogen) {
this.hydrogen = hydrogen;
},
async example() {
const kernel = this.hydrogen.getActiveKernel();
const result = await kernel.execute("print('Hello')");
console.log(result.status); // 'ok' or 'error'
}
};
| Method | Description |
|---|---|
getActiveKernel() |
Get the kernel for the active editor |
onDidChangeKernel(callback) |
Subscribe to kernel changes |
getCellRange(editor) |
Get the current cell range |
| Method | Description |
|---|---|
execute(code) |
Execute code, returns Promise<{status, outputs, error}> |
executeWithCallback(code, callback) |
Execute with streaming callback |
| Property/Method | Description |
|---|---|
executionState |
Current state: 'idle', 'busy', 'starting' |
executionCount |
Current execution count |
lastExecutionTime |
Last execution time string (e.g., "1.23s") |
onDidChangeExecutionState(callback) |
Subscribe to state changes, returns Disposable |
interrupt() |
Interrupt running execution |
restart([callback]) |
Restart the kernel |
shutdown() |
Shutdown the kernel |
| Method | Description |
|---|---|
complete(code) |
Get completions, returns Promise<{matches, ...}> |
inspect(code, cursorPos) |
Get documentation, returns Promise<{data, found}> |
| Property/Method | Description |
|---|---|
language |
Kernel language (e.g., "python") |
displayName |
Kernel display name (e.g., "Python 3") |
kernelSpec |
Full kernel spec object |
getConnectionFile() |
Path to kernel connection file |
| Method | Description |
|---|---|
onDidDestroy(callback) |
Called when kernel is destroyed |
addMiddleware(middleware) |
Add execution middleware |
async function runCode(hydrogen) {
const kernel = hydrogen.getActiveKernel();
// Simple execution
const result = await kernel.execute("x = 42\nprint(x)");
if (result.status === "ok") {
console.log("Outputs:", result.outputs);
} else {
console.error(`${result.error.ename}: ${result.error.evalue}`);
}
// Monitor state
const disposable = kernel.onDidChangeExecutionState((state) => {
console.log("Kernel state:", state);
});
// Get completions
const completions = await kernel.complete("import nu");
console.log(completions.matches); // ['numpy', 'numbers', ...]
// Cleanup
disposable.dispose();
}
Got ideas to make this package better, found a bug, or want to help add new features? Just drop your thoughts on GitHub — any feedback's welcome!