EmVim, quando estou no modo de inserção e quero usar a conclusão do nome do arquivo, quero que o caminho de pesquisa seja relativo ao arquivo atual, não ao diretório de trabalho atual. Por exemplo, se estiver no modo de inserção, digito o seguinte:
./
^X^F
O menu de conclusão está me mostrando arquivos no:pwd
, mas prefiro ver os arquivos em%:p:h
listado.
Existe uma opção que eu possa definir para corrigir isso e, se não, o que você sugere como solução alternativa?
Responder1
Se você
:set autochdir
você obterá o comportamento que deseja. No entanto, se você precisar manter o diretório de trabalho (por exemplo, para abrir facilmente outros arquivos do projeto), será necessário salvar/restaurar o CWD com autocmds:
:autocmd InsertEnter * let save_cwd = getcwd() | set autochdir
:autocmd InsertLeave * set noautochdir | execute 'cd' fnameescape(save_cwd)
Responder2
@Ingo Karkatderesponderé legal, mas estou um pouco hesitante em colocar issomeu vimrc, porque mesmo opágina de ajuda para'autochdir'
informa que seu uso quebrará alguns plug-ins.
Eu criei minha própria solução, que pode ser muito específica para meus casos de uso:
Pretendo extraí-lo para uma função e definir uma variável para o pwd antes que o comando lcs seja emitido e, em seguida, redefini-lo em algum momento. Seria bom se houvesse um menu autocmd.
Posso ou não usar isso, mas pensei em lançar outra solução.
Responder3
Eu tenho isso no meu .vimrc
:
" [relative autocomplete]
" ==============================================================================
" Vim's file autocomplete (C-X C-F) works only in an absolute path (using the
" current working directory) as base. But in most languages, you want to use
" relative imports, and file autocomplete doesn't work there. For that, I use
" <C-X><C-X><C-F>:
function! s:EnableRelativeAutocomplete() abort
let b:relative_autocomplete_cleanup_pending = 1
lcd %:p:h
endfunction
function! s:DisableRelativeAutocomplete() abort
if exists('b:relative_autocomplete_cleanup_pending') && b:relative_autocomplete_cleanup_pending
lcd -
let b:relative_autocomplete_cleanup_pending = 0
endif
endfunction
inoremap <C-x><C-x><C-f> <C-o>:call <SID>EnableRelativeAutocomplete()<CR><C-x><C-f>
augroup relative_file_autocomplete
autocmd!
autocmd InsertLeave * call s:DisableRelativeAutocomplete()
augroup END
Ele mudará o diretório de trabalho para o arquivo atual ao usar <C-x><C-x><C-f>
e voltará ao diretório anterior ao sair do modo de inserção, se necessário.