Fiquei intrigado com a sua pergunta e fiquei meio empolgado. Essa solução gerará um arquivo PDF agradável com um índice clicável e um código destacado colorido. Ele localizará todos os arquivos no diretório atual e nos subdiretórios e criará uma seção no arquivo PDF para cada um deles (veja as notas abaixo para saber como tornar seu comando find mais específico).
Requer que você tenha o seguinte instalado (as instruções de instalação são para sistemas baseados em Debian, mas estas devem estar disponíveis nos repositórios de sua distribuição):
-
sudo apt-get install texlive-latex-extra latex-xcolor texlive-latex-recommended
Isso também deve instalar um sistema LaTeX básico se você não tiver um instalado.
Depois de instalados, use este script para criar um documento LaTeX com seu código-fonte. O truque é usar o listings
(parte de texlive-latex-recommended
) e color
(instalado por latex-xcolor
) Pacotes LaTeX. O \usepackage[..]{hyperref}
é o que torna as listagens nos links clicáveis do índice.
#!/usr/bin/env bash
tex_file=$(mktemp) ## Random temp file name
cat<<EOF >$tex_file ## Print the tex file header
\documentclass{article}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{color} %% Allow color names
\lstdefinestyle{customasm}{
belowcaptionskip=1\baselineskip,
xleftmargin=\parindent,
language=C++, %% Change this to whatever you write in
breaklines=true, %% Wrap long lines
basicstyle=\footnotesize\ttfamily,
commentstyle=\itshape\color{Gray},
stringstyle=\color{Black},
keywordstyle=\bfseries\color{OliveGreen},
identifierstyle=\color{blue},
xleftmargin=-8em,
}
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}
\begin{document}
\tableofcontents
EOF
find . -type f ! -regex ".*/\..*" ! -name ".*" ! -name "*~" ! -name 'src2pdf'|
sed 's/^\..//' | ## Change ./foo/bar.src to foo/bar.src
while read i; do ## Loop through each file
name=${i//_/\_} ## escape underscores
echo "\newpage" >> $tex_file ## start each section on a new page
echo "\section{$i}" >> $tex_file ## Create a section for each filename
## This command will include the file in the PDF
echo "\lstinputlisting[style=customasm]{$i}" >>$tex_file
done &&
echo "\end{document}" >> $tex_file &&
pdflatex $tex_file -output-directory . &&
pdflatex $tex_file -output-directory . ## This needs to be run twice
## for the TOC to be generated
Execute o script no diretório que contém os arquivos de origem
bash src2pdf
Isso criará um arquivo chamado all.pdf
no diretório atual. Eu tentei isso com um par de arquivos fonte aleatórios que encontrei no meu sistema (especificamente, dois arquivos da fonte de vlc-2.0.0
) e esta é uma captura de tela das duas primeiras páginas do PDF resultante:
Algunscomentários:
- Oscriptnãofuncionaráseosnomesdosarquivosdecódigo-fontecontiveremespaços.Jáqueestamosfalandodecódigo-fonte,vouassumirquenão.
- Euadicionei
!-name"*~"
para evitar arquivos de backup. -
Recomendo que você use um comando
find
mais específico para encontrar seus arquivos, caso contrário, qualquer arquivo aleatório será incluído no PDF. Se todos os seus arquivos tiverem extensões específicas (.c
e.h
, por exemplo), você deve substituir ofind
no script por algo assimfind . -name "*\.c" -o -name "\.h" | sed 's/^\..//' |
- Brinque com as opções
listings
, você pode ajustar isso para ser exatamente como você deseja.