スキップしてメイン コンテンツに移動

ddu.vim introduction

ddu.vim へ移行する

昨日、重い腰を上げて、denite.vimから、ddu.vimへの移行を行った。

基本的なセッティッグは、ddu.vim の README.md を読めばある程度出来る。 とは言え、ddu.vim の理念を理解していないとそもそも使えないプラグインなので、理念を含めて説明していきたいと思う。

ddu.vim とは

ddu.vim は、Shougoさんによって開発されている、Vim プラグインである。 Unite.vim や denite.vim の流れを組むプラグインであり、物凄く雑に説明すると、Vim で操作できる全てをコントロールしようというプラグインである。 雑すぎねーか。

Unite.vim からこのコンセプトは変わっていないが、Unite.vim は速度が遅いという欠点を抱えていた。 そこで、速度改善のために、pure Vim Script から脱却し、Python3 を採用したのが、denite.vim。 しかし、denite.vim は Python 回りのでトラブルが多かった。

そういう地獄のような状況で、denops.vimというプラグインが登場する事で環境が一気に変わった。 denops.vim は、Denoを Vim で使えるようにするプラグインで、これがべらぼうに Vim と相性が良かった。 早いし、色々なことが出来るなど、非常に柔軟な対応を出来るようになった。 Python ちゃんは要らなかったんや……。

簡単にまとめると、

  • ddu.vim は全てを繋ぐ
  • 環境依存性を著しく下げる denpos.vim の登場により、環境構築が容易に
  • Deno を採用することで高速性と柔軟性を担保

と言った、まさしく次世代のプラグインと呼ぶことが出来る。

ddu.vim の概念

ddu.vim には、

  • UI
  • sources
  • filters
  • kinds

という概念があり、これらも合わせてインストールが必要である。 それぞれ好きな物をインストールすれば良いと書いてしまえばそれで終わりなのだが、初めて導入する人にとっては何を言っているのか意味が分からないと思う。

UI は、文字通り、ユーザーインターフェースである。 とりあえず、ファジーファインダーに近い動きをしている、ddu-ui-ff を採用すれば良い。

sources は、文字通り、ソース。入力出力変換で言う所の入力。 ここが、色々とバラエティに溢れたのを採用出来るが、それがそもそも分からねーよ!!という人がいると思う。 代表的なのは、ファイルであるが、レジスタやバッファ、履歴などを採用出来る。 自分は、ファイル、レジスタ、バッファ、履歴を導入した。 よく使っているのは、履歴であり、これに関しては、導入して育てて行けばどんどん使いやすくなるので、マストで入れておきたい。 ファイルも、基本なので、これも導入しておきたい。 バッファも ddu.vim 経由で選択出来ると楽を出来るので、入れておきたい。 レジスタはおまけだが、これも有効だと便利。

filters は、文字通り、フィルタ。文字を入力して候補を絞っていくために自分は、ddu-filter-matcher_substring を採用している。 多分、これが一番使いやすい。

kinds は選んだアイテムに対する動作を設定する。基本、ddu-kind-file があれば問題ない。

ddu.vim の導入方法

ここから、ddu.vim の導入方法を記載する。 参考にして欲しい。 既に済んでいるステップがあるならば、飛ばしても良い。

Deno のインストール

ddu.vim の導入に当たり、Denoのインストールは必須なので、頑張ってインストールする。 まあ、頑張るほど大変ではない。

ddu.vim と必須ライブラリのインストール
  • Shougo/ddu.vim
  • vim-denops/denops.vim

上記のライブラリのインストールは必須。

UI のインストール
  • Shougo/ddu-ui-ff

自分は、上記をインストールした。

sources のインストール
  • Shougo/ddu-source-file
  • Shougo/ddu-source-register
  • kuuote/ddu-source-mr
  • lambdalisue/mr.vim
  • shun/ddu-source-buffer

先述したように、必要なソースをインストール。 mr.vim は ddu-source-mr に必要なので、インストール

filters のインストール
  • Shougo/ddu-filter-matcher_substring

フィルタはとりあえず、matcher_substring が使いやすいので、オススメ。

