ブラウザ

Firenvimの使い方|ChromeとFirefoxの入力欄でNeovimを動かす設定と起動しないときの対処【0.2.17対応】

Firenvimの使い方|ChromeとFirefoxの入力欄でNeovimを動かす設定と起動しないときの対処【0.2.17対応】

Firenvimは、ブラウザの入力欄をローカルのNeovimに置き換える拡張です。GitHubのIssue欄をクリックすると、その位置に普段の init.lua を読み込んだNeovimが開き、:w で内容が入力欄へ戻ります。この記事は公式リポジトリ glacambre/firenvim の最新リリース0.2.17(2026年5月8日公開)とmaster(コミット302c105)のソースに基づき、インストール処理と通信経路はNeovim 0.12.6でmacOS上のヘッドレス実行により確かめました。ブラウザ画面の操作は公式ドキュメントによります。なお、Neovim自体をブラウザ内で動かす拡張ではなく、その用途にはttydやcode-serverが向きます。

まとめ:Firenvimを使い始める前に確認する7点

  • 導入は2段階。Neovimプラグインを入れて firenvim#install(0) を実行し、次にChromeウェブストアかFirefox Add-onsから拡張を入れる。
  • 操作は「クリックで開く、:w で入力欄へ反映、:q で閉じる」の3つ。:w はフォームの送信まではしない。
  • Neovimの下限は0.6.0。READMEのLua例を使うなら0.7.0以上が要る。
  • lazy.nvimでFirenvimがブラウザ経由の起動時に読み込まれない設定だと、起動に失敗する。lazy = not vim.g.started_by_firenvim を付ける。
  • 既定の takeover = "always" は該当する入力欄を全部奪う。業務端末では既定を never にして、使うサイトだけ自動起動させる形を勧める。ただし、never のサイトでも手動起動はでき、拡張のアクセス権限を制限する設定ではない。
  • 編集中の本文は $TMPDIR/firenvim などに平文のファイルで置かれ、通常の終了時に削除される。ヤンクした文字列はShaDaに残る。
  • Firefox 154(2026年8月18日公開)以降は、WebSocketへのLocal Network Access検査で枠が一瞬で閉じることがある。回避策は全WebSocketの保護を外すため、専用プロファイルに限る。

Firenvimの基本操作:入力欄での起動と:wによる反映

使い方はREADMEの冒頭にある数行でほぼ尽きます。入力欄をクリックするとNeovimの枠が重なり、元の入力欄は隠れた状態になります。

操作 動作
入力欄をクリック その場でNeovimの枠が開く
<C-e> 枠が出ないときに手動で開く(既定のショートカット)
:w Neovimの内容を隠れた入力欄へ書き戻す
:q 枠を閉じて元の入力欄へ戻る
URLバー横のボタン そのタブだけFirenvimを一時的に止める

つまずきやすいのは :w の範囲です。反映されるのは入力欄の値までで、コメントの投稿やフォームの送信はページ側のボタンを押して行います。書き戻しは BufWrite を合図にしているので、:w せずに :q! で抜けると、編集した文字列は入力欄へ届きません。

枠を開くたびに、その入力欄専用のNeovimプロセスが1つ起動します(background.ts の getNeovimInstance)。SECURITY.mdにはブラウザ起動時にNeovimを立ち上げるとありますが、この先行起動は0.2.17で廃止され、現在は設定を読み取るだけです。init.lua も枠を開くたびに読まれるので、起動に数秒かかる設定は入力欄を開くたびに同じだけ待たされます。Neovim自体の操作や init.lua の書き方はNeovim(nvim)の使い方で扱っています。

導入手順:Neovimプラグインとブラウザ拡張の2段階

lazy.nvimへの追加とfirenvim#installの実行

READMEのlazy.nvim例は build だけを指定していますが、遅延読み込みを既定にしている環境では、次のように lazy を足してください。

{
  'glacambre/firenvim',
  lazy = not vim.g.started_by_firenvim,
  build = ":call firenvim#install(0)",
}

