« Utilisateur:Goulven » : différence entre les versions

De Disposition de clavier bépo
(Emacs)
 
(Configuration Vim/Neovim (sur Typematrix 2030))
 
(Une version intermédiaire par le même utilisateur non affichée)
Ligne 1 : Ligne 1 :
== '''Configuration raccourcis Emacs''' ==
Voici ma configuration Vim/Neovim. Le mappage de l'ensemble des touches à été revu et repensé pour une adaptation logique et efficace de Vim avec le bépo. Attention: la double virgule (,,) est utilisée à la place de ESC (voir mémo à la fin). J'ai volontairement laissé les plugins et skins pour exemple.


Bonjour a tous, je voulais vous présenter ma configuration de raccourcis clavier pour emacs. Mais avant, je voudrais m'arrêter sur les quelques légères modifications que j'ai fait sur layout Bépo:
[[Fichier:Vim_Typematrix.png]]


Tout d'abord j'ai inversé les accolades et les parenthèses pour les avoir en accès direct, tout développeur comprendra je pense. Aussi, j'ai inversé le 'Ç' avec le 'W' car sur le typematrix 2030 il se retrouve désagréablement loin, ce que je trouve embêtant lorsque l'on se retrouve a taper du texte en anglais.
<b>Le fichier .vimrc :</b>
<pre>
" .vimrc
" Configuration Bépo
"
" Goulven
"
" Ajouter vim depuis le dépot:
" sudo add-apt-repository ppa:jonathonf/vim
" sudo apt update
"
set nocompatible
set encoding=utf-8
set fileencoding=utf-8
set number
set title
set ruler
set visualbell
set noerrorbells
set lbr!
set mouse=a
set mousehide
set ttyfast
set wrap
set textwidth=80
set history=20
set diffopt=vertical


Voici donc les modifications apportées au layout sous X11 (Linux,*BSD).
" Délai de basculement du mode insertion/normal
set timeoutlen=1000 "pour les touches remappées
set ttimeoutlen=0 "pour les codes de touches (touche Échap)


Le fichier a modifier est: /usr/share/X11/xkb/symbols/fr dans la rubrique Bépo.
" Recherche
set ignorecase
set smartcase
set incsearch
set hlsearch


<pre>
" Indentation
set autoindent
set smartindent
set cindent
set tabstop=4
set shiftwidth=4
set expandtab
set backspace=indent,eol,start
 
" Lecture/enregistrement
set autoread
set autowrite
 
autocmd FocusLost,TabLeave * :wall
 
if has("autocmd")
autocmd! bufwritepost .vimrc source ~/.vimrc
endif
 
" Coloration syntaxique
if has("syntax")
syntax on
endif
 
" Affichage
set showcmd
set showmode
set shortmess+=I
set cursorline
 
" set showmatch
 
" Folding
set foldcolumn=3
set foldmethod=manual
 
 
" Correction orthographique
"set spelllang=en,fr
"set spell
"set spellsuggest=5
 
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
 
" Chargement du gestionnaire de plugin vundle
" https://github.com/gmarik/Vundle.git ~/.vim/bundle/Vundle.vim
Plugin 'gmarik/Vundle.vim'
 
Plugin 'scrooloose/syntastic'
Plugin 'scrooloose/nerdtree'
Plugin 'scrooloose/nerdcommenter'
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'sirver/ultisnips'
Plugin 'honza/vim-snippets'
Plugin 'tpope/vim-fugitive'
Plugin 'tpope/vim-surround'
" Plugin 'tpope/vim-repeat'
" Plugin 'tpope/vim-unimpaired'
Plugin 'ervandew/supertab'
Plugin 'valloric/youcompleteme'
Plugin 'kien/ctrlp.vim'
Plugin 'majutsushi/tagbar'
Plugin 'raimondi/delimitmate'
Plugin 'nathanaelkane/vim-indent-guides'
Plugin 'kien/rainbow_parentheses.vim'
Plugin 'morhetz/gruvbox'
Plugin 'NLKNguyen/papercolor-theme'
Plugin 'drewtempelmeyer/palenight.vim'
Plugin 'octol/vim-cpp-enhanced-highlight'
Plugin 'bfrg/vim-cpp-modern'
Plugin 'quark-zju/vim-cpp-auto-include'
Plugin 'andrewradev/splitjoin.vim'
 
 
call vundle#end()
filetype plugin indent on
filetype plugin on


Pour les accolades:
" Syntastic
key <AE02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [braceleft,  2,    less,  leftdoublequotemark ] }; // { 2 <
set statusline+=%#warningmsg#
key <AE03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [braceright, 3, greater, rightdoublequotemark ] }; // } 3 >
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
let g:syntastic_always_populate_loc_list=1
let g:syntastic_auto_loc_list=1
let g:syntastic_check_on_open=1
let g:syntastic_check_on_wq=0
let g:syntastic_cpp_compiler_options='-std=c++17'


On inverse avec les parenthèses:
" The NERD Tree
key <AB02> { [ y, Y,  guillemotleft, leftsinglequotemark  ] }; // y Y «
let g:NERDTreeMapOpenVSplit='v'
key <AB03> { [ x, X, guillemotright, rightsinglequotemark ] }; // x X »