kinds のインストール
  • Shougo/ddu-kind-file

kinds は、当面は kind-file で間に合っている。

ddu-commands のインストール
  • Shougo/ddu-commands.vim

:call ddu#start({雑多なオプション})みたいな感じで、実行してもいいが、それは面倒なので、vimrc によく使うコマンドをまとめて置くことにした。

まとめると
Plug 'Shougo/ddu.vim'
Plug 'vim-denops/denops.vim'
Plug 'Shougo/ddu-ui-ff'
Plug 'Shougo/ddu-source-file'
Plug 'Shougo/ddu-source-register'
Plug 'kuuote/ddu-source-mr'
Plug 'lambdalisue/mr.vim'
Plug 'shun/ddu-source-buffer'
Plug 'Shougo/ddu-filter-matcher_substring'
Plug 'Shougo/ddu-commands.vim'

すれば良い。

余談だが、自分は、dein.toml で管理しているので、vimrc には書いていない。

ddu の設定
call ddu#custom#patch_global({
    \   'ui': 'ff',
    \   'sources': [{'name':'file','params':{}},{'name':'mr'},{'name':'register'},{'name':'buffer'}],
    \   'sourceOptions': {
    \     '_': {
    \       'matchers': ['matcher_substring'],
    \     },
    \   },
    \   'kindOptions': {
    \     'file': {
    \       'defaultAction': 'open',
    \     },
    \   },
    \ })

一番シンプルなこの形を採用した。 最低限の事は出来る。 sources に何を入れるかがキモだが、自分はとりあえず先述したように、ファイル、履歴、レジスタ、バッファを入れた。

キー操作の設定

ddu.vim 内での動きをキー設定する必要があるので、vimrc に書く。

autocmd FileType ddu-ff call s:ddu_my_settings()
function! s:ddu_my_settings() abort
  nnoremap <buffer><silent> <CR>
        \ <Cmd>call ddu#ui#ff#do_action('itemAction')<CR>
  nnoremap <buffer><silent> <Space>
        \ <Cmd>call ddu#ui#ff#do_action('toggleSelectItem')<CR>
  nnoremap <buffer><silent> i
        \ <Cmd>call ddu#ui#ff#do_action('openFilterWindow')<CR>
  nnoremap <buffer><silent> q
        \ <Cmd>call ddu#ui#ff#do_action('quit')<CR>
endfunction

autocmd FileType ddu-ff-filter call s:ddu_filter_my_settings()
function! s:ddu_filter_my_settings() abort
  nnoremap <buffer> <CR>
  \ <Cmd>call ddu#ui#ff#do_action('itemAction')<CR>
  nnoremap <buffer><silent> q
  \ <Cmd>call ddu#ui#ff#do_action('quit')<CR>
  inoremap <buffer> <CR>
  \ <Cmd>call ddu#ui#ff#do_action('itemAction')<CR>
  inoremap <buffer> <C-j>
  \ <Cmd>call ddu#ui#ff#execute("call cursor(line('.')+1,0)")<CR>
  inoremap <buffer> <C-k>
  \ <Cmd>call ddu#ui#ff#execute("call cursor(line('.')-1,0)")<CR>
endfunction

ddu.vim を起動したあと、i キーを押すことで、ファジーファインダーでやってる事が出来る。 q で終了、エンターでアクション実行、Ctrl+J/Ctrl+K でアイテムの上下移動ができる。 この辺は基本の動作として書いておけば良い。

nnoremap <SID>[ug] <Nop>
nmap ,u <SID>[ug]

nnoremap <silent> <SID>[ug]m :<C-u>Ddu mr<CR>
nnoremap <silent> <SID>[ug]b :<C-u>Ddu buffer<CR>
nnoremap <silent> <SID>[ug]r :<C-u>Ddu register<CR>
nnoremap <silent> <SID>[ug]n :<C-u>Ddu file -source-param-new -volatile<CR>
nnoremap <silent> <SID>[ug]f :<C-u>Ddu file<CR>