Neovim 0.12.6で lazy = true のまま起動スクリプトを動かすと、ブラウザへ返る応答は Your plugin manager did not load the Firenvim plugin for Neovim. でした。ブラウザ経由の起動ではスクリプトが g:started_by_firenvim を先に定義するので、上の1行を入れると応答は正常なバージョン情報に変わります。

ビルドフックのないプラグインマネージャーでは、導入後にシェルから次を実行します。引数の 0 は設定ディレクトリが見つかったブラウザにだけ入れる指定で、1 は確認せず全ブラウザへ入れる指定です。

nvim --headless "+call firenvim#install(0) | q"

Neovimの下限は0.6.0です。autoload/firenvim.vim の firenvim#install() が has('nvim-0.6.0') で判定して、満たさなければ中断します。READMEのLua例は vim.api.nvim_create_autocmd を使うため、例をそのまま写すなら0.7.0以上が必要になります。最新安定版は0.12.6(2026年10月9日公開)で、この版への移行はNeovim 0.12系への移行手順にまとめました。

firenvim#installが作る起動スクリプトとマニフェスト

firenvim#install(0) はNeovim側の設定を書き換えません。Chrome・Firefoxの設定ディレクトリだけを置いたmacOSの環境で実行すると、作られたファイルは次の3つでした。

  • ~/.local/share/firenvim/firenvim:Neovimを起動するシェルスクリプト(権限 rwx------)
  • ~/Library/Application Support/Mozilla/NativeMessagingHosts/firenvim.json:Firefox用マニフェスト(rw-------)
  • ~/Library/Application Support/Google/Chrome/NativeMessagingHosts/firenvim.json:Chrome用マニフェスト(rw-------)

マニフェストの呼び出し元は、Firefoxが [email protected]、Chromeが拡張ID egpjdkipkomnmjhjmdamaniclmdlobbo に固定されています。別のIDの拡張は起動スクリプトを呼び出せません。入っていないブラウザについては No config detected for vivaldi. Skipping. のような行が出ますが、使いたいブラウザがその行に出ていなければ問題ありません。Windowsでは %LOCALAPPDATA%\firenvim にマニフェストを置き、それを指すレジストリキーも作ります。

拡張の入手先(0.2.17)とChrome・Firefox以外の対応範囲

拡張はChromeウェブストアとFirefox Add-onsにあり、2026年11月時点でどちらも0.2.17です。Firefox版は128以降が対象で、154以降は切り分け章の手順3の対応が要ることがあります。

READMEが明確にサポートと書くのはFirefoxとChromeです。OperaとVivaldiは動くはずだが個別にテストはしていない、Edgeは動くかもしれない、Safariは動かない、という扱いで、BraveとArcは脚注が「動くはず」、本文が「動くかもしれない」と表現が割れています。Chromium系のブラウザでは、Chromeウェブストア版の拡張を入れられることと、インストールスクリプトがそのブラウザの設定ディレクトリを見つけられることが条件です。

firenvim_configの書き方:サイト別の許可とキーの扱い

takeoverとpriorityで作るサイト別の許可リスト

設定は init.lua の vim.g.firenvim_config にまとめます。localSettings のキーはURL全体に当てるJavaScriptの正規表現です。業務でWebフォームを多用する端末では、既定を止めて必要なサイトだけ許可する次の形を勧めます。

vim.g.firenvim_config = {
  localSettings = {
    [".*"] = {
      takeover = "never",
      selector = "textarea",
      priority = 0,
    },
    ["^https?://github\\.com/"] = {
      takeover = "always",
      priority = 1,
    },
  },
}

正規表現はURLのどこかに一致すれば通るので、許可する側には ^ を付けます。付けないと、クエリに https://github.com/ を含む別サイトのURLでも always になります。既定の always のままだと、社内ツールのコメント欄のようにブラウザで直接打ちたい場所でも編集枠に切り替わります。selector の既定は textarea:not([readonly], [aria-readonly]), div[role="textbox"] で、GmailやSlackのようなリッチテキストエディタも対象になるため、textarea に絞ると誤爆が減ります。

