FTP/SFTP Explorer — an NppFTP-style VS Code extensionEnglish · Türkçe sürüm: Developer: Sanater An FTP client that brings the workflow of NppFTP (the Notepad++ plugin) to VS Code: define a profile → connect → click a file in the remote tree → edit → save, and it uploads itself.
Features
On top of that:
InstallationFrom the Marketplace: open the Extensions panel ( From a .vsix file: Extensions panel →
Reload the window afterwards ( To build from source see Development below. LanguageThe extension speaks English and Turkish. By default it follows the VS Code display language; to pin one explicitly:
This setting covers messages, dialogs, the profile window and the message window.
Command and menu titles are translated through the VS Code platform mechanism
instead, so those follow the display language ( Getting started
To upload the current file manually: Ctrl+Alt+U ( Profile fields
SSH terminalYou do not need a separate program to run
Credentials come from the same place as the FTP/SFTP connection, and are not asked
for again if the profile is already connected. Servers requiring
Which profiles can use it?
Matching tag highlightingMove the cursor into a tag and both the opening and the closing tag stand out:
Three highlight layersNotepad++'s look is made of three separate layers; each can be toggled individually:
How much gets coloured? (
|
| Command | Shortcut |
|---|---|
| Tag Matching: Go to Matching Tag | Ctrl+Alt+M |
| Tag Matching: Select Tag Block | — |
Changing the colours
In settings.json:
"workbench.colorCustomizations": {
"ftpxTag.matchBackground": "#a074c470",
"ftpxTag.matchLineBackground": "#8a6fc42e",
"ftpxTag.attributeBackground": "#d9b23a4d",
"ftpxTag.matchBorder": "#c08cf0cc",
"ftpxTag.guideForeground": "#a074c470"
}
Settings
| Setting | Default | Description |
|---|---|---|
ftpx.language |
auto |
Extension language: auto / en / tr |
ftpx.onSave |
upload |
On save: upload / ask / none |
ftpx.confirmDelete |
true |
Ask before deleting |
ftpx.showHiddenFiles |
true |
Show dot files |
ftpx.sortFoldersFirst |
true |
Sort folders first |
ftpx.logLevel |
info |
off / info / debug / trace |
ftpx.cachePath |
"" |
Folder for downloaded files |
ftpx.autoConnectProfile |
"" |
Profile to connect to on startup |
ftpx.reconnectOnUpload |
true |
Silently re-establish a dropped connection |
ftpx.tagHighlight.enabled |
true |
Matching tag highlighting |
ftpx.tagHighlight.style |
background |
background / outline / underline / background+outline |
ftpx.tagHighlight.bold |
false |
Render matching tags bold |
ftpx.tagHighlight.scope |
tag |
tag (boundaries), name (name only), full (with attributes) |
ftpx.tagHighlight.highlightLine |
true |
Fill the whole line of the matching tags |
ftpx.tagHighlight.highlightAttributes |
true |
Mark attribute names of the matching tag |
ftpx.tagHighlight.matchInsideContent |
false |
Match from the content between the tags too |
ftpx.tagHighlight.highlightBladeDirectives |
true |
Also match @if/@endif style Blade blocks |
ftpx.tagHighlight.showVerticalGuide |
false |
Draw a vertical guide between the tags |
ftpx.tagHighlight.languages |
HTML/Blade/Vue... | Enabled language ids (* = all) |
ftpx.tagHighlight.maxFileSize |
2000000 |
Skip tag matching above this size |
Project layout
src/
extension.ts Entry point: view, status bar, save-and-upload hook
session.ts The single active connection + operation queue
profileStore.ts profiles.json + SecretStorage
profileEditor.ts The "FTP Profiles" webview
tree.ts Remote file tree + drag & drop
commands.ts All commands
transfer.ts Download/upload, progress, ASCII conversion
cache.ts Local↔remote mapping
i18n.ts Language resolution (setting + display language)
i18n/
core.ts Active language, placeholder formatting, t()
en.ts / tr.ts Message bundles (key parity enforced by tests)
clients/
client.ts Shared interface
ftpClient.ts FTP / FTPES / FTPS (basic-ftp)
sftpClient.ts SFTP (ssh2-sftp-client)
ssh/
shell.ts SSH shell (vscode-free, testable)
terminal.ts Binds the shell to the VS Code terminal panel
tagmatch/
tags.ts HTML/XML tag scanner + stack-based matcher
directives.ts Blade block directives
match.ts Combines both, finds the pair under the cursor
highlighter.ts Decorations, listeners, cache
media/ Webview HTML/CSS/JS, icons
test/ Smoke tests against a real SFTP + SSH server
package.nls.json Command/setting titles (English)
package.nls.tr.json Command/setting titles (Turkish)
Development
npm install
npm run compile
Open this folder in VS Code and press F5: a separate "Extension Development Host" window starts so you can try your changes without touching the installed version.
See PUBLISHING.md in the repository for packaging and publishing.
Tests
npm test
test/sftp-server.js starts a real in-process SFTP + SSH server; test/smoke.js
verifies connecting, listing, stat, downloading (including progress reporting),
uploading, mkdir, rename, chmod and recursive deletion end to end. On the SSH
side it covers opening a shell, running commands, multi-byte character integrity,
window-size propagation, the initial directory (including quote escaping) and the
wrong-password path. It also covers every corner case of the tag/directive scanner
(comments, <script>, quoted >, void elements, @section forms, @@ escapes)
and the consistency of the translation bundles (key parity, empty strings,
placeholder agreement).
Known limitations
- Active (PORT) FTP mode is not supported.
basic-ftponly uses passive mode (PASV/EPSV); if a profile selects active mode a warning is logged and passive mode is used. - SSH host keys are not verified. The server key fingerprint is logged at
debuglevel but is not compared againstknown_hosts. - ASCII mode does not rely on the server's
TYPE Abehaviour; line endings are converted locally instead (to the OS convention on download, toLFon upload). Binary content is detected and left untouched. - Only one connection at a time (same as NppFTP).
- FTP has no single-file
statcommand, so "Properties" reads from the parent directory listing; some servers do not report permissions or ownership.
License and contact
MIT licensed. Developer: Sanater