Tag: Golang

Neovim で Golang のデバッグ環境を構築する方法

この記事では、Neovim で Golang のデバッグ環境を構築する手順について紹介します。 具体的には、Delve を利用した nvim-dap の設定や、動的に CLI 引数を入力する方法、さらに視覚的にデバッグ情報を表示する nvim-dap-ui の導入方法について解説します。

必要なツールと前提条件

  • Neovim: v0.10.5
  • Go: Go の実行環境および go.mod で管理されたプロジェクトが必要です。
  • Delve: Golang 用デバッガである Delve をインストールしてください。
    • go install github.com/go-delve/delve/cmd/dlv@latest
  • LazyVim / lazy.nvim
    • Neovim の設定管理ツールとして LazyVim を使用しています。
  • プラグイン

nvim-dap の基本設定

まずは、nvim-dap を LazyVim の仕組みを利用して設定します。 以下のサンプル設定では、Go 用のアダプタとして Delve を利用し、単一ファイル実行と動的な CLI 引数入力の2種類のデバッグ構成を用意しています。

-- ~/.config/nvim/lua/plugins/nvim-dap.lua
return {
  "mfussenegger/nvim-dap",
  event = "VeryLazy",  -- lazy.nvim の遅延読み込みイベント
  config = function()
    local dap = require("dap")

    -- Go 用のアダプタ設定(Delve を利用)
    dap.adapters.go = {
      type = "executable",
      command = "dlv",
      args = { "dap" },
    }

    -- デバッグ構成の定義
    dap.configurations.go = {
      {
        type = "go",
        name = "Launch file",
        request = "launch",
        program = "${file}",
        cwd = "${workspaceFolder}",
      },
      {
        type = "go",
        name = "Launch file (with arguments)",
        request = "launch",
        program = "${file}",
        cwd = "${workspaceFolder}",
        args = function()
          local input = vim.fn.input("Enter CLI arguments: ")
          return vim.split(input, " ", { trimempty = true })
        end,
      },
      {
        type = "go",
        name = "Launch package (with arguments)",
        request = "launch",
        program = "${workspaceFolder}",  -- パッケージ全体をビルド対象にする
        cwd = "${workspaceFolder}",
        args = function()
          local input = vim.fn.input("Enter CLI arguments: ")
          return vim.split(input, " ", { trimempty = true })
        end,
      },
      {
        type = "go",
        name = "Debug tests",
        request = "launch",
        mode = "test",
        program = "${file}",
      },
    }

    -- キーマッピングの設定例
    vim.keymap.set("n", "<leader>db", dap.toggle_breakpoint, { desc = "Toggle Breakpoint" })
    vim.keymap.set("n", "<leader>dc", dap.continue, { desc = "Start Debugging" })
    vim.keymap.set("n", "<leader>di", dap.step_into, { desc = "Step Into" })
    vim.keymap.set("n", "<leader>do", dap.step_over, { desc = "Step Over" })
    vim.keymap.set("n", "<leader>dO", dap.step_out, { desc = "Step Out" })
  end,
}

ポイント

  • program と cwd の設定
    • 単一ファイルの場合は ${file}、複数ファイルを含むパッケージの場合は ${workspaceFolder} を指定します。
  • 動的 CLI 引数入力
    • args を関数にして、デバッグ開始時にユーザーから CLI 引数を入力させるようにしています。

nvim-dap-ui の導入と設定

続いて、視覚的にデバッグ情報を表示するために nvim-dap-ui を設定します。 nvim-dap-ui は nvim-dap に依存するため、LazyVim の設定では dependencies を指定しておきます。

Read more...

Neovim で neotest でのテスト環境を構築する方法

この記事では、Neovim で Golang のテストを実行するまでの手順を紹介します

必要なツールと前提条件

  • Neovim: v0.10.5
  • Go: Go の実行環境および go.mod で管理されたプロジェクトが必要です。
  • LazyVim / lazy.nvim
    • Neovim の設定管理ツールとして LazyVim を使用しています。
  • プラグイン

neotest の基本設定

私はrafi/vim-configを利用しています。 “extras” plugins として lazyvim.plugins.extras.test.core がリストの中にありました。 :LazyExtras でLazyVimのメニューを出し、testで検索、xで有効、neovimの再起動でインストールされました。

neotest 使い方