自分は、トリガーを,u に設定している。

  • ,um で履歴表示
  • ,ub でバッファ表示
  • ,ur でレジスタ表示
  • ,un で新規ファイル作成
  • ,uf でファイル選択

という動きをさせている。ちなみに、新規ファイル作成は昨日実装されたばかりの機能なので、今導入すれば古参顔する事が出来る。

コピペしたい人用

とっちらかり過ぎていてつれえわ……って人用に、まとめとく。

"vim-plug
call plug#begin()

Plug 'Shougo/ddu.vim'
Plug 'vim-denops/denops.vim'
Plug 'Shougo/ddu-ui-ff'
Plug 'Shougo/ddu-source-file'
Plug 'Shougo/ddu-source-register'
Plug 'kuuote/ddu-source-mr'
Plug 'lambdalisue/mr.vim'
Plug 'shun/ddu-source-buffer'
Plug 'Shougo/ddu-filter-matcher_substring'
Plug 'Shougo/ddu-commands.vim'

call plug#end()

"ddu settings.

call ddu#custom#patch_global({
    \   'ui': 'ff',
    \   'sources': [{'name':'file','params':{}},{'name':'mr'},{'name':'register'},{'name':'buffer'}],
    \   'sourceOptions': {
    \     '_': {
    \       'matchers': ['matcher_substring'],
    \     },
    \   },
    \   'kindOptions': {
    \     'file': {
    \       'defaultAction': 'open',
    \     },
    \   },
    \ })

"ddu-key-setting
autocmd FileType ddu-ff call s:ddu_my_settings()
function! s:ddu_my_settings() abort
  nnoremap <buffer><silent> <CR>
        \ <Cmd>call ddu#ui#ff#do_action('itemAction')<CR>
  nnoremap <buffer><silent> <Space>
        \ <Cmd>call ddu#ui#ff#do_action('toggleSelectItem')<CR>
  nnoremap <buffer><silent> i
        \ <Cmd>call ddu#ui#ff#do_action('openFilterWindow')<CR>
  nnoremap <buffer><silent> q
        \ <Cmd>call ddu#ui#ff#do_action('quit')<CR>
endfunction

function! s:ddu_filter_my_settings() abort
  nnoremap <buffer> <CR>
  \ <Cmd>call ddu#ui#ff#do_action('itemAction')<CR>
  nnoremap <buffer><silent> q
  \ <Cmd>call ddu#ui#ff#do_action('quit')<CR>
  inoremap <buffer> <CR>
  \ <Cmd>call ddu#ui#ff#do_action('itemAction')<CR>
  inoremap <buffer> <C-j>
  \ <Cmd>call ddu#ui#ff#execute("call cursor(line('.')+1,0)")<CR>
  inoremap <buffer> <C-k>
  \ <Cmd>call ddu#ui#ff#execute("call cursor(line('.')-1,0)")<CR>
endfunction

"ddu keymapping.
nnoremap <SID>[ug] <Nop>
nmap ,u <SID>[ug]

nnoremap <silent> <SID>[ug]m :<C-u>Ddu mr<CR>
nnoremap <silent> <SID>[ug]b :<C-u>Ddu buffer<CR>
nnoremap <silent> <SID>[ug]r :<C-u>Ddu register<CR>
nnoremap <silent> <SID>[ug]n :<C-u>Ddu file -source-param-new -volatile<CR>
nnoremap <silent> <SID>[ug]f :<C-u>Ddu file<CR>

うん、長いなこれ。 とりあえず、これを vimrc に書いて、:PlugInstall した後、,uf から、ddu.vim の世界に入門することをオススメする。 自分は、,u をトリガーにしているが、ここは好きな奴に変えてもらって構わない。 ddu keymapping の所を適度に修正してもらえばいい。

コメント

このブログの人気の投稿

EFIブートローダを移動した話

