Conclusão do nome do arquivo Vim em relação ao arquivo atual

Conclusão do nome do arquivo Vim em relação ao arquivo atual

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:hlistado.

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:

inoremap./<CX><CF> <CO>:lcd %:p:h<CR><CX><CF>

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.

informação relacionada