READMEは「最も高い priority のパターンが使われる」と書いていますが、configuration.ts の実装は一致した設定を priority の昇順に Object.assign で重ねます。そのため上の例では、GitHub側に selector を書かなくても textarea が引き継がれます。priority の高い設定には、上書きしたい項目だけ書けば足ります。

キー 取りうる値 既定値
takeover always / once / empty / nonempty / never always
cmdline neovim / firenvim / none firenvim
content text / html text
renderer canvas(htmlは削除済み) canvas
priority 数値 0

takeover の once は最初の選択時だけ奪い、:q の後はショートカットが必要になります。empty は空の欄だけ、nonempty は入力済みの欄だけが対象です。cmdline はREADMEの設定例が neovim と書いていますが、実装の既定は領域を節約する外部表示の firenvim です。例を写すとNeovim標準のコマンドラインに変わり、狭い入力欄では編集に使える行が減ります。

Luaの書き方にも落とし穴があります。READMEの vim.g.firenvim_config.localSettings[...] = {...} という入れ子への代入は、Neovim 0.12.6で確かめても値が保存されませんでした。すでに定義済みの設定へ後から足すなら、ローカル変数で受けて代入し直します。

local cfg = vim.g.firenvim_config
cfg.localSettings["^https?://[^/]+\\.co\\.uk/"] = { takeover = "never", priority = 2 }
vim.g.firenvim_config = cfg

設定を変えたのに挙動が変わらないときは、ブラウザの拡張ボタンから開くポップアップの Reload settings を押します。拡張は読み取った設定をブラウザ側の保存領域に持っているためです。

ブラウザが握るキーとMetaキーの取り返し方

<C-n>・<C-t>・<C-w> は通常の方法では上書きできません。Chromeは chrome://extensions/shortcuts、Firefoxは about:addons のショートカットメニューから、拡張の send_C-n・send_C-t・send_C-w にキーを割り当てます。手動起動の nvimify と、タブ単位で止める toggle_firenvim も同じ画面で変更できます。

逆にブラウザへ渡したいキーは ignoreKeys に書きます。キーがNeovimのモード名、値がキーの配列です。修飾キーはShift、Alt、Control、Metaの順に並べ、Ctrl+Alt+Shift+1 は <SAC-1> になります。

-- vim.g.firenvim_config のテーブルに足す
globalSettings = {
  ignoreKeys = { all = { '<C-->' }, normal = { '<C-1>', '<C-2>' } },
},

macOSのoptionキーは、ブラウザがキーを受け取った時点で別の文字に変わっています。macOSでの既定 alt = "alphanum"(他のOSの既定は all)はoption+oを ø として渡し、alt = "all" は <M-ø> として渡すので、どちらでも <M-o> のマッピングは動きません。

Firenvimのときだけ効かせる表示とfiletypeの設定

g:started_by_firenvimによるステータス行の非表示

入力欄の高さは数行のことが多いので、ブラウザ経由の起動時だけUIを減らします。判定に使うのは、起動スクリプトが定義する g:started_by_firenvim です。

if vim.g.started_by_firenvim then
  vim.o.laststatus = 0
  vim.o.showtabline = 0
end

設定の分岐が増えてきたら、Firenvim専用の設定ディレクトリを持つ方法があります。NVIM_APPNAME を指定して firenvim#install() を実行すると、その値が起動スクリプトに書き込まれます。環境変数の渡し方は環境変数とは?Linux・Windowsの設定方法とDocker・CIでの受け渡しを参照してください。

バッファ名とコードエディタの言語判定によるfiletype設定

バッファ名の既定は {hostname%32}_{pathname%32}_{selector%32}_{timestamp%32}.{extension} です。先頭がホスト名なので、GitHubの入力欄だけMarkdownとして開くことができます。

vim.api.nvim_create_autocmd("BufEnter", {
  pattern = "github.com_*.txt",
  command = "set filetype=markdown",
})

{extension} は通常の入力欄では txt ですが、Ace・CodeMirror・Monacoで作られたエディタ上では、そのエディタの言語設定から拡張子が決まります。Goの入力欄なら .go で開くので、init.lua のLSPやハイライトの設定がそのまま当たります。

権限と入力内容の置き場所:業務端末で導入する前の確認事項

