# Vim: (Alt: clang_complete) Neu: YouCompleteMe

## musv

Hallo, 

schon seit langer Zeit scheiter ich daran, den C/C++-Support über Clang und LLVM im Vim zum Laufen zu kriegen. 

Gemacht hab ich folgendes:

clang_complete.vmb runtergeladen. 

vim clang_complete.vmb -> :so %

Meine Konfigdatei (clang-Teil):

```
let g:clang_use_library =1

let g:clang_library_path='/usr/lib64/'

let g:clang_complete_copen = 1
```

clang, llvm, Python-2.7 sind installiert. 

Versuch ich jetzt: vim test.cpp, bekomm ich folgende Meldung:

```
"test.cpp" 6L, 43C                                                                                                                                                        6,1         Alles

Exception in thread Thread-1:

Traceback (most recent call last):

  File "/usr/lib64/python2.7/threading.py", line 810, in __bootstrap_inner

    self.run()

  File "/root/.vim/plugin/libclang.py", line 434, in run

    self.timer)

  File "/usr/share/vim/vimfiles/plugin/libclang.py", line 35, in getCurrentTranslationUnit

    flags = TranslationUnit.PrecompiledPreamble | TranslationUnit.CXXPrecompiledPreamble # | TranslationUnit.CacheCompletionResults

AttributeError: type object 'TranslationUnit' has no attribute 'PrecompiledPreamble'

Betätigen Sie die EINGABETASTE oder geben Sie einen Befehl ein
```

Tipp ich im Vim dann:

```
#include <iostream>

int main()

{

  std::
```

krieg ich:

```
-- Benutzerdefinierte Ergänzung (^U^N^P) Muster nicht gefunden
```

Mit STRG+P stehen mir dann nur die bereits im Code vorkommenden Literale zur Verfügung, d.h. std, include, iostream, int, main.

Wie kriegt man Clang + LLVM im Vim zum Laufen? Das ist eins der wichtigsten Features für mich. Und nirgendwo sonst bin ich so lange Zeit bisher daran gescheitert.Last edited by musv on Mon May 26, 2014 7:18 pm; edited 3 times in total

----------

## musv

Ok, hab's hinbekommen. Ich hatte noch 'ne alte clang-Installation in /usr/share/vim/vimfiles. Da kamen sich die beiden Plugins wohl ins Gehege. Außerdem dürfte noch Reste vom Omnicomplete vorhanden gewesen sein.

----------

## musv

Ein paar Probleme gibt's dann doch noch: 

Wie jetzt clang_complete die Headerdateien des eigenen Projektes findet, hab ich rausgefunden. Bsp:

```
mein_projekt/src/test.cpp

mein_projekt/include/test.h

mein_projekt/.clang_complete

```

Die .clang_complete enthält dann:

```
-I./include
```

Aufgerufen wird das Ganze mit:

```
vim src/test.cpp
```

D.h. vim befindet sich im Basisverzeichnis. Dann klappt die Vervollständigung.

Was jetzt aber irgendwie nicht geht, sind die Standardbefehle und Datentypen von Libs, die man nicht einbinden muss. 

Beispiel:

```
touch test.cpp

vim test.cpp

#i[strg+P] <- hier krieg ich "Stichwort-Ergängung (^N^P) Muster nicht gefunden". Da hätte ich gern "#include".

i[strg+P] <- hier sollte eigentlich ein "int" kommen. Stattdessen: "Stichwort-Ergängung (^N^P) Muster nicht gefunden".

```

Wie krieg ich das hin?

----------

## musv

Hab wieder schmerzhaft rausgefunden, dass man bei weiteren Vim-Scripten ziemlich vorsichtig sein muss, sonst zerschießt es sofort das clang_complete-Script. Im jetzigen Fall war es taglist, was sich mit clang_complete beißt.

----------

## franzf

Du kannst mal YouCompleteMe probieren. Sollte auch schneller sein als clang_complete, da der kritische Teil in C++ geschrieben ist.

----------

## musv

Hab's probiert. Erst mal bin ich dadurch auf Vundle gestoßen, was ich durchaus genial find. 

Dann hab ich versucht YCM zu installieren. Hat auch problemlos geklappt. Nur klappt die Autovervollständigung wieder nicht:

```
HTTPConnectionPool(host='127.0.0.1', port=42829): Max retries exceeded with url: /event_notification (Caused by <class 'socket.error'>: 

[Errno 111] Verbindungsaufbau abgelehnt)
```

```
Printing YouCompleteMe debug information...

-- Server crashed, no debug info from server

-- Server running at: http://127.0.0.1:53282

HTTPConnectionPool(host='127.0.0.1', port=53282): Max retries exceeded with url: /event_notification (Caused by <class 'socket.error'>: [Errno 111] V

erbindungsaufbau abgelehnt)
```

Tja, 'ne andere Fehlermeldung gibt's nicht. Ins Debugverzeichnis, wo eigentlich das Logfile stehen sollte, schreibt das Vim gar nichts rein.

----------

## franzf

Ich hatte anfangs auch leichte Schwierigkeiten, aber mit clang-3.4 waren alle Probleme vorbei (clang_complete wollte noch immer nicht  :Wink: )

Wie sieht dein setup aus:

Welches clang/llvm verwendest du? (Version und system oder "official build", der ja seitens YCM empfohle wird)

Wie hast du den ycmd kompiliert? (das script verwendet oder mit manuellem cmake-Aufruf?)

Ich hab es einfach mit "cmake -DUSE_SYSTEM_LIBCLANG=ON pfad_siehe_ycmdocs" konfiguriert + "make". Ich habs mit clang/llvm-3.4.1 am Laufen.

