Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/02/2009, à 20:35

PacoMokette

Vim - Configuration complete

Bonjour a tous,
Cela faisait un bon moment que je n'étais pas venu sur ce forum, mais je ne trouve pas vraiment d'autres endroits qu'ici ou les gens connaissent vraiment vim.
Je ne lance pas ce sujet pour avoir des trolls sur vim VS emacs ^^
En fait j'ai lu quelques sujets sympathiques sur ce forum justement, j'ai appris quelques trucs notamment la configuration d'un fichier ~/.netrc qui permet d'avoir ses mots de passes de connexion ftp stockés.
Si çà vous intéresse je pourrais vous donnez un lien wink
Sinon je vous sollicite pour que vous m'aidiez a construire un .vimrc complet, car ce qu'on trouve principalement sur le net ce sont la liste des commandes de vim, mais un bon fichier de configuration et une bonne utilisation des fonctions que l'on définie est un atout majeure je pense smile
J'ai commencé un fichier de configuration, je vous le met ici, si ca peut aider des gens ici :

"Activation de la coloration syntaxique
syntax on

"Activation de l'auto indentation
set cindent

"Modification du modèle de coloration syntaxique
colorscheme default

"Fonction d'affichage d'un message en inverse video
function! s:DisplayStatus(msg)
	echohl Todo
	echo a:msg
	echohl None
endfunction

"Variable d'enregistrement de l'état de la gestion de la souris
let s:mouseActivation = 1

"Fonction permettant l'activation/désactivation de la gestion de la souris
function! ToggleMouseActivation()
	if(s:mouseActivation)
		let s:mouseActivation = 0
		set mouse=n
		set paste
		call s:DisplayStatus('Désactivation de la gestion souris (mode collage)')
	else
		let s:mouseActivation = 1
		set mouse=a
		set nopaste
		call s:DisplayStatus('Activation de la gestion de la souris (mode normal)')
	endif
endfunction

"Activation par défaut au démarrage de la gestion de la souris
set mouse=a
set nopaste

"Personnalisation de la ligne de status
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [ASCII=\%03.3b]\ [Line=%04l]\ [Col=%04v]\ [%p%%]
set laststatus=2

"Activation de l'indentation automatique
set autoindent

"Redéfinitions des tabulations
"set expandtab "Pour remplacer les tabulations par des espaces
set shiftwidth=4
set softtabstop=4
set tabstop=4 

"Fonction de 'nettoyage' d'un fichier :
"Suppression des caractères ^M en fin de ligne
function CleanCode()
	%s/^M//g
	call s:DisplayStatus('Code nettoyé')
endfunction

"Déplacement de l'onget courant vers la gauche ou vers la droite
function! MoveTab(direction)
	if(a:direction ='left')
		let tabNum = tabpagenr()-2
		if(tabNum <0)
			let tabNum = 0
		endif
		execute 'tabm ' . tabNum
	else
		let tabNum = tabpagenr()
		execute 'tabm ' . tabNum
	endif
endfunction

"Ajout de la numérotation des lignes
set number
highlight LineNr ctermbg=black ctermfg=gray

"Ajout d'une ligne colorée pour surligné la ligne en cours
"set cursorline
"highlight CursorLine term=reverse cterm=reverse

"Amélioration de la lisibilité des nomsdes onglets
highlight TabLine term=none cterm=none
highlight TabLineSel ctermbg=darkblue

"Définition du style d'affichage des signets
sign define information text=>> linehl=Warning texthl=Error

"Variable d'enregistrement des identifiants designets pour chaque buffer
let s:signMarks ={}

"Variable d'enregistrement des sauts sur les signets de chaque buffer
let s:jumpMarks ={}

"Fonctin de marquage des signets
function! MarkSign()
	let filename = bufname(winbufnr(winnr()))
	if(has_key(s:signMarks, filename))	
		let s:signMarks[filename] +=1
	else
		let s:signMarks[filename] =1
	endif
	exe ':sign place ' . s:signMarks[filename] . ' line=' /line(.) .' name=information file=' .expand ('%:p')
endfunction