拡張の権限とローカル通信の保護

READMEは導入前にSECURITY.mdを読むよう求めています。拡張が要求する主な権限は、<all_urls>(全サイトのページへ枠を追加するため)と nativeMessaging(Neovimを起動するため)です。ほかに scripting・storage・alarms を要求し、Chrome版のビルドではホスト権限に file:///* も加わります。

拡張とNeovimの間はWebSocketで、TLSはかかりません。保護は2段です。Neovimは 127.0.0.1 にだけバインドし、拡張は256ビットのランダムな値を接続のパスに入れます。起動スクリプトへ直接接続して確かめたところ、待ち受けは 127.0.0.1:<ポート> のみで、異なるパスワードを送るとNeovimは5回すべて0.1秒以内に終了しました。推測で接続を試みるページがあってもコマンドは実行できず、プロセスが終わるだけです。

残る懸念としてSECURITY.mdが認めているのは、悪意のあるページが大量の入力欄を作ってフォーカスし、プロセス・ポート・メモリを枯渇させる攻撃です。防御策としてはapparmorによる隔離が案内されています。

編集中の本文の平文保存と終了後の残存

Firenvimは入力欄の内容を実際のファイルへ書き出してからNeovimで開きます(frame.ts の writefile)。作業ディレクトリは $XDG_RUNTIME_DIR または $TMPDIR の下の firenvim で、インストール時の値が起動スクリプトに書き込まれます。計測ではディレクトリの権限が 700、ファイルは 644 でした。

終わり方 編集ファイル
WebSocketを閉じる(:q 相当) 削除された
親の接続が切れる(ブラウザ終了相当) 削除された
SIGKILLで強制終了 残った

削除は VimLeave の処理に任されているので、Neovimが後始末できない終わり方では残ります。もう1つの残存先がShaDaで、ヤンクした文字列は元のファイルを消しても main.shada の中に残っていました。Firenvimで個人情報を扱う可能性があるなら、次の3行をブラウザ経由の起動時だけ効かせます。この設定で同じ操作をしたときは、状態ディレクトリから文字列が見つかりませんでした。

if vim.g.started_by_firenvim then
  vim.o.swapfile = false
  vim.o.undofile = false
  vim.o.shadafile = "NONE"
end

既定の selector は textarea と div[role="textbox"] だけなので、input 要素のパスワード欄が自動で奪われることはありません(<C-e> の手動起動はフォーカス中の要素が対象になります)。判断としては、個人の開発端末で使う範囲なら上の設定と許可リストで足ります。顧客情報を扱う業務システムを開く端末へ全社展開する使い方は勧めません。全サイトへのアクセス権とネイティブ実行の権限を持つ拡張を配ることになり、許可リストはユーザー各自の init.lua に依存するからです。

Firenvimが起動しない場合の症状別切り分け

chrome:// のページやChromeウェブストア、Firefoxの about:addons などの特権ページや組み込みPDFビューアにはブラウザの制限で拡張のスクリプトが入らないので、枠が出なくて当然です。厳しいCSPを持つページでの失敗はIssue #1681で追跡されています。通常のページでも動かないときは、下の表で症状に近い手順から確認します。

症状 原因の候補 確認先
枠がまったく出ない マニフェスト未作成・プラグイン未読込 手順1・2
拡張のアイコンに警告が出る プラグインと拡張の版が不一致 手順2
枠が一瞬出てすぐ閉じる Firefox 154以降のLocal Network Access 手順3
Snap・Flatpak版だけ動かない サンドボックスの権限 手順4
外部コマンド依存のプラグインだけ失敗 ブラウザの $PATH 手順5

手順1:firenvim#install(0)の出力確認

Neovimを引数なしで起動して :call firenvim#install(0) を実行します。Installed native manifest for <ブラウザ名>. が出れば正常です。使いたいブラウザに No config detected と出るなら、設定ディレクトリが標準の場所にありません。標準の場所へシンボリックリンクを張るか、firenvim#install(1) で強制インストールしてから内容をコピーします。Unknown function: firenvim#install はプラグイン自体が読み込まれていない状態です。

手順2:起動スクリプトの単体実行と版の一致

