NVIMで文章を書くメリット

「コーディング用のエディタで文章を書く?」と思うかもしれません。しかし実際に試してみると、Neovimはライターにとっても非常に優れた執筆環境であることがわかります。

🎯
集中できる
余計なUIがなく、全画面で文章だけに向き合える。フォーカスモードと組み合わせれば通知も消える
とにかく軽い
数十MBのWordファイルでもサクサク。大量のメモやノートを開いても動作が重くならない
📦
Git管理できる
テキストファイルなので差分管理が完璧。「昨日の下書きに戻したい」が簡単にできる
🔍
全文検索が強力
Telescopeのlive_grepで何千ものファイルから瞬時にキーワードを探せる
🖋️
キーボードだけで完結
マウスなしで段落移動・文章整形・コピペ・検索置換。流れを途切れさせない
🔧
自分だけの環境
フォント・行間・カラーテーマをすべて自分好みにカスタマイズできる

Markdownの書き方とプレビュー

NeovimでのテキストはMarkdown形式で書くのが最も相性が良いです。シンプルな記法で見出し・リスト・コードブロックなどを表現でき、後からHTMLやPDF、Word形式に変換することも可能です。

render-markdown.nvim — インライン描画

render-markdown.nvim は、Markdownをリアルタイムで整形表示するプラグインです。# 記号が実際の見出しとして表示され、**太字** が太く見えるなど、プレビューをわざわざ開かなくても書きながら見た目を確認できます。

Luaplugins/render-markdown.lua
{
  "MeanderingProgrammer/render-markdown.nvim",
  dependencies = { "nvim-treesitter/nvim-treesitter", "nvim-tree/nvim-web-devicons" },
  ft = { "markdown", "md" },  -- Markdownファイルのみ有効化
  opts = {
    heading = {
      enabled = true,
      sign = false,
      icons = { "# ", "## ", "### " },
    },
    bullet = {
      enabled = true,
      icons = { "●", "○", "◆" },
    },
    checkbox = {
      enabled = true,
      unchecked = { icon = "☐" },
      checked   = { icon = "☑" },
    },
  },
}

glow — ターミナルプレビュー

glow はターミナル上でMarkdownをプレビューするCLIツールです。別ウィンドウで実際のレンダリングを確認したい場合に便利です。

glow のインストールと使い方
$ brew install glow
# インストール後、ターミナルから実行
$ glow my-note.md
# Neovim内からも起動できる
:!glow %      " % は現在のファイルパス

日本語入力の設定

Neovimで日本語を入力するときの最大の課題は、IME(インプットメソッド)の切り替え問題です。Insert モードを抜けて Normal モードに戻ったとき、IMEが日本語のままだとコマンドが入力できません。

⚠️
よくある問題 日本語入力中に Esc を押してNormalモードに戻っても、IMEが日本語のままで h/j/k/l などのコマンドが動かない。このストレスを解消することが重要です。

解決策 1: im-select.nvim

Normal モードに戻ったときに自動でIMEを英語に切り替えるプラグインです。macOSユーザーに最もおすすめの方法です。

im-select のセットアップ(macOS)
$ brew install im-select
Luaplugins/im-select.lua
{
  "keaising/im-select.nvim",
  config = function()
    require("im-select").setup({
      -- Normalモードに戻ったときに使うIMEの識別子(macOSの場合)
      default_im_select  = "com.apple.keylayout.ABC",
      default_command    = "im-select",
      -- Insertモードに入ったときに前回のIME状態を復元する
      set_previous_events = { "InsertEnter" },
    })
  end,
}

解決策 2: 手動でショートカットを設定

プラグインを使わずに、Esc 押下時にIMEを切り替えるautocmdを設定する方法もあります。

Luainit.lua — autocmd でIMEを制御
-- InsertモードからNormalモードに戻るとき、macOSのIMEを英語に切り替える
vim.api.nvim_create_autocmd("InsertLeave", {
  callback = function()
    vim.fn.system("im-select com.apple.keylayout.ABC")
  end,
})

スペルチェックの設定

