RuVim

Ruby で実装した Vim ライクなターミナルエディタです。

Vim の操作感をベースに、Ruby ならではの、もしくは ko1 が欲しい拡張性と独自機能を加えています。

Vim にない独自機能

  • Rich View (gr) — TSV / CSV / Markdown をテーブル整形して閲覧。CJK 幅を考慮したカラム揃え
  • g/ 検索フィルタ — 検索にマッチする行だけを集めたバッファを作成。再帰的に絞り込み可能。ログ解析に便利
  • Follow mode (-f / :follow)tail -f 相当のファイル追従。inotify 対応
  • Git / GitHub 統合:git blame, :git status, :git diff, :git log, :git branch, :git commit, :git grep をエディタ内で実行。:gh link で GitHub URL をクリップボードにコピー、:gh browse でブラウザで開く
  • Ruby related:
    • Ruby DSL 設定~/.config/ruvim/init.rb に Ruby で nmap, set, command を記述。Vim script 不要
    • Ruby 正規表現 — 検索・置換は Ruby Regexp。Ruby ユーザーにそのまま馴染む
    • :ruby eval — 実行中に任意の Ruby コードを評価。ctx.editor / ctx.buffer API でエディタを操作

概要

  • raw mode + ANSI 描画
  • Normal / Insert / Command-line / Visual(char / line / block)
  • Ex コマンド(:w, :q, :e, :help, :set, :git, :gh など)
  • split / vsplit / tab
  • quickfix / location list(:vimgrep, :grep, :copen など)
  • シェル連携(:!cmd, :r !cmd, :w !cmd
  • Ruby DSL 設定(XDG)

起動

起動:

ruvim

ファイルを開いて起動:

ruvim path/to/file.txt

主な CLI オプション:

  • ruvim --help
    • ヘルプを表示して終了
  • ruvim --version
    • バージョンを表示して終了
  • ruvim --clean
    • ユーザー設定 / ftplugin を読まずに起動
  • ruvim -R file.txt
    • readonly モードで開く(w を拒否)
  • ruvim -M file.txt
    • modifiable off 相当(編集操作を拒否、readonly も有効化)
  • ruvim -Z file.txt
    • restricted mode(config/ftplugin 無効、:ruby 無効)
  • ruvim -u /tmp/init.rb
    • 設定ファイルを指定
  • ruvim -u NONE
    • ユーザー設定を読まない(ftplugin は有効)
  • ruvim --cmd 'set number' file.txt
    • user config 読み込み前に Ex コマンドを実行
  • ruvim -c 'set number' file.txt
    • 起動後に Ex コマンドを実行
  • ruvim +10 file.txt
    • 起動後に 10 行目へ移動
  • ruvim + file.txt
    • 起動後に最終行へ移動
  • ruvim -o a.rb b.rb
    • 複数ファイルを水平 split で開く(最小実装)
  • ruvim -O a.rb b.rb
    • 複数ファイルを垂直 split で開く(最小実装)
  • ruvim -p a.rb b.rb
    • 複数ファイルを tab で開く(最小実装)
  • ruvim -f log.txt
    • follow mode(tail -f 相当)で起動
  • ruvim -d file.txt
    • diff mode placeholder(現状は未実装メッセージのみ)
  • ruvim -q errors.log
    • quickfix startup placeholder(現状は未実装メッセージのみ)
  • ruvim -S Session.vim
    • session startup placeholder(現状は未実装メッセージのみ)

開発環境で gem 未インストールのまま試す場合:

ruby -Ilib exe/ruvim

主な操作(抜粋)

  • 移動: h j k l, w b e, 0 ^ $, gg, G, f/F/t/T, %
  • 挿入: i, a, A, I, o, O
  • 編集: x, dd, d{motion}, c{motion}, yy, yw, p, P, r<char>
  • text object: iw, aw, i", a", i), a), ip, ap など
  • 検索: /, ?, n, N, *, #, g*, g#
  • Visual: v, V, Ctrl-v, y, d
  • Undo/Redo: u, Ctrl-r
  • マクロ: q{reg}, @{reg}, @@
  • Ex: :w, :q, :e, :help, :set, :git, :gh
  • Git: Ctrl-g:git プリセット入力。blame / status / diff / log / branch / commit / grep
  • シェル: :!cmd, :r !cmd(出力を挿入), :w !cmd(バッファをパイプ)

詳しくは docs/tutorial.md を参照してください。

設定

設定ファイルは Ruby DSL です。

  • $XDG_CONFIG_HOME/ruvim/init.rb
  • ~/.config/ruvim/init.rb

filetype ごとの設定:

  • $XDG_CONFIG_HOME/ruvim/ftplugin/<filetype>.rb
  • ~/.config/ruvim/ftplugin/<filetype>.rb

--clean で user config / ftplugin を無効化できます。

詳しくは docs/config.md を参照してください。

ドキュメント

  • docs/tutorial.md - 使い方
  • docs/spec.md - 実装仕様 / 設計
  • docs/command.md - コマンド一覧
  • docs/binding.md - キーバインド
  • docs/config.md - 設定
  • docs/plugin.md - 拡張 / plugin 的な書き方(現状)
  • docs/vim_diff.md - Vim との差分
  • docs/todo.md - TODO / 次フェーズ案

開発

テスト実行:

rake test

CI 相当(test + docs 整合チェック):

rake ci

lint / format 方針(現状):

  • rubocop / 自動 formatter は未導入
  • 変更時は rake test と必要に応じて ruby -c で構文確認
  • docs を触ったときは rake docs:checkrake ci に含まれる)

## 注意(現状)

- Vim 完全互換ではありません
- 正規表現は Vim regex ではなく Ruby `Regexp` を使います
- 文字幅 / Unicode は改善済みですが、完全互換ではありません
- 複数ファイル引数や一部 Vim CLI オプションは未実装です