vim und tabs

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

vim und tabs
Ich hab das problem in vim schon ewig. gestoert hats mich schon immer, aber der suchaufwand war mir immer zu gross. jetzt brauch ichs mal korrekt.

~/.vimrc

" =================
" == TABS
" =================
" In Insert mode: Use the appropriate number of spaces to insert a <Tab>
set noexpandtab
" Copy indent from current line when starting a new line
set autoindent
" Do smart autoindenting when starting a new line
set smartindent
" Number of spaces to use for each step of (auto)indent.
set shiftwidth=4
" Number of spaces that a <Tab> counts for while performing editing
set softtabstop=4
" Number of spaces that a <Tab> in the file counts for
set tabstop=4
set mouse=nvi
set formatoptions+=r

das ergibt in [m]vim[/m] zum beispiel folgendes:

BITS 32 section .text global _start _start: xor eax, eax ; 0 eax push eax ; push 0

Wenn ich die gespeicherte Datei nun mit [m]nano[/m] oeffne, hab ich folgendes ergebnis:

BITS 32 section .text global _start _start: xor eax, eax ; 0 eax push eax ; push 0

also man beachte die kommentare, bzw die size. Ich weiss nicht so recht woran das liegt. Vielleicht kann mir da jemand weiterhelfen. Ich tippe auf [m]shiftwidth[/m] in verbindung mit [m]smart/autoindent[/m]


Ich versteh nicht ganz, wo dein Problem liegt? Anscheinend verwendet nano eine andere TAB-Größe als dein vim.
Allerdings stimmt dein erster Kommentar nicht der darauf folgenden Direktive überein: [m]set noexpandtab[/m] sorgt dafür, das vim wirklich TABs in die Datei schreibt, wenn du Spaces willst musst du hier [m]set expandtab[/m] schreiben.


ja das is kein problem. ob 8spaces oder 4 ist wirklich egal.

das problem sieht man in der letzten zeile. das sollte so nicht sein. in vim wirds korrekt untereinander dagestellt. in nano mit +1 Tab


Das ist doch ein ganz normales Verhalten?
Tab ist schlicht abhängig von der Interpretation die du halt entsprechend geändert hast. Standard sind 8 Spaces

Wenn du auch in Nano 4 Spaces haben willst, dann musst es dort auch setzen.
nano -T 4 beim aufruf, oder in der config set tabsize 4

Alternativ eben keine Tabulatoren nutzen (was du aber ja explizit in der Konfig hast)
Dann wären es nur Leerzeichen und würde unabhängig von Tabeinstellungen immer gleich aussehen.

Das ist aber riesen großer Mist, du würdest dann deine Vorliebe für Einrückungen anderen aufzwingen.

edit: Gna zu langsam…
Ja das “Problem” welches du da sonst noch hast ist mir unverständlich, passiert bei mir nicht. (auch nicht mit gleicher .vimrc)
Irgendwelche komischen auto-Einrückungen in nano aktiv?


Eventuell sollten wir uns nicht auf verschiedene Darstellungsweisen diverser Editoren verlassen. Kannst du mal die kaputte Datei irgendwo ins ciptmp oder dein wwwcip packen oder nen hexdump davon posten?


[m]/proj/ciptmp/siulgosc/shellcode.asm[/m]

das problem tritt, wie man sieht, nur in der push zeile auf. Dadurch verschiebt sich aber alles weitere. das zerstoert mir oefters das komplette layout ;(


Mach mal in vim [m]:set list[/m], dann wird der Whitespace entsprechend mit Zeichen dargestellt und du siehst auch sofort wo da das Problem liegt. In dieser Zeile mischst du Leerzeichen und Tabs. Je nach eingestellter Tabbreite wird der Tab dann auch anders dargestellt, die Leerzeichen bleiben allerdings weiterhin gleich.

Ergänzung: Standardmäßig sieht die Ausgabe bei [m]list[/m] nicht sonderlich toll aus, lässt sich aber über [m]listchars[/m] nach Belieben anpassen. Meine Einstellung für Terminals, die UTF-8 unterstützen, wäre zum Beispiel: [m]set listchars=tab:.,trail:·,eol:¶,nbsp:[/m]


ah, super. Danke :slight_smile:

Was ist denn sinnvoller, bzw. was seht ihr fuer sinnvoller an? Richtige Tabs verwenden, oder Leerzeichen?

€: Danke fuer das edit. ist schon in der config :slight_smile:


Sinnvoller ist es richtige Tabs fuer Einrueckungen zu verwenden weil die eben einstellbar sind. D.h. jeder kann sich selbst konfigurieren, wie breit er gerne den Platz links haben moechte und es gibt kein Geheule ueber “mit 4 Leerzeichen Einrueckung seh ich aber nix” und “mit 8 hab ich aber keinen Platz” oder so. Man rueckt immer um 1 Tab pro Ebene ein und jeder darf dann nach belieben seinen Texteditor auf die Anzeigeoption “n Leerzeichen pro Tab” einstellen. Wichtig ist dabei dass niemals Leerzeichen zur Einrueckung verwendet werden duerfen.

Das gilt fuer Einrueckungen, es gibt aber noch eine andere Anwendung die du auch hattest, fuer die man keine Tabs verwenden sollte: Ausrichtungen, also sowas wie die Kommentare hinter dem push und dem xor. Das sollte man immer mit Leerzeichen machen, weil das wie du schon festgestellt hast mit Tabs kaputtgeht, die richtige Ausrichtung haengt naemlich von der exakten Zeichenanzahl der vorhergehenden Zeile ab. Dein Beispiel lautet also in richtig dann:

BITS 32
section .text
<TAB>global _start
<TAB>_start:
<TAB><TAB>xor eax, eax....; 0 eax
<TAB><TAB>push eax........; push 0

Oder als anderes Beispiel irgendeine lustige C-Funktion (absichtlich etwas komisch geschrieben nur ums zu zeigen):

int foo(char bla,
........int komische_dinge,
........int anderes_zeug,
........int nochmehr_lange_sachen)
{
<TAB>foobar(komische_dinge,./* kommentar1 */
<TAB>.......bla,............/*kommentar2*/
<TAB>.......nochmehr_lange_sachen);
etc.

Ohja, und Space-Einruecker sind Umweltverbrecher:
http://peterbraden.co.uk/article/space-infidel


Schließe mich arw an:

Indentation mit TAB
Alignment mit SPACE

Das sind 2 unterschiedliche Dinge. Ersteres alles was am Anfang der Zeile passiert und das sollte man wirklich mit Tab machen, weil der eine 2 oder 4 Tiefe bevorzugt und der andere eben 8 als Tiefe. Dahingegen sollte man alles was man innerhalb einer Zeile alignen möchte mit Spaces tun, damit es dann auch überall gleich aussieht.
Schaffen tun das gefühlt 0,0001% der Programmierer.


Langhaarige Lunix-Frickler verwenden natuerlich Spaces (z.B. http://www.jwz.org/doc/tabs-vs-spaces.html). Nur der arw, mit dem mag wie immer keiner spielen.


Der Typ ist ein hirnloser Vollspaten der einen Tab fuer eine bequeme Moeglichkeit haelt viele Leerzeichen mit einem Tastendruck zu machen und hat damit genau garnicht verstanden was er brabbelt. Von daher stimmt auf jeden Fall mal der Teil mit „Frickler“…


Der hat meinen Lieblings-xscreensaver gemacht! Dein Hauptbelastungszeuge dagegen ist:

Keine weiteren Fragen.