Tag: Vim

Neovimでyyがpで貼り付けられない?コンテナ×tmux×mac環境でハマったクリップボード問題の解決法

概要

Neovimでコピー(yy)した内容を貼り付け(p)ようとしたところ、意図しないテキストが挿入されるという現象に遭遇しました。 本記事では、OSC52ベースのクリップボード連携を導入していた際にこの問題に出会い、どのように原因を特定し、どのように理想の挙動を取り戻したかを記録します。

🐞 課題:yy でコピーしたのに p で貼れない?

Neovim上で yy で行をコピーし、その後 p で貼り付けようとしたところ、**貼り付けられたのは直前の yy ではなく、古い内容(またはシステムクリップボードの内容)**でした。

この問題は特に以下の構成で再現しました:

  • macOS (WezTerm)
  • tmux をホスト側とコンテナ内両方で利用
  • Neovimで OSC52 を使った vim.g.clipboard を定義

🔍 調査ログ

1. レジスタの状態を確認

Neovimで以下のコマンドを使って、各レジスタの状態を確認:

:reg "
:reg 0
:reg +
  • yy 実行後、無名レジスタ(")には値が入っている

  • p で貼り付けられる内容は + レジスタの中身だった

2. p のマッピングを確認

:verbose nmap p

結果は no mapping found → p はデフォルト挙動のはず。

3. vim.opt.clipboard の影響を再確認

設定では以下を定義していた:

vim.opt.clipboard:append({ "unnamedplus" })

これは p を “+p に読み替える効果を持つ可能性があり、貼り付け元が無名レジスタではなく、+ レジスタになっていた。

4. vim.g.clipboard による外部プロバイダ使用

vim.g.clipboard = {
  name = "osc-copy",
  copy = {
    ["+"] = 'osc copy -d ' .. tty,
    ["*"] = 'osc copy -d ' .. tty,
  },
  paste = {
    ["+"] = 'osc paste -d ' .. tty,
    ["*"] = 'osc paste -d ' .. tty,
  },
  cache_enabled = 0,
}

この設定により、Neovimは “+ や “* レジスタをすべて osc に委ねており、p の貼り付け対象が “0(ヤンクレジスタ)ではなくなっていた。 (yyによるヤンクは正しく機能していたが、pによる貼り付け時に問題が起きていた)

Read more...

neovim関連

プラグインの状況を確認する

コマンドモードで :checkhealth と入力。

neovimでカラフルにする

:checkhealthで次のエラーが出ていた

tmux
   - OK escape-time: 1
   - OK focus-events: on
   - $TERM: tmux-256color
   - WARNING Neither Tc nor RGB capability set. True colors are disabled.     ⤷  'termguicolors' won't work properly.
     - ADVICE:
       - Put this in your ~/.tmux.conf and replace XXX by your $TERM              ⤷  outside of tmux:
         set-option -sa terminal-features ',XXX:RGB'
       - For older tmux versions use this instead:
         set-option -ga terminal-overrides ',XXX:Tc'

いくつか設定に修正が必要だった。

Read more...

vim-refのキーバインドのメモ

vim-refのキーマップ

とりあえず大文字の「K」を押す

| K | カーソルしたのキーワードにジャンプ |

ref-viewerの内部ではKに加えて以下のキーマップが利用できる。要はKやEnterキーで読み進めて、<C-t><C-o> で戻ることができる。

| Enter | カーソル下のキーワードにジャンプ | | ダブルクリック | 同上 | | <C-j> | 同上 | | <C-t> | 前のページに戻る | | <C-o> | 同上 | | <C-i> | 次のページに進む |

Read more...

rafi-vim-config

vimというよりはneovimの話になる。

rafi/vim-config vim用のconfigのレポジトリ

個人というよりContributorsが多数いる非常に多機能なneovimの設定を目指したレポジトリ。

rafi/vim-config: Lean mean Neovim machine, carefully crafted with Use with latest Neovim.

  • エラーメッセージが出ている状態だと非常にもっさりする
  • 初回インストール時に大量のプラグインがインストールされる(好みが分かれそうなポイント)

インストール

~/.config/nvim 配下になるようにgit cloneすれば良い。 私はghqを使っているので

ghq get https://github.com/rafi/vim-config.git
cd ~/.config/
ln -s ~/workspace/git/github.com/rafi/vim-config ./nvim

現在の管理方針

2026年時点では、Neovim 本体の設定は rafi/vim-config を upstream として使い、個人差分は別リポジトリに分ける方針にしている。

  • ~/.config/nvim
    • rafi/vim-config 本体
  • ~/.config/nvim/lua/config
    • 個人設定用リポジトリ tin-machine/nvim_config
  • ~/.config/nvim/lua/plugins
    • 個人プラグイン設定用リポジトリ tin-machine/nvim_plugins
  • ~/.config/nvim/lazyvim.json
    • :LazyExtras で有効化した extras の状態

rafi 側の README でも、現在の前提は Neovim 0.11 系で、ユーザー拡張は lua/configlua/plugins に置く構成になっている。 そのため、Ubuntu Desktop でも rafi 本体を直接 fork して改造するより、upstream の lua/rafi 配下には触らず、個人差分だけを別 repo で symlink する方が追従しやすい。

Read more...

cheat sheet vim

rafi/vim-config

rafi/vim-config: Lean mean Neovim machine, carefully crafted with Use with latest Neovim.

Snacks Explorer(ファイラ)

2026年時点では rafi/vim-config / LazyVim の現行寄りに合わせて、ファイラは Neo-tree ではなく Snacks Explorer を使う。 ローカルでは lazyvim.jsonlazyvim.plugins.extras.editor.snacks_explorer を明示し、個人プラグイン側の Snacks Explorer 無効化 override は削除する。

効果キー
Snacks Explorerを開く(root dir);e / Space e / Space fe
Snacks Explorerを開く(cwd);E / Space E / Space fE
現在のファイルをファイラで表示;a
現在のファイルをファイラで表示(cwd);A
ファイルを開くl / Enter
新しいタブで開くst
上のディレクトリに移動Backspace
ファイル/ディレクトリ作成a
ツリーを閉じるh
grepgr
ファイル検索gf
水平分割で開くsv
垂直分割で開くsg
プレビューのオンオフK
リネームr
削除d
ファイル移動m
コピーc
ペーストp
パスをヤンクy
システムアプリで開くo
更新u

Lazygit

効果キー
gitのルートで開くSpace , tg
カレントディレクトリで開くSpace , tg

キーバインド

効果省略記法
文字コードを確認:set fileencoding
保存する文字コードを変更:set fileencoding=utf-8
前ひらいたバッファに戻る<C-^> ( 数字の6のやつ )
検索で行きすぎたら戻る;
変更してきた箇所に戻るg;
変更してきた箇所に進むg,
次のワードの頭にw
次のワードの最後にe
行頭にいきなり追加I
上書きモードR
ワード前のスペース有りヤンクyaw
スペース無しヤンクyiw
文字を検索して上書きct<key>
ワード削除diw
引数をまるっと削除di(
functionの記述をまるっと削除di{
カーソル上の単語を消すdiw
カーソル上の単語を消して挿入モードdiw
“"(ダブルコーテーション)で囲まれた文字列を消すdi”
新規ファイルを開く(横分割):new
新規ファイルを開く(縦分割):vnew
新規ファイルを開く(タブ):tabnew
次のタブに切替gt
前のタブに切替gT
これは % がカレントディレクトリ、 :h が親ディレクトリの意味:e %:h<Tab>
ウィンドウを入れ替える。<C-w>x
縦に最大化<C-w>_
横に最大化<C-w>パイプ
ウィンドウの大きさを揃える<C-w>=
ウィンドウの幅を増やす<C-w>>
ウィンドウの幅を減らす<C-w><
ウィンドウの高さを増やす<C-w>+
ウィンドウの高さを減らす<C-w>-
縦に最大化<C-w>_
横に最大化<C-w>パイプ
アクティブなウインドウを左に移動<C-w>h
アクティブなウインドウを下に移動<C-w>j
アクティブなウインドウを上に移動<C-w>k
アクティブなウインドウを右に移動<C-w>l
アクティブなウインドウそのものを左に移動<C-w>H
アクティブなウインドウそのものを下に移動<C-w>J
アクティブなウインドウそのものを上に移動<C-w>K
アクティブなウインドウそのものを右に移動<C-w>L
アクティブなウインドウを次に移動<C-w>w
バッファリストのファイル名をリスト表示:buffers
バッファリストの指定したバッファを開く:buffer:b
バッファリストの次のバッファを開く:bnext:bn
バッファリストの前のバッファを開く:bprevious:bp
バッファリストのすべてのバッファをウィンドウを開く:ball:ba
バッファリストにバッファを追加:badd:bad
バッファリストからバッファを削除:bdelete:bd
バッファリストの最初のバッファを開く:bfirst:bf
バッファリストの最後のバッファを開く:blast:bl
バッファリストの次の変更済みバッファを開く:bmodified:bm
バッファを閉じる:bd
新規タブ:tabedit
{count}で指定した番号のタブへ移動:tabnext:tabn {count}gt
次のタブへ移動:tabnext:tabn gt
前のタブへ移動:tabprevious:tabp gT
現在、以外のタブを全て閉じる:tabo
開いてるファイルを削除:call delete(expand(’%’))
数値をインクリメント、デクリメントするC-a, C-x (ノーマルモード)
前に変更した場所へカーソルを移動するg; (ノーマルモード)
パラグラフ削除dap (ノーマルモード)
プラグイン、モジュール 一覧:scriptnames
deinプラグインのアップデート:call dein#update()
deinでエラーが起きtが時:call dein#clear_state()
Snacks Explorerを開く:lua Snacks.explorer()
ファイルの再読込:e
ファイルを書き込んでexitする:x
ショートカット一覧:map

LSP( neovim rafi/vim-config の設定 20240630時点)のキーバインド

rafi/vim-config: Lean mean Neovim machine, carefully crafted with Use with latest Neovim.

Read more...

vim関連のあれこれ

開いているファイルの文字コードの確認

set fileencoding?

デフォルトの文字コードをUTF8にする

set encoding=utf-8
set fileencodings=utf-8

vim-refでriを検索する

vim-refはRubyに限らずvimでリファレンスを参照するプラグイン、そこからRubyのリファレンス参照コマンドのriを使うプラグインが vim-ref-ri

[[Uniteを使ってriを検索できるvim-ref-riというプラグインを作った|http://yuku-tech.hatenablog.com/entry/20120429/1335628327]

使い方は簡単。vim-refとして検索するなら

:Ref ri NAME

Uniteインタフェースでインクリメンタルに検索したいなら

:Unite ref/ri

と実行する

vim-refで辞書を引く

※ 一通り、動作するように設定できてから気づいた… これは、tmuxで範囲を選択し、翻訳できた方が汎用性が広い…

:Ref alc hello

などとして、vim-refにalcが定義されていた時代もあったのだが、アルクから指摘があり、コードから削除した背景があったようだ

今のvim-refは webdictというソースに変更され、これを設定することで複数ソースに対応している(上記URLのすぐ次のエントリで対応している)

設定方法はvim-refの環境を整えるを参考にした

"webdictサイトの設定
let g:ref_source_webdict_sites = {
\   'je': {
\     'url': 'http://dictionary.infoseek.ne.jp/jeword/%s',
\   },
\   'ej': {
\     'url': 'http://dictionary.infoseek.ne.jp/ejword/%s',
\   },
\   'wiki': {
\     'url': 'http://ja.wikipedia.org/wiki/%s',
\   },
\ }

"デフォルトサイト
let g:ref_source_webdict_sites.default = 'ej'

"出力に対するフィルタ。最初の数行を削除
function! g:ref_source_webdict_sites.je.filter(output)
  return join(split(a:output, "\n")[15 :], "\n")
endfunction
function! g:ref_source_webdict_sites.ej.filter(output)
  return join(split(a:output, "\n")[15 :], "\n")
endfunction
function! g:ref_source_webdict_sites.wiki.filter(output)
  return join(split(a:output, "\n")[17 :], "\n")
endfunction

nmap <Leader>rj :<C-u>Ref webdict je<Space>
nmap <Leader>re :<C-u>Ref webdict ej<Space>

vimのリストいろいろ

2007-01-22 - 窓の外に出てみれば リストいろいろ

Read more...