2024/06/15

Neovimオススメ設定① ddする時に空白行をヤンクしない

Neovimのオススメ設定シリーズ第1弾。(第2弾があるかは未定)

はじめに

今回はluaで書くことを前提にしています。

ヤンクせずに行削除するには

_ddをすることで、ヤンクせずに行を削除できます。

これを利用して、ddコマンドをオーバーライドします。

設定

init.lua
vim.keymap.set("n", "dd", function()
  local line = vim.api.nvim_get_current_line()
  if string.match(line, '^%s*$') then
    vim.cmd('normal! "_dd')
  else
    vim.cmd('normal! dd')
  end
end, { noremap = true, silent = true })

最後に

簡単な設定ですが、これを設定してからQOLがかなり上がりました。

皆さんも是非試してみてください。

ではまた。

追記

visualモードで複数行選択した時のdに関しても、対応しました。 こちらに関しては動作が不安定なので改良の余地ありです。
良い感じになったら修正しておきます。 こうしたらいいよ、等あれば連絡頂けると幸いです。

init.lua
vim.keymap.set("x", "d", function()
  local mode = vim.fn.visualmode()

  local start = vim.api.nvim_buf_get_mark(0, "<")
  local finish = vim.api.nvim_buf_get_mark(0, ">")
  if
    start[1] > finish[1] or (start[1] == finish[1] and start[2] > finish[2])
  then
    start, finish = finish, start
  end

  local selection_text = ""
  if mode == "V" then
    local lines = vim.api.nvim_buf_get_lines(0, start[1] - 1, finish[1], false)
    selection_text = table.concat(lines, "\n")
  elseif mode == "v" then
    local lines = vim.api.nvim_buf_get_lines(0, start[1] - 1, finish[1], false)
    if #lines == 0 then
      return
    end
    if #lines == 1 then
      selection_text = lines[1]:sub(start[2] + 1, finish[2] + 1)
    else
      local parts = {}
      table.insert(parts, lines[1]:sub(start[2] + 1))
      for i = 2, #lines - 1 do
        table.insert(parts, lines[i])
      end
      table.insert(parts, lines[#lines]:sub(1, finish[2] + 1))
      selection_text = table.concat(parts, "\n")
    end
  else
    local lines = vim.api.nvim_buf_get_lines(0, start[1] - 1, finish[1], false)
    selection_text = table.concat(lines, "\n")
  end

  if selection_text:match("^%s*$") then
    vim.cmd('normal! "_d')
  else
    vim.cmd("normal! d")
  end
end, { noremap = true, silent = true })

最終更新日:2026/01/20