echo 'abcde{}' | ${XDG_DATA_HOME:-${HOME}/.local/share}/firenvim/firenvim

先頭の数バイトに続いて {"messages": [], "version": "0.2.17", ...} が返れば正常です。version が 0.0.0 で Your plugin manager did not load the Firenvim plugin と返るなら、前述の遅延読み込みの設定を見直します。拡張をアップデートしたあとに Neovim plugin version (…) and browser addon version (…) do not match. の警告が出たら、プラグインを更新して firenvim#install(0) を実行し直してください。

手順3:Firefox 154以降のLocal Network AccessによるWebSocket遮断

2026年8月18日公開のFirefox 154で、Local Network Accessの保護がWebSocketにも広がりました。Firenvimの編集枠は ws://127.0.0.1:<ポート> へ接続するので、この検査に止められると枠が一瞬だけ表示されて閉じ、コンソールに 127.0.0.1 への接続失敗(can’t establish a connection to the server)が出ます。同じ症状はIssue #1732にFirefox 154とZenで報告があり、2026年11月時点でオープンのままです。同じIssueにはGitHubでは動いて他のドメインで失敗するという報告もあるので、1つのサイトで動いても解消の根拠にはなりません。

TROUBLESHOOTING.md が示す回避策は、about:config で network.lna.websocket.enabled を false にする方法だけで、拡張ごとの例外を指定するAPIはありません。全サイトのWebSocketから保護が外れ、任意のページが 127.0.0.1 やプライベートIPを探れるようになるため、false にするのはFirenvim専用のプロファイルに限ります。

手順4:Snap・Flatpak版のブラウザの権限

パッケージ管理の形式によってはサンドボックスがNeovimの起動を止めます。flatpak permissions webextensions で確認し、拒否されていれば flatpak permission-set webextensions firenvim snap.firefox yes で許可します。Ubuntuの標準であるSnap版Firefoxを使っている環境は、ここを最初に確認してください。

手順5:ブラウザから見える$PATHの差

起動はするのに外部コマンドに依存するプラグインだけが動かないなら、シェルの echo $PATH とFirenvim内の :!echo $PATH を比べます。現行の起動スクリプトは export PATH="$PATH:<インストール時の PATH>" の1行を持ちます。インストール時のPATHに必要なディレクトリが入っていないと、外部コマンドが見つかりません。パスの通ったシェルで firenvim#install(0) をやり直すのが最初の手段です。追記は末尾なので、別の版のコマンドが先に見つかる場合は firenvim#install(0, 'export PATH="..."') の第2引数で並び順を指定します。

Neovimをブラウザで使う別の手段との選び分け

下の表の中で、入力欄の位置にNeovimの画面そのものが出るのはFirenvimだけです。GhostTextなどはエディタ側の別ウィンドウで編集し、ttydとcode-serverはブラウザ内に端末やエディタを出す方式で、入力欄は置き換えません。

ツール 編集する場所 エディタ 主な前提
Firenvim ページ内の枠 Neovimのみ プラグイン+拡張
GhostText エディタの別ウィンドウ VS Code・Vim・Neovimほか 各エディタ用プラグイン
Textern エディタの別ウィンドウ 任意 Firefox・Linux用ネイティブアプリ
Tridactyl エディタの別ウィンドウ 任意 Firefox・ネイティブメッセンジャー
ttyd ブラウザ内の端末 端末で動くもの サーバー側でttydを起動
code-server+vscode-neovim ブラウザ内のVS Code Neovim 0.10.0以上 code-serverの実行環境

入力欄ごとにNeovimの環境を使いたいならFirenvim、VS CodeやEmacsと併用するならGhostText(Neovimは nvim-ghost.nvim で接続)、Firefoxで全操作をVim風にしたいならTridactylが向きます。Texternはエディタ側へのプラグインが要らない代わりに、ネイティブアプリの対応がLinuxに限られ、Firefox Add-onsの掲載版も0.8(2023年6月更新)で止まっています。Vim本体しか使っていない環境では、Neovim専用のFirenvimは選べません(Vim側の現行版はVim 9.2の新機能と更新手順で扱っています)。

