Bonjour !
Ces deux scripts combinés vous permettent d'ouvrir, dans une seule fenêtre vim, TOUS les fichiers du répertoire courant et de ses sous-répertoires, qui contiennent une expression donnée, et de positionner le curseur à la bonne ligne sur tous ces fichiers.
Ça marche avec des reg_exp (pas trop avancées : compatibles grep/vim).
1er script — je l'appelle p. ex. « where ». Il peut s'utiliser tout seul et retourne la liste des fichiers correspondant à votre expression.
#!/usr/bin/env bash
# -----------
# Description
# -----------
# Looking for a string in all files in all directories (and subdirs)
# except SVN subdirectories
# ---------
# Arguments
# ---------
# Argument 1 is string. If not given, asked for.
#############################################################################
BLUE="$(tput setaf 4)"
RED="$(tput setaf 1)"
NORMAL="$(tput sgr0)"
temp="$(tempfile)"
if [ "$1" == "" ]
then
echo -n "${BLUE}Search for:${NORMAL} " 1>&2
read s
else
s="$@"
fi
echo "${RED}----------${NORMAL}" 1>&2
grep -RIl "$s" * |
sort |
uniq |
grep -v "/.svn/" > "$temp" 2> /dev/null
cat "$temp"
echo "${RED}----------${NORMAL}" 1>&2
echo "${RED}$(wc -l "$temp" | cut -d\ -f1) résultats${NORMAL}" 1>&2
rm "$temp"
2e script — je l'appelle p. ex. « vimWhere ». C'est celui qui vous intéresse, mais il a besoin du premier.
#!/usr/bin/env bash
# -----------
# Description
# -----------
# Looking for a string in all files in all directories (and subdirs)
# except SVN subdirectories and opens vim to edit directly where
# it is necessary.
# ---------
# Arguments
# ---------
# Arguments are concatenated => research pattern.
# If no argument, it is prompted.
#############################################################################
SEARCH_PROG="~/.my_binaries/where"
BLUE="$(tput setaf 4)"
RED="$(tput setaf 1)"
NORMAL="$(tput sgr0)"
temp="$(tempfile)"
if [ "$1" == "" ]
then
echo -n "${BLUE}Search for:${NORMAL} " 1>&2
read s
else
s="$@"
fi
count=0
while read i
do
toedit[count++]="$i"
done < <("$SEARCH_PROG" "$s" 2> /dev/null)
((count==0)) && {
echo Nothing to edit
exit 0
}
echo ':au BufEnter * winc |' > $temp
while ((count > 0))
do
((count--))
echo "/$s" >> $temp
echo ":winc w" >> $temp
done
vim -O -s "$temp" -- "${toedit[@]}"
rm $temp
— Adaptez la ligne « SEARCH_PROG="~/.my_binaries/where" » avec le nom du premier script
— Rendez les deux scripts exécutables
— Rendez le deuxième (et même le premier si vous comptez l'utiliser) en accès facile, par exemple en mettant son répertoire dans PATH ou avec un alias.
C'est prêt.
Benoit