----------

## musv

Die Module hab ich installiert mit:

```
./install.sh --clang-completer --system-libclang
```

Das Problem war Python. Hat mich schon ein paar Stunden gekostet, das rauszufinden. Klar, es steht überall, dass man Python2 braucht, aber in der vimrc ist dann in den Default-Configs immer nur /usr/bin/python drin, was ja bekanntermaßen auf Python3 zeigt. 

Und dass man halt noch eine Option benötigt, damit die temporären Logfiles nicht gelöscht werden, ist auch nicht gerade optimal.

```
let g:ycm_path_to_python_interpreter = '/usr/bin/python2'

" let g:ycm_server_keep_logfiles = 1

" let g:ycm_server_log_level = 'debug'
```

Damit hat's dann geklappt.

----------

## firefly

 *musv wrote:*   

> Klar, es steht überall, dass man Python2 braucht, aber in der vimrc ist dann in den Default-Configs immer nur /usr/bin/python drin, was ja bekanntermaßen auf Python3 zeigt. 

 

Der Linkt zeigt aber nur auf Python3, wenn man im system python3 als default python version gesetzt hat  :Wink:  also nicht wirklich bekanntermaßen

----------

## franzf

Schön dass es jetzt klappt!

Ich muss aber sagen, dass trotz global gesetztem python3 als default bei mir ycmd problemlos läuft! Den python path habe ich in meiner vimrc gar nicht gesetzt, evtl. nimmt YCM ohne persönlicher Intervention ja den richtigen...

Ansonsten würde mich interessieren, ob sich YCM bei dir unproblematischer verhält als clang_complete (was ja mit ein Hintergedanke meinerseits bei der Empfehlung war).

----------

## musv

Ja, läuft richtig gut. Hab heut den ganzen Tag mal damit zugebracht, Vim noch richtig zu konfigurieren (Airline, Nerdtree, Matchit, Syntastic)

Eine Sache stört mich noch bei YouCompleteMe:

Wenn das Popup mit der Funktionsauswahl kommt, dann kann ich mit TAB/Shift+TAB (inzwischen deaktiviert) und Cursor hoch/runter durch die Liste scrollen. Drück ich dann:

Return: springt er sofort auf die nächste Zeile

Space: macht er auch ein Leerzeichen, aber ohne die evtl. nötige Klammer zu setzen, z.b. string.empty -> eigentlich string.empty(), YCM macht string.empty *hiergehtsweiter*

Strg+P: scrollt in der Liste nach oben

Strg+Space: bleibt in der Liste hängen

Bei Clang_Complete konnte ich das mit Strg+P auswählen. Und da wurden dann auch gleich noch die Parameter der Funktion mit übernommen. 

Geht das hier irgendwie auch?

----------

## franzf

Am einfachsten wird es wohl sein delimitMate zu installieren und nach Auswahl der passenden Vervollständigung "(" zu drücken. (Da muss ich sagen, dass kdevelop die mMn. beste Vervollständigung anbietet... Sollte aber mit nem Feature Request bei YCM evtl. möglich sein  :Wink: )

Zwei kleine allgemeine Tips:

- Wenn du ne deutsche Tastaturbelegung hast ist <leader> mit "\" ziemlich unhandlich. Z.B. auf "," bietet sich an:

let mapleader = ","

- Für besseres C++ Syntax Highlihting:

https://github.com/octol/vim-cpp-enhanced-highlight

----------

## musv

 *franzf wrote:*   

> Am einfachsten wird es wohl sein delimitMate zu installieren und nach Auswahl der passenden Vervollständigung "(" zu drücken. 

 

Danke, werd ich mir ansehen

 *franzf wrote:*   

> - Wenn du ne deutsche Tastaturbelegung hast ist <leader> mit "\" ziemlich unhandlich. Z.B. auf "," bietet sich an:
> 
> let mapleader = ","

 

Hab ich schon gelesen. Allerdings ist das Komma ja auch mit 'ner Navigationsfunktion belegt. Ist also nicht so praktisch. Stattdessen sind bei uns die Umlaute noch frei:

```

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" Tastatur-Remapping

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" Achtung: Keine Kommentare hinter dem Remapping!

"Cursor auch bei Zeilenumbruch: j -> gj / k -> kg

noremap j gj

nnoremap k gk

"Backslashtaste auf ü legen

" Sonderkonfiguration Windows

" ü=CHAR-252 - Escapezeichen \ damit der CHAR akzeptiert wird

"let mapleader="\<CHAR-252>"

let mapleader="ü"

" [] im Normalmodus auf öä legen

" Sonderkonfiguration Windows

" ä=CHAR-228, ö=CHAR-246

"noremap <CHAR-228> ]

noremap ö [

"noremap <CHAR-246> [

noremap ä ]

" {} im Normalmodus auf ÖÄ legen

" Sonderkonfiguration Windows

" Ä=CHAR-196, Ö=CHAR-214

"noremap <CHAR-214> {

noremap Ö {

" noremap <CHAR-196> }

noremap Ä }
```

Da ich auf Arbeit Cygwin verwende, ist bei der Windows-Config latin1 als Kodierung eingestellt. Da muss ich statt der Umlaute dann die CHAR-Zeichen verwenden. Vermutlich könnte ich da sogar die Kommentare rausnehmen, da das eh nicht kollidieren wird. Muss ich mal probieren.

Mit dem CPP-Highlighting bin ich eigentlich in der Defaulteinstellung zufrieden.

----------

