@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
。
- 挿入されるパスは、完全な絶対パスになります。スクリプトを調整してその動作を変更できますが、私はそれを回避できませんでした。
path
どちらもサポートしていません)。vim-rooterの使用目的によって異なります。それに応じて、他のプラグインを使用することもできます。余談ですが、私はyoucompletemeを使用します。これは、入力を開始すると、現在のバッファーのディレクトリからのパスを補完します./
。reddit.com/r/vim/comments/216jdd/…を