日本語入力の扱い:ChromeとFirefoxの差とskkeleton

ChromeとFirefoxで異なるIME合成イベント

IMEの変換確定の扱いはブラウザによって違います。src/KeyHandler.ts のコメントは中国語Pinyin入力での観測を記録していて、確定の入力イベントはFirefoxでは compositionend の後に届き、Chromeでは前に届くうえ isComposing が真のままです。Firenvimはこの差を、Chromeだけ compositionend を監視して埋めています。日本語IMEも同じ処理を通るので、不具合を報告するときはブラウザ名とバージョンを必ず添えてください。

skkeletonでNeovim側に日本語入力を寄せる判断

OSのIMEを通さない構成として、SKK方式の skkeleton があります。Firenvimの枠の中で使う運用はVim as an IMEの解説に例があります。ブラウザのどの入力欄でも同じ辞書を使えます。必要なのは依存先の denops.vim が要求するDeno 2.3.0以上とNeovim 0.11.3以上で、Firenvimの下限である0.6.0では動きません。IMEの変換窓がFirenvimの枠と干渉する、複数のマシンで辞書を揃えたいなどの具体的な不満がなければ、SKKの習得とDenoの管理を増やす理由は薄いと判断します。denops.vimの仕組みはdenops.vimとはで解説しています。

よくある質問

FirenvimはChromeでも使えますか?

使えます。Chromeウェブストアの拡張(0.2.17)と、Neovim側の firenvim#install(0) の両方が要ります。拡張だけではNeovimを起動するためのマニフェストが作られず、クリックしても枠が出ません。Brave・Vivaldi・OperaなどのChromium系ブラウザでも同じ拡張を使います。

Neovimのバージョンはいくつ必要ですか?

0.6.0以上です。付属のTROUBLESHOOTING.mdとChromeウェブストアの説明文には0.4.0とありますが、インストール処理の実装は0.6.0で判定しているので、実装の値を採ってください。READMEのLua例をそのまま使うなら0.7.0以上、skkeletonと組み合わせるなら0.11.3以上が条件になります。

特定のサイトだけFirenvimを無効にできますか?

できます。localSettings に対象サイトのURL正規表現を追加し、takeover = "never" と、既定のパターンより大きい priority を指定するだけです。そのタブだけ止めるなら、URLバー横のボタンで足ります。

編集内容を自動で入力欄に反映できますか?

可能です。Firenvimは BufWrite を合図に入力欄へ書き戻すので、TextChanged と TextChangedI の自動コマンドで write を呼べば同期されます。本文が長いと遅くなるため、READMEには timer_start で書き込みを10秒に1回へ間引く例も載っています。

Neovimをブラウザの中で使う方法はFirenvim以外にありますか?

入力欄の編集が目的なら、前章の表のGhostTextやTexternが候補です。端末ごとブラウザへ出すならttyd(書き込みには -W が必要)、VS Code環境ならcode-serverとvscode-neovim(Neovim 0.10.0以上)の組み合わせがあります。Firenvimはブラウザ内にNeovimを同梱しておらず、ローカルのNeovimが必須です。

関連記事

お気に入りに入れた記事の一覧

一創の公式 SNS

X では毎朝の新着記事と IT ニュースの速報を、YouTube・TikTok・Instagram・LinkedIn・Facebook では記事の解説動画を配信しています。

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.11.11 テックブログ Microsoft 2026年11月の月例更新:Outlookの悪用済みCVE-2026-124194と修正版の確認方法
  2. 2026.11.11 テックブログ JANISの不正アクセス:最大11,652名の医療機関情報と情報窃取プログラムの検知設定
  3. 2026.11.11 テックブログ SMBC日興証券の不正アクセス:持株会会員最大5.6万人の範囲と受託システムの分離設計
  4. 2026.01.21 コラム 税務調査の録音は禁止?判例・裁決と国税局マニュアルで見る、断られたときの対応
  5. 2026.11.09 テックブログ ステップゴルフ不正アクセス:口座情報の対象確認と偽連絡・引き落としの注意点

RELATED POSTS 関連記事

目次