Ainsi que le Ç et le W
" The NERD Commenter
key <AD12> { [ ccedilla,   Ccedilla ,    dead_cedilla  ] }; // ç Ç
let g:NERDSpaceDelims=1
key <BKSL> { [        w,            W,    dead_belowcomma ] }; // w W ,
let g:NERDCompactSexyComs=1
let g:NERDDefaultAlign='left'
let g:NERDAltDelims_java=1
let g:NERDCustomDelimiters={ 'c': { 'left': '/**','right': '*/'}}
let g:NERDCommentEmptyLines=1
let g:NERDTrimTrailingWhitespaces=1


</pre>
" vim-airline
Ces modifications sont indiquées en rouge sur la carte de configuration des raccourcis emacs que voici:
" Attention installer le paquet fonts-powerline
" ou bien git clone https://github.com/powerline/fonts.git --depth=1
" cd fonts && ./install.sh
let g:airline#extensions#tabline#enabled=1
let g:airline_theme='hybridline'
let g:airline_powerline_fonts=1
let g:airline#extensions#tagbar#enabled = 1
let g:airline#extensions#tmuxline#enabled = 1


[[Fichier:Config_emacs_goulven.png]]
"Ultisnips
let g:UltiSnipsSnippetsDir="~/.vim/UltiSnips"
let g:UltiSnipsEditSplit="vertical"
" let g:UltiSnipsJumpForwardTrigger="<C-r>"
" let g:UltiSnipsJumpBackwardTrigger="<C-t>
let g:UltiSnipsExpandTrigger = "<tab>"
let g:UltiSnipsJumpForwardTrigger = "<tab>"
let g:UltiSnipsJumpBackwardTrigger = "<s-tab>""


Je tiens a préciser que ce n'est qu'une première version, donc suseptible d'évoluer, je suis ouvert. Pour faire cette configuration, je me suis inspiré de ce que j'ai vu sur ce site(config de sarcastic/louiz), du manuel des commandes emacs et du bépo ou plus exactement de la méthode dvorak. C'est à dire de placer les touches les plus utilisées sur la rangée centrale, puis celle du haut etc…
" make YCM compatible with UltiSnips (using supertab)
let g:ycm_key_list_select_completion = ['<C-r>', '<Down>']
let g:ycm_key_list_previous_completion = ['<C-t>', '<Up>']
" let g:ycm_server_keep_logfiles = 1
" let g:ycm_server_log_level = 'debug'
let g:SuperTabDefaultCompletionType = '<C-n>'


Sous emacs, on accède aux fonctions par combinaison de touches : Ctrl, Alt ou Ctrl + Alt donc la main gauche s'occupant de cela, j'ai donc placé les touches de déplacement à droite sur la rangée centrale et organisé le reste autour. Ensuite j'ai garder le Ctrl-X pour l'extension et fait de même. Et voici donc le fichier de configuration .emacs:
let g:omni_sql_no_default_maps = 1


<pre>
" vim-surround
" Remappage des touches 'opérateur'
"
" d devient e
" c devient x
" y devient c
"
" if exists("g:surround_bepo_mappings")
"  nmap es  <Plug>Dsurround
"  nmap xs  <Plug>Csurround
"  nmap xS  <Plug>CSurround
"  nmap cs  <Plug>Ysurround
"  nmap cS  <Plug>YSurround
"  nmap css <Plug>Yssurround
"  nmap cSs <Plug>YSsurround
"  xmap <leader>S  <Plug>VSurround
"  xmap <leader>Sg  <Plug>VgSurround
" endif
"
" Puis on désactive le mappage de surround par défaut
" et on ajoute le mappage leader_s
let g:surround_no_mappings=1
let g:surround_bepo_mappings=1


;; Déactivation des commandes d'origines
" CtrlP
(global-unset-key "\C-x\C-f")
let g:ctrlp_show_hidden=1
(global-unset-key "\C-x\C-s")
let g:ctrlp_working_path_mode=0
(global-unset-key "\C-x\C-v")
(global-unset-key "\C-x\C-w")
(global-unset-key "\C-x\C-q")
(global-unset-key "\C-x\C-c")
(global-unset-key "\C-x\C-u")
(global-unset-key "\C-x\TAB")
(global-unset-key "\C-xs")
(global-unset-key "\C-xi")
(global-unset-key "\C-d")
(global-unset-key "\C-s")
(global-unset-key "\C-g")
(global-unset-key "\C-b") ;; backward-char
(global-unset-key "\C-f") ;; forward-char
(global-unset-key "\M-b") ;; backward-word
(global-unset-key "\M-f") ;; forward-word
(global-unset-key "\C-p") ;; previous-line
(global-unset-key "\C-n") ;; next-line
(global-unset-key "\C-a") ;; move-beginning-of-line
(global-unset-key "\C-e") ;; move-end-of-line
(global-unset-key "\M-a") ;; backward-sentence
(global-unset-key "\M-e") ;; forward-sentence
(global-unset-key "\M-{") ;; backward-paragraph
(global-unset-key "\M-}") ;; forward-paragraph
(global-unset-key "\C-\M-b") ;; backward-sexp
(global-unset-key "\C-\M-f") ;; forward-sexp
(global-unset-key "\C-\M-a") ;; beginning-of-defun
(global-unset-key "\C-\M-e") ;; end-of-defun
(global-unset-key "\M-<") ;; beginning-of-buffer
(global-unset-key "\M->") ;; end-of-buffer
(global-unset-key "\C-w") ;; kill-region
(global-unset-key "\M-w") ;; kill-ring-save
(global-unset-key "\C-y") ;; yank
(global-unset-key "\M-y") ;; yank-pop
(global-unset-key "\C-k") ;; kill-line
(global-unset-key "\M-k") ;; kill-sentence
(global-unset-key "\C-\M-k") ;; kill-sexp
(global-unset-key "\M-x")
(global-unset-key "\C-z")
(global-unset-key "\C-\M-v")
(global-unset-key "\C-\M-V")