EFIブートローダを移動した HX90に環境を整え終わってから、アホな事をしたので、その記録を残す。 SSD: Cドライブ SSD: Dドライブ(データストレージ用) + ESP※ SSD: Eドライブ(データストレージ用) ※ESP(EFI System Partition) インストールした時、こんな構成だった。 ESPがDドライブにあるのが気持ち悪かったので、これを削除した。 そしたら、BIOS画面が出るだけになり、Windowsが起動しなくなった。 移動手順 この時の自分はMBRをふっ飛ばした時と同じ現象だと思ったので、MBRというキーワードで検索したが、今はEFIブートローダーと呼んでいるらしい。 【Win10】任意のディスクにEFIブートローダをインストールする 色々検索した結果この記事が参考になった。 Diskpartを使って、パーティションを新たに分割し、bcdbootを実行して、無事に事なきを得た。 パーティションの分割はこんな感じ Diskpart Select volume 0 shrink desired = 200 Select disk 0 Create partition EFI size=200 Format quick fs=fat32 label="ESP" Assign letter=P exit EFIブートローダーのインストールはこんな感じ bcdboot C:\Windows /s P: /f UEFI ちなみに、自分の環境だけの問題なのだが、コマンドラインで、「\」を入力するのができなかった。我が家のキーボードはHHKBだけなので、日本語配列を無理やり適用されると、バックスラッシュが入力できないという不具合が生じる。 結局、コマンドプロンプトからマウスで範囲選択してコピーして貼り付けるという荒業でクリアした。 普通の人は、何も考えずに、\を入力すれば良い。 最終的に SSD: Cドライブ + ESP※ SSD: Dドライブ(データストレージ用) SSD: Eドライブ(データストレージ用) ※ESP(EFI System Partition) という構成に切り替えることができた。

Windows版gVimをアンインストールした日

Windows 版 gVim をアンインストールした話 以前に、 Windows11 on WSL2 + wezterm + Neovim = 最強開発環境 という痛々しい記事を書いたのだが、その続きの記事と言っても過言ではない。 この記事は Vim 駅伝 の 3 月 1 日の記事である。 前回はぺりーさんの netrw を使うために という記事だった。 次回は kuuote さんの Vim 側の組み込みプラグインを無効化するハック という記事である。 gVim との付き合い 思い返してみると、gVim との付き合いは大分長くなった。エディタとしては 自分の人生の中で最も長く付き合ってきたエディタ と言える。Vim のインターフェースとして gVim を何度も使ってきた。自分の手持ちのマシンは Windows なので、必然的に gVim を選択肢として選ぶ必要があった。 gVim の良さは何か。それは、Windows とのシームレスな関係であり、Windows OS の機能をそのまま使いたい場合に有用である。かつての自分にとってこの部分は非常に重要であった。具体的には、印刷機能と画面半透明化機能であり、これが無いとやってられないという認識であった。 しかし、時代が進み、自分の技術力の向上や考え方の変化、さらに Vim 周りのプラグインの更新が進むと gVim で運用していく事がだんだんと億劫になっていったというのが事実である。故に、 WSL2 上で動く Neovim の快適さに心が打ち震えた のである。 技術力の向上に伴う考え方の変化 かつての自分は 何でも gVim で処理したいな と考えていた。メールを見たり天気を見たり、Twitter を見たりするのに、gVim を活用していた。かつての Emacs 使いの guru のような立ち位置を目指していたというのがある。2000 年代初頭にインターネットに多少なりとも触れていた人ならば、「それ Pla」という古の単語を思い浮かべるかもしれない。この概念を持ち出すのはあまりにも古すぎるが、結局言いたいのは、 1 つの手法で全部をこなす という考え方だ。ネットを見るのにわざわざブラウザに切り替えるのはもったいないという今となっては情熱に似た何かを当時は多くの人が持っていた。 しかし、自分自身の技術力

javascriptは外部ファイルにした方がいいの?それとも、インラインの方が良いの?

事の発端 os0xさんのブログコメント で、javascriptの書き方について、面白いやり取りがありましたので、それについての私見を書きたいと思います。 結論から言いますと、プログラマ的な立場から言わせて頂くと、外部ファイル管理が望ましく、コーダ的な立場から言わせていただくとインラインが望ましいです。 なぜそのような結論に至ったのか、まずは経緯を御覧ください。 コメント欄でのやり取り os0xさんのブログコメント欄を引用しています