Neovimには組み込みのスペルチェック機能があります。英語の文章を書くときに特に役立ちます。日本語には対応していませんが、英語の技術記事や英訳が含まれる文書には効果的です。

スペルチェックの使い方
:set spell    " スペルチェックを有効化
:set spelllang=en_us  " 英語(US)を指定
:set nospell    " スペルチェックを無効化
 
# スペルチェック中のナビゲーション
]s 次のスペルミスへ移動
[s 前のスペルミスへ移動
z= 修正候補を表示
zg カーソル下の単語を辞書に追加(good)
zw カーソル下の単語をスペルミスとして登録(wrong)
Luainit.lua — Markdownファイルのみスペルチェックを有効化
vim.api.nvim_create_autocmd("FileType", {
  pattern = { "markdown", "text" },
  callback = function()
    vim.opt_local.spell = true
    vim.opt_local.spelllang = { "en_us" }
  end,
})

文章専用プラグイン

vim-pencil — ライター向け執筆補助

vim-pencil はライター向けに特化した設定をまとめたプラグインです。ソフトラップ(行の折り返し)・ハードラップ・自動保存など、文章執筆に適した設定をコマンド1つで切り替えられます。

Luaplugins/pencil.lua
{
  "preservim/vim-pencil",
  ft = { "markdown", "text", "rst" },
  config = function()
    vim.g["pencil#wrapModeDefault"] = "soft"  -- ソフトラップを既定に
    vim.api.nvim_create_autocmd("FileType", {
      pattern = { "markdown", "text" },
      callback = function() vim.fn["pencil#init"]() end,
    })
  end,
}

goyo.nvim — ディストラクションフリーモード

goyo.nvim はコンテンツを画面中央に配置し、ステータスバーやサイドバーを非表示にして「文章だけ」の空間を作り出します。

goyo の使い方
:Goyo   " フォーカスモードをトグル
:Goyo 80   " 幅80文字で起動
:Goyo!   " フォーカスモードを終了

limelight.nvim — カーソル周辺だけをハイライト

limelight.nvim はカーソルがある段落だけをフルカラーで表示し、他の段落をグレーアウトするプラグインです。今書いている部分だけに視点を集中させる効果があります。goyo と組み合わせて使うのが定番です。

Luagoyo + limelight を連動させる設定
-- Goyo 起動時に Limelight も起動する
vim.api.nvim_create_autocmd("User", {
  pattern = "GoyoEnter",
  callback = function()
    vim.cmd("Limelight")
    vim.opt.linebreak = true
    vim.opt.wrap = true
  end,
})
vim.api.nvim_create_autocmd("User", {
  pattern = "GoyoLeave",
  callback = function()
    vim.cmd("Limelight!")
  end,
})

フォーカスモードの全体設定

goyo + limelight だけでなく、以下の設定を組み合わせることで、より完全なフォーカス環境を作ることができます。

Luaフォーカスモード完全設定例
-- フォーカスモードを切り替える関数
local focus_mode = false
local function toggle_focus()
  focus_mode = not focus_mode
  if focus_mode then
    vim.cmd("Goyo")           -- 余計なUIを消す
    vim.cmd("Limelight")     -- 現在の段落だけ明るくする
    vim.opt.number = false   -- 行番号を消す
    vim.opt.relativenumber = false
    vim.opt.cursorline = false
  else
    vim.cmd("Goyo!")
    vim.cmd("Limelight!")
    vim.opt.number = true
    vim.opt.relativenumber = true
    vim.opt.cursorline = true
  end
end

vim.keymap.set("n", "<leader>z", toggle_focus, { desc = "Toggle Focus Mode" })

Obsidian連携 — obsidian.nvim

Obsidianユーザーなら obsidian.nvim を使うことで、ObsidianのvaultをそのままNeovimから操作できます。wikiリンク([[ノート名]])の補完・ジャンプ・新規ノート作成・タグ管理などが可能です。

Luaplugins/obsidian.lua
{
  "epwalsh/obsidian.nvim",
  version = "*",
  dependencies = { "nvim-lua/plenary.nvim" },
  ft = "markdown",
  opts = {
    workspaces = {
      {
        name = "personal",
        path = "~/Documents/Obsidian/MyVault",  -- Vaultのパスを指定
      },
    },
    completion = {
      nvim_cmp = true,  -- nvim-cmp との連携
      min_chars = 2,
    },
    new_notes_location = "current_dir",  -- 新規ノートの保存先
    mappings = {
      ["<leader>on"] = { action = "<cmd>ObsidianNew<cr>", desc = "New Note" },
      ["<leader>os"] = { action = "<cmd>ObsidianSearch<cr>", desc = "Search Notes" },
    },
  },
}

obsidian.nvim の主なコマンド

コマンド動作
:ObsidianNew新規ノートを作成
:ObsidianSearchTelescope でノートを検索
:ObsidianFollowLink[[リンク]] の先のノートを開く
:ObsidianBacklinks現在のノートへの被リンク一覧
:ObsidianTagsタグ一覧から検索
:ObsidianToday今日のデイリーノートを開く

ワードカウント設定

文章量を把握するためのワードカウントをステータスバーに表示する設定です。lualine.nvim を使っている場合は以下のように組み込めます。

Lualualine にワードカウントを追加
-- ワードカウント関数(Markdown・text ファイルのみ表示)
local function word_count()
  local ft = vim.bo.filetype
  if ft == "markdown" or ft == "text" then
    local wc = vim.fn.wordcount()
    return "W:" .. wc.words
  end
  return ""
end

-- lualine の sections に追加
require("lualine").setup({
  sections = {
    lualine_x = { word_count, "encoding", "filetype" },
  }
})

文章向けキーマップ設定例

LuaMarkdownファイル向けローカルキーマップ
vim.api.nvim_create_autocmd("FileType", {
  pattern = "markdown",
  callback = function()
    local map = function(key, action, desc)
      vim.keymap.set("n", key, action, { buffer = true, desc = desc })
    end
    -- フォーカスモードをトグル
    map("<leader>z", "<cmd>Goyo<cr>", "Toggle Goyo")
    -- 見出しレベルの変換
    map("<leader>h1", "<cmd>s/^#* /# /<cr>", "H1 Heading")
    map("<leader>h2", "<cmd>s/^#* /## /<cr>", "H2 Heading")
    -- チェックボックスのトグル
    map("<leader>tc", ":s/\\[ \\]/[x]/e | s/\\[x\\]/[ ]/e<cr>", "Toggle Checkbox")
    -- 今日の日付を挿入
    map("<leader>td", 'o## ' .. os.date("%Y-%m-%d") .. "<Esc>", "Insert Date")
  end,
})

実際の執筆フロー

1

ターミナルからNeovimを起動

プロジェクトディレクトリに移動してから nvim . で起動するか、直接 nvim notes/today.md でファイルを指定して開きます。

2

新しいMarkdownファイルを作成

Telescopeで <leader>ff を使って既存ファイルを探すか、:e notes/new-article.md で新規作成します。obsidian.nvim があれば :ObsidianNew が便利です。

3

フォーカスモードをオン

<leader>z で Goyo を起動し、ステータスバーやサイドバーを消します。limelight も連動させれば、現在書いている段落だけがハイライトされます。

4

Insert モードで執筆

i または o でInsertモードに入り、文章を書きます。Esc でNormalモードに戻り、カーソル移動・コピペ・検索置換などを行います。IMEは im-select.nvim が自動で切り替えてくれます。

5

保存とGit管理

:w で保存、:wq で保存して終了します。gitsigns.nvim を入れていれば、変更箇所が行番号の横に色で表示されます。:Git commit でコミットまでNeovim内で完結します。

💡
自動保存の設定 書き忘れを防ぐには自動保存 autocmd が便利です。
vim.api.nvim_create_autocmd({"InsertLeave", "TextChanged"}, { callback = function() vim.cmd("silent! write") end })
これでInsertモードを抜けるたびに自動保存されます。