set wildignore+=*/tmp/*,*.so,*.swp,*.zip " Unix
set wildignore+=*\\tmp\\*,*.swp,*.zip,*.exe " Windows
set wildignore+=*.a,*.o
set wildignore+=*.bmp,*.gif,*.ico,*.jpg,*.png
set wildignore+=.DS_Store,.git,.hg,.svn
set wildignore+=*~,*.tmp
set wildignore+=*/Nas/*


;; *** Ouvrir/Enregistrer/Quitter ***
let g:ctrlp_custom_ignore='\v[\/]\.(git|hg|svn)$'
let g:ctrlp_custom_ignore={
\ 'dir': '\v[\/]\.(git|hg|svn)$',
\ 'file': '\v\.(exe|so|dll)$',
\ 'link': 'some_bad_symbolic_links',
\}


;; C-e C-e (Ouvrir un fichier)
" Indent Guides
(global-set-key "\C-x\C-e" 'find-file)
let g:indent_guides_enable_on_vim_startup=0
;; C-e C-o (Sauver le buffer)
(global-set-key "\C-x\C-i" 'save-buffer)
;; C-e C-i (Enregistrer sous)
(global-set-key "\C-x\C-u" 'write-file)
;; C-e C-u (Quitter)
(global-set-key "\C-x\C-y" 'save-buffers-kill-terminal)
;; C-e k (Fermer un tampon)
(global-set-key "\C-xq" 'kill-buffer)
;; C-e p (Changer de tampon)
(global-set-key "\C-x." 'switch-to-buffer)


;; *** Déplacements ***
" DelimitMate
let delimitMate_expand_cr=1
let delimitMate_expand_space=1
let delimitMate_smart_quotes='\w\%#'


;; C-t (Reculer d'un caractère)
" Rainbow Parentheses
(global-set-key "\C-t" 'backward-char)
au VimEnter * RainbowParenthesesToggle
;; C-r (Avancer d'un caractère)
au syntax * RainbowParenthesesLoadRound
(global-set-key "\C-r" 'forward-char)
au syntax * RainbowParenthesesLoadSquare
au syntax * RainbowParenthesesLoadBraces


;; M-t (Reculer d'un mot)
" Theme gruvbox
(global-set-key "\M-t" 'backward-word)
if has ('gui_running')
;; M-r (Avancer d'un mot)
    set guifont=Droid\ Sans\ Mono\ for\ Powerline\ Regular\ 16
(global-set-key "\M-r" 'forward-word)
colorscheme gruvbox
set background=dark
else
set background=light
colorscheme PaperColor
endif


;; C-d (Ligne précédente)
" vim-cpp-auto-include
(global-set-key "\C-d" 'previous-line)
" autocmd BufWritePre /home/goulven/Devel/**.cpp :ruby CppAutoInclude::process
;; C-s (Ligne suivante)
(global-set-key "\C-s" 'next-line)


;; C-c (début de ligne)
"" mapping du clavier bépo->qwerty en mode normal
(global-set-key "\C-c" 'move-beginning-of-line)
""
;; C-n (fin de ligne)
" n  Normal mode map. Defined using ':nmap' or ':nnoremap'.
(global-set-key "\C-n" 'move-end-of-line)
" i  Insert mode map. Defined using ':imap' or ':inoremap'.
" v  Visual and select mode map. Defined using ':vmap' or ':vnoremap'.
" x  Visual mode map. Defined using ':xmap' or ':xnoremap'.
" s  Select mode map. Defined using ':smap' or ':snoremap'.
" c Command-line mode map. Defined using ':cmap' or ':cnoremap'.
" o  Operator pending mode map. Defined using ':omap' or ':onoremap'.
"
" <Space>  Normal, Visual and operator pending mode map. Defined using
"          ':map' or ':noremap'.
" !  Insert and command-line mode map. Defined using 'map!' or
" 'noremap!'.
noremap b ^
onoremap b ^
noremap é b
onoremap é b
noremap p w
onoremap p w
noremap o o
noremap è <c-w>
noremap èè <c-w><c-w>
noremap èd <c-w><Up>
noremap ès <c-w><Down>
noremap èt <c-w><Left>
noremap èr <c-w><Right>
noremap ^ p
noremap v v
noremap d k
onoremap d k
noremap l $
onoremap l $
noremap j /
onoremap j /
noremap z t
onoremap z t
noremap w K
noremap a a
noremap u e
onoremap u e
noremap i i
noremap e d
noremap \ \
noremap , ~
inoremap ,, <esc>
noremap c y
noremap t h
onoremap t h
noremap s j
onoremap s j
noremap r l
onoremap r l
noremap n u
noremap m @
nnoremap m @
noremap à r
noremap y s
noremap x c
noremap . .
noremap k x
noremap ' >
noremap q z
noremap qq zz
noremap gg gg
noremap ga g~
noremap h ;
onoremap h ;
noremap f f
onoremap f f


;; M-c (début de fonction)
noremap B \|
(global-set-key "\M-c" 'beginning-of-defun)
onoremap B \|
;; M-n (fin de fonction)
noremap É B
(global-set-key "\M-n" 'end-of-defun)
onoremap É B
noremap P W
onoremap P W
noremap O O
noremap È J
noremap \! P
noremap D <c-u>
onoremap D <c-u>
noremap L %
noremap J ?
onoremap J ?
noremap Z T
onoremap Z T
noremap A A
noremap U E
onoremap U E
noremap I I
noremap E D
noremap ; =
noremap C Y
noremap T N
onoremap T N
noremap S <c-d>
onoremap S <c-d>
noremap R n
onoremap R n
noremap N U
noremap M '
onoremap M '
noremap À R
noremap Y S
noremap X C
noremap K X
noremap ? <
noremap Q Z
noremap G G
onoremap G G
noremap H ,
onoremap H ,
noremap F F
onoremap F F
noremap Ç "


;; M-d (début de paragraphe)
" remappage text ojects
(global-set-key "\M-d" 'backward-paragraph)
onoremap ap aw
;; M-s (fin de paragraphe)
onoremap aP aW
(global-set-key "\M-s" 'forward-paragraph)
onoremap ip iw
onoremap iP iW
onoremap a) as
onoremap i) is
onoremap aj ap
onoremap ij ip


;; C-M-c (Reculer jusqu'à un espace)
noremap " ! " Filtre externe
(global-set-key "\C-\M-c" 'backward-sexp)
noremap « - " Ligne précédente
;; C-M-n (Avancer jusqu'à un espace)
onoremap « -
(global-set-key "\C-\M-n" 'forward-sexp)
noremap » + " Ligne suivante
onoremap » +
noremap @ q " Enregist. macro
nnoremap @ q
noremap + <c-a> " Incrémenter
noremap - <c-x> " Décrémenter
noremap / { " Début paragraphe
onoremap / {
noremap * } " Fin paragraphe
onoremap * }
noremap = - " DDP du dessous


;; M-+ (début du buffer)
" touches Crtl
(global-set-key "\M-+" 'beginning-of-buffer)
noremap <c-i> H " Haut écran
;; M-- (fin du buffer)
noremap <c-u> M " Milieu écran
(global-set-key "\M--" 'end-of-buffer)
noremap <c-a> L " Bas écran
noremap <c-o> <c-b> " Page dessus
noremap <c-e> <c-f> " Page dessous
noremap <c-l> <c-y> " Défil. ligne au dessous
noremap <c-j> <c-e> " Défil. ligne au dessus
noremap <c-c> <c-]> " Ctags identifiant
noremap <c-f> <c-g> " Info curseur
noremap <c-q> # " Id tag précédent
noremap <c-h> * " Id tag suivant
noremap <c-n> & " Refaire
noremap <c-b> m " Définir marque
noremap <c-m> ` " Marque précédente
nnoremap <c-s> :w<CR> " Enregistrer


;; *** Effacement Copier/coller ***
noremap <c-k> Q " Ex mode
(global-set-key (kbd "\M-'") 'forward-kill-word)
noremap <c-x> <c-c> " Normal/cancel
(global-set-key "\C-q" 'kill-line)
(global-set-key "\M-q" 'kill-sentence)
(global-set-key "\C-\M-q" 'kill-sexp)
(global-set-key "\C-l" 'kill-region)
(global-set-key "\M-l" 'kill-ring-save)
(global-set-key "\M-j" 'yank-pop)


;; *** Casse ***
let mapleader="ç"
(global-set-key "\M-f" 'upcase-word)
(global-set-key "\M-w" 'downcase-word)
(global-set-key "\M-m" 'capitalize-word)


;; *** Divers ***
" extensions ^ du bépo
(global-set-key "\C-z" 'recenter-top-bottom)
noremap ô :NERDTreeToggle<CR>
noremap î :IndentGuidesToggle<CR>
noremap û :UltiSnipsEdit<CR>
noremap ê :RainbowParenthesesToggle<CR>


" mappages avec Leader
nmap <leader>t :TagbarToggle<CR>
nmap <leader>k ggg?G``
</pre>
</pre>


Note: Cette configuration fonctionne très bien en mode Perl ou Text, en revanche en mode C, et cela m'embête car je développe essentiellement dans ce language, il y a un problème de remappage du Ctrl-D. Je sais que cela viens du mode mineur 'electric mode' et dès que j'ai la solution je met a jour ces lignes. En attendant, si quelqu'un à la solution, je suis preneur!
<b>Petit mémo:</b>
<pre>
,, ESC
 
=== Buffers/Window/Tabs ===
:ls List buffers.
:bw Close current buffer.
:bn Next buffer.
:bp Previous buffer.
 
:sp [file] -open file on horizontal window
:vsp [optional-file] -open file on vertical window
 
èè aller a la fenêtre suivante.
èn nouvelle fenêtre horizontale (nouveau buffer)
ès divise la fenêtre horizontalement (buffer courant)
èv divise la fenêtre verticalement (buffer courant)
è= egaliser la taille des fenêtres
èc close window
èo close all windows, leaving: only the current window open
èw go to next window
èp go to previous window
èd go to window above
ès go to window below
èt go to window on left
èr go to window on right
èx échanger deux fenêtres
èT basculer la fenêtre active dans un nouvel onglet
 
:tabn ou gt onglet suivant
:tabp ou gT onglet précédent
v
:tabc fermer onglet courant
:tabo -close all others tabs leaving ONLY the current tab open
 
=== Formatage texte ===
gg,l indenter tout le fichier
= Opérateurs =
x remplacer
e supprimer (effacer)
^ couper et mémoriser dans un registre
ga Alterner la casse
gu Convertir en minuscule
gU Convertir en majuscule
K Décaler vers la droite
? Décaler vers la gauche
<c-a> Indenter automatiquement
 
= Text objects =
ip Mot courant
ap Mot courant plus un espace
iP MOT courant
aP MOT courant plus un espace
i) Phrase courante
a) Phrase courant plus un espace
ij Paragraphe courant
aj Paragraphe courant plus une ligne blanche
 
= Text Objects Sélection =
ab Autour d'une paire de parenthèses
ib À l'intérieur d'une paire de parenthèses
aB Autour d'une paire d'accolades
iB À l'intérieur d'une paire d'accolades
] [ Crochets ]
>
'
"
`
t
 
=== Folding ===
qf créer un repli
qo ouvrir repli
qc fermer repli
qr ouvrir tous les replis
qm fermer tous les replis
q[RM] + tous les niveaux
qi active/désactive le folding
 
=== Scrolling ===
qq au milieu
qb en bas
qt en haut
 
=== vim-surround ===
es[caracter_to_delete]
xs[target_caracter][remplacement_caracter]
cs[pattern-motion][caracter]
css[caracter_added_on_entire_line]
(){}[]<>
b (
B )
r }
a ]
`
"
'
t Xml or HTML tags
w word
s sentence
p paragraph
 
=== NERD Tree ===
ô ouvrir/fermer NERDTree
== Fichiers
o ouvrir un fichier
go aperçu du fichier
t ouvrir un fichier dans un onglet
T ouvrir un fichier dans un onglet mais reste sur la fenêtre courante
! executer un fichier
== Repertoires
o ouvrir/fermer le répertoire
O ouvrir le répertoire et les sous-répertoires
x fermer le noeud parent
X fermer tous les noeuds des sous-répertoires
== Explorateur
P aller à la racine
p aller au répertoire parent
K aller sur le premier répertoire fils
J aller sur le dernier répertoire fils
d et s naviguer sur les dossiers/fichiers
== Système de fichier
C placer le rep courant comme racine de l'explorateur
u déplacer la racine de l'explorateur vers le rep précédent
U idem, mais laisse l'ancien rep racine ouvert
r rafraîchir le rep courant
R rafraîchir le racine
m affiche le menu de l'explorateur
== Filtres
I afficher/cacher les fichiers cachés
f filtrer les fichiers
F afficher/cacher les fichiers
== Autres
q fermer l'explorateur
? aide
 
=== Nerd Commenter ===
çcc commenter la séléction ou ligne
ççi inverser le commentaire
 
 
=== Autres ===
î  IndentGuide Toggle
û  UltisnipsEdit
ê  RainbowParenthese Toggle
</pre>

Dernière version du 2 octobre 2020 à 11:27

Voici ma configuration Vim/Neovim. Le mappage de l'ensemble des touches à été revu et repensé pour une adaptation logique et efficace de Vim avec le bépo. Attention: la double virgule (,,) est utilisée à la place de ESC (voir mémo à la fin). J'ai volontairement laissé les plugins et skins pour exemple.

Vim Typematrix.png

Le fichier .vimrc :

" .vimrc
" Configuration Bépo
"
" Goulven
" 
" Ajouter vim depuis le dépot:
" sudo add-apt-repository ppa:jonathonf/vim
" sudo apt update
" 
set nocompatible
set encoding=utf-8
set fileencoding=utf-8
set number
set title
set ruler
set visualbell
set noerrorbells
set lbr!
set mouse=a
set mousehide
set ttyfast
set wrap
set textwidth=80
set history=20
set diffopt=vertical

" Délai de basculement du mode insertion/normal
set timeoutlen=1000	"pour les touches remappées
set ttimeoutlen=0	"pour les codes de touches (touche Échap)

" Recherche
set ignorecase
set smartcase
set incsearch
set hlsearch

" Indentation
set autoindent
set smartindent
set cindent
set tabstop=4
set shiftwidth=4
set expandtab
set backspace=indent,eol,start

" Lecture/enregistrement
set autoread
set autowrite

autocmd FocusLost,TabLeave * :wall

if has("autocmd")
	autocmd! bufwritepost .vimrc source ~/.vimrc
endif

" Coloration syntaxique
if has("syntax")
	syntax on
endif

" Affichage
set showcmd
set showmode
set shortmess+=I
set cursorline

" set showmatch

" Folding
set foldcolumn=3
set foldmethod=manual


" Correction orthographique
"set spelllang=en,fr
"set spell
"set spellsuggest=5

filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" Chargement du gestionnaire de plugin vundle
" https://github.com/gmarik/Vundle.git ~/.vim/bundle/Vundle.vim
Plugin 'gmarik/Vundle.vim'

Plugin 'scrooloose/syntastic'
Plugin 'scrooloose/nerdtree'
Plugin 'scrooloose/nerdcommenter'
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'sirver/ultisnips'
Plugin 'honza/vim-snippets'
Plugin 'tpope/vim-fugitive'
Plugin 'tpope/vim-surround'
" Plugin 'tpope/vim-repeat'
" Plugin 'tpope/vim-unimpaired'
Plugin 'ervandew/supertab'
Plugin 'valloric/youcompleteme'
Plugin 'kien/ctrlp.vim'
Plugin 'majutsushi/tagbar'
Plugin 'raimondi/delimitmate'
Plugin 'nathanaelkane/vim-indent-guides'
Plugin 'kien/rainbow_parentheses.vim'
Plugin 'morhetz/gruvbox'
Plugin 'NLKNguyen/papercolor-theme'
Plugin 'drewtempelmeyer/palenight.vim'
Plugin 'octol/vim-cpp-enhanced-highlight'
Plugin 'bfrg/vim-cpp-modern'
Plugin 'quark-zju/vim-cpp-auto-include'
Plugin 'andrewradev/splitjoin.vim'


call vundle#end()
filetype plugin indent on
filetype plugin on

" Syntastic
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
let g:syntastic_always_populate_loc_list=1 
let g:syntastic_auto_loc_list=1
let g:syntastic_check_on_open=1
let g:syntastic_check_on_wq=0
let g:syntastic_cpp_compiler_options='-std=c++17'

" The NERD Tree
let g:NERDTreeMapOpenVSplit='v'

" The NERD Commenter
let g:NERDSpaceDelims=1
let g:NERDCompactSexyComs=1
let g:NERDDefaultAlign='left'
let g:NERDAltDelims_java=1
let g:NERDCustomDelimiters={ 'c': { 'left': '/**','right': '*/'}}
let g:NERDCommentEmptyLines=1
let g:NERDTrimTrailingWhitespaces=1