"Fonction de saut sur un signet
function! JumpToSign()
	let filename = bufname(winbufnr(winnr()))
	if(has_key(s:signMarks, filename))
		if(has_key(s:jumpMarks, filename))
			let s:jumpMarks[filename] +=1
		else
			let s:jumpMarks[filename] = 1
		endif
		if(s:jumpMarks[filename] > s:signMarks[filename])
			let s:jumpMarks[filename] = 1
		endif
		silent! execute ':sign jump ' . s:jumpMarks[filename] . 'file=' . expand('%:p')
	endif
endfunction

"Autorisation de remonter ou descendre d'une ligne avec les flèches
"gauche ou droite
set whichwrap=b,s,<,>,[,]

"Ouverture des fichiers avec le curseur à la position de la dernière édition
function! s:Cursor0ldPosition()
	if line("'\"") > 0 && line("'\"") <= line("$")
		exe "normal g`\""
	endif
endfunction
autocmd BufReadPost * silent! call s:CursorOldPosition()

"Repli de code
"Affichage textuel personnalisé lors d'un pliage
function! MyFoldFunction()
{
	let line = getline(v:foldstart)
	let sub = substitute(line, '/\*\|\*/\|^\s+', '', 'g')
	let lines = v:foldend - v:foldstart +1
	return '[+] '. v:folddashes.sub .'...' . lines . 'lignes...'
	getline(v:foldend)
endfunction

"activation de la gestion des ouvertures/fermetures des replis de code
set foldenable
"Affichage d'une ligne de '=' sur les pliages
set fillchars=fold:=
"Definition personnaelle de l'affichage du pliage
set foldtext=MyFoldFunction()

let php_folding=1

Je precise que tout ne marche pas ( j'ai recopier un linux magazine, mais j'ai mal du recopier )
Et je ne sais pas comment me servir de toutes les fonctions aussi ^^'

Je vous demande quelques conseils pour la programmation notamment en C et en PHP
En fait le php est pire a configurer que le C AMHA

Je voudrais savoir si a partir d'un fichier php quelconque je pouvais avoir une indentation particuliere
Je vous explique ma maniere a moi de coder ( je reconnais que c'est peut etre un peu exotique, enfin je ne sais pas trop, mais je m'y retrouve vraiment bien smile

<html>
    <body>
        <?php
            echo "bonjour";
        ?>
        <p>
            <p>
                <?php echo $var; ?>
            </p>
        </p>
        <h1> Bonjour <?php echo $nom; ?> </h1>
    </body>
</html>

Mon type d'indentation en C :

#include <stdio.h>

int main()
{
	while(1)
	{
		printf("Hello World");
	}
}

Voila j'accepte tous les commentaires smile
Merci d'avance wink

Hors ligne

#2 Le 20/02/2009, à 20:42

geenux

Re : Vim - Configuration complete

"set expandtab "Pour remplacer les tabulations par des espaces

Décommente cette ligne, surtout si tu compte travailler sur des projets à plusieurs (mais même seul). Les tabulations ne sont pas forcéments interprétées de la même façon par les différents éditeurs, et ça peux conduire à des résultats étranges.

Je pense que ton .vimrc est long inutilement... Il y a une bonne partie des fonctions que tu n'utilisera jamais. Tu devrais au moins le séparer en plusieurs fichiers (et les inclures ensuites dans ton .vimrc).

Le style d'indentation lors d'un mélange php / html est  assez embétant avec vim... Si je me souviens bien, il y a un plugin qui permet d'améliorer ça.

Hors ligne

#3 Le 20/02/2009, à 21:14

PacoMokette

Re : Vim - Configuration complete

Bah je n'aime pas trop les espaces a la place des tabulations. Pour le moment je n'ai jamais eut de problemes a cause de ca. C'est vraiment important ?

sinon ca m'interesse ton histoire de plug in je vais essayer de me renseigner, mais a mon avis je vais avoir un peu de mal :S

Ah oui autre chose concernant le php, si on tape la commande gg=G ca reindente le code n'importe comment, il me semble que tout reviens a gauche :S

Hors ligne

#4 Le 20/02/2009, à 22:02

geenux

Re : Vim - Configuration complete

Bah je n'aime pas trop les espaces a la place des tabulations. Pour le moment je n'ai jamais eut de problemes a cause de ca. C'est vraiment important ?

Tant que tu code dans ton coin, non. Dès que tu commence à envoyer des patch à d'autres personnes, oui.

C'est ce dont je parlais pour l'indentation php (gg=G déplorable). Il me semble que j'avais vu un plugin, mais je ne l'ai jamais utilisé, donc je ne connais ni son nom, ni son efficacité.

Hors ligne

#5 Le 20/02/2009, à 22:59

PacoMokette

Re : Vim - Configuration complete

On vient de me donner un lien pour un plug in :
http://www.vim.org/scripts/script.php?script_id=604
Je vais le tester.
Je vous dis ce que j'en pense apres wink

Sinon j'ai une petite question :
On m'a donné une commande assez exotique pour passer d'une indentation :
int main(){
}

celle ci :
int main()
{
}

Je voudrais savoir si on pouvait faire une sorte d'alias dans le vimrc ? pour qu'il soit plus simple a utiliser.
Merci d'avance wink

Hors ligne

#6 Le 21/02/2009, à 08:52

geenux

Re : Vim - Configuration complete

map touche commande

Ça créé un raccourcis clavier vers une commande.
Par exemple, pour ton cas, ça donnerai un truc du genre

map <C-i> <esc>$F{x<cr>i{

Et tu pourrai le lancer avec Ctrl+i

Sinon je viens de tester le plugin, ça marche pas mal. Quelques petits problèmes, mais rien de bien méchant.

Hors ligne

#7 Le 21/02/2009, à 15:03

PacoMokette

Re : Vim - Configuration complete

J'ai moi aussi tester le php.vim, je le trouve plutot bien, hormis deux choses :
je n'ai plus de coloration syntaxique avec ce plug in, et l'indentation n'est pas exactement comme je la veux, enfin pour le deuxieme point c'est moins grave quand meme ^^
Sinon je me renseigne sur la doc vim pour map, parce que ca a l'air un peu dur a utiliser ( je comprends le debut de la commande, mais pas le $F{x<cr>i{

Enfin merci encore smile

Hors ligne

#8 Le 21/02/2009, à 16:34

geenux

Re : Vim - Configuration complete

Sinon je me renseigne sur la doc vim pour map, parce que ca a l'air un peu dur a utiliser ( je comprends le debut de la commande, mais pas le $F{x<cr>i{

En fait c'était une façon tordue de faire ce que tu voulais faire.
Je vais décomposer un peu $F{xo{ :
$ : aller à la fin de la ligne
F{ : rechercher le { en arrière
x : le supprimer
o : ouvrir une ligne en insertion sous le curseur
{ : insérer le nouveau {
Et on mappe le tout:

map touche $F{xo{

Sinon, moi j'ai toujours la coloration syntaxique quand j'ai le plugin php.vim.
Comment l'as tu installé ?

Hors ligne

#9 Le 21/02/2009, à 16:50

PacoMokette

Re : Vim - Configuration complete

Alors pour l'installation sur un salon Jabber on m'a dit de le mettre dans /usr/share/vim/vimcurrent/syntax
et ca remplace l'ancien php.vim

sinon pour ta commande je viens de l'essayer, je ne sais pas si je l'utilise mal, mais une fois le fichier ouvert je fais CTRL + i ( i et CTRL en meme temps ) ca met mon curseur en fin de ligne ( peut etre a cause du $ du map )
je me trompe peut etre :S

Hors ligne

#10 Le 21/02/2009, à 16:56

geenux

Re : Vim - Configuration complete

J'avais fait une petite erreur dans le premier, t'as fait avec le mapping de la fin du 2ème message.
Sinon, php.vim n'est pas un script de coloration (enfin pas celui là), donc ce n'étais pas là qu'il fallait le mettre.
Tu peux, par exemple le mettre dans ~/.vim/ftplugin/php/
Il faudra que tu remette le script original php.vim dans le répertoire syntax si tu veux récupérer la coloration syntaxique.

Hors ligne

#11 Le 21/02/2009, à 17:16

PacoMokette

Re : Vim - Configuration complete

Pour la commande de map, j'ai essayé les deux ca me donne le meme resultat, j'ai du oublier quelque chose :S

Sinon j'ai deja recuperer l'ancien php.vim ^^
Je place le nouveau php.vim dans le dossier que tu m'as indiqué wink

argh ils ont supprimé le script, ou alors une erreur sur le serveur sad

Hors ligne

#12 Le 21/02/2009, à 18:02

geenux

Re : Vim - Configuration complete

Le voilà :

" Vim indent file
" Language:	Php
" Authors:	Miles Lott <milos@groupwhere.org>, Johannes Zellner <johannes@zellner.org>, Pim Snel <pim@lingewoud.nl> 
" URL:		http://lingewoud.nl/downloads.php
" Last Change:	23 feb 2004 
" Version:	0.3
" Notes:  	This is a combination of the PHP indent file of Miles Lott with 
"         	the HTML indent file of Johannes Zellner. Usefull for editing 
"         	php-files with html parts in it. 
"         	
" Changelog: 
" 			 0.3 - 25 mar 2004
" 			 - fixed wrong indention when a php-tag is opened and closed on
" 			   one single line.
" 			 0.2 - 23 feb 2004
" 			 - applied patch from Holger Dzeik <dzeik@nentec.de>
"            - added changelog
"            - added default indention of 3 spaces after the <?php for better
"              reading
"            - replaced URL
"            - reformatted the options section
"            0.1 - 27 mar 2003
"            - initial creation of html-enhanced php indent-file

" Options: 
let php_noindent_switch=0    " set this to '1' to not try to indent switch/case statements
set sw=3                     " default shiftwidth of 3 spaces


if exists("b:did_indent")
	finish
endif
let b:did_indent = 1

setlocal indentexpr=GetPhpIndent()
"setlocal indentkeys+=0=,0),=EO
setlocal indentkeys+=0=,0),=EO,o,O,*<Return>,<>>,<bs>,{,}

" Only define the function once.
if exists("*GetPhpIndent")
	finish
endif

" Handle option(s)
if exists("php_noindent_switch")
	let b:php_noindent_switch=1
endif

if exists('g:html_indent_tags')
	unlet g:html_indent_tags
endif

function GetPhpIndent()
    " Find a non-empty line above the current line.
	let lnum = prevnonblank(v:lnum - 1)

	" Hit the start of the file, use zero indent.
	if lnum == 0
	    return 0
	endif

	let line = getline(lnum)    " last line
	let cline = getline(v:lnum) " current line
	let pline = getline(lnum - 1) " previous to last line
	let ind = indent(lnum)

	let restore_ic=&ic
	let &ic=1 " ignore case

	let ind = <SID>HtmlIndentSum(lnum, -1)
	let ind = ind + <SID>HtmlIndentSum(v:lnum, 0)

	let &ic=restore_ic
	
	let ind = indent(lnum) + (&sw * ind)

	" Indent after php open tags 
	if line =~ '<?php' && line !~ '?>'
		let ind = ind + &sw
	endif
	if cline =~ '^\s*[?>]' " // Fix from Holger Dzeik <dzeik@nentec.de> Thanks!
		let ind = ind - &sw
	endif


	if exists("b:php_noindent_switch") " version 1 behavior, diy switch/case,etc
		" Indent blocks enclosed by {} or ()
		if line =~ '[{(]\s*\(#[^)}]*\)\=$'
			let ind = ind + &sw
		endif
		if cline =~ '^\s*[)}]'
			let ind = ind - &sw
		endif
		return ind
	else " Try to indent switch/case statements as well
		" Indent blocks enclosed by {} or () or case statements, with some anal requirements
		if line =~ 'case.*:\|[{(]\s*\(#[^)}]*\)\=$'
			let ind = ind + &sw
			" return if the current line is not another case statement of the previous line is a bracket open
			if cline !~ '.*case.*:\|default:' || line =~ '[{(]\s*\(#[^)}]*\)\=$'
				return ind
			endif
		endif
		if cline =~ '^\s*case.*:\|^\s*default:\|^\s*[)}]'
			let ind = ind - &sw
			" if the last line is a break or return, or the current line is a close bracket,
			" or if the previous line is a default statement, subtract another
			if line =~ '^\s*break;\|^\s*return\|' && cline =~ '^\s*[)}]' && pline =~ 'default:'
				let ind = ind - &sw
			endif
		endif

		if line =~ 'default:'
			let ind = ind + &sw
		endif
		return ind
	endif
endfunction


" [-- local settings (must come before aborting the script) --]
"setlocal indentexpr=HtmlIndentGet(v:lnum)
"setlocal indentkeys=o,O,*<Return>,<>>,<bs>,{,}



" [-- helper function to assemble tag list --]
fun! <SID>HtmlIndentPush(tag)
    if exists('g:html_indent_tags')
	let g:html_indent_tags = g:html_indent_tags.'\|'.a:tag
    else
	let g:html_indent_tags = a:tag
    endif
endfun


" [-- <ELEMENT ? - - ...> --]
call <SID>HtmlIndentPush('a')
call <SID>HtmlIndentPush('abbr')
call <SID>HtmlIndentPush('acronym')
call <SID>HtmlIndentPush('address')
call <SID>HtmlIndentPush('b')
call <SID>HtmlIndentPush('bdo')
call <SID>HtmlIndentPush('big')
call <SID>HtmlIndentPush('blockquote')
call <SID>HtmlIndentPush('button')
call <SID>HtmlIndentPush('caption')
call <SID>HtmlIndentPush('center')
call <SID>HtmlIndentPush('cite')
call <SID>HtmlIndentPush('code')
call <SID>HtmlIndentPush('colgroup')
call <SID>HtmlIndentPush('del')
call <SID>HtmlIndentPush('dfn')
call <SID>HtmlIndentPush('dir')
call <SID>HtmlIndentPush('div')
call <SID>HtmlIndentPush('dl')
call <SID>HtmlIndentPush('em')
call <SID>HtmlIndentPush('fieldset')
call <SID>HtmlIndentPush('font')
call <SID>HtmlIndentPush('form')
call <SID>HtmlIndentPush('frameset')
call <SID>HtmlIndentPush('h1')
call <SID>HtmlIndentPush('h2')
call <SID>HtmlIndentPush('h3')
call <SID>HtmlIndentPush('h4')
call <SID>HtmlIndentPush('h5')
call <SID>HtmlIndentPush('h6')
call <SID>HtmlIndentPush('i')
call <SID>HtmlIndentPush('iframe')
call <SID>HtmlIndentPush('ins')
call <SID>HtmlIndentPush('kbd')
call <SID>HtmlIndentPush('label')
call <SID>HtmlIndentPush('legend')
call <SID>HtmlIndentPush('map')
call <SID>HtmlIndentPush('menu')
call <SID>HtmlIndentPush('noframes')
call <SID>HtmlIndentPush('noscript')
call <SID>HtmlIndentPush('object')
call <SID>HtmlIndentPush('ol')
call <SID>HtmlIndentPush('optgroup')
call <SID>HtmlIndentPush('pre')
call <SID>HtmlIndentPush('q')
call <SID>HtmlIndentPush('s')
call <SID>HtmlIndentPush('samp')
call <SID>HtmlIndentPush('script')
call <SID>HtmlIndentPush('select')
call <SID>HtmlIndentPush('small')
call <SID>HtmlIndentPush('span')
call <SID>HtmlIndentPush('strong')
call <SID>HtmlIndentPush('style')
call <SID>HtmlIndentPush('sub')
call <SID>HtmlIndentPush('sup')
call <SID>HtmlIndentPush('table')
call <SID>HtmlIndentPush('textarea')
call <SID>HtmlIndentPush('title')
call <SID>HtmlIndentPush('tt')
call <SID>HtmlIndentPush('u')
call <SID>HtmlIndentPush('ul')
call <SID>HtmlIndentPush('var')


" [-- <ELEMENT ? O O ...> --]
if !exists('g:html_indent_strict')
    call <SID>HtmlIndentPush('body')
    call <SID>HtmlIndentPush('head')
    call <SID>HtmlIndentPush('html')
    call <SID>HtmlIndentPush('tbody')
endif


" [-- <ELEMENT ? O - ...> --]
if !exists('g:html_indent_strict_table')
    call <SID>HtmlIndentPush('th')
    call <SID>HtmlIndentPush('td')
    call <SID>HtmlIndentPush('tr')
    call <SID>HtmlIndentPush('tfoot')
    call <SID>HtmlIndentPush('thead')
endif

delfun <SID>HtmlIndentPush

set cpo-=C

" [-- count indent-increasing tags of line a:lnum --]
fun! <SID>HtmlIndentOpen(lnum)
    let s = substitute('x'.getline(a:lnum),
    \ '.\{-}\(\(<\)\('.g:html_indent_tags.'\)\>\)', "\1", 'g')
    let s = substitute(s, "[^\1].*$", '', '')
    return strlen(s)
endfun

" [-- count indent-decreasing tags of line a:lnum --]
fun! <SID>HtmlIndentClose(lnum)
    let s = substitute('x'.getline(a:lnum),
    \ '.\{-}\(\(<\)/\('.g:html_indent_tags.'\)\>>\)', "\1", 'g')
    let s = substitute(s, "[^\1].*$", '', '')
    return strlen(s)
endfun

" [-- count indent-increasing '{' of (java|css) line a:lnum --]
fun! <SID>HtmlIndentOpenAlt(lnum)
    return strlen(substitute(getline(a:lnum), '[^{]\+', '', 'g'))
endfun

" [-- count indent-decreasing '}' of (java|css) line a:lnum --]
fun! <SID>HtmlIndentCloseAlt(lnum)
    return strlen(substitute(getline(a:lnum), '[^}]\+', '', 'g'))
endfun

" [-- return the sum of indents respecting the syntax of a:lnum --]
fun! <SID>HtmlIndentSum(lnum, style)
    if a:style == match(getline(a:lnum), '^\s*</')
	if a:style == match(getline(a:lnum), '^\s*</\<\('.g:html_indent_tags.'\)\>')
	    let open = <SID>HtmlIndentOpen(a:lnum)
	    let close = <SID>HtmlIndentClose(a:lnum)
	    if 0 != open || 0 != close
		return open - close
	    endif
	endif
    endif
    if '' != &syntax &&
	\ synIDattr(synID(a:lnum, 1, 1), 'name') =~ '\(css\|java\).*' &&
	\ synIDattr(synID(a:lnum, strlen(getline(a:lnum)) - 1, 1), 'name')
	\ =~ '\(css\|java\).*'
	if a:style == match(getline(a:lnum), '^\s*}')
	    return <SID>HtmlIndentOpenAlt(a:lnum) - <SID>HtmlIndentCloseAlt(a:lnum)
	endif
    endif
    return 0
endfun

" vim: set ts=3 sw=3:

Sinon en effet, je viens de tester mon mapping, ça ne fonctionne pas (bizzare).
Enfin, reprend ta "commande assez exotique pour passer d'une indentation" et sert toi en pour faire le mapping.

Hors ligne

#13 Le 22/02/2009, à 23:05

PacoMokette

Re : Vim - Configuration complete

Alors voici la commande "exotique" que j'avais parlé un peu avant :
je l'ai mise dans mon vimrc :
map <C-i> <esc>:%s/\S\zs\s*{/\{<CR>

Mais en fait ca ne marche pas a tous les coups ^^'
C'est susceptible d'améliorations a mon avis.
Tu ne connaitrais pas un tutoriel pour maitriser la configuration du fichier ? je suis tombé sur beaucoup de sites parlant du fichier de configuration mais généralement il y a juste la configuration, et aucune explication.
Si vous voulez je peux vous donner les liens.

Voila smile

Hors ligne