ラベル vim の投稿を表示しています。 すべての投稿を表示
ラベル vim の投稿を表示しています。 すべての投稿を表示

2016年12月19日月曜日

[Vim] あいまい補完プラグイン

いい加減な単語のつづりでも適当に補完してくれるプラグインを作っています。

作成したのはかなり前になりますが、私自身、今現在でも便利に使っていますので紹介します。

AmbiCompletion : Ambiguous completion



概要

バッファの中にある、補完対象の単語と「近い」単語を候補とします。

主に英単語や、プログラムの関数・変数の補完を目的としています。
長い名前の単語を入力する場合、単語の一部を入力して、このプラグインを使って補完するのがユースケースです。

補完前: ng_wd_tb_cpleted
→ 補完後: long_word_tobe_completed 
※補完後の単語が編集中のバッファに存在することが前提です。
気づかずに単語の途中をミスタイプしていて、思うように補完できずにイライラした経験があるのではないでしょうか?
AmbiCompletion を使う場合、上の例にあるように、多少文字が欠けていても補完がされます。
また、単語の先頭文字が一致している必要もありません。

日本語も補完対象になります。
その場合、Vim が単語を区切る単位(wやeといった移動で、その区切りが分かります)での補完になります。
おおよそ、ひらがな・カタカナ・漢字といった単位での補完になります。

補完のされ方

このプラグインのアイディアの元は、「Word Fuzzy Completion」という補完プラグインです。

レーベンシュタイン距離の考え方に沿って、同じバッファの中にある単語の中からある程度近いものを補完候補とします。

差異:

  • 評価方法を変更し、単語の先頭が一致していなくても候補とできる
  • また、連続して一致する文字が多い(似通った単語)ほど高い評価になる
  • +python が不要(全て Vim Script で実装)
  • 速度改善

補完する際のバッファ中にある単語を候補として保管をするため、どうしても速度が犠牲になります。
そのため、単語の集合をキャッシングしたり、単語の収集をカーソル周辺の行に限定したりできるような機能を設けています。

また、最近では、指定したバッファも補完候補の単語の収集対象とできるようになってきています。

まとめ

プログラミングで長い変数名・関数名をタイピングするのが面倒な方は、ぜひどうぞ。

AmbiCompletion : Ambiguous completion

2008年10月1日水曜日

範囲選択文字列を検索

Vim で、ビジュアルモード時に * と # を押したら、選択されている文字列を検索させます。

let s:RangeAsterisk__reg = ''
function! s:RangeAsterisk__keepReg()
let s:RangeAsterisk__reg = @*
endfunction
function! s:RangeAsterisk__restoreReg()
let @* = s:RangeAsterisk__reg
endfunction
vnoremap * :call RangeAsterisk__keepReg()gv"*y/*:call RangeAsterisk__restoreReg()
vnoremap # :call RangeAsterisk__keepReg()gv"*y?*:call RangeAsterisk__restoreReg()

通常、* と # は (ビジュアルモード中であっても) カーソル直下の単語を検索しますが、これはあまり直感的とは言えません。
いちいちコピーしてから / で (貼り付けして) 検索するのも煩わしいものです。


現在 vimrc は 325 行...
もうちょっと外に追い出したいなぁ。

2008年9月15日月曜日

Vim での括弧自動補完 AutoClose

とかなんとかやっていたら、AutoClose というプラグインがあるのを発見しました。
あらまあ素敵。

ちなみに、同名のプラグインが 2 つあるようです。
僕は更新のされている方 (script_id=2009) を使ってます。
もう一つの方 (script_id=1849) との比較はやってません。

2008年7月27日日曜日

Vim での括弧自動補完 :abbreviate

自動補完の話題の続きですが、Vim には :abbreviate というコマンドがあるんですね。
例えば、
:abbreviate ms Microsoft
として、abbreviation を登録するとします。
そうすると、ms<なんか> と入力した場合に ms の部分を Microsoft に変換してくれるのだそうです。

<なんか>の部分は、<Space>, <Tab>, <Enter>, <Esc> などが該当するようです。


で、これを使って括弧の自動補完ができないのかなと思ったんですが、<なんか>まで入力しないと補完されないということに気づきました。
<なんか> として入力された文字を潰さないといけないんですが、<Space> なら潰す必要があるけど、<Esc> なら潰さないという処理が必要なわけです。

というか、そもそも abbreviation はそういうふうに使うもんじゃねーよ、という話です。

2008年7月16日水曜日

Vim での括弧自動補完

ここでの内容を基に、自分なりにカスタマイズしてみる。
" 括弧と引用符の補完
inoremap  (   ()
inoremap  ()  ()
inoremap  <   <>
inoremap  <>  <>
inoremap  [   []
inoremap  []  []
inoremap  {   {}
inoremap  {}  {}
inoremap  "   ""
inoremap  ""  ""
inoremap  '   ''
inoremap  ''  ''
問題点:
  1. It's のようなアポストロフィには未対応
    It's'  となってしまう
  2. 先に閉じ括弧を入力していた場合にも未対応
    ()) ← こうなる
    まぁ、これはどうでもいいや
  3. 引用符をコメント開始の記号にしているファイルタイプには未対応
    vim とか、vb とか
    特に、vim なんて二重引用符がコメントにも文字列リテラルにもなるし…
一番の問題は 1 なんだけど、これを解決しようとするとなると、やっぱりスクリプトを書かないといけない気がする。面倒。

1 のケースでは、カーソル位置が
It's|'
に来るのだから単純に <Del> を一回押してよ、と思うし。これもどうでも良いや。

2008年7月12日土曜日

Vimpi

面白そうなサービスです。
vim.org に登録されているスクリプトをまとめて、新着順、注目度順に並べてくれます。

自分がウォッチしたいスクリプトを登録すると、それらをまとめた GLVS ファイルを作ってくれるので、インストールもすごく楽になります。

素晴しい。

GetLatestVimScripts

GLVS 経由でスクリプトをインストールしようとしたら、
序数 3212 がダイナミック ライブラリ LIBEAY32.dll から見つかりませんでした
などというエラーが出てしまった。

ググったところ、
ということが分かった。

Ruby 自体はマシンにインストールされていたので、早速、両 DLL をコピー。
無事 GLVS が動くようになりましたとさ。

2008年7月2日水曜日

カラースキーム編集プラグイン

なんてものを考えてみた。
  1. いつも通り、お気に入りのカラースキームを選択する
  2. 変更したい箇所(単語)の上で、ハイライト変更のコマンドを実行する
  3. その箇所が、どのグループ(Comment や Keyword) なのかを判別する
    - シンタックスID
    - リンクされていたら、リンク先のシンタックスID
  4. 3 に対応するハイライトを変更する
    - プロンプトを表示して、ユーザにフォントや色を指定してもらう
    - 対応するシンタックスIDの属性を変更
カーソルの位置からグループを特定するのが至難かもしれない。あとは、カーソルを置けない場所の変更をどうするべきか…

だれかつくってよー