" vim-airline
" Attention installer le paquet fonts-powerline
" ou bien git clone https://github.com/powerline/fonts.git --depth=1
" cd fonts && ./install.sh
let g:airline#extensions#tabline#enabled=1
let g:airline_theme='hybridline'
let g:airline_powerline_fonts=1
let g:airline#extensions#tagbar#enabled = 1
let g:airline#extensions#tmuxline#enabled = 1

"Ultisnips
let g:UltiSnipsSnippetsDir="~/.vim/UltiSnips"
let g:UltiSnipsEditSplit="vertical"
" let g:UltiSnipsJumpForwardTrigger="<C-r>"
" let g:UltiSnipsJumpBackwardTrigger="<C-t>
let g:UltiSnipsExpandTrigger = "<tab>"
let g:UltiSnipsJumpForwardTrigger = "<tab>"
let g:UltiSnipsJumpBackwardTrigger = "<s-tab>""

" make YCM compatible with UltiSnips (using supertab)
let g:ycm_key_list_select_completion = ['<C-r>', '<Down>']
let g:ycm_key_list_previous_completion = ['<C-t>', '<Up>']
" let g:ycm_server_keep_logfiles = 1
" let g:ycm_server_log_level = 'debug'
let g:SuperTabDefaultCompletionType = '<C-n>'

