2016-06-23 11 views
1

Irgendwie kann ich Emacs ff-find-other-file nicht machen, um meine Header-Datei zu bekommen. Hier ist, was ich habe (minimal Beispiel):Emacs ff-find-other-Datei findet nicht meine Kopfzeile

cd ~/tmp 
mkdir test 
cd test 
mkdir -p src/a/b inc/a/b 
echo "aaaa" > src/a/b/a.cpp 
echo "bbbb" > inc/a/b/a.hpp 
tree 

gibt:

. 
├── inc 
│   └── a 
│    └── b 
│     └── a.hpp 
└── src 
    └── a 
     └── b 
      └── a.cpp 

Dies ist ähnlich wie meine Projektstruktur.


emacs -Q src/a/b/a.cpp 

Dann Dieses Kopieren in *scratch* und Ausführung mit C-x C-e:

(setq cc-search-directories '("." "../inc" "../inc/*" "../../inc/*" "../../../inc/*" "/usr/include")) 

und Laufe ff-find-other-file in Puffer a.cpp, führt nur zu einer Eingabeaufforderung in dem Minipuffer:

Find or create a.hpp in: ~/tmp/test/src/a/b/

C-h v auf ff-search-directories kehrt cc-search-directories und auf cc-search-directories ich die Liste oben zu bekommen.

Ich erwarte ff-find-other-file in ../../../inc/* suchen und a.hpp finden. Warum nicht?


bearbeiten: es scheint, der rekursive Teil zu sein, die hier nicht funktioniert.

Nach:

cp inc/a/b/a.hpp inc/ 

a.hpp aus a.cpp gefunden.

Die Hilfe über ff-search-directories sagt:

Die Sterne sind nicht Platzhalter: sie zusammen mit der vorhergehenden Schrägstrich durchsucht werden. Der Stern repräsentiert alle Unterverzeichnisse außer `.. ', und jedes dieser Unterverzeichnisse wird der Reihe nach durchsucht.

Beachten Sie, dass dieses Zitat, wenn von der Hilfe für ff-search-directories, während die Liste I modifizierte cc-search-directories ist. Ich kann nicht sehen, warum das einen Unterschied machen würde.

Diese und andere Threads auf SO ließen mich glauben, * würde rekursiv den Verzeichnisbaum durchsuchen. Falsch?

Antwort

1

* repräsentiert jedes unmittelbare Unterverzeichnis seiner Eltern; nichts mehr.

Der Kommentar hat es etwas deutlicher formuliert:

Der Stern ist nicht ein allgemeines Platzhalter-Zeichen: Es zeigt nur, dass die Unterverzeichnisse dieses Verzeichnisses muss jeder wiederum gesucht werden.

, d. H. Für dieses spezielle Beispiel würde ich erwarten, "../../../inc/*/b" zu arbeiten. Oder in der Tat "../../../inc/*/*" (wie Sie am Ende verwendet haben).

Siehe auch https://stackoverflow.com/a/23662870/324105 und beachten Sie insbesondere, dass Sie Funktionen definieren können, um den/die Zieldateipfad (e) dynamisch zu generieren.

Ich vermute, dass Sie wollen, dass die a/b basierend auf dem ursprünglichen Pfad bestimmt wird, so eine Funktion, um den entsprechenden Pfad zu der anderen Datei zurückzugeben wäre Ihre beste Lösung hier.

0

Oh, schaltet sich die Suche aus nicht rekursiv nach allen. Diese anderen Fragen und Antworten haben mich dazu gebracht, die Hilfe falsch zu verstehen (zitiert in der Frage).

"Jedes dieser Unterverzeichnisse wird der Reihe nach durchsucht" bedeutet nicht, dass ihre Unterverzeichnisse auch durchsucht werden.

(setq cc-search-directories '("." 
           "../inc" "../inc/*" "../../inc/*" "../../../inc/*" 
           "../../inc/*/*" "../../../inc/*/*/*" 
           "../src" "../src/*" "../../src/*" "../../../src/*" 
           "../../src/*/*" "../../../src/*/*/*" 
           "/usr/include" "/usr/local/include/*")) 
0

Einen anderen Optionen wird Projektil und führen Sie den projectile-find-other-file Befehl verwenden:

Da die Tiefe meines Baumes begrenzt ist, ich meine cc-search-directories gerade geändert. Da das Projektil Ihre Projektstruktur kennt, passt es Ihre cpp/h Dateien automatisch an. Es ist etwas langsamer als ff-find-other-file, aber es scheint den Job ziemlich gut zu machen.