<leader> t でテスト関連のメニューが開き

  • t テストファイルを開いた状態で実行すると、そのテストファイルの内容が実行される
  • T と押すと全てのテストが実行

まずは、nvim-dap を LazyVim の仕組みを利用して設定します。 以下のサンプル設定では、Go 用のアダプタとして Delve を利用し、単一ファイル実行と動的な CLI 引数入力の2種類のデバッグ構成を用意しています。

-- ~/.config/nvim/lua/plugins/nvim-dap.lua
return {
  "mfussenegger/nvim-dap",
  event = "VeryLazy",  -- lazy.nvim の遅延読み込みイベント
  config = function()
    local dap = require("dap")

    -- Go 用のアダプタ設定(Delve を利用)
    dap.adapters.go = {
      type = "executable",
      command = "dlv",
      args = { "dap" },
    }

    -- デバッグ構成の定義
    dap.configurations.go = {
      {
        type = "go",
        name = "Launch file",
        request = "launch",
        program = "${file}",
        cwd = "${workspaceFolder}",
      },
      {
        type = "go",
        name = "Launch file (with arguments)",
        request = "launch",
        program = "${file}",
        cwd = "${workspaceFolder}",
        args = function()
          local input = vim.fn.input("Enter CLI arguments: ")
          return vim.split(input, " ", { trimempty = true })
        end,
      },
      {
        type = "go",
        name = "Launch package (with arguments)",
        request = "launch",
        program = "${workspaceFolder}",  -- パッケージ全体をビルド対象にする
        cwd = "${workspaceFolder}",
        args = function()
          local input = vim.fn.input("Enter CLI arguments: ")
          return vim.split(input, " ", { trimempty = true })
        end,
      },
      {
        type = "go",
        name = "Debug tests",
        request = "launch",
        mode = "test",
        program = "${file}",
      },
    }

    -- キーマッピングの設定例
    vim.keymap.set("n", "<leader>db", dap.toggle_breakpoint, { desc = "Toggle Breakpoint" })
    vim.keymap.set("n", "<leader>dc", dap.continue, { desc = "Start Debugging" })
    vim.keymap.set("n", "<leader>di", dap.step_into, { desc = "Step Into" })
    vim.keymap.set("n", "<leader>do", dap.step_over, { desc = "Step Over" })
    vim.keymap.set("n", "<leader>dO", dap.step_out, { desc = "Step Out" })
  end,
}

ポイント

  • program と cwd の設定
    • 単一ファイルの場合は ${file}、複数ファイルを含むパッケージの場合は ${workspaceFolder} を指定します。
  • 動的 CLI 引数入力
    • args を関数にして、デバッグ開始時にユーザーから CLI 引数を入力させるようにしています。

nvim-dap-ui の導入と設定

続いて、視覚的にデバッグ情報を表示するために nvim-dap-ui を設定します。 nvim-dap-ui は nvim-dap に依存するため、LazyVim の設定では dependencies を指定しておきます。

Read more...

go-chromecast を使って Google Home に喋らせる

google home に喋らせる

vishen / go-chromecastを用いて Linux マシンから 手軽に GoogleHome に WaveNet 音声で喋らせた。

下記のようにワンライナーで喋らせることができる。

~/go/bin/go-chromecast  --device-name shosai tts "こんばんは" --google-service-account=home-hogehoge.json --voice-name ja-JP-Wavenet-B --speaking-rate 1.05 --pitch 0.9

日本語サポート

サポートされている音声と言語

音声名性別
ja-JP-Wavenet-A女性
ja-JP-Wavenet-B女性
ja-JP-Wavenet-C女性
ja-JP-Wavenet-D女性

go-chromecast インストール

$ go get -u github.com/vishen/go-chromecast

Google Cloud Text-to-Speech を使うための設定

Cloud Text-to-Speechの画面に移動。

[有効にする]を選択する。

次に go-chromecast から Text-to-Speech を使えるように API キーを作成する。

認証情報を作成する

使用する API の設定

認証情報を作成する

アカウント詳細。ここでは特に何も設定せず、完了を押した。

認証情報を作成する

サービスアカウントをクリックして、そのサービスアカウント用の秘密鍵を作成する。

認証情報を作成する

秘密鍵がダウンロードされた。

認証情報を作成する

秘密鍵を Linux マシンにコピーして鳴らす

go-chromecast コマンドで家の中にある Google Home をリスト化、その Google Home を鳴らす。

Read more...