Forum: PC Hard- und Software Vim - Neuer Anlauf und Fragen


von Nano (Gast)


Lesenswert?

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?

von Sepia (Gast)


Lesenswert?

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?
1
:qa!
2
3
oder, um alle auch zu speichern:
4
5
:wqa!

von Nano (Gast)


Lesenswert?

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?

von Sven L. (sven_rvbg)


Lesenswert?

:!ls -all

von Nano (Gast)


Lesenswert?

Danke. gut zu wissen, dass :! der Befehl ist um beliebige 
Kommandozeilenprogramme aufrufen zu können.

von Nano (Gast)


Lesenswert?

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?

von Nano (Gast)


Lesenswert?

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:
1
autocmd BufWinLeave *.* mkview
2
autocmd BufWinEnter *.* silent loadview

Das kann man hier nachlesen:
https://www.freecodecamp.org/news/learn-linux-vim-basic-features-19134461ab85/


Also wirklich extrem umständlich.
Warum kann vim nicht automatisch Funktionsblöcke erkennen und warum 
lässt es einem diese dann nicht einfach bequem zwischen offen und 
geschlossen hin und herschalten?

von Nano (Gast)


Lesenswert?

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?

von Nano (Gast)


Lesenswert?

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.

von Name (Gast)


Lesenswert?

Nano schrieb:
> Wie kann man vim beibringen, dass er keine Tabs verwendet, sondern
> stattdessen zwei Leerzeichen pro Einrückungsstufe?
1
:h 'et
2
:h 'ts

von Nano (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

: Bearbeitet durch User
von Nano (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Nano (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

Nano schrieb:

> Wie kann ich in vim den Inhalt der path Variable anzeigen?
1
:echo &path

Wie ich gerade gelernt habe, ist path streng genommen keine Variable, 
sondern eine Option.

von Nano (Gast)


Lesenswert?

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
1
.,/usr/include,,
ausgegeben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.