let g:omni_sql_no_default_maps = 1

" vim-surround
" Remappage des touches 'opérateur'
"
" d devient e
" c devient x
" y devient c
"
" if exists("g:surround_bepo_mappings")
"   nmap es  <Plug>Dsurround
"   nmap xs  <Plug>Csurround
"   nmap xS  <Plug>CSurround
"   nmap cs  <Plug>Ysurround
"   nmap cS  <Plug>YSurround
"   nmap css <Plug>Yssurround
"   nmap cSs <Plug>YSsurround
"   xmap <leader>S   <Plug>VSurround
"   xmap <leader>Sg  <Plug>VgSurround
" endif
"
" Puis on désactive le mappage de surround par défaut
" et on ajoute le mappage leader_s
let g:surround_no_mappings=1
let g:surround_bepo_mappings=1

" CtrlP
let g:ctrlp_show_hidden=1
let g:ctrlp_working_path_mode=0

set wildignore+=*/tmp/*,*.so,*.swp,*.zip	" Unix
set wildignore+=*\\tmp\\*,*.swp,*.zip,*.exe	" Windows
set wildignore+=*.a,*.o
set wildignore+=*.bmp,*.gif,*.ico,*.jpg,*.png
set wildignore+=.DS_Store,.git,.hg,.svn
set wildignore+=*~,*.tmp
set wildignore+=*/Nas/*

let g:ctrlp_custom_ignore='\v[\/]\.(git|hg|svn)$'
let g:ctrlp_custom_ignore={
			\ 'dir':	'\v[\/]\.(git|hg|svn)$',
			\ 'file':	'\v\.(exe|so|dll)$',
			\ 'link':	'some_bad_symbolic_links',
			\}

" Indent Guides
let g:indent_guides_enable_on_vim_startup=0

" DelimitMate
let delimitMate_expand_cr=1
let delimitMate_expand_space=1
let delimitMate_smart_quotes='\w\%#'

" Rainbow Parentheses
au VimEnter * RainbowParenthesesToggle
au syntax * RainbowParenthesesLoadRound
au syntax * RainbowParenthesesLoadSquare
au syntax * RainbowParenthesesLoadBraces

" Theme gruvbox 
if has ('gui_running')
    set guifont=Droid\ Sans\ Mono\ for\ Powerline\ Regular\ 16
	colorscheme gruvbox
	set background=dark
else
	set background=light
	colorscheme PaperColor
endif

" vim-cpp-auto-include
" autocmd BufWritePre /home/goulven/Devel/**.cpp :ruby CppAutoInclude::process

"" mapping du clavier bépo->qwerty en mode normal
""
" n  Normal mode map. Defined using ':nmap' or ':nnoremap'.
" i  Insert mode map. Defined using ':imap' or ':inoremap'.
" v  Visual and select mode map. Defined using ':vmap' or ':vnoremap'.
" x  Visual mode map. Defined using ':xmap' or ':xnoremap'.
" s  Select mode map. Defined using ':smap' or ':snoremap'.
" c  Command-line mode map. Defined using ':cmap' or ':cnoremap'.
" o  Operator pending mode map. Defined using ':omap' or ':onoremap'.
" 
" <Space>  Normal, Visual and operator pending mode map. Defined using
"          ':map' or ':noremap'.
" !  Insert and command-line mode map. Defined using 'map!' or
" 'noremap!'.
 
noremap b ^
onoremap b ^
noremap é b
onoremap é b
noremap p w
onoremap p w
noremap o o
noremap è <c-w>
noremap èè <c-w><c-w>
noremap èd <c-w><Up>
noremap ès <c-w><Down>
noremap èt <c-w><Left>
noremap èr <c-w><Right>
noremap ^ p
noremap v v
noremap d k
onoremap d k
noremap l $
onoremap l $
noremap j /
onoremap j /
noremap z t
onoremap z t
noremap w K
noremap a a
noremap u e
onoremap u e
noremap i i
noremap e d
noremap \ \
noremap , ~
inoremap ,, <esc>
noremap c y
noremap t h
onoremap t h
noremap s j
onoremap s j
noremap r l
onoremap r l
noremap n u
noremap m @
nnoremap m @
noremap à r
noremap y s
noremap x c
noremap . .
noremap k x
noremap ' >
noremap q z
noremap qq zz
noremap gg gg
noremap ga g~
noremap h ;
onoremap h ;
noremap f f
onoremap f f

noremap B \|
onoremap B \|
noremap É B
onoremap É B
noremap P W
onoremap P W
noremap O O
noremap È J
noremap \! P
noremap D <c-u>
onoremap D <c-u>
noremap L %
noremap J ?
onoremap J ?
noremap Z T
onoremap Z T
noremap A A
noremap U E
onoremap U E
noremap I I
noremap E D
noremap ; =
noremap C Y
noremap T N
onoremap T N
noremap S <c-d>
onoremap S <c-d>
noremap R n
onoremap R n
noremap N U
noremap M '
onoremap M '
noremap À R
noremap Y S
noremap X C
noremap K X
noremap ? <
noremap Q Z
noremap G G
onoremap G G
noremap H ,
onoremap H ,
noremap F F
onoremap F F
noremap Ç "

" remappage text ojects
onoremap ap aw
onoremap aP aW
onoremap ip iw
onoremap iP iW
onoremap a) as
onoremap i) is
onoremap aj ap
onoremap ij ip

noremap " !		" Filtre externe
noremap « -		" Ligne précédente
onoremap « -
noremap » +		" Ligne suivante
onoremap » +
noremap @ q		" Enregist. macro
nnoremap @ q
noremap + <c-a>		" Incrémenter
noremap - <c-x>		" Décrémenter
noremap / {		" Début paragraphe
onoremap / {
noremap * }		" Fin paragraphe
onoremap * }
noremap = -		" DDP du dessous

" touches Crtl
noremap <c-i> H		" Haut écran
noremap <c-u> M		" Milieu écran
noremap <c-a> L		" Bas écran
noremap <c-o> <c-b>	" Page dessus
noremap <c-e> <c-f>	" Page dessous
noremap <c-l> <c-y>	" Défil. ligne au dessous
noremap <c-j> <c-e>	" Défil. ligne au dessus
noremap <c-c> <c-]>	" Ctags identifiant
noremap <c-f> <c-g>	" Info curseur
noremap <c-q> #		" Id tag précédent
noremap <c-h> *		" Id tag suivant
noremap <c-n> &		" Refaire
noremap <c-b> m		" Définir marque
noremap <c-m> `		" Marque précédente
nnoremap <c-s> :w<CR>	" Enregistrer

noremap <c-k> Q		" Ex mode
noremap <c-x> <c-c>	" Normal/cancel

let mapleader="ç"

" extensions ^ du bépo
noremap ô :NERDTreeToggle<CR>
noremap î :IndentGuidesToggle<CR>
noremap û :UltiSnipsEdit<CR>
noremap ê :RainbowParenthesesToggle<CR>

" mappages avec Leader
nmap <leader>t :TagbarToggle<CR>
nmap <leader>k ggg?G``

Petit mémo:

,, ESC

=== Buffers/Window/Tabs ===
:ls	List buffers.
:bw	Close current buffer.
:bn	Next buffer.
:bp	Previous buffer.

:sp [file]	 	-open file on horizontal window
:vsp [optional-file]	-open file on vertical window

èè	aller a la fenêtre suivante.
èn	nouvelle fenêtre horizontale (nouveau buffer)
ès	divise la fenêtre horizontalement (buffer courant)
èv	divise la fenêtre verticalement (buffer courant)
è=	egaliser la taille des fenêtres
èc	close window
èo	close all windows, leaving: only the current window open
èw	go to next window
èp	go to previous window
èd	go to window above
ès	go to window below
èt	go to window on left
èr	go to window on right
èx	échanger deux fenêtres	
èT	basculer la fenêtre active dans un nouvel onglet

:tabn ou gt	onglet suivant
:tabp ou gT	onglet précédent
v
:tabc		fermer onglet courant
:tabo		-close all others tabs leaving ONLY the current tab open

=== Formatage texte ===
gg,l	indenter tout le fichier
= Opérateurs =
x 	remplacer
e 	supprimer (effacer)
^	couper et mémoriser dans un registre
ga	Alterner la casse
gu	Convertir en minuscule
gU	Convertir en majuscule
K	Décaler vers la droite
?	Décaler vers la gauche
<c-a>	Indenter automatiquement

= Text objects =
ip	Mot courant
ap	Mot courant plus un espace
iP	MOT courant
aP	MOT courant plus un espace
i)	Phrase courante
a)	Phrase courant plus un espace
ij	Paragraphe courant
aj	Paragraphe courant plus une ligne blanche

= Text Objects Sélection =
ab	Autour d'une paire de parenthèses
ib	À l'intérieur d'une paire de parenthèses
aB	Autour d'une paire d'accolades
iB	À l'intérieur d'une paire d'accolades
]	[ Crochets ]
>
'
"
`
t

=== Folding ===
qf	créer un repli
qo	ouvrir repli
qc	fermer repli
qr	ouvrir tous les replis
qm	fermer tous les replis
q[RM]	+ tous les niveaux
qi	active/désactive le folding

=== Scrolling ===
qq	au milieu
qb	en bas
qt	en haut

=== vim-surround ===
es[caracter_to_delete]
xs[target_caracter][remplacement_caracter]
cs[pattern-motion][caracter]
css[caracter_added_on_entire_line]
(){}[]<>
b (
B )
r }
a ]
`
"
'
t Xml or HTML tags
w word
s sentence
p paragraph

=== NERD Tree ===
ô	ouvrir/fermer NERDTree
== Fichiers
o	ouvrir un fichier
go	aperçu du fichier
t	ouvrir un fichier dans un onglet
T 	ouvrir un fichier dans un onglet mais reste sur la fenêtre courante
!	executer un fichier
== Repertoires
o	ouvrir/fermer le répertoire
O	ouvrir le répertoire et les sous-répertoires
x	fermer le noeud parent
X	fermer tous les noeuds des sous-répertoires
== Explorateur
P	aller à la racine
p	aller au répertoire parent
K	aller sur le premier répertoire fils
J	aller sur le dernier répertoire fils
d et s 	naviguer sur les dossiers/fichiers
== Système de fichier
C	placer le rep courant comme racine de l'explorateur
u	déplacer la racine de l'explorateur vers le rep précédent
U	idem, mais laisse l'ancien rep racine ouvert
r	rafraîchir le rep courant
R	rafraîchir le racine
m	affiche le menu de l'explorateur
== Filtres
I	afficher/cacher les fichiers cachés
f	filtrer les fichiers
F	afficher/cacher les fichiers
== Autres
q	fermer l'explorateur
?	aide

=== Nerd Commenter ===
çcc	commenter la séléction ou ligne
ççi	inverser le commentaire


=== Autres ===
î   IndentGuide Toggle
û   UltisnipsEdit
ê   RainbowParenthese Toggle