2 votes

Définition floue du répertoire de travail à partir des répertoires marqués d'un signet dans vim

Parfois, j'ai besoin de changer le répertoire de travail actuel à un endroit différent (par exemple, pour rechercher dans un autre projet). Ceci peut par exemple être réalisé avec lcd /path/to/dir . Cependant, l'écriture des chemins est souvent trop lente et je me retrouve souvent à utiliser les mêmes endroits. L'idéal serait d'avoir un chercheur de flous tel que fzf qui s'affiche avec une liste prédéfinie de répertoires de signets à choisir. La recherche floue permettrait de sélectionner et de changer rapidement le répertoire de travail (évidemment sans modifier le fichier actuel à partir duquel il a été appelé).

A court terme, je cherche l'équivalent de la fzf-marques pour vim.

3voto

Sebastian Müller Points 215

Après avoir fait un peu plus lecture J'ai trouvé en fait un moyen d'intégrer les fzf-marks dans vim, (qui fonctionnent aussi très bien sans fzf-marks).

Tout ce dont vous avez besoin, c'est d'un fichier listant les répertoires marqués d'un signet, avec une variable pointant vers lui, par ex. FZF_MARKS_FILE="${HOME}/.fzf-marks

Ce fichier est formaté comme suit, cat $FZF_MARKS_FILE :

project1 : /home/user/project1/code
project2 : /home/user/project2/code
vimswapdir : /home/user/.local/share/nvim/swap
rlibsloc : /home/user/R/x86_64-pc-linux-gnu-library
trash : /home/user/.local/share/Trash/files
vim-plugins : /home/user/.config/nvim/plugged

L'idée est maintenant de le charger et de l'analyser de manière similaire à ce qui est fait dans fzf-marks. fonction de saut et le rendre interrogeable de manière floue pour un accès rapide définissant une fonction FM :

command! -bang FM call fzf#run(fzf#wrap({'source': 'cat ~/.fzf-marks | sed "s/.*: \(.*\)$/\1/" | sed "s#~#${HOME}#"', 'sink': 'lcd'}, <bang>0))

Appel à :FM fait maintenant apparaître une fenêtre fzf avec les répertoires marqués d'un signet à sélectionner.

Cas d'utilisation (que je retrouve souvent) :

Disons que j'ai commencé à éditer un fichier quelque part (disons dans ~/myproject ), mais il fallait chercher ( :grep ) pour une phrase contenant le mot foo qui, je le sais, est dans un fichier dans /home/user/project1/code . Je ne me souviens jamais du chemin du projet 1, juste qu'il a code sur son chemin. C'est pour cette raison que je l'ai mis dans mes favoris (voir ci-dessus).

Auparavant, il fallait rechercher le chemin d'accès et le saisir dans vim, c'est-à-dire taper :grep foo /home/user/project1/code . Maintenant, cela fonctionne plus rapidement comme suit :

:FM dans vim, en faisant apparaître la liste des répertoires marqués d'un signet, en tapant des morceaux de code par exemple co limite rapidement la recherche :

enter image description here

en sélectionnant la première ligne, le répertoire courant est fixé à project1 (ce qui peut être confirmé par :pwd ) mais en laissant le fichier édité tel quel. Maintenant, :grep! foo recherche en effet récursivement dans le projet1.

Après avoir terminé la recherche, je peux réinitialiser le répertoire de travail au répertoire des fichiers actuels. :cd %:h ou c'est Root avec Racine : :Rooter .

0voto

tinmarino Points 602

Mon ctrlp conf, notamment pour cache_dir y let g:ctrlp_cmd = 'CtrlPMixed'

    " Open buffer here
    let g:ctrlp_switch_buffer = ''
    " Cache
    let g:ctrlp_cache_dir ='$h/.cache/ctrlp'
    " replace $home by ~ in cache
    let g:ctrlp_tilde_homedir = 1
    let g:ctrlp_mruf_max = 50000
    " Use ag <- grep
    " if executable('ag')
    "   let g:ctrl_user_command = 'ag %s -l --nocolor -g ""'
    " endif
    " Ignore
    let g:ctrlp_cutom_ignore = {
      \ 'dir': '\.git$,undo/',
      \ 'file': 'log'
    \ }
    if $os !=? 'termux'
      " E like edit and closer to ctrl + <c-p> used to paste
      let g:ctrlp_map = '<C-E>'
      vnoremap <C-E> :<C-u>CtrlPMixed<CR>
    else
      " Because move up gives c-e
      let g:ctrlp_map = ',e'
    endif
    " Keep cache
    let g:ctrlp_clear_cache_on_exit = 0
    " Mixed to search in MRU, FIles, Buffers
    let g:ctrlp_types = ['buf', 'mru', 'fil']
    let g:ctrlp_cmd = 'CtrlPMixed'
    " Faster listing <- vim.globpath
    if $os ==? 'windows'
      let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d'
    else
      let g:ctrlp_user_command = 'find %s -type f'
    endif

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X