ubuntuusers.de

Sammelthread: Vim, .vimrc und Vim-Konfiguration allgemein

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

kutteldaddeldu Team-Icon

(Themenstarter)

Anmeldungsdatum:
1. Juli 2008

Beiträge: 3586

Sorry, mein – extrem dämlicher – Fehler: Die Matchpair-Option zeigt ja nur korrespondierende Klammern visuell an, der Kommentar ist falsch. (Ich hatte einen englischen Kommentar falsch übersetzt, da ich von der anderen – bei mir auch vorhandenen – Funktion ausgegangen bin.)

Du hast Recht: die Funktion wird durch ein Plugin ermöglicht – konkret wohl durch AutoClose! Sorry für die unnötigen Versuche und die verschwendete Zeit!

1984

Avatar von 1984

Anmeldungsdatum:
2. März 2008

Beiträge: 545

Hey hey,

kein Problem! So viel Zeit wie ich in die Konfiguration meines Systems gesteckt habe, ist das jetzt auch nicht mehr ausschlaggebend 😉 Außerdem hast du mir ja jetzt auch ein gutes Stück weiter geholfen und das macht's ohne Frage wieder gut!

Hab das Plugin installiert und es funktioniert. Mit einem Punkt bin ich aber nicht zufrieden und zwar, dass es nicht einrückt, wenn ich z.B

 int main(){} 

schreibe und dann einen Zeilenumbruch mache und dann eigentlich das haben will:

int main(){
   <- hier soll der Cursor sein
}

Weißt du da eine Lösung oder ist das normal? Weil eigentlich wollte ich das genau deswegen haben!

Grüße, 1984

kutteldaddeldu Team-Icon

(Themenstarter)

Anmeldungsdatum:
1. Juli 2008

Beiträge: 3586

Bin ich leider überfragt. Ganz, ganz evtl. geht es aber mit einem dieser Plugins?

zim

Avatar von zim

Anmeldungsdatum:
27. Juni 2005

Beiträge: Zähle...

Wohnort: bremen

Hey 1984,

liegt es vielleicht an laut deiner .vimrc auskommentierten "set ai" und/oder "set pastetoggle=<F8>"?

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Für so Vervollständigungskrempel würde ich eher snipmate verwenden – wurde erstaunlicherweise hier noch gar nicht genannt. Da reicht dann in einer C-Datei ein einfaches

main<Tab>

und du erhältst

int main(int argc, const char *argv[])
{
	<Cursor>
	return 0;
}

wobei du das natürlich auch „customizen“ kannst. Für Funktionen allgemein kannst du

fun<Tab>

eingeben und bekommst dann

void function_name(   )
{
	/* code */
}

Der Cursor landet dabei auf dem ersten der hier gelb markierten Felder und wenn du etwas tippst, überschreibt es das Feld. Mit einem weiteren Tastendruck auf Tab springst du zum nächsten Feld.

Ähnliches gibt es für andere Sprachen und man kann auch recht einfach selbst neue „Snippets“ hinzufügen. Man muss sich kurz dran gewöhnen und es ist weitaus mehr als das einfache Hinzufügen von Klammern, aber wenn man’s raus hat, ist es sehr angenehm. ☺

1984

Avatar von 1984

Anmeldungsdatum:
2. März 2008

Beiträge: 545

Hey hey,

vielen Dank Kuttel Daddeldu für den Link. Jetzt habe ich genau das was ich wollte. Ich habe das AutoClose Plugin installiert um alles zu vervollständigen (Anführungszeichen, runder Klammern,...) und ich habe jetzt noch eine Zeile in die vimrc eingefügt, damit die geschwungenen Klammern richtig stehen bei einer Funktion. Diese Zeile ist:

inoremap {<CR>  {<CR>}<Esc>O

@Vain Das wäre dann so der nächste Schritt gewesen. Wobei ich noch schauen muss wie sehr ich das brauchen werde, aber das zu wissen ist auf jeden Fall hilfreich!

@zim Danke für die Antwort, aber Problem ist gelöst 😉

Nebenbei mal gefragt: Wie macht ihr das bei größeren Projekten? Coded ihr da auch alles in vim oder verwaltet ihr das Projekt mit einer IDE und coded in vim oder ganz anders? Ich hab da leider noch keine ganz ideale Lösung gefunden.

Grüße, 1984

John_W

Anmeldungsdatum:
10. Juli 2010

Beiträge: 571

Ich progge nur im Vim, die Quelltexte kompiliere ich dann in einem neuen Tab (Gnome-Terminal).

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Dito. Für kleinere Sachen habe ich das hier:

" Funktion statt einzelnen Run-Skripten für die Programme. Allerdings
" kann es immernoch ein Run-Skript geben und das hat dann auch Vorrang.
" Man kann nämlich nicht alles automatisch mit dieser Funktion hier
" abbilden (mehrere Dateien, komplexe Parameter, ...).
fun! CompileAndRun(runProgram)
	" Setze das Programm, was es auszuführen gälte. Muss hier passieren,
	" da es ggf. später nicht mehr wegen "cw" geht, da das ein anderes
	" Fenster öffnet und es da keinen Namen gibt. Die Variable
	" l:interpreter gibt an, dass das Programm direkt ausgeführt werden
	" soll -- ist sie 1, dann wird unterbunden, dass auf Ausführbarkeit
	" des Programms getestet wird. l:domake weist einen Programmbau an.
	" In l:run steht, wie ein eventuelles Run-Skript heißt.
	let l:progname = './' . expand('%:t:r')
	let l:interpreter = 0
	let l:domake = 1
	let l:runner = './run'

	" Der normale make-Befehl piped das irgendwie an "tee" weiter. Das
	" hat aber zur Folge, dass der Returncode vom ersten Befehl verloren
	" geht. Das hier ist ein Tipp aus dem Netz, wie man trotzdem noch an
	" den ersten Returncode herankommt:
	setl shellpipe=2>&1\ \|\ tee\ %s;exit\ \${PIPESTATUS[0]}

	" Finde heraus, mit was du das Programm bauen kannst.
	if filereadable("SConstruct")
		setl makeprg=scons
	elseif filereadable("Makefile") || filereadable("makefile")
		setl makeprg=make
	elseif filereadable("build.xml")
		setl makeprg=ant
	elseif &filetype == 'c'
		setl makeprg=gcc\ -Wall\ -o\ %<\ %
	elseif &filetype == 'cpp'
		setl makeprg=g++\ -Wall\ -o\ %<\ %
	elseif &filetype == 'java'
		setl makeprg=javac\ %
		let l:progname = 'java ' . expand('%:t:r')
		let l:interpreter = 1
	elseif &filetype == 'matlab'
		let l:progname = 'octave ' . expand('%') . ' | less'
		let l:interpreter = 1
		let l:domake = 0
	else
		" Bei allem anderen nimmst du an, dass die Datei selbst
		" ausführbar ist und dass man sie nicht bauen muss. Das ist bei
		" Skripten jeglicher Art der Fall. Ist sie doch nicht
		" ausführbar, dann wird das unten abgefangen.
		let l:progname = './' . expand('%')
		let l:domake = 0
	endif

	" Speichern, bauen und ggf. ausführen.
	write
	if l:domake == 1
		silent !echo -e "\n\nBuilding..."
		make
		cw
	else
		silent !echo -e "\n\nNot running build tool."
	endif

	if v:shell_error == 0 && a:runProgram == 1
		if executable(l:runner)
			silent !echo -e "\n\nExecuting run script..."
			exec '!' . l:runner
		elseif executable(l:progname) || l:interpreter == 1
			silent exec '!echo -e "\n\nExecuting \"'
						\. l:progname . '\""...'
			exec '!' . l:progname
		endif
	endif
endfun

" Shortcuts für scons und make - nicht vergessen, dass für Screen
" eventuell das ein oder andere remapped werden muss, s.u.
map <F5> :call CompileAndRun(1)<CR>
map <S-F5> :call CompileAndRun(0)<CR>
map <C-F5> :w \| !./%<CR>

Das deckt natürlich bei weitem nicht alle Fälle ab und ist nicht universal nutzbar. Daher für größere Sachen einfach ein neues Terminal, wozu hat man denn sonst X. 😉

John_W

Anmeldungsdatum:
10. Juli 2010

Beiträge: 571

Für den Fall, dass ich mal die make-Funktion benutze, hab ich als makeprg "$(compile)" eingetragen - eine Bash-Funktion, die entweder eine .COMPILE.*-Datei mit entsprechendem Interpreter ausführt oder falls es nur eine Quelltextdatei gibt diese direkt kompiliert. Synonym dazu hab ich noch eine Run-Funktion, die ähnlich arbeitet.

1984

Avatar von 1984

Anmeldungsdatum:
2. März 2008

Beiträge: 545

Hey hey,

das kompilieren war bei mir auch nicht das Problem, das kann man ja auch direkt aus vim machen mit z.B

:!g++ prog.cpp -o prog

Danke trotzdem für das Skript Vain. Hab mir es gleich mal geklaut 😀 Ich meinte eigentlich eher um die Übersicht zu behalten bei mehreren Klassen und Methoden/Funktionen.

Wird das gerade zu sehr OT? Will diesen tollen Thread ja nicht vollmüllen 😉

Grüße, 1984

John_W

Anmeldungsdatum:
10. Juli 2010

Beiträge: 571

Man kann natürlich jedes Programm aus Vim aufrufen, aber :make ist deutlich schneller zu tippen 😉

Antworten |