From 0f1ba5af1684cfc64b3ff5374ef95c70df1caac0 Mon Sep 17 00:00:00 2001 From: ertopogo Date: Thu, 20 Nov 2025 00:37:40 +0100 Subject: Amélioration des scripts avec chemin Windows direct vers WSL et ajout du fichier Cursor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 54 +- PROJECT.md | 223 ++-- .../windows/var_APPDATA_Cursor_User_settings.json | 5 + configs/windows/var_USERPROFILE__vimrc | 1102 ++++++++++---------- configs/wsl/home_.bashrc | 6 +- configs/wsl/home_.screenrc | 2 +- files-config.txt | 22 +- path-mapping.json | 19 +- scripts/sync-from-project.ps1 | 291 +++--- scripts/sync-to-project.ps1 | 455 ++++---- 10 files changed, 1094 insertions(+), 1085 deletions(-) create mode 100644 configs/windows/var_APPDATA_Cursor_User_settings.json diff --git a/.gitignore b/.gitignore index 0278e95..276862f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,27 +1,27 @@ -# Fichiers temporaires -*.tmp -*.temp -*.log - -# Fichiers système -.DS_Store -Thumbs.db -desktop.ini - -# Fichiers d'éditeur -.vscode/ -.idea/ -*.swp -*.swo -*~ - -# Fichiers de sauvegarde -*.bak -*.backup - -# Ne pas ignorer les fichiers de configuration et scripts -!files-config.txt -!path-mapping.json -!scripts/ -!configs/ - +# Fichiers temporaires +*.tmp +*.temp +*.log + +# Fichiers système +.DS_Store +Thumbs.db +desktop.ini + +# Fichiers d'éditeur +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Fichiers de sauvegarde +*.bak +*.backup + +# Ne pas ignorer les fichiers de configuration et scripts +!files-config.txt +!path-mapping.json +!scripts/ +!configs/ + diff --git a/PROJECT.md b/PROJECT.md index 26d8f3b..68ea77a 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -1,111 +1,112 @@ -# Projet : Synchronisation de fichiers de configuration - -## Objectif - -Ce projet permet de centraliser et synchroniser tous les fichiers de configuration (vim, bash, screen, cursor, documentation, etc.) depuis Windows et WSL vers un dépôt git sur chillka. - -## Structure du projet - -``` -config-files-keyvault/ -├── .git/ # Dépôt git local -├── configs/ -│ ├── windows/ # Fichiers provenant de Windows -│ └── wsl/ # Fichiers provenant de WSL -├── scripts/ -│ ├── sync-to-project.ps1 # Script pour copier fichiers vers le projet -│ └── sync-from-project.ps1 # Script pour restaurer fichiers depuis le projet -├── files-config.txt # Liste des fichiers à synchroniser -├── path-mapping.json # Mapping chemins originaux <-> chemins dans le projet -└── PROJECT.md # Documentation du projet -``` - -## Utilisation - -### 1. Ajouter des fichiers à synchroniser - -Éditer le fichier `files-config.txt` et ajouter les fichiers au format : -``` -windows|%USERPROFILE%\.vimrc -wsl|~/.bashrc -``` - -### 2. Copier les fichiers vers le projet - -Exécuter le script PowerShell : -```powershell -.\scripts\sync-to-project.ps1 -``` - -Ce script va : -- Lire `files-config.txt` -- Copier chaque fichier vers `configs/{system}/` -- Créer/mettre à jour `path-mapping.json` avec les chemins originaux - -### 3. Restaurer les fichiers depuis le projet - -Exécuter le script PowerShell : -```powershell -.\scripts\sync-from-project.ps1 -``` - -Ce script va : -- Lire `path-mapping.json` -- Copier chaque fichier depuis `configs/{system}/` vers son emplacement original -- Créer les répertoires parents si nécessaire - -### 4. Synchronisation Git - -Le dépôt git est configuré avec le remote : -``` -toshiro@chillka:/var/data/git/repositories/config-files-keyvault.git -``` - -Pour synchroniser : -```powershell -git add . -git commit -m "Mise à jour des fichiers de configuration" -git push origin main -``` - -## Format de fichiers-config.txt - -Chaque ligne doit suivre le format : -``` -{système}|{chemin} -``` - -Où : -- `{système}` : `windows` ou `wsl` -- `{chemin}` : Chemin du fichier avec support des variables d'environnement Windows (`%VAR%`) ou expansion WSL (`~`) - -Exemples : -``` -windows|%USERPROFILE%\.vimrc -windows|%APPDATA%\Code\User\settings.json -wsl|~/.bashrc -wsl|~/.bash_aliases -wsl|~/.screenrc -``` - -## Format de path-mapping.json - -Ce fichier est généré automatiquement par le script `sync-to-project.ps1`. Il contient le mapping entre les chemins originaux et les chemins dans le projet : - -```json -{ - "windows": { - "%USERPROFILE%\\.vimrc": "configs/windows/.vimrc" - }, - "wsl": { - "~/.bashrc": "configs/wsl/.bashrc" - } -} -``` - -## Notes - -- Les fichiers sont organisés par système d'origine (windows/wsl) pour faciliter la gestion -- Le mapping des chemins permet de restaurer les fichiers à leur emplacement exact -- Les répertoires parents sont créés automatiquement lors de la restauration - +# Projet : Synchronisation de fichiers de configuration + +## Objectif + +Ce projet permet de centraliser et synchroniser tous les fichiers de configuration (vim, bash, screen, cursor, documentation, etc.) depuis Windows et WSL vers un dépôt git sur chillka. + +## Structure du projet + +``` +config-files-keyvault/ +├── .git/ # Dépôt git local +├── configs/ +│ ├── windows/ # Fichiers provenant de Windows +│ └── wsl/ # Fichiers provenant de WSL +├── scripts/ +│ ├── sync-to-project.ps1 # Script pour copier fichiers vers le projet +│ └── sync-from-project.ps1 # Script pour restaurer fichiers depuis le projet +├── files-config.txt # Liste des fichiers à synchroniser +├── path-mapping.json # Mapping chemins originaux <-> chemins dans le projet +└── PROJECT.md # Documentation du projet +``` + +## Utilisation + +### 1. Ajouter des fichiers à synchroniser + +Éditer le fichier `files-config.txt` et ajouter les fichiers au format : +``` +windows|%USERPROFILE%\.vimrc +wsl|~/.bashrc +``` + +### 2. Copier les fichiers vers le projet + +Exécuter le script PowerShell : +```powershell +.\scripts\sync-to-project.ps1 +``` + +Ce script va : +- Lire `files-config.txt` +- Copier chaque fichier vers `configs/{system}/` +- Créer/mettre à jour `path-mapping.json` avec les chemins originaux + +### 3. Restaurer les fichiers depuis le projet + +Exécuter le script PowerShell : +```powershell +.\scripts\sync-from-project.ps1 +``` + +Ce script va : +- Lire `path-mapping.json` +- Copier chaque fichier depuis `configs/{system}/` vers son emplacement original +- Créer les répertoires parents si nécessaire + +### 4. Synchronisation Git + +Le dépôt git est configuré avec le remote : +``` +toshiro@chillka:/var/data/git/repositories/config-files-keyvault.git +``` + +Pour synchroniser : +```powershell +git add . +git commit -m "Mise à jour des fichiers de configuration" +git push origin main +``` + +## Format de fichiers-config.txt + +Chaque ligne doit suivre le format : +``` +{système}|{chemin} +``` + +Où : +- `{système}` : `windows` ou `wsl` +- `{chemin}` : Chemin du fichier avec support des variables d'environnement Windows (`%VAR%`) ou expansion WSL (`~`) + +Exemples : +``` +windows|%USERPROFILE%\.vimrc +windows|%APPDATA%\Cursor\User\settings.json +wsl|~/.bashrc +wsl|~/.bash_aliases +wsl|~/.screenrc +``` + +## Format de path-mapping.json + +Ce fichier est généré automatiquement par le script `sync-to-project.ps1`. Il contient le mapping entre les chemins originaux et les chemins dans le projet : + +```json +{ + "windows": { + "%USERPROFILE%\\.vimrc": "configs/windows/.vimrc" + }, + "wsl": { + "~/.bashrc": "configs/wsl/.bashrc" + } +} +``` + +## Notes + +- Les fichiers sont organisés par système d'origine (windows/wsl) pour faciliter la gestion +- Le mapping des chemins permet de restaurer les fichiers à leur emplacement exact +- Les répertoires parents sont créés automatiquement lors de la restauration +- Les fichiers WSL sont accessibles via le chemin Windows `\\wsl.localhost\Ubuntu\` pour une meilleure performance et fiabilité + diff --git a/configs/windows/var_APPDATA_Cursor_User_settings.json b/configs/windows/var_APPDATA_Cursor_User_settings.json new file mode 100644 index 0000000..a9c7f11 --- /dev/null +++ b/configs/windows/var_APPDATA_Cursor_User_settings.json @@ -0,0 +1,5 @@ +{ + "window.commandCenter": true, + "workbench.colorTheme": "Default Light Modern", + "powershell.powerShellDefaultVersion": "Windows PowerShell (x86)" +} \ No newline at end of file diff --git a/configs/windows/var_USERPROFILE__vimrc b/configs/windows/var_USERPROFILE__vimrc index b9caa86..d0eb449 100644 --- a/configs/windows/var_USERPROFILE__vimrc +++ b/configs/windows/var_USERPROFILE__vimrc @@ -1,551 +1,551 @@ -" ============================================================================== -" Configuration VIM pour Erwin -" ============================================================================== -" Fichier : C:\Users\Erwin\_vimrc copy -" Chemin réel : D:\Users\Erwin\_vimrc (via junction point) -" Dernière mise à jour : 2025 -" -" Structure : -" 1. En-tête et configuration de base VIM -" 2. Configuration Pathogen -" 3. Configuration des types de fichiers et syntaxe -" 4. Options générales (encoding, tabs, search, etc.) -" 5. Interface utilisateur (curseur, police, cloche) -" 6. Raccourcis personnalisés (leader, navigation) -" 7. Plugins configuration (via fichiers séparés si nécessaire) -" 8. Fonctions personnalisées -" 9. Autocompletion par type de fichier -" 10. Configurations spécifiques Windows -" ============================================================================== - -" ============================================================================== -" 1. CONFIGURATION DE BASE VIM -" ============================================================================== - -" Désactiver la compatibilité avec vi (nécessaire pour toutes les fonctionnalités) -set nocompatible -set nocp - -" Charger les configurations d'exemple et Windows -source $VIMRUNTIME/vimrc_example.vim -source $VIMRUNTIME/mswin.vim -behave mswin - -" ============================================================================== -" 2. CONFIGURATION PATHOGEN -" ============================================================================== -" Pathogen permet de charger les plugins depuis le dossier bundle/ -" Les plugins doivent être installés dans : D:\Users\Erwin\vimfiles\bundle\ -" Pathogen se trouve dans : D:\Users\Erwin\vimfiles\autoload\pathogen.vim -" -" Configuration : charger uniquement les plugins depuis vimfiles\bundle\ -" (même emplacement que ce _vimrc) - -" ============================================================================== -" ACTIVATION DES MODULES VIMOUTLINER (AVANT PATHOGEN) -" ============================================================================== -" IMPORTANT : Cette variable doit être définie AVANT execute pathogen#infect() -" pour que les modules VimOutliner (checkbox, tags, etc.) soient chargés -" Format : "module1:module2:module3" -" Modules disponibles : checkbox, tags, smart_paste, math, newhoist, format, clock -if !exists('g:vo_modules_load') - let g:vo_modules_load = "checkbox:tags:smart_paste" -endif - -" ============================================================================== -" CONFIGURATION MINIBUFEXPLORER (AVANT PATHOGEN) -" ============================================================================== -" IMPORTANT : Cette variable doit être définie AVANT le chargement du plugin -" pour empêcher MiniBufExplorer de créer des liens de surlignage par défaut -" Cela permet de définir nos propres couleurs personnalisées -let g:did_minibufexplorer_syntax_inits = 1 - -execute pathogen#infect('bundle/{}') - -" ============================================================================== -" 3. CONFIGURATION DES TYPES DE FICHIERS ET SYNTAXE -" ============================================================================== - -" Activer la détection automatique des types de fichiers -filetype plugin indent on - -" Activer la coloration syntaxique -syntax on - -" Charger tous les fichiers de détection de type de fichier -runtime! ftdetect\*.vim - -" ============================================================================== -" 3.1. CONFIGURATION VIMOUTLINER -" ============================================================================== -" VimOutliner gère les fichiers .otl (outline files) -" Plugin installé dans : D:\Users\Erwin\vimfiles\bundle\vimoutliner-master\ -" Configuration séparée dans : D:\Users\Erwin\vimoutlinerrc -" -" IMPORTANT : maplocalleader doit être défini AVANT le chargement de vimoutliner -" (c'est fait dans la section 6, mais on le vérifie ici) -" -" IMPORTANT : g:vo_modules_load doit être défini AVANT le chargement pour activer -" les plugins (checkbox, tags, smart_paste, etc.) -" Cette variable est définie dans vimoutlinerrc, mais on peut aussi la définir ici -" si nécessaire AVANT execute pathogen#infect() -" -" Vimoutliner charge automatiquement ses plugins via Pathogen -" Le fichier vimoutlinerrc est chargé automatiquement par le plugin s'il existe dans $HOME - -" Charger la configuration vimoutliner personnalisée après Pathogen -" Note : VimOutliner cherche automatiquement vimoutlinerrc dans plusieurs emplacements : -" - .vimoutlinerrc (avec point) dans $HOME -" - vimoutlinerrc (sans point) dans $HOME, $HOME/.vimoutliner, ou $HOME/.vim -" - vimoutlinerrc dans le répertoire du plugin -" Le fichier est chargé automatiquement par le plugin, pas besoin de le sourcer ici - -" ============================================================================== -" 4. OPTIONS GÉNÉRALES -" ============================================================================== - -" ---- Encodage ---- -" Configuration de l'encodage pour supporter UTF-8 -set encoding=utf-8 -set termencoding=utf-8 -set fileencoding=utf-8 - -" ---- Tabulations et indentation ---- -" Configuration par défaut : tabstop=4, shiftwidth=4 -set shiftwidth=4 -set tabstop=4 -" Note : Pour les fichiers .otl, vimoutliner configure tabstop=1 - -" ---- Recherche ---- -" Recherche intelligente : si on utilise des majuscules, recherche sensible à la casse -" Si uniquement minuscules, recherche insensible à la casse -set smartcase -set ignorecase - -" ---- Cloche système ---- -" Désactiver le bip et utiliser un flash visuel à la place -set visualbell - -" ---- Variables d'environnement ---- -" Configuration du répertoire temporaire pour diff (évite erreur E97) -" Sur Windows, utiliser un chemin valide ou laisser la variable système -let $TMP=expand('$TEMP') . '\vimtmp' - -" ============================================================================== -" 5. INTERFACE UTILISATEUR -" ============================================================================== - -" ---- Police de caractères ---- -" Définir la police pour l'interface graphique VIM -set guifont=Consolas:h10:cANSI - -" ---- Configuration du curseur ---- -" Définir les couleurs et le style du curseur -highlight Cursor guifg=black guibg=green -highlight iCursor guifg=white guibg=steelblue -highlight CursorLine guifg=red guibg=blue - -" Configuration du style du curseur selon le mode -set guicursor=n-v-c:block-Cursor -set guicursor+=i:ver100-iCursor -set guicursor+=n-v-c:blinkon0 -set guicursor+=i:blinkwait11 - -" ---- Numérotation des lignes ---- -" Afficher les numéros de ligne -set number -" Optionnel : afficher aussi les numéros relatifs -" set relativenumber - -" ---- Statusline ---- -" Toujours afficher la barre de statut (nécessaire pour airline/powerline) -set laststatus=2 - -" ---- Colorscheme par défaut ---- -" Définir un colorscheme par défaut (sera surchargé par vimoutliner pour les fichiers .otl) -" Vous pouvez changer ce colorscheme selon vos préférences -" colorscheme desert -colorscheme toshiro_light - -" ============================================================================== -" 6. RACCOURCIS PERSONNALISÉS -" ============================================================================== - -" ---- Définition des leaders ---- -" Définir les raccourcis de leader pour les commandes personnalisées -" IMPORTANT : maplocalleader doit être défini AVANT le chargement de vimoutliner -" car vimoutliner utilise maplocalleader pour ses raccourcis (,,c, ,,x, ,,d, etc.) -let maplocalleader=",," -let mapleader=",," - -" ---- Édition du vimrc ---- -" Ouvrir le fichier _vimrc dans une nouvelle fenêtre -nnoremap ev :vsp $MYVIMRC -" Recharger le fichier _vimrc -nnoremap sv :source $MYVIMRC - -" ---- Navigation entre fenêtres avec Alt ---- -" Utiliser Alt + flèches pour naviguer entre les fenêtres -nmap :wincmd k -nmap :wincmd j -nmap :wincmd h -nmap :wincmd l - -" ---- Navigation entre fenêtres avec Ctrl ---- -" Utiliser Ctrl + hjkl pour naviguer entre les fenêtres -nnoremap h -nnoremap j -nnoremap k -nnoremap l - -" ---- Escape avec jk ---- -" Utiliser jk comme raccourci pour Escape (plus rapide) -inoremap jk - -" ---- Copier/Coller vers le presse-papiers système ---- -" Copier vers le presse-papiers système (Ctrl+C) -vmap "+y -" Couper vers le presse-papiers système (Ctrl+X) -vmap "+c -" Coller depuis le presse-papiers système (Ctrl+V en mode visuel) -vmap c"+p -" Coller depuis le presse-papiers système (Ctrl+V en mode insertion) -imap "+pa - -" ---- Désactiver la recherche sur Escape ---- -" Désactiver le surlignage de recherche quand on appuie sur Escape -nnoremap :noh - -" ---- Ouvrir un fichier à gauche ---- -" Ouvrir le fichier sous le curseur dans une nouvelle fenêtre à droite -" La nouvelle fenêtre fait 25% de la largeur totale, la fenêtre actuelle garde sa position -function! OpenFileInNewWindow() - " Sauvegarder le numéro de la fenêtre actuelle - let l:current_win = winnr() - - " Créer une nouvelle fenêtre verticale avec le même buffer (pour garder le curseur sur le fichier) - execute "rightbelow vsplit" - let l:new_win = winnr() - - " Utiliser gf dans la nouvelle fenêtre pour ouvrir le fichier sous le curseur - " gf utilise la logique native de Vim pour trouver les fichiers - normal! gf - - " Redimensionner la nouvelle fenêtre à 25% de la largeur totale - let l:new_width = float2nr(&columns * 0.25) - execute "vertical resize " . l:new_width - - " Le curseur est maintenant dans la nouvelle fenêtre avec le fichier ouvert -endfunction -nnoremap gF :call OpenFileInNewWindow() - -" ---- Largeur des fenêtres ---- -" Redimensionner la fenêtre courante à 100 caractères -nnoremap 1 100 -" Redimensionner la fenêtre courante à 120 caractères -nnoremap 2 120 -" Redimensionner la fenêtre courante à toute la largeur -nnoremap 3 - -" ---- Sélectionner le texte collé ---- -" Sélectionner le texte qui vient d'être collé -nnoremap gp `[v`] - -" ---- Mettre des guillemets autour d'une sélection ---- -" Mettre des guillemets doubles autour du mot sous le curseur -nnoremap q" ciw""P -" Mettre des guillemets simples autour du mot sous le curseur -nnoremap q' ciw''P - -" ---- Tlist (TagList) ---- -" Basculer l'affichage de la liste des tags avec F11 -nnoremap :TlistToggle - -" ---- Ouvrir le fichier courant dans un navigateur ---- -" Ouvrir le fichier courant dans Firefox -nnoremap f :exe ':silent !firefox %' -" Ouvrir le fichier courant dans Chromium -nnoremap c :exe ':silent !chromium-browser %' -" Ouvrir le fichier courant dans Opera -nnoremap o :exe ':silent !opera %' -" Ouvrir le fichier courant dans Internet Explorer -nnoremap e :exe ':silent !iexplore %' - -" ---- Zoom police de caractères ---- -" Augmenter la taille de la police (leader+) -nnoremap + :silent! let &guifont = substitute( - \ &guifont, - \ ':h\zs\d\+', - \ '\=eval(submatch(0)+1)', - \ '') -" Diminuer la taille de la police (leader-) -nnoremap - :silent! let &guifont = substitute( - \ &guifont, - \ ':h\zs\d\+', - \ '\=eval(submatch(0)-1)', - \ '') - -" ---- Abréviations de date ---- -" Insérer la date actuelle (dt -> YYYY-MM-DD) -iabbrev dt =strftime("%Y-%m-%d") -" Insérer la date et l'heure actuelles (dts -> YYYY-MM-DD@HH:MM:SS) -iabbrev dts =strftime("%Y-%m-%d@%H:%M:%S") - -" ---- Chemin du fichier courant ---- -" Insérer le chemin complet du dossier du fichier courant (\fn) -inoremap \fn =expand("%:p:h") - -" ============================================================================== -" 7. CONFIGURATION DES PLUGINS -" ============================================================================== - -" ---- UltiSnips ---- -" Configuration pour les snippets (modèles de code) -let g:UltiSnipsSnippetDirectories = ['~/.vim/UltiSnips', 'UltiSnips'] -let g:UltiSnipsExpandTrigger = "" -let g:UltiSnipsListSnippets = "" -let g:UltiSnipsJumpForwardTrigger = "" -let g:UltiSnipsJumpBackwardTrigger = "" -let g:UltiSnipsUsePythonVersion = 2 - -" ---- EasyMotion ---- -" Plugin de navigation rapide dans le fichier -let g:EasyMotion_do_mapping = 0 " Désactiver les mappings par défaut -let g:EasyMotion_startofline = 0 " Garder la colonne du curseur lors des mouvements JK - -" Activer la recherche insensible à la casse -let g:EasyMotion_smartcase = 1 - -" Mappings avec le leader : utiliser pour toutes les commandes -" Bi-directional find motion : `s{char}{label}` pour aller n'importe où -nmap s (easymotion-s) -" Navigation par mots -nmap w (easymotion-w) -nmap b (easymotion-b) -" Navigation par lignes -nmap j (easymotion-j) -nmap k (easymotion-k) -" Alternative : navigation par lignes avec leader simple -map j (easymotion-j) -map k (easymotion-k) - -" Personnalisation des couleurs EasyMotion -hi link EasyMotionTarget ErrorMsg -hi link EasyMotionShade Comment -hi link EasyMotionTarget2First MatchParen -hi link EasyMotionTarget2Second MatchParen -hi link EasyMotionMoveHL Search - -" ---- MiniBufExplorer (Minibuffer) ---- -" Affiche une liste des buffers ouverts dans une fenêtre séparée -let g:miniBufExplMapWindowNavVim = 1 " Navigation avec Ctrl+hjkl entre fenêtres -let g:miniBufExplMapWindowNavArrows = 1 " Navigation avec flèches -let g:miniBufExplMapCTabToBufs = 1 " Ctrl+Tab pour naviguer entre buffers -let g:miniBufExplModSelTarget = 1 " Améliore la sélection de buffer -let g:miniBufExplUseSingleClick = 1 " Un clic pour ouvrir un buffer -let g:miniBufExplMaxHeight = 1 " Hauteur minimale (1 ligne) - -" Raccourci pour ouvrir/fermer MiniBufExplorer -nnoremap mb :MBEToggle - -" ---- Personnalisation des couleurs MiniBufExplorer ---- -" La variable g:did_minibufexplorer_syntax_inits est définie AVANT Pathogen (ligne 52) -" pour empêcher le plugin de créer des liens par défaut -" Définir les couleurs personnalisées (sans liens) -" Buffer actif : surligné en vert (très visible) -hi MBEVisibleActiveNormal guifg=white guibg=#00ff00 ctermfg=white ctermbg=green gui=bold cterm=bold -hi MBEVisibleActiveChanged guifg=black guibg=#00ff00 ctermfg=black ctermbg=green gui=bold,italic cterm=bold,italic - -" Buffers modifiés : en jaune/orange pour attirer l'attention -hi MBEChanged guifg=black guibg=#ffaa00 ctermfg=black ctermbg=yellow gui=bold cterm=bold -hi MBEVisibleChanged guifg=black guibg=#ffaa00 ctermfg=black ctermbg=yellow gui=bold cterm=bold - -" Buffers normaux : en bleu clair pour une bonne lisibilité -hi MBENormal guifg=#0066cc guibg=#e6f2ff ctermfg=blue ctermbg=lightblue -hi MBEVisibleNormal guifg=#0066cc guibg=#e6f2ff ctermfg=blue ctermbg=lightblue - -" Fonction pour réappliquer les couleurs après chaque rafraîchissement de MiniBufExplorer -function! ReapplyMiniBufExplColors() - " Réappliquer les couleurs (le plugin peut les avoir écrasées) - hi MBEVisibleActiveNormal guifg=white guibg=#00ff00 ctermfg=white ctermbg=green gui=bold cterm=bold - hi MBEVisibleActiveChanged guifg=black guibg=#00ff00 ctermfg=black ctermbg=green gui=bold,italic cterm=bold,italic - hi MBEChanged guifg=black guibg=#ffaa00 ctermfg=black ctermbg=yellow gui=bold cterm=bold - hi MBEVisibleChanged guifg=black guibg=#ffaa00 ctermfg=black ctermbg=yellow gui=bold cterm=bold - hi MBENormal guifg=#0066cc guibg=#e6f2ff ctermfg=blue ctermbg=lightblue - hi MBEVisibleNormal guifg=#0066cc guibg=#e6f2ff ctermfg=blue ctermbg=lightblue -endfunction - -" Appliquer les couleurs après chaque rafraîchissement de MiniBufExplorer -autocmd BufEnter *-MiniBufExplorer-* call ReapplyMiniBufExplColors() -autocmd WinEnter * if &filetype == "" && bufname("%") =~ "-MiniBufExplorer-" | call ReapplyMiniBufExplColors() | endif - -" ---- vim-airline (Powerline pour Vim) ---- -" Barre de statut améliorée - alternative moderne à Powerline -" Ne nécessite pas Python, fonctionne directement avec Vim -" Pathogen charge automatiquement le plugin depuis bundle/vim-airline - -" Configuration minimale pour éviter les bugs -let g:airline#extensions#tabline#enabled = 0 " Désactiver la tabline (peut créer une fenêtre supplémentaire) -let g:airline#extensions#branch#enabled = 1 " Afficher la branche git si disponible -let g:airline#extensions#hunks#enabled = 0 " Désactiver les hunks git (peut causer des problèmes) - -" Thème simple -let g:airline_theme = 'dark' -let g:airline_powerline_fonts = 0 " Désactiver les symboles Powerline (évite les bugs d'affichage) - -" Simplifier les symboles pour éviter les problèmes d'affichage -if !exists('g:airline_symbols') - let g:airline_symbols = {} -endif -let g:airline_symbols.branch = 'branch:' -let g:airline_symbols.readonly = 'RO' -let g:airline_symbols.linenr = 'ln' -let g:airline_symbols.dirty = '*' - -" ---- UndoTree ---- -" Visualisation de l'arbre d'annulation (undo tree) -" Permet de naviguer dans l'historique des modifications -let g:undotree_SetFocusWhenToggle = 1 " Mettre le focus sur UndoTree quand on l'ouvre -let g:undotree_WindowLayout = 2 " Layout : arbre à gauche, diff à droite -let g:undotree_SplitWidth = 30 " Largeur de la fenêtre UndoTree -let g:undotree_DiffpanelHeight = 10 " Hauteur du panneau de différence -let g:undotree_DiffAutoOpen = 1 " Ouvrir automatiquement le panneau de différence -let g:undotree_TreeNodeShape = '◯' " Forme des nœuds de l'arbre -let g:undotree_HighlightChangedText = 1 " Surligner le texte modifié -let g:undotree_HighlightChangedWithSign = 1 " Afficher un signe pour les changements - -" Raccourci pour ouvrir/fermer UndoTree -nnoremap u :UndotreeToggle - -" ---- Calendar ---- -" Plugin calendrier avec intégration Google -let g:calendar_google_calendar = 1 -let g:calendar_google_task = 1 - -" ---- Personnalisation des couleurs ---- -" Commentaires en gris clair -highlight Comment guifg=#888888 ctermfg=gray -" Numéros de ligne en gris clair -highlight LineNr guifg=#cccccc ctermfg=252 - -" ---- Dictionary & Spelling ---- -" Configuration de la correction orthographique -highlight clear SpellBad -highlight SpellBad cterm=underline,bold ctermfg=red - -" ============================================================================== -" 8. FONCTIONS PERSONNALISÉES -" ============================================================================== - -" ---- Fonctions navigateur ---- -" Ajouter les navigateurs au PATH -let $PATH = $PATH . ';C:\Program Files (x86)\Internet Explorer' -let $PATH = $PATH . ';C:\Program Files (x86)\Mozilla Firefox' - -" Fonction pour ouvrir l'URL sous le curseur dans Internet Explorer -function! BrowserIE() - let line = getline(".") - exec ":silent !iexplore.exe ".line -endfunction - -" Fonction pour ouvrir l'URL sous le curseur dans Firefox -function! BrowserFF() - let line = getline(".") - exec ":silent !firefox.exe ".line -endfunction - -" Mappings pour les fonctions navigateur -map w :call BrowserFF() & -map ww :call BrowserIE() & - -" ---- Fonction MyDiff pour Windows ---- -" Configuration de diff pour Windows (évite les erreurs) -set diffexpr=MyDiff() - -function! MyDiff() - let opt = '-a --binary ' - if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif - if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif - let arg1 = v:fname_in - if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif - let arg2 = v:fname_new - if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif - let arg3 = v:fname_out - if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif - if $VIMRUNTIME =~ ' ' - if &sh =~ '\ ' . arg3 - if exists('l:shxq_sav') - let &shellxquote=l:shxq_sav - endif -endfunction - -" ---- Fonctions de zoom police (alternative) ---- -" Fonctions pour augmenter/diminuer la taille de la police -" Note : Les raccourcis + et - sont déjà définis dans la section 6 - -function! AdjustFontSize(amount) - let fontname = substitute(&guifont, '^\(.* \)\([1-9][0-9]*\)$', '\1', '') - let cursize = substitute(&guifont, '^\(.* \)\([1-9][0-9]*\)$', '\2', '') - let newsize = cursize + a:amount - if (newsize >= 6) && (newsize <= 16) - let newfont = fontname . newsize - let &guifont = newfont - endif -endfunction - -function! LargerFont() - call AdjustFontSize(1) -endfunction -command! LargerFont call LargerFont() - -function! SmallerFont() - call AdjustFontSize(-1) -endfunction -command! SmallerFont call SmallerFont() - -" ============================================================================== -" 9. AUTOCOMPLETION PAR TYPE DE FICHIER -" ============================================================================== - -" Configuration de l'autocomplétion (omnifunc) pour chaque type de fichier -autocmd FileType python set omnifunc=pythoncomplete#Complete -autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS -autocmd FileType html set omnifunc=htmlcomplete#CompleteTags -autocmd FileType css set omnifunc=csscomplete#CompleteCSS -autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags -autocmd FileType php set omnifunc=phpcomplete#CompletePHP -autocmd FileType c set omnifunc=ccomplete#Complete -autocmd FileType votl set omnifunc=votlcomplete#Complete -autocmd FileType ps1 set omnifunc=poshcomplete#CompleteCommand - -" ============================================================================== -" 10. CONFIGURATIONS SPÉCIFIQUES WINDOWS -" ============================================================================== - -" ---- Configuration Python ---- -" Définir le chemin Python 3 pour VIM -set pythonthreehome="C:\Users\Erwin\AppData\Local\Programs\Python\Python310-32" -set pythonthreedll="C:\Users\Erwin\AppData\Local\Programs\Python\Python310-32\python310.dll" - -" ---- PoshComplete (PowerShell completion) ---- -" Configuration pour l'autocomplétion PowerShell (si le plugin est installé) -let g:PoshComplete_Port='1234' -" Note : Les chemins suivants doivent être ajustés selon votre installation -" set rtp+=C:\Users\pombette\.vim\bundle\poshcomplete-vim -" set rtp+=C:\Users\pombette\.vim\bundle\vimproc.vim\autoload - -" ============================================================================== -" FIN DE LA CONFIGURATION -" ============================================================================== +" ============================================================================== +" Configuration VIM pour Erwin +" ============================================================================== +" Fichier : C:\Users\Erwin\_vimrc copy +" Chemin réel : D:\Users\Erwin\_vimrc (via junction point) +" Dernière mise à jour : 2025 +" +" Structure : +" 1. En-tête et configuration de base VIM +" 2. Configuration Pathogen +" 3. Configuration des types de fichiers et syntaxe +" 4. Options générales (encoding, tabs, search, etc.) +" 5. Interface utilisateur (curseur, police, cloche) +" 6. Raccourcis personnalisés (leader, navigation) +" 7. Plugins configuration (via fichiers séparés si nécessaire) +" 8. Fonctions personnalisées +" 9. Autocompletion par type de fichier +" 10. Configurations spécifiques Windows +" ============================================================================== + +" ============================================================================== +" 1. CONFIGURATION DE BASE VIM +" ============================================================================== + +" Désactiver la compatibilité avec vi (nécessaire pour toutes les fonctionnalités) +set nocompatible +set nocp + +" Charger les configurations d'exemple et Windows +source $VIMRUNTIME/vimrc_example.vim +source $VIMRUNTIME/mswin.vim +behave mswin + +" ============================================================================== +" 2. CONFIGURATION PATHOGEN +" ============================================================================== +" Pathogen permet de charger les plugins depuis le dossier bundle/ +" Les plugins doivent être installés dans : D:\Users\Erwin\vimfiles\bundle\ +" Pathogen se trouve dans : D:\Users\Erwin\vimfiles\autoload\pathogen.vim +" +" Configuration : charger uniquement les plugins depuis vimfiles\bundle\ +" (même emplacement que ce _vimrc) + +" ============================================================================== +" ACTIVATION DES MODULES VIMOUTLINER (AVANT PATHOGEN) +" ============================================================================== +" IMPORTANT : Cette variable doit être définie AVANT execute pathogen#infect() +" pour que les modules VimOutliner (checkbox, tags, etc.) soient chargés +" Format : "module1:module2:module3" +" Modules disponibles : checkbox, tags, smart_paste, math, newhoist, format, clock +if !exists('g:vo_modules_load') + let g:vo_modules_load = "checkbox:tags:smart_paste" +endif + +" ============================================================================== +" CONFIGURATION MINIBUFEXPLORER (AVANT PATHOGEN) +" ============================================================================== +" IMPORTANT : Cette variable doit être définie AVANT le chargement du plugin +" pour empêcher MiniBufExplorer de créer des liens de surlignage par défaut +" Cela permet de définir nos propres couleurs personnalisées +let g:did_minibufexplorer_syntax_inits = 1 + +execute pathogen#infect('bundle/{}') + +" ============================================================================== +" 3. CONFIGURATION DES TYPES DE FICHIERS ET SYNTAXE +" ============================================================================== + +" Activer la détection automatique des types de fichiers +filetype plugin indent on + +" Activer la coloration syntaxique +syntax on + +" Charger tous les fichiers de détection de type de fichier +runtime! ftdetect\*.vim + +" ============================================================================== +" 3.1. CONFIGURATION VIMOUTLINER +" ============================================================================== +" VimOutliner gère les fichiers .otl (outline files) +" Plugin installé dans : D:\Users\Erwin\vimfiles\bundle\vimoutliner-master\ +" Configuration séparée dans : D:\Users\Erwin\vimoutlinerrc +" +" IMPORTANT : maplocalleader doit être défini AVANT le chargement de vimoutliner +" (c'est fait dans la section 6, mais on le vérifie ici) +" +" IMPORTANT : g:vo_modules_load doit être défini AVANT le chargement pour activer +" les plugins (checkbox, tags, smart_paste, etc.) +" Cette variable est définie dans vimoutlinerrc, mais on peut aussi la définir ici +" si nécessaire AVANT execute pathogen#infect() +" +" Vimoutliner charge automatiquement ses plugins via Pathogen +" Le fichier vimoutlinerrc est chargé automatiquement par le plugin s'il existe dans $HOME + +" Charger la configuration vimoutliner personnalisée après Pathogen +" Note : VimOutliner cherche automatiquement vimoutlinerrc dans plusieurs emplacements : +" - .vimoutlinerrc (avec point) dans $HOME +" - vimoutlinerrc (sans point) dans $HOME, $HOME/.vimoutliner, ou $HOME/.vim +" - vimoutlinerrc dans le répertoire du plugin +" Le fichier est chargé automatiquement par le plugin, pas besoin de le sourcer ici + +" ============================================================================== +" 4. OPTIONS GÉNÉRALES +" ============================================================================== + +" ---- Encodage ---- +" Configuration de l'encodage pour supporter UTF-8 +set encoding=utf-8 +set termencoding=utf-8 +set fileencoding=utf-8 + +" ---- Tabulations et indentation ---- +" Configuration par défaut : tabstop=4, shiftwidth=4 +set shiftwidth=4 +set tabstop=4 +" Note : Pour les fichiers .otl, vimoutliner configure tabstop=1 + +" ---- Recherche ---- +" Recherche intelligente : si on utilise des majuscules, recherche sensible à la casse +" Si uniquement minuscules, recherche insensible à la casse +set smartcase +set ignorecase + +" ---- Cloche système ---- +" Désactiver le bip et utiliser un flash visuel à la place +set visualbell + +" ---- Variables d'environnement ---- +" Configuration du répertoire temporaire pour diff (évite erreur E97) +" Sur Windows, utiliser un chemin valide ou laisser la variable système +let $TMP=expand('$TEMP') . '\vimtmp' + +" ============================================================================== +" 5. INTERFACE UTILISATEUR +" ============================================================================== + +" ---- Police de caractères ---- +" Définir la police pour l'interface graphique VIM +set guifont=Consolas:h10:cANSI + +" ---- Configuration du curseur ---- +" Définir les couleurs et le style du curseur +highlight Cursor guifg=black guibg=green +highlight iCursor guifg=white guibg=steelblue +highlight CursorLine guifg=red guibg=blue + +" Configuration du style du curseur selon le mode +set guicursor=n-v-c:block-Cursor +set guicursor+=i:ver100-iCursor +set guicursor+=n-v-c:blinkon0 +set guicursor+=i:blinkwait11 + +" ---- Numérotation des lignes ---- +" Afficher les numéros de ligne +set number +" Optionnel : afficher aussi les numéros relatifs +" set relativenumber + +" ---- Statusline ---- +" Toujours afficher la barre de statut (nécessaire pour airline/powerline) +set laststatus=2 + +" ---- Colorscheme par défaut ---- +" Définir un colorscheme par défaut (sera surchargé par vimoutliner pour les fichiers .otl) +" Vous pouvez changer ce colorscheme selon vos préférences +" colorscheme desert +colorscheme toshiro_light + +" ============================================================================== +" 6. RACCOURCIS PERSONNALISÉS +" ============================================================================== + +" ---- Définition des leaders ---- +" Définir les raccourcis de leader pour les commandes personnalisées +" IMPORTANT : maplocalleader doit être défini AVANT le chargement de vimoutliner +" car vimoutliner utilise maplocalleader pour ses raccourcis (,,c, ,,x, ,,d, etc.) +let maplocalleader=",," +let mapleader=",," + +" ---- Édition du vimrc ---- +" Ouvrir le fichier _vimrc dans une nouvelle fenêtre +nnoremap ev :vsp $MYVIMRC +" Recharger le fichier _vimrc +nnoremap sv :source $MYVIMRC + +" ---- Navigation entre fenêtres avec Alt ---- +" Utiliser Alt + flèches pour naviguer entre les fenêtres +nmap :wincmd k +nmap :wincmd j +nmap :wincmd h +nmap :wincmd l + +" ---- Navigation entre fenêtres avec Ctrl ---- +" Utiliser Ctrl + hjkl pour naviguer entre les fenêtres +nnoremap h +nnoremap j +nnoremap k +nnoremap l + +" ---- Escape avec jk ---- +" Utiliser jk comme raccourci pour Escape (plus rapide) +inoremap jk + +" ---- Copier/Coller vers le presse-papiers système ---- +" Copier vers le presse-papiers système (Ctrl+C) +vmap "+y +" Couper vers le presse-papiers système (Ctrl+X) +vmap "+c +" Coller depuis le presse-papiers système (Ctrl+V en mode visuel) +vmap c"+p +" Coller depuis le presse-papiers système (Ctrl+V en mode insertion) +imap "+pa + +" ---- Désactiver la recherche sur Escape ---- +" Désactiver le surlignage de recherche quand on appuie sur Escape +nnoremap :noh + +" ---- Ouvrir un fichier à gauche ---- +" Ouvrir le fichier sous le curseur dans une nouvelle fenêtre à droite +" La nouvelle fenêtre fait 25% de la largeur totale, la fenêtre actuelle garde sa position +function! OpenFileInNewWindow() + " Sauvegarder le numéro de la fenêtre actuelle + let l:current_win = winnr() + + " Créer une nouvelle fenêtre verticale avec le même buffer (pour garder le curseur sur le fichier) + execute "rightbelow vsplit" + let l:new_win = winnr() + + " Utiliser gf dans la nouvelle fenêtre pour ouvrir le fichier sous le curseur + " gf utilise la logique native de Vim pour trouver les fichiers + normal! gf + + " Redimensionner la nouvelle fenêtre à 25% de la largeur totale + let l:new_width = float2nr(&columns * 0.25) + execute "vertical resize " . l:new_width + + " Le curseur est maintenant dans la nouvelle fenêtre avec le fichier ouvert +endfunction +nnoremap gF :call OpenFileInNewWindow() + +" ---- Largeur des fenêtres ---- +" Redimensionner la fenêtre courante à 100 caractères +nnoremap 1 100 +" Redimensionner la fenêtre courante à 120 caractères +nnoremap 2 120 +" Redimensionner la fenêtre courante à toute la largeur +nnoremap 3 + +" ---- Sélectionner le texte collé ---- +" Sélectionner le texte qui vient d'être collé +nnoremap gp `[v`] + +" ---- Mettre des guillemets autour d'une sélection ---- +" Mettre des guillemets doubles autour du mot sous le curseur +nnoremap q" ciw""P +" Mettre des guillemets simples autour du mot sous le curseur +nnoremap q' ciw''P + +" ---- Tlist (TagList) ---- +" Basculer l'affichage de la liste des tags avec F11 +nnoremap :TlistToggle + +" ---- Ouvrir le fichier courant dans un navigateur ---- +" Ouvrir le fichier courant dans Firefox +nnoremap f :exe ':silent !firefox %' +" Ouvrir le fichier courant dans Chromium +nnoremap c :exe ':silent !chromium-browser %' +" Ouvrir le fichier courant dans Opera +nnoremap o :exe ':silent !opera %' +" Ouvrir le fichier courant dans Internet Explorer +nnoremap e :exe ':silent !iexplore %' + +" ---- Zoom police de caractères ---- +" Augmenter la taille de la police (leader+) +nnoremap + :silent! let &guifont = substitute( + \ &guifont, + \ ':h\zs\d\+', + \ '\=eval(submatch(0)+1)', + \ '') +" Diminuer la taille de la police (leader-) +nnoremap - :silent! let &guifont = substitute( + \ &guifont, + \ ':h\zs\d\+', + \ '\=eval(submatch(0)-1)', + \ '') + +" ---- Abréviations de date ---- +" Insérer la date actuelle (dt -> YYYY-MM-DD) +iabbrev dt =strftime("%Y-%m-%d") +" Insérer la date et l'heure actuelles (dts -> YYYY-MM-DD@HH:MM:SS) +iabbrev dts =strftime("%Y-%m-%d@%H:%M:%S") + +" ---- Chemin du fichier courant ---- +" Insérer le chemin complet du dossier du fichier courant (\fn) +inoremap \fn =expand("%:p:h") + +" ============================================================================== +" 7. CONFIGURATION DES PLUGINS +" ============================================================================== + +" ---- UltiSnips ---- +" Configuration pour les snippets (modèles de code) +let g:UltiSnipsSnippetDirectories = ['~/.vim/UltiSnips', 'UltiSnips'] +let g:UltiSnipsExpandTrigger = "" +let g:UltiSnipsListSnippets = "" +let g:UltiSnipsJumpForwardTrigger = "" +let g:UltiSnipsJumpBackwardTrigger = "" +let g:UltiSnipsUsePythonVersion = 2 + +" ---- EasyMotion ---- +" Plugin de navigation rapide dans le fichier +let g:EasyMotion_do_mapping = 0 " Désactiver les mappings par défaut +let g:EasyMotion_startofline = 0 " Garder la colonne du curseur lors des mouvements JK + +" Activer la recherche insensible à la casse +let g:EasyMotion_smartcase = 1 + +" Mappings avec le leader : utiliser pour toutes les commandes +" Bi-directional find motion : `s{char}{label}` pour aller n'importe où +nmap s (easymotion-s) +" Navigation par mots +nmap w (easymotion-w) +nmap b (easymotion-b) +" Navigation par lignes +nmap j (easymotion-j) +nmap k (easymotion-k) +" Alternative : navigation par lignes avec leader simple +map j (easymotion-j) +map k (easymotion-k) + +" Personnalisation des couleurs EasyMotion +hi link EasyMotionTarget ErrorMsg +hi link EasyMotionShade Comment +hi link EasyMotionTarget2First MatchParen +hi link EasyMotionTarget2Second MatchParen +hi link EasyMotionMoveHL Search + +" ---- MiniBufExplorer (Minibuffer) ---- +" Affiche une liste des buffers ouverts dans une fenêtre séparée +let g:miniBufExplMapWindowNavVim = 1 " Navigation avec Ctrl+hjkl entre fenêtres +let g:miniBufExplMapWindowNavArrows = 1 " Navigation avec flèches +let g:miniBufExplMapCTabToBufs = 1 " Ctrl+Tab pour naviguer entre buffers +let g:miniBufExplModSelTarget = 1 " Améliore la sélection de buffer +let g:miniBufExplUseSingleClick = 1 " Un clic pour ouvrir un buffer +let g:miniBufExplMaxHeight = 1 " Hauteur minimale (1 ligne) + +" Raccourci pour ouvrir/fermer MiniBufExplorer +nnoremap mb :MBEToggle + +" ---- Personnalisation des couleurs MiniBufExplorer ---- +" La variable g:did_minibufexplorer_syntax_inits est définie AVANT Pathogen (ligne 52) +" pour empêcher le plugin de créer des liens par défaut +" Définir les couleurs personnalisées (sans liens) +" Buffer actif : surligné en vert (très visible) +hi MBEVisibleActiveNormal guifg=white guibg=#00ff00 ctermfg=white ctermbg=green gui=bold cterm=bold +hi MBEVisibleActiveChanged guifg=black guibg=#00ff00 ctermfg=black ctermbg=green gui=bold,italic cterm=bold,italic + +" Buffers modifiés : en jaune/orange pour attirer l'attention +hi MBEChanged guifg=black guibg=#ffaa00 ctermfg=black ctermbg=yellow gui=bold cterm=bold +hi MBEVisibleChanged guifg=black guibg=#ffaa00 ctermfg=black ctermbg=yellow gui=bold cterm=bold + +" Buffers normaux : en bleu clair pour une bonne lisibilité +hi MBENormal guifg=#0066cc guibg=#e6f2ff ctermfg=blue ctermbg=lightblue +hi MBEVisibleNormal guifg=#0066cc guibg=#e6f2ff ctermfg=blue ctermbg=lightblue + +" Fonction pour réappliquer les couleurs après chaque rafraîchissement de MiniBufExplorer +function! ReapplyMiniBufExplColors() + " Réappliquer les couleurs (le plugin peut les avoir écrasées) + hi MBEVisibleActiveNormal guifg=white guibg=#00ff00 ctermfg=white ctermbg=green gui=bold cterm=bold + hi MBEVisibleActiveChanged guifg=black guibg=#00ff00 ctermfg=black ctermbg=green gui=bold,italic cterm=bold,italic + hi MBEChanged guifg=black guibg=#ffaa00 ctermfg=black ctermbg=yellow gui=bold cterm=bold + hi MBEVisibleChanged guifg=black guibg=#ffaa00 ctermfg=black ctermbg=yellow gui=bold cterm=bold + hi MBENormal guifg=#0066cc guibg=#e6f2ff ctermfg=blue ctermbg=lightblue + hi MBEVisibleNormal guifg=#0066cc guibg=#e6f2ff ctermfg=blue ctermbg=lightblue +endfunction + +" Appliquer les couleurs après chaque rafraîchissement de MiniBufExplorer +autocmd BufEnter *-MiniBufExplorer-* call ReapplyMiniBufExplColors() +autocmd WinEnter * if &filetype == "" && bufname("%") =~ "-MiniBufExplorer-" | call ReapplyMiniBufExplColors() | endif + +" ---- vim-airline (Powerline pour Vim) ---- +" Barre de statut améliorée - alternative moderne à Powerline +" Ne nécessite pas Python, fonctionne directement avec Vim +" Pathogen charge automatiquement le plugin depuis bundle/vim-airline + +" Configuration minimale pour éviter les bugs +let g:airline#extensions#tabline#enabled = 0 " Désactiver la tabline (peut créer une fenêtre supplémentaire) +let g:airline#extensions#branch#enabled = 1 " Afficher la branche git si disponible +let g:airline#extensions#hunks#enabled = 0 " Désactiver les hunks git (peut causer des problèmes) + +" Thème simple +let g:airline_theme = 'dark' +let g:airline_powerline_fonts = 0 " Désactiver les symboles Powerline (évite les bugs d'affichage) + +" Simplifier les symboles pour éviter les problèmes d'affichage +if !exists('g:airline_symbols') + let g:airline_symbols = {} +endif +let g:airline_symbols.branch = 'branch:' +let g:airline_symbols.readonly = 'RO' +let g:airline_symbols.linenr = 'ln' +let g:airline_symbols.dirty = '*' + +" ---- UndoTree ---- +" Visualisation de l'arbre d'annulation (undo tree) +" Permet de naviguer dans l'historique des modifications +let g:undotree_SetFocusWhenToggle = 1 " Mettre le focus sur UndoTree quand on l'ouvre +let g:undotree_WindowLayout = 2 " Layout : arbre à gauche, diff à droite +let g:undotree_SplitWidth = 30 " Largeur de la fenêtre UndoTree +let g:undotree_DiffpanelHeight = 10 " Hauteur du panneau de différence +let g:undotree_DiffAutoOpen = 1 " Ouvrir automatiquement le panneau de différence +let g:undotree_TreeNodeShape = '◯' " Forme des nœuds de l'arbre +let g:undotree_HighlightChangedText = 1 " Surligner le texte modifié +let g:undotree_HighlightChangedWithSign = 1 " Afficher un signe pour les changements + +" Raccourci pour ouvrir/fermer UndoTree +nnoremap u :UndotreeToggle + +" ---- Calendar ---- +" Plugin calendrier avec intégration Google +let g:calendar_google_calendar = 1 +let g:calendar_google_task = 1 + +" ---- Personnalisation des couleurs ---- +" Commentaires en gris clair +highlight Comment guifg=#888888 ctermfg=gray +" Numéros de ligne en gris clair +highlight LineNr guifg=#cccccc ctermfg=252 + +" ---- Dictionary & Spelling ---- +" Configuration de la correction orthographique +highlight clear SpellBad +highlight SpellBad cterm=underline,bold ctermfg=red + +" ============================================================================== +" 8. FONCTIONS PERSONNALISÉES +" ============================================================================== + +" ---- Fonctions navigateur ---- +" Ajouter les navigateurs au PATH +let $PATH = $PATH . ';C:\Program Files (x86)\Internet Explorer' +let $PATH = $PATH . ';C:\Program Files (x86)\Mozilla Firefox' + +" Fonction pour ouvrir l'URL sous le curseur dans Internet Explorer +function! BrowserIE() + let line = getline(".") + exec ":silent !iexplore.exe ".line +endfunction + +" Fonction pour ouvrir l'URL sous le curseur dans Firefox +function! BrowserFF() + let line = getline(".") + exec ":silent !firefox.exe ".line +endfunction + +" Mappings pour les fonctions navigateur +map w :call BrowserFF() & +map ww :call BrowserIE() & + +" ---- Fonction MyDiff pour Windows ---- +" Configuration de diff pour Windows (évite les erreurs) +set diffexpr=MyDiff() + +function! MyDiff() + let opt = '-a --binary ' + if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif + if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif + let arg1 = v:fname_in + if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif + let arg2 = v:fname_new + if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif + let arg3 = v:fname_out + if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif + if $VIMRUNTIME =~ ' ' + if &sh =~ '\ ' . arg3 + if exists('l:shxq_sav') + let &shellxquote=l:shxq_sav + endif +endfunction + +" ---- Fonctions de zoom police (alternative) ---- +" Fonctions pour augmenter/diminuer la taille de la police +" Note : Les raccourcis + et - sont déjà définis dans la section 6 + +function! AdjustFontSize(amount) + let fontname = substitute(&guifont, '^\(.* \)\([1-9][0-9]*\)$', '\1', '') + let cursize = substitute(&guifont, '^\(.* \)\([1-9][0-9]*\)$', '\2', '') + let newsize = cursize + a:amount + if (newsize >= 6) && (newsize <= 16) + let newfont = fontname . newsize + let &guifont = newfont + endif +endfunction + +function! LargerFont() + call AdjustFontSize(1) +endfunction +command! LargerFont call LargerFont() + +function! SmallerFont() + call AdjustFontSize(-1) +endfunction +command! SmallerFont call SmallerFont() + +" ============================================================================== +" 9. AUTOCOMPLETION PAR TYPE DE FICHIER +" ============================================================================== + +" Configuration de l'autocomplétion (omnifunc) pour chaque type de fichier +autocmd FileType python set omnifunc=pythoncomplete#Complete +autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS +autocmd FileType html set omnifunc=htmlcomplete#CompleteTags +autocmd FileType css set omnifunc=csscomplete#CompleteCSS +autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags +autocmd FileType php set omnifunc=phpcomplete#CompletePHP +autocmd FileType c set omnifunc=ccomplete#Complete +autocmd FileType votl set omnifunc=votlcomplete#Complete +autocmd FileType ps1 set omnifunc=poshcomplete#CompleteCommand + +" ============================================================================== +" 10. CONFIGURATIONS SPÉCIFIQUES WINDOWS +" ============================================================================== + +" ---- Configuration Python ---- +" Définir le chemin Python 3 pour VIM +set pythonthreehome="C:\Users\Erwin\AppData\Local\Programs\Python\Python310-32" +set pythonthreedll="C:\Users\Erwin\AppData\Local\Programs\Python\Python310-32\python310.dll" + +" ---- PoshComplete (PowerShell completion) ---- +" Configuration pour l'autocomplétion PowerShell (si le plugin est installé) +let g:PoshComplete_Port='1234' +" Note : Les chemins suivants doivent être ajustés selon votre installation +" set rtp+=C:\Users\pombette\.vim\bundle\poshcomplete-vim +" set rtp+=C:\Users\pombette\.vim\bundle\vimproc.vim\autoload + +" ============================================================================== +" FIN DE LA CONFIGURATION +" ============================================================================== diff --git a/configs/wsl/home_.bashrc b/configs/wsl/home_.bashrc index e2c8cf7..8820077 100644 --- a/configs/wsl/home_.bashrc +++ b/configs/wsl/home_.bashrc @@ -1,4 +1,4 @@ -set -o vi +set -o vi alias df="dfC -aT" # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) @@ -166,8 +166,8 @@ fi bind 'set bell-style none' ~/configure_dns_wsl.sh -# Ajouter les entr├®es /etc/hosts au d├®marrage (WSL) -# Ne s'ex├®cute que lors de l'ouverture du premier screen (fen├¬tre 0) +# Ajouter les entrées /etc/hosts au démarrage (WSL) +# Ne s'exécute que lors de l'ouverture du premier screen (fenêtre 0) if [ -n "$STY" ] && [ "$WINDOW" = "0" ]; then [ -f /home/toshiro/.local/bin/persist_hosts_wsl.sh ] && /home/toshiro/.local/bin/persist_hosts_wsl.sh fi diff --git a/configs/wsl/home_.screenrc b/configs/wsl/home_.screenrc index c80ee21..cba6874 100644 --- a/configs/wsl/home_.screenrc +++ b/configs/wsl/home_.screenrc @@ -1,4 +1,4 @@ -# added for cygwin on windows 2015-08-02@12:17:31 +# added for cygwin on windows 2015-08-02@12:17:31 shell -bash # added the bash completion with tab diff --git a/files-config.txt b/files-config.txt index 6e1bdc3..cf8c507 100644 --- a/files-config.txt +++ b/files-config.txt @@ -1,11 +1,11 @@ -# Format: {système}|{chemin} -# Système: windows ou wsl -# Chemin: supporte les variables d'environnement Windows (%VAR%) et expansion WSL (~) -# -# Exemples: -windows|%USERPROFILE%\_vimrc -windows|%APPDATA%\Code\User\settings.json -wsl|~/.bashrc -wsl|~/.bash_aliases -wsl|~/.screenrc - +# Format: {système}|{chemin} +# Système: windows ou wsl +# Chemin: supporte les variables d'environnement Windows (%VAR%) et expansion WSL (~) +# +# Exemples: +windows|%USERPROFILE%\_vimrc +windows|%APPDATA%\Cursor\User\settings.json +wsl|~/.bashrc +wsl|~/.bash_aliases +wsl|~/.screenrc + diff --git a/path-mapping.json b/path-mapping.json index 95e99ea..8b77a8f 100644 --- a/path-mapping.json +++ b/path-mapping.json @@ -1,9 +1,10 @@ -{ - "windows": { - "%USERPROFILE%\\_vimrc": "configs\\windows\\var_USERPROFILE__vimrc" - }, - "wsl": { - "~/.bashrc": "configs\\wsl\\home_.bashrc", - "~/.screenrc": "configs\\wsl\\home_.screenrc" - } -} +{ + "windows": { + "%APPDATA%\\Cursor\\User\\settings.json": "configs\\windows\\var_APPDATA_Cursor_User_settings.json", + "%USERPROFILE%\\_vimrc": "configs\\windows\\var_USERPROFILE__vimrc" + }, + "wsl": { + "~/.bashrc": "configs\\wsl\\home_.bashrc", + "~/.screenrc": "configs\\wsl\\home_.screenrc" + } +} diff --git a/scripts/sync-from-project.ps1 b/scripts/sync-from-project.ps1 index 45ff258..73ba1c5 100644 --- a/scripts/sync-from-project.ps1 +++ b/scripts/sync-from-project.ps1 @@ -1,137 +1,154 @@ -# Script pour restaurer les fichiers de configuration depuis le projet -# Lit path-mapping.json et copie chaque fichier vers son emplacement original - -param( - [string]$MappingFile = "path-mapping.json" -) - -$ErrorActionPreference = "Stop" - -# Vérifier que le fichier de mapping existe -if (-not (Test-Path $MappingFile)) { - Write-Error "Le fichier de mapping '$MappingFile' n'existe pas. Exécutez d'abord sync-to-project.ps1" - exit 1 -} - -# Charger le mapping -try { - $mapping = Get-Content $MappingFile -Raw | ConvertFrom-Json -} catch { - Write-Error "Impossible de charger le fichier de mapping: $_" - exit 1 -} - -$restoredCount = 0 -$skippedCount = 0 -$errorCount = 0 - -# Fonction pour résoudre un chemin Windows -function Resolve-WindowsPath { - param([string]$path) - - # Remplacer les variables d'environnement - $resolved = $path - $resolved = $resolved -replace '%USERPROFILE%', $env:USERPROFILE - $resolved = $resolved -replace '%APPDATA%', $env:APPDATA - $resolved = $resolved -replace '%LOCALAPPDATA%', $env:LOCALAPPDATA - $resolved = $resolved -replace '%HOME%', $env:HOME - - # Remplacer les autres variables d'environnement - $resolved = [System.Environment]::ExpandEnvironmentVariables($resolved) - - return $resolved -} - -# Traiter les fichiers Windows -if ($mapping.windows) { - $mapping.windows.PSObject.Properties | ForEach-Object { - $originalPath = $_.Name - $projectPath = $_.Value - - try { - # Vérifier que le fichier source existe dans le projet - if (-not (Test-Path $projectPath)) { - Write-Warning "Fichier source introuvable dans le projet: $projectPath" - $skippedCount++ - return - } - - # Résoudre le chemin de destination - $destinationPath = Resolve-WindowsPath $originalPath - - # Créer le répertoire parent si nécessaire - $destinationDir = Split-Path $destinationPath -Parent - if ($destinationDir -and -not (Test-Path $destinationDir)) { - New-Item -ItemType Directory -Path $destinationDir -Force | Out-Null - Write-Host "Créé le répertoire: $destinationDir" - } - - # Copier le fichier - Copy-Item -Path $projectPath -Destination $destinationPath -Force - - Write-Host "Restauré: $projectPath -> $destinationPath" - $restoredCount++ - - } catch { - Write-Error "Erreur lors de la restauration de '$originalPath': $_" - $errorCount++ - } - } -} - -# Traiter les fichiers WSL -if ($mapping.wsl) { - $mapping.wsl.PSObject.Properties | ForEach-Object { - $originalPath = $_.Name - $projectPath = $_.Value - - try { - # Vérifier que le fichier source existe dans le projet - if (-not (Test-Path $projectPath)) { - Write-Warning "Fichier source introuvable dans le projet: $projectPath" - $skippedCount++ - return - } - - # Résoudre le chemin de destination WSL - $wslDestination = $originalPath - if ($wslDestination -match '^~') { - $wslDestination = wsl bash -c "echo $wslDestination" - } - - # Créer le répertoire parent si nécessaire - $wslDir = Split-Path $wslDestination -Parent - if ($wslDir) { - wsl mkdir -p "$wslDir" 2>$null - } - - # Copier le fichier vers WSL - # Convertir le chemin Windows en chemin WSL - $wslSource = (wsl wslpath -a $projectPath) - wsl cp "$wslSource" "$wslDestination" - - if ($LASTEXITCODE -ne 0) { - # Fallback: utiliser PowerShell pour copier vers WSL - $content = Get-Content $projectPath -Raw -Encoding UTF8 - $tempFile = [System.IO.Path]::GetTempFileName() - Set-Content -Path $tempFile -Value $content -Encoding UTF8 - $wslTemp = (wsl wslpath -a $tempFile) - wsl cp "$wslTemp" "$wslDestination" - Remove-Item $tempFile - } - - Write-Host "Restauré (WSL): $projectPath -> $wslDestination" - $restoredCount++ - - } catch { - Write-Error "Erreur lors de la restauration WSL de '$originalPath': $_" - $errorCount++ - } - } -} - -Write-Host "`nRésumé:" -Write-Host " Fichiers restaurés: $restoredCount" -Write-Host " Fichiers ignorés: $skippedCount" -Write-Host " Erreurs: $errorCount" - +# Script pour restaurer les fichiers de configuration depuis le projet +# Lit path-mapping.json et copie chaque fichier vers son emplacement original + +param( + [string]$MappingFile = "path-mapping.json" +) + +$ErrorActionPreference = "Stop" + +# Vérifier que le fichier de mapping existe +if (-not (Test-Path $MappingFile)) { + Write-Error "Le fichier de mapping '$MappingFile' n'existe pas. Exécutez d'abord sync-to-project.ps1" + exit 1 +} + +# Charger le mapping +try { + $mapping = Get-Content $MappingFile -Raw | ConvertFrom-Json +} catch { + Write-Error "Impossible de charger le fichier de mapping: $_" + exit 1 +} + +$restoredCount = 0 +$skippedCount = 0 +$errorCount = 0 + +# Fonction pour résoudre un chemin Windows +function Resolve-WindowsPath { + param([string]$path) + + # Remplacer les variables d'environnement + $resolved = $path + $resolved = $resolved -replace '%USERPROFILE%', $env:USERPROFILE + $resolved = $resolved -replace '%APPDATA%', $env:APPDATA + $resolved = $resolved -replace '%LOCALAPPDATA%', $env:LOCALAPPDATA + $resolved = $resolved -replace '%HOME%', $env:HOME + + # Remplacer les autres variables d'environnement + $resolved = [System.Environment]::ExpandEnvironmentVariables($resolved) + + return $resolved +} + +# Fonction pour résoudre un chemin WSL vers un chemin Windows accessible +function Resolve-WSLPath { + param([string]$path) + + # Détecter la distribution WSL (par défaut Ubuntu) + $wslDistro = "Ubuntu" + + # Expansion de ~ vers /home/toshiro (ou autre utilisateur) + if ($path -match '^~') { + $homePath = wsl bash -c "echo ~" 2>$null + if ($LASTEXITCODE -eq 0 -and $homePath) { + $path = $path -replace '^~', $homePath + } else { + # Fallback: utiliser toshiro + $path = $path -replace '^~', "/home/toshiro" + } + } + + # Convertir le chemin WSL en chemin Windows accessible + # Format: /home/toshiro/.bashrc -> \\wsl.localhost\Ubuntu\home\toshiro\.bashrc + if ($path -match '^/') { + # Enlever le slash initial + $relativePath = $path.Substring(1) + # Convertir en chemin Windows + $windowsPath = "\\wsl.localhost\$wslDistro\$relativePath" -replace '/', '\' + return $windowsPath + } + + return $path +} + +# Traiter les fichiers Windows +if ($mapping.windows) { + $mapping.windows.PSObject.Properties | ForEach-Object { + $originalPath = $_.Name + $projectPath = $_.Value + + try { + # Vérifier que le fichier source existe dans le projet + if (-not (Test-Path $projectPath)) { + Write-Warning "Fichier source introuvable dans le projet: $projectPath" + $skippedCount++ + return + } + + # Résoudre le chemin de destination + $destinationPath = Resolve-WindowsPath $originalPath + + # Créer le répertoire parent si nécessaire + $destinationDir = Split-Path $destinationPath -Parent + if ($destinationDir -and -not (Test-Path $destinationDir)) { + New-Item -ItemType Directory -Path $destinationDir -Force | Out-Null + Write-Host "Créé le répertoire: $destinationDir" + } + + # Copier le fichier + Copy-Item -Path $projectPath -Destination $destinationPath -Force + + Write-Host "Restauré: $projectPath -> $destinationPath" + $restoredCount++ + + } catch { + Write-Error "Erreur lors de la restauration de '$originalPath': $_" + $errorCount++ + } + } +} + +# Traiter les fichiers WSL +if ($mapping.wsl) { + $mapping.wsl.PSObject.Properties | ForEach-Object { + $originalPath = $_.Name + $projectPath = $_.Value + + try { + # Vérifier que le fichier source existe dans le projet + if (-not (Test-Path $projectPath)) { + Write-Warning "Fichier source introuvable dans le projet: $projectPath" + $skippedCount++ + return + } + + # Résoudre le chemin de destination WSL en chemin Windows accessible + $destinationPath = Resolve-WSLPath $originalPath + + # Créer le répertoire parent si nécessaire + $destinationDir = Split-Path $destinationPath -Parent + if ($destinationDir -and -not (Test-Path $destinationDir)) { + New-Item -ItemType Directory -Path $destinationDir -Force | Out-Null + Write-Host "Créé le répertoire: $destinationDir" + } + + # Copier le fichier directement (maintenant que le chemin WSL est converti en chemin Windows) + Copy-Item -Path $projectPath -Destination $destinationPath -Force + + Write-Host "Restauré (WSL): $projectPath -> $destinationPath" + $restoredCount++ + + } catch { + Write-Error "Erreur lors de la restauration WSL de '$originalPath': $_" + $errorCount++ + } + } +} + +Write-Host "`nRésumé:" +Write-Host " Fichiers restaurés: $restoredCount" +Write-Host " Fichiers ignorés: $skippedCount" +Write-Host " Erreurs: $errorCount" + diff --git a/scripts/sync-to-project.ps1 b/scripts/sync-to-project.ps1 index aef1249..dc7423a 100644 --- a/scripts/sync-to-project.ps1 +++ b/scripts/sync-to-project.ps1 @@ -1,235 +1,220 @@ -# Script pour copier les fichiers de configuration vers le projet -# Lit files-config.txt et copie chaque fichier vers configs/{system}/ - -param( - [string]$ConfigFile = "files-config.txt", - [string]$MappingFile = "path-mapping.json" -) - -$ErrorActionPreference = "Stop" - -# Vérifier que le fichier de configuration existe -if (-not (Test-Path $ConfigFile)) { - Write-Error "Le fichier de configuration '$ConfigFile' n'existe pas." - exit 1 -} - -# Créer les répertoires de destination -$configsDir = "configs" -$windowsDir = Join-Path $configsDir "windows" -$wslDir = Join-Path $configsDir "wsl" - -foreach ($dir in @($configsDir, $windowsDir, $wslDir)) { - if (-not (Test-Path $dir)) { - New-Item -ItemType Directory -Path $dir -Force | Out-Null - Write-Host "Créé le répertoire: $dir" - } -} - -# Charger le mapping existant ou créer un nouveau -$mapping = @{ - windows = @{} - wsl = @{} -} - -if (Test-Path $MappingFile) { - try { - $existingMapping = Get-Content $MappingFile -Raw | ConvertFrom-Json - if ($existingMapping.windows) { - $mapping.windows = @{} - $existingMapping.windows.PSObject.Properties | ForEach-Object { - $mapping.windows[$_.Name] = $_.Value - } - } - if ($existingMapping.wsl) { - $mapping.wsl = @{} - $existingMapping.wsl.PSObject.Properties | ForEach-Object { - $mapping.wsl[$_.Name] = $_.Value - } - } - } catch { - Write-Warning "Impossible de charger le mapping existant, création d'un nouveau mapping." - } -} - -# Fonction pour résoudre un chemin Windows -function Resolve-WindowsPath { - param([string]$path) - - # Remplacer les variables d'environnement - $resolved = $path - $resolved = $resolved -replace '%USERPROFILE%', $env:USERPROFILE - $resolved = $resolved -replace '%APPDATA%', $env:APPDATA - $resolved = $resolved -replace '%LOCALAPPDATA%', $env:LOCALAPPDATA - $resolved = $resolved -replace '%HOME%', $env:HOME - $resolved = $resolved -replace '%USERPROFILE%', $env:USERPROFILE - - # Remplacer les autres variables d'environnement - $resolved = [System.Environment]::ExpandEnvironmentVariables($resolved) - - return $resolved -} - -# Fonction pour résoudre un chemin WSL -function Resolve-WSLPath { - param([string]$path) - - # Expansion de ~ - if ($path -match '^~') { - $homePath = wsl bash -c "echo ~" - $path = $path -replace '^~', $homePath - } - - return $path -} - -# Fonction pour obtenir le chemin relatif dans le projet -function Get-ProjectPath { - param( - [string]$system, - [string]$originalPath - ) - - # Nettoyer chaque partie du chemin - $parts = $originalPath -split '[\\/]' - $safeParts = @() - - foreach ($part in $parts) { - # Nettoyer chaque partie : remplacer les caractères invalides et les variables - $safePart = $part -replace '[\\/:*?"<>|]', '_' - $safePart = $safePart -replace '^%', 'var_' -replace '%$', '' -replace '%', '_' - $safePart = $safePart -replace '^~', 'home' - - # Si la partie est vide après nettoyage, utiliser un nom par défaut - if ([string]::IsNullOrWhiteSpace($safePart)) { - $safePart = "root" - } - - $safeParts += $safePart - } - - # Rejoindre toutes les parties avec des underscores - $safeName = $safeParts -join '_' - - # Construire le chemin final - $basePath = Join-Path "configs" $system - return Join-Path $basePath $safeName -} - -# Lire et traiter le fichier de configuration -$lines = Get-Content $ConfigFile | Where-Object { - $_ -notmatch '^\s*#' -and $_.Trim() -ne '' -} - -$copiedCount = 0 -$skippedCount = 0 -$errorCount = 0 - -foreach ($line in $lines) { - $line = $line.Trim() - if ($line -eq '' -or $line -match '^\s*#') { - continue - } - - # Parser la ligne: système|chemin - if ($line -notmatch '^(\w+)\|(.+)$') { - Write-Warning "Ligne ignorée (format invalide): $line" - continue - } - - $system = $matches[1] - $originalPath = $matches[2] - - if ($system -notin @('windows', 'wsl')) { - Write-Warning "Système invalide '$system' dans la ligne: $line" - continue - } - - try { - # Résoudre le chemin selon le système - if ($system -eq 'windows') { - $resolvedPath = Resolve-WindowsPath $originalPath - } else { - # Pour WSL, utiliser wsl pour résoudre le chemin - $wslPath = $originalPath - if ($wslPath -match '^~') { - $wslPath = wsl bash -c "echo $wslPath" - } - $resolvedPath = $wslPath - } - - # Vérifier que le fichier existe - if ($system -eq 'windows') { - if (-not (Test-Path $resolvedPath)) { - Write-Warning "Fichier introuvable: $resolvedPath (original: $originalPath)" - $skippedCount++ - continue - } - } else { - # Pour WSL, vérifier via wsl - wsl test -f "$resolvedPath" 2>$null | Out-Null - if ($LASTEXITCODE -ne 0) { - Write-Warning "Fichier introuvable dans WSL: $resolvedPath (original: $originalPath)" - $skippedCount++ - continue - } - } - - # Obtenir le chemin de destination dans le projet - $projectPath = Get-ProjectPath $system $originalPath - - # Créer le répertoire parent si nécessaire - $projectDir = Split-Path $projectPath -Parent - if (-not (Test-Path $projectDir)) { - New-Item -ItemType Directory -Path $projectDir -Force | Out-Null - } - - # Copier le fichier - if ($system -eq 'windows') { - Copy-Item -Path $resolvedPath -Destination $projectPath -Force - } else { - # Pour WSL, utiliser PowerShell pour copier depuis WSL - # Méthode plus fiable : lire le contenu depuis WSL et l'écrire avec PowerShell - try { - $content = wsl cat "$resolvedPath" 2>&1 - if ($LASTEXITCODE -eq 0) { - # Convertir le contenu en chaîne si c'est un tableau - if ($content -is [array]) { - $content = $content -join "`n" - } - Set-Content -Path $projectPath -Value $content -Encoding UTF8 -Force - } else { - throw "Erreur lors de la lecture du fichier WSL: $content" - } - } catch { - Write-Error "Impossible de copier le fichier WSL '$resolvedPath': $_" - throw - } - } - - # Enregistrer le mapping - $mapping[$system][$originalPath] = $projectPath - - Write-Host "Copié: $originalPath -> $projectPath" - $copiedCount++ - - } catch { - Write-Error "Erreur lors du traitement de '$line': $_" - $errorCount++ - } -} - -# Sauvegarder le mapping -$mappingJson = @{ - windows = $mapping.windows - wsl = $mapping.wsl -} | ConvertTo-Json -Depth 10 - -Set-Content -Path $MappingFile -Value $mappingJson -Encoding UTF8 - -Write-Host "`nRésumé:" -Write-Host " Fichiers copiés: $copiedCount" -Write-Host " Fichiers ignorés: $skippedCount" -Write-Host " Erreurs: $errorCount" -Write-Host " Mapping sauvegardé dans: $MappingFile" - +# Script pour copier les fichiers de configuration vers le projet +# Lit files-config.txt et copie chaque fichier vers configs/{system}/ + +param( + [string]$ConfigFile = "files-config.txt", + [string]$MappingFile = "path-mapping.json" +) + +$ErrorActionPreference = "Stop" + +# Vérifier que le fichier de configuration existe +if (-not (Test-Path $ConfigFile)) { + Write-Error "Le fichier de configuration '$ConfigFile' n'existe pas." + exit 1 +} + +# Créer les répertoires de destination +$configsDir = "configs" +$windowsDir = Join-Path $configsDir "windows" +$wslDir = Join-Path $configsDir "wsl" + +foreach ($dir in @($configsDir, $windowsDir, $wslDir)) { + if (-not (Test-Path $dir)) { + New-Item -ItemType Directory -Path $dir -Force | Out-Null + Write-Host "Créé le répertoire: $dir" + } +} + +# Charger le mapping existant ou créer un nouveau +$mapping = @{ + windows = @{} + wsl = @{} +} + +if (Test-Path $MappingFile) { + try { + $existingMapping = Get-Content $MappingFile -Raw | ConvertFrom-Json + if ($existingMapping.windows) { + $mapping.windows = @{} + $existingMapping.windows.PSObject.Properties | ForEach-Object { + $mapping.windows[$_.Name] = $_.Value + } + } + if ($existingMapping.wsl) { + $mapping.wsl = @{} + $existingMapping.wsl.PSObject.Properties | ForEach-Object { + $mapping.wsl[$_.Name] = $_.Value + } + } + } catch { + Write-Warning "Impossible de charger le mapping existant, création d'un nouveau mapping." + } +} + +# Fonction pour résoudre un chemin Windows +function Resolve-WindowsPath { + param([string]$path) + + # Remplacer les variables d'environnement + $resolved = $path + $resolved = $resolved -replace '%USERPROFILE%', $env:USERPROFILE + $resolved = $resolved -replace '%APPDATA%', $env:APPDATA + $resolved = $resolved -replace '%LOCALAPPDATA%', $env:LOCALAPPDATA + $resolved = $resolved -replace '%HOME%', $env:HOME + $resolved = $resolved -replace '%USERPROFILE%', $env:USERPROFILE + + # Remplacer les autres variables d'environnement + $resolved = [System.Environment]::ExpandEnvironmentVariables($resolved) + + return $resolved +} + +# Fonction pour résoudre un chemin WSL vers un chemin Windows accessible +function Resolve-WSLPath { + param([string]$path) + + # Détecter la distribution WSL (par défaut Ubuntu) + $wslDistro = "Ubuntu" + + # Expansion de ~ vers /home/toshiro (ou autre utilisateur) + if ($path -match '^~') { + $homePath = wsl bash -c "echo ~" 2>$null + if ($LASTEXITCODE -eq 0 -and $homePath) { + $path = $path -replace '^~', $homePath + } else { + # Fallback: utiliser toshiro + $path = $path -replace '^~', "/home/toshiro" + } + } + + # Convertir le chemin WSL en chemin Windows accessible + # Format: /home/toshiro/.bashrc -> \\wsl.localhost\Ubuntu\home\toshiro\.bashrc + if ($path -match '^/') { + # Enlever le slash initial + $relativePath = $path.Substring(1) + # Convertir en chemin Windows + $windowsPath = "\\wsl.localhost\$wslDistro\$relativePath" -replace '/', '\' + return $windowsPath + } + + return $path +} + +# Fonction pour obtenir le chemin relatif dans le projet +function Get-ProjectPath { + param( + [string]$system, + [string]$originalPath + ) + + # Nettoyer chaque partie du chemin + $parts = $originalPath -split '[\\/]' + $safeParts = @() + + foreach ($part in $parts) { + # Nettoyer chaque partie : remplacer les caractères invalides et les variables + $safePart = $part -replace '[\\/:*?"<>|]', '_' + $safePart = $safePart -replace '^%', 'var_' -replace '%$', '' -replace '%', '_' + $safePart = $safePart -replace '^~', 'home' + + # Si la partie est vide après nettoyage, utiliser un nom par défaut + if ([string]::IsNullOrWhiteSpace($safePart)) { + $safePart = "root" + } + + $safeParts += $safePart + } + + # Rejoindre toutes les parties avec des underscores + $safeName = $safeParts -join '_' + + # Construire le chemin final + $basePath = Join-Path "configs" $system + return Join-Path $basePath $safeName +} + +# Lire et traiter le fichier de configuration +$lines = Get-Content $ConfigFile | Where-Object { + $_ -notmatch '^\s*#' -and $_.Trim() -ne '' +} + +$copiedCount = 0 +$skippedCount = 0 +$errorCount = 0 + +foreach ($line in $lines) { + $line = $line.Trim() + if ($line -eq '' -or $line -match '^\s*#') { + continue + } + + # Parser la ligne: système|chemin + if ($line -notmatch '^(\w+)\|(.+)$') { + Write-Warning "Ligne ignorée (format invalide): $line" + continue + } + + $system = $matches[1] + $originalPath = $matches[2] + + if ($system -notin @('windows', 'wsl')) { + Write-Warning "Système invalide '$system' dans la ligne: $line" + continue + } + + try { + # Résoudre le chemin selon le système + if ($system -eq 'windows') { + $resolvedPath = Resolve-WindowsPath $originalPath + } else { + # Pour WSL, convertir en chemin Windows accessible + $resolvedPath = Resolve-WSLPath $originalPath + } + + # Vérifier que le fichier existe + if (-not (Test-Path $resolvedPath)) { + Write-Warning "Fichier introuvable: $resolvedPath (original: $originalPath)" + $skippedCount++ + continue + } + + # Obtenir le chemin de destination dans le projet + $projectPath = Get-ProjectPath $system $originalPath + + # Créer le répertoire parent si nécessaire + $projectDir = Split-Path $projectPath -Parent + if (-not (Test-Path $projectDir)) { + New-Item -ItemType Directory -Path $projectDir -Force | Out-Null + } + + # Copier le fichier + # Maintenant que les chemins WSL sont convertis en chemins Windows, on peut utiliser Copy-Item pour les deux + Copy-Item -Path $resolvedPath -Destination $projectPath -Force + + # Enregistrer le mapping + $mapping[$system][$originalPath] = $projectPath + + Write-Host "Copié: $originalPath -> $projectPath" + $copiedCount++ + + } catch { + Write-Error "Erreur lors du traitement de '$line': $_" + $errorCount++ + } +} + +# Sauvegarder le mapping +$mappingJson = @{ + windows = $mapping.windows + wsl = $mapping.wsl +} | ConvertTo-Json -Depth 10 + +Set-Content -Path $MappingFile -Value $mappingJson -Encoding UTF8 + +Write-Host "`nRésumé:" +Write-Host " Fichiers copiés: $copiedCount" +Write-Host " Fichiers ignorés: $skippedCount" +Write-Host " Erreurs: $errorCount" +Write-Host " Mapping sauvegardé dans: $MappingFile" + -- cgit v1.2.3