Ich gebe vim gerade im Rahmen eines Editor Vergleichstests mal wieder
eine Chance und habe jetzt ein paar Fragen dazu.
1. Wenn ich eine Session mit mehreren Tabs geöffnet habe und eine
weitere
Datei in einem neuen Tab erstelle, wie kann ich dann die Session so
aktualisieren, dass beim nächsten mal auch das Tab für die neue Datei
geöffnet wird?
Im Internet habe ich gelesen, dass dies mit :mks! gehen würde, aber
dieser Befehl legt nur eine neue Session.vim Datei im aktuellen
Verzeichnis an, ohne die alte Sessiondatei zu aktualisieren.
Wenn ich die alte aktualisieren will, dann muss ich die alte Session
Datei extra hinter dem :mks! Befehl angeben, dann funktioniert es. Geht
es aber auch ohne Angabe der Session Datei?
2. Wenn ich mehrere Tabs geöffnet habe, wie schließe ich dann vim in
einem Rutsch, also so, dass auch alle Tabs auf einmal geschlossen
werden?
:q! schließt nur den aktiven Tab, alle anderen bleiben geöffnet. n-mal
:q! einzutippen, bis alle tabs geschlossen sind, nervt ziemlich. Geht
das irgendwie schneller?
3. Was kann neovim besser als vim?
Nano schrieb:> Wenn ich die alte aktualisieren will, dann muss ich die alte Session> Datei extra hinter dem :mks! Befehl angeben, dann funktioniert es
So mache ich es auch.
Nano schrieb:> 2. Wenn ich mehrere Tabs geöffnet habe, wie schließe ich dann vim in> einem Rutsch, also so, dass auch alle Tabs auf einmal geschlossen> werden?
Sepia schrieb:> So mache ich es auch.
Dann scheint es wohl keine bessere Lösung zu geben. Schade.
> :qa!>> oder, um alle auch zu speichern:>> :wqa!
Danke.
Weitere Frage:
4. Wie kann ich die Dateien im aktuellen Verzeichnis auflisten,
während ich vim geöffnet habe?
Also ich muss schon sagen, Code folding ist mit vim extrem umständlich.
Zuerst soll man mit der Eingabe von mb gefolgt von % erst einmal
definieren, welcher Block gefaltet werden soll.
Dann muss man das eigentliche Falten mit zf'b durchführen.
Und wenn man den gefaltenen Block wieder aufmachen will, muss man zo
eingeben. Den Block wieder schließen kann man mit ze.
Alternativ kann man mit za auch einfach zwischen den beiden Zuständen
hin und herschalten.
Da es aber nicht umständlich genug geht, muss man diese Schritte für
jeden Funktionsblock separat machen und zu allem Überdruss
verliert vim das Wissen innerhalb der Sitzung, welcher Funktionsblock
geschlossen werden soll.
Ich habe bsw. drei Funktionen (C Code) angelegt.
Dann habe ich für func_1() so ne Faltung definiert, anschließend für
func_2() und func_3().
Will man dann entfalten und falten, dann passiert z.B: folgendes:
A) Das Falten geht plötzlich nicht mehr
oder
B) Das Falten geht, aber func_2() faltet func_3() noch gleich mit, so
dass nach der Faltung anstatt einer nicht geöffneten func_3() Funktion
gleich die main() Funktion unterhalb der Faltung angezeigt wird, wenn
das die Reihenfolge der Funktionen ist.
Da frage ich mich, WTF?
Jeder anständige GUI Editor macht das Falten eines Funktionsblocks
mit einem Mausklick und was gefaltet werden soll, muss man gar nicht
erst definieren, der Editor weiß es automatisch.
Geht das in vim vanilla irgendwie besser?
Ach ja und damit sich vim beim nächsten mal, also wenn man vim beendet
hat und die Datei später weiterbearbeiten möchte, an die definierten
Folds erinnnern kann, muss man auch noch die vim Konfigurationsdatei
bearbeiten und da folgendes reinschreiben:
5. Identation, also die formatiere Einrückung des Codes geht mit Eingabe
von
1
=i{
im normal Mode. Aber die automatische Einrückung macht daraus Tabs.
Wie kann man vim beibringen, dass er keine Tabs verwendet, sondern
stattdessen zwei Leerzeichen pro Einrückungsstufe?
Wie kann man überhaupt den Identation Stil konfigurieren?
Wie sag ich vim z.b. dass ich die Identation von K&R haben möchte, oder
vom GNU Projekt?
6. Autocomplete funktioniert leider auch nicht richtig.
Ich habe probeweise das mal mit einer Datei mit C Code ausprobiert.
Laut obigem Link soll man anfangen das Schlüsselwort bzw. den
Funktionsnamen
zu schreiben, dann CTRL+n drücken und schon kriegt man eine Auswahl an
Kombinationen und das soll alles in vim vanilla, ohne plugins out of the
box gehen.
Tja, vim scheint die ganzen mathematischen Funktionen aus math.h nicht
zu kennen, den header habe ich eingebunden, aber tippt man
1
ata CTRL+n
2
oder
3
po CTRL+n
ein, dann wird einem weder atan(), noch pow() vorgeschlagen.
Er scheint die Funktionen schlichtweg nicht zu kennen.
Name schrieb:> Nano schrieb:>> Wie kann man vim beibringen, dass er keine Tabs verwendet, sondern>> stattdessen zwei Leerzeichen pro Einrückungsstufe?:h 'et> :h 'ts
Hm, also wenn ich mir die Hilfe so durchlese, dann bezieht sich das im
Zusammenhang wenn man manuell Text eingibt und bspw. Leerzeichen durch
ein Tab ersetzt werden sollen oder umgekehrt, wie viele Zeichen ein Tab
entsprechen soll.
Was mich aber interessiert ist die Codeformatierung und deren
Einrückung, also das es da wie oben in der Frage angegeben gemacht wird,
ohne das ich die Defaulteinstellung für Tabs ändern muss.
Das sollte also unabhängig von der normalen Tabeinstellung
funktionieren.
Sepia schrieb:> :qa!>> oder, um alle auch zu speichern:>> :wqa!
Wobei das Ausrufezeichen nur nötig ist, wenn man ungespeicherte Daten
ausdrücklich verwerfen will. Es ist also im zweiten Fall wenig sinnvoll,
im ersten nur, wenn man wirklich bewusst nix speichern will.
Nano schrieb:> 4. Wie kann ich die Dateien im aktuellen Verzeichnis auflisten,> während ich vim geöffnet habe?
Einfach das aktuelle Verzeichnis wie eine Datei öffnen, also z.B. mit
1
:sp .
Man bekommt dann einen Buffer, der quasi wie ein Datei-öffnen-Dialog
genutzt werden kann.
Nano schrieb:> Was mich aber interessiert ist die Codeformatierung und deren> Einrückung, also das es da wie oben in der Frage angegeben gemacht wird,> ohne das ich die Defaulteinstellung für Tabs ändern muss.
In meiner .vimrc steht:
1
" use 4 spaces for a tab
2
set tabstop=4
3
set softtabstop=4
4
set shiftwidth=4
5
set expandtab
Nano schrieb:> Tja, vim scheint die ganzen mathematischen Funktionen aus math.h nicht> zu kennen, den header habe ich eingebunden, aber tippt man ata CTRL+n> oder> po CTRL+n> ein, dann wird einem weder atan(), noch pow() vorgeschlagen.> Er scheint die Funktionen schlichtweg nicht zu kennen.
Was steht denn in der Variable path drin? Die bestimmt, wo nach Headern
gesucht wird.
Nano schrieb:> Da es aber nicht umständlich genug geht, muss man diese Schritte für> jeden Funktionsblock separat machen
Man kann auch mit zM alle auf einmal schließen und mit zR alle öffnen.
> Da frage ich mich, WTF?> Jeder anständige GUI Editor macht das Falten eines Funktionsblocks> mit einem Mausklick und was gefaltet werden soll, muss man gar nicht> erst definieren, der Editor weiß es automatisch.
Das geht mit vim selbstverständlich auch. Du musst es allerdings erst
einschalten. Dazu :set foldmethod=syntax machen, dann findet er die
Blöcke auch von selber. Und wenn du Mausbedienung aktiviert hast und
z.B. set foldcolumn=5 eingegeben hast, bekommst du auch Marker für die
Folds, die du zum öffnen und schließen anklicken kannst.
Rolf M. schrieb:> Nano schrieb:>> 4. Wie kann ich die Dateien im aktuellen Verzeichnis auflisten,>> während ich vim geöffnet habe?>> Einfach das aktuelle Verzeichnis wie eine Datei öffnen, also z.B. mit:sp> .
Danke.
> Nano schrieb:>> Was mich aber interessiert ist die Codeformatierung und deren>> Einrückung, also das es da wie oben in der Frage angegeben gemacht wird,>> ohne das ich die Defaulteinstellung für Tabs ändern muss.>> In meiner .vimrc steht:" use 4 spaces for a tab> set tabstop=4> set softtabstop=4> set shiftwidth=4> set expandtab
Das ändert aber die Defaulteinstellung für tabs, oder?
Die ident Geschichte, also =i{, wird damit nicht separat konfiguriert.
Ich möchte, dass =i{ gar keine Tabs verwendet und stattdessen da, wo es
gerade Tabs macht, nur zwei Leerzeichen setzt und zwar so, dass die
Einstellung für die default tabs bei 8 Zeichen bleibt. Dazu müsste die
i={ ident Funktion direkt konfiguriert werden können.
> Nano schrieb:>> Tja, vim scheint die ganzen mathematischen Funktionen aus math.h nicht>> zu kennen, den header habe ich eingebunden, aber tippt man ata CTRL+n>> oder>> po CTRL+n>> ein, dann wird einem weder atan(), noch pow() vorgeschlagen.>> Er scheint die Funktionen schlichtweg nicht zu kennen.>> Was steht denn in der Variable path drin? Die bestimmt, wo nach Headern> gesucht wird.
Die ganz normale $PATH Environmentvariable?
In der sind keine include Verzeichnisse angegeben, sondern überwiegend
nur Verzeichnisse für ausführbare Binaries.
Aber ich glaube nicht, dass das Problem daran liegt, denn andere
Funktionsnamen wie bspw. printf werden durchaus gefunden und per
autocomplete vorgeschlagen.
Ich habe mal nen Screenshot beigefügt, da sieht man, was nach nach
Eingabe von p gefolgt von CTRL+N für math.h angezeigt wird.
> Nano schrieb:>> Da es aber nicht umständlich genug geht, muss man diese Schritte für>> jeden Funktionsblock separat machen>> Man kann auch mit zM alle auf einmal schließen und mit zR alle öffnen.
Das meinte ich nicht, sondern dass ich zuerst, wie im oben verlinkten
Artikel aufgezeigt, erst mb und % eingeben soll, gefolgt von zf'b, damit
ein Block gefaltet wird.
zM und zR das alles faltet bzw. öffnet brauche ich dagegen ohnehin
nicht.
Aber ich sehe gerade, dass es mit :set foldmethod=syntax, wie du weiter
unten erwähnst, viel besser geht.
Dann reicht ein za um eine Funktion zu falten und zo um sie wieder zu
entfalten und es kommt auch nichts durcheinander.
Eventuell ist der oben verlinkte Artikel hier irreführend.
>>> Da frage ich mich, WTF?>> Jeder anständige GUI Editor macht das Falten eines Funktionsblocks>> mit einem Mausklick und was gefaltet werden soll, muss man gar nicht>> erst definieren, der Editor weiß es automatisch.>> Das geht mit vim selbstverständlich auch. Du musst es allerdings erst> einschalten. Dazu :set foldmethod=syntax machen, dann findet er die> Blöcke auch von selber.
Danke, das geht viel besser.
Die im Artikel beschriebene Lösung ist wohl eher eine allgemeine Lösung,
um beliebigen Text an beliebiger Stelle zu falten, wozu man dann wohl
auch definieren muss, was man falten möchte.
> Und wenn du Mausbedienung aktiviert hast und> z.B. set foldcolumn=5 eingegeben hast, bekommst du auch Marker für die> Folds, die du zum öffnen und schließen anklicken kannst.
Danke, foldcolumn funktioniert, die Mausbedienung scheint aber nicht zu
gehen. Ich habe vim in einer KDE konsole gestartet.
Nano schrieb:> Das ändert aber die Defaulteinstellung für tabs, oder?> Die ident Geschichte, also =i{, wird damit nicht separat konfiguriert.> Ich möchte, dass =i{ gar keine Tabs verwendet und stattdessen da, wo es> gerade Tabs macht, nur zwei Leerzeichen setzt und zwar so, dass die> Einstellung für die default tabs bei 8 Zeichen bleibt. Dazu müsste die> i={ ident Funktion direkt konfiguriert werden können.
Ach so, dann habe ich dich falsch verstanden. Wie man das macht (und ob
das geht) weiß ich nicht.
>> Was steht denn in der Variable path drin? Die bestimmt, wo nach Headern>> gesucht wird.>> Die ganz normale $PATH Environmentvariable?
Nein. Ich meine die Variable path in vim.
1
:h path
> Ich habe mal nen Screenshot beigefügt, da sieht man, was nach nach> Eingabe von p gefolgt von CTRL+N für math.h angezeigt wird.
Ok, dann ist path offenbar richtig gessetzt. Bei mir funktioniert es so.
Ich wüsste jetzt nicht, dass ich dafür irgendwas noch besonders
konfiguriert hätte. Mit anderen Worten: Ich kann dir nicht sagen, warum
er es bei dir nicht findet.
> Danke, foldcolumn funktioniert, die Mausbedienung scheint aber nicht zu> gehen. Ich habe vim in einer KDE konsole gestartet.
Wie gesagt muss die erst aktiviert werden.
1
:set mouse=a
Dann kannst du auch mit der Maus markieren, und du kannst z.B. die
Datei-Fenster innerhalb von vim mit der Maus größer und kleiner machen.
Siehe auch
1
:help mouse
Da kann man auch noch deutlich mehr konfigurieren, um sich's genau
passend einstellen zu können.
Rolf M. schrieb:> Nein. Ich meine die Variable path in vim.:h path>
Wie kann ich in vim den Inhalt der path Variable anzeigen?
>> Danke, foldcolumn funktioniert, die Mausbedienung scheint aber nicht zu>> gehen. Ich habe vim in einer KDE konsole gestartet.>> Wie gesagt muss die erst aktiviert werden.:set mouse=a> Dann kannst du auch mit der Maus markieren, und du kannst z.B. die> Datei-Fenster innerhalb von vim mit der Maus größer und kleiner machen.>
Danke.
Rolf M. schrieb:> Nano schrieb:>>> Wie kann ich in vim den Inhalt der path Variable anzeigen?:echo &path>> Wie ich gerade gelernt habe, ist path streng genommen keine Variable,> sondern eine Option.
Danke.
Also bei mir wird dann