Vimファイル名/パスの補完


10

ctrl + x、ctrl + f(compl-filename)を使用して現在のディレクトリからファイル名/パスを完成できることを知っています。これは、変更が現在のディレクトリをアクティブバッファーのディレクトリに更新するset autochdirとの組み合わせでうまく機能します。

しかし、airblade/vim-rooter現在のディレクトリを「プロジェクト」フォルダにするためにを使い始めました。現在、ファイル名の補完は常にプロジェクトフォルダから始まります。

質問:現在のディレクトリではなく、アクティブなバッファのディレクトリをファイル名の補完に使用する方法はありますか?それとも他の回避策ですか?

Stackoverflowでも質問


5
C-xC-fは、現在のバッファの作業ディレクトリを常に使用します。構成するオプションはありません(pathどちらもサポートしていません)。vim-rooterの使用目的によって異なります。それに応じて、他のプラグインを使用することもできます。余談ですが、私はyoucompletemeを使用します。これは、入力を開始すると、現在のバッファーのディレクトリからのパスを補完します./reddit.com/r/vim/comments/216jdd/…を
muru

回答:


7

@muruが述べたように、パスとファイル名を完成させるディレクトリを構成するオプションはありません。常にウィンドウの作業ディレクトリを使用します。

これを支援するために、いくつかの関数とマッピングを書きました。バックグラウンドで、ローカルの作業ディレクトリを(を使用して:lcd)一時的に変更し、完了したら以前の作業ディレクトリを復元します。

私も知らない理由で、私はこのマイクロプラグインをElephantと呼びました。

コードは次のとおりです(GitHubのVim構成からコピー)。

let g:elephant_map = {
    \ 'f': function('elephant#current_file'),
    \ 'p': function('elephant#vcs_project')
\ }

function! elephant#prompt(base)
    let l:Fcn = get(g:elephant_map, a:base, function('elephant#identity'))
    let l:basedir = l:Fcn()
    execute 'lcd' l:basedir
    let l:file = fnamemodify(input(l:basedir.'/', '', 'file'), ':p')
    lcd -
    return fnamemodify(l:file, ':.')
endfunction

function! s:elephant_init()
    let l:base = getchar()
    return elephant#prompt(nr2char(l:base))
endfunction

function! elephant#identity()
    return '.'
endfunction

function! elephant#vcs_project()
    return fnamemodify(finddir('.git', '.;'), ':h')
endfunction

function! elephant#current_file()
    return expand('%:h')
endfunction

inoremap <silent> <expr> <C-R><C-E> <SID>elephant_init()
cnoremap <silent> <C-R><C-E> <C-R>=<SID>elephant_init()<CR>

それを使用する方法

これらのマッピングの使用は、3つのステップで行われます。

1.マッピングを呼び出す

挿入モードまたはコマンドラインモードで、を使用してマッピングを呼び出します<C-R><C-E>

2.ディレクトリを選択します

単一の文字を入力して、補完するルートディレクトリを選択します。上記のコードは、2種類のルートを提供します。

  • f -現在のファイル(バッファ)が存在するディレクトリ
  • p -現在のファイルが属するGitプロジェクトのベースディレクトリ

3.パスまたはファイル名を入力します

指定されたディレクトリを基準にした相対パスまたはファイル名を入力するように求められます。Enter終了したらを押します。

いくつかのメモ

  • これは、挿入モードでのインライン補完を提供しません<C-X><C-F>。代わりに、コマンドラインプロンプト(:コマンドの移動先)にパスまたはファイル名を入力します。を押すEnterと、パスがバッファに挿入されます。
  • コマンドラインモードでも同じことが当てはまります。これは、入力したコマンドを実行するEnterためにヒットEnterしなければならないことを忘れてしまうと、混乱することがあります。
  • その他のディレクトリ機能は、に追加することで登録できますg:elephant_map
  • 挿入されるパスは、完全な絶対パスになります。スクリプトを調整してその動作を変更できますが、私はそれを回避できませんでした。

ソリューションを完全にテストしませんでしたが、完全性のためにそれを受け入れました。代わりに、推奨される回避策を使用しました:ctrl + x、ctrl + fの代わりにYouCompleteMe
Rafael Barbosa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.