ruvim

RuVim チュートリアル(使い方)

起動

このリポジトリは Ruby 標準ライブラリのみで動きます。

ruvim

ファイルを指定しない起動では、Vim 風の intro screen(RuVim では intro 用の read-only 特殊バッファ)を表示します。 編集を始めると通常の空バッファに置き換わります。

ファイルを開いて起動:

ruvim path/to/file.txt

起動オプション(Vim 風・現状)

例:

ruvim --clean file.txt
ruvim -R file.txt
ruvim --cmd 'set number' -u /tmp/minimal_init.rb file.txt
ruvim -u /tmp/minimal_init.rb -c 'set number' file.txt
ruvim +10 file.txt
ruvim -o a.rb b.rb
ruvim -O a.rb b.rb
ruvim -p a.rb b.rb

開発環境で gem 未インストールのまま試す場合は ruby -Ilib exe/ruvim でも起動できます。

基本操作

Normal mode

Insert mode

Command-line mode(Ex 風)

使えるコマンド:

Follow mode(tail -f 相当)

ファイルへの追記をリアルタイムにバッファへ反映する追従モードです。

ruvim -f /var/log/syslog        # 起動時から follow mode
ruvim -f log1.txt log2.txt      # 複数ファイルすべて follow

起動後に切り替えることもできます:

:follow          " follow 開始(トグル)
:follow          " もう一度で停止

Undo / Redo

現状の undo 粒度:

検索

検索は command-line の入力欄を再利用しています(prefix が : ではなく / または ? になる)。 検索パターンは Ruby 正規表現です(例: /foo\d+/ 相当なら foo\d+ を入力)。

quickfix / location list(最小)

substitute(最小)

d + motion(operator-pending)

使える例(現状):

yank / paste / replace

register prefix を付けると register を指定できます。

Mark / Jump list

Macro

Options(:set

change operator(c

c は削除後に Insert mode に入ります。

Visual mode

ユーザー定義 Ex コマンド(:command

例:

:command Hi help
:Hi

既存名を置き換える場合は ! を使います。

:command! Hi commands

Ruby 実行(:ruby / :rb

例:

:ruby buffer.line_count
:rb [window.cursor_y, window.cursor_x]

ctx, editor, buffer, window を参照できます。

画面まわり(現状)

Unicode 幅の設定(現状)

例:

RUVIM_AMBIGUOUS_WIDTH=2 ruvim

バッファ管理

複数 window / split(現状)

各 window はカーソル位置とスクロール位置を独立に持ちます。

Tabpage(現状)

タブごとに split レイアウトと current window が保持されます。

設定ファイル(XDG)

起動時に以下を読み込みます(存在する場合)。

例:

nmap "H", "cursor.left"
nmap "L", "cursor.right"

command "user.say_hi" do |ctx, **|
  ctx.editor.echo("hi from rc")
end

ex_command_call "Hi", "user.say_hi"

利用できる主な DSL:

テスト実行

ruby -Ilib:test -e 'Dir["test/*_test.rb"].sort.each { |f| require File.expand_path(f) }'

コマンド設計の見方

RuVim では、ユーザーが入力する Ex コマンド名(例: :w)と、内部の処理を分けています。

この分離で、ヘルプ・補完・引数チェックを後から足しやすくしています。

Builtin Ex コマンドを追加する

lib/ruvim/app.rbregister_builtins! に Ex 登録を追加します。

例: :bn(次バッファ)を追加する場合のイメージ

register_ex_unless(ex, "bn", call: :buffer_next, desc: "Next buffer", nargs: 0)

次に lib/ruvim/global_commands.rb に実装を追加します。

def buffer_next(ctx, **)
  # TODO: buffer list から次へ移動
end

Normal mode のキーバインドを追加する

lib/ruvim/app.rbbind_default_keys! で定義します。

例: Hcursor.left に割り当てる:

@keymaps.bind(:normal, "H", "cursor.left")

複数キー列も使えます(現状 dd のような連続入力)。

@keymaps.bind(:normal, "dd", "buffer.delete_line")

キーマップのレイヤー(現状 API)

RuVim::KeymapManager は以下の登録 API を持ちます。

解決順は filetype -> buffer -> mode -> global です。

ftplugin(filetype ごとの設定)

RuVim は buffer の path から filetype を簡易検出し、初回表示時に ftplugin を読み込みます。

ftplugin の中では nmap / imap が filetype-local として登録されます。setlocal も使えます。

# ~/.config/ruvim/ftplugin/ruby.rb
nmap "K", "search.word_forward"
setlocal "tabstop=2"

シンタックスハイライト(最小)

補完(現状の基礎)

Symbol と Proc の使い分け

RuVim のコマンド定義は SymbolProc の両方に対応しています。

Symbol(推奨: builtin)

cmd.register("cursor.left", call: :cursor_left, desc: "Move cursor left")

利点:

Proc(推奨: 実験・拡張)

ex.register("Hello", call: ->(ctx, **) { ctx.editor.echo("hello") }, desc: "Demo", nargs: 0)

利点:

次の拡張候補(おすすめ順)

  1. シンタックスハイライト(最小)
  2. 補完基盤(Ex 引数 / buffer word)
  3. Undo/Redo
  4. buffer-local keymap
  5. :command でユーザー定義 Ex コマンド
  6. :ruby で Ruby 実行