2012-05-09 14 views
5

Ok, questo è un desiderio piuttosto complicato. Esso deriva dal fatto che la maggior parte delle mie linee FORTRAN contengono una dichiarazione "chiamata", e io sono stanco di digitare chiamata, chiamata, chiamata, chiamata ...come mettere un prefisso costante davanti a ogni nuova riga in vim mentre scrivo?

Quello che vorrei avere è la seguente:

  • ogni volta che premo invio, la riga successiva ha una stringa "chiamata" aggiunta automaticamente in primo piano.
  • se premo scheda, viene aggiunta la scheda davanti della chiamata stringa (in modo che possa trattino)
  • se io sono all'inizio della riga, e premo backspace una volta, si rimuoverà il voce "chiama", ma lascia le schede. Allo stesso modo, sarebbe bello se potesse rimuovere automaticamente la voce se digito "if", "do", "enddo" e tutti i relativi

Sapete se esiste già qualcosa del genere, è possibile, e se avete suggerimenti o script simili da cui posso trarre, sarebbe estremamente apprezzato.

Ad esempio, nel commento in stile C, ogni volta che si preme Invio, un asterisco viene aggiunto automaticamente all'inizio della riga. Dov'è il codice che lo fa (presumo che sia una funzionalità plugin, non codificata in vim)?

+0

': help eval'': help usr_41.txt' ti aiuterà. – kev

risposta

3

ho seguito il tuo suggerimento su C Commenti e arrivato fino a questo:

:set formatoptions+=ro 
:set comments+=s:call,m:call,e:call 

Se una riga comincia con 'chiamata', questo dovrebbe anteporre automaticamente righe consecutive con lo stesso testo. Funziona solo se la riga precedente conteneva 'chiamata' e 'chiamata' non viene cancellata sulle parole chiave che hai specificato. Sentiti libero di giocare con queste opzioni, forse lo personalizzerai a tuo piacimento.

Per il rientro uso >> in modalità normale o Ctrl +T in modalità di inserimento. Per eliminare la "chiamata" all'inizio della riga, utilizzare Ctrl + W anziché Backspace.

In alternativa è possibile utilizzare abbreviazioni per velocizzare la digitazione:

:iab ,, call 
+0

Non voglio usare le abbreviazioni, perché poi tendo a sviluppare la memoria muscolare che trasferisco in altre lingue. Di tanto in tanto digito call quando sto codificando in python. –

+0

molto bello, pragmatico e completo – sehe

0

A mio parere, quando c'è bisogno di modificare il comportamento di <CR> e <BS>, vuol dire che qualcosa non va, o sarà sbagliato prima o più tardi perché ci sono molti casi limite.

Uno dei problemi più grandi che ho riscontrato è che non riesco a indovinare se il cursore si trovava nella prima o nella seconda colonna all'interno delle funzioni, ed è un punto importante sapere di essere in grado di elaborare correttamente tab e backspaces. Ma qui hai un inizio. Non l'ho provato a fondo perché è un casino. Non lo consiglio, l'approccio di myki è molto migliore a mio parere.

Aggiungere questo codice ben commentato al file vimrc e testarlo.

"" When pressed 'return' in insert mode: 
"" <Esc>: Exit from Insert Mode to Normal Mode. 
"" o: Add a new line below the current one and set Insert Mode. 
"" call <Esc>: Write literal 'call ' and exit from Insert Mode. 
"" A: Set cursor at end of line and enter Insert Mode to begin writting. 
inoremap <cr> <Esc>ocall <Esc>A 

function! SpecialTab() 

    "" Get cursor position. 
    let cursor_pos = getpos('.') 

    "" If line is empty, insert a tab, update current position and finish 
    let line_len = strlen(getline(line('.'))) 
    if empty(getline(line('.'))) || line_len == 1 
     s/\%#/\t/ 
     let cursor_pos[2] += 1 
     call setpos('.', cursor_pos) 
     return 
    endif 

    "" Search for a line beginning with 'call', omitting spaces. If found 
    "" insert a tab at the beginning of line. 
    if match(getline(line('.')), "\s*call") != -1 
     s/^/\t/ 
    else 
     "" Insert a normal tab in current cursor position. I cannot use 
     "" the regular <Tab> command because function would entry in a 
     "" infinite recursion due to the mapping. 
     s/\%#\(.\)/\1\t/ 
    endif 

    "" Set cursor column in the character it was before adding tab character. 
    let cursor_pos[2] += 2 
    call setpos('.', cursor_pos) 
endfunction 

"" Map the tab character. 
inoremap <Tab> <Esc>:call SpecialTab()<cr>:startinsert<cr> 

function! SpecialBackspace() 
    "" Do nothing if line is empty. 
    if empty(getline(line('.'))) 
     return 
    endif 

    "" Get cursor position. 
    let cursor_pos = getpos('.') 

    "" If cursor is not in first column press 'delete' button and done. 
    if col('.') > 1 
     execute "normal \<Del>" 
     return 
    endif 

    "" Search for 'call' string. If found delete it and set cursor in 
    "" previous position. 
    if match(getline(line('.')), "\s*call") != -1 
     s/call// 
     let cursor_pos[2] = 1 
     call setpos('.', cursor_pos) 
     return 
    endif 

    "" A line with one character is a special case. I delete the complete 
    "" line. 
    let line_len = strlen(getline(line('.'))) 
    if line_len == 1 
     s/^.*$// 
     return 
    endif 

    "" If cursor is in first column, delete character. Messy behavior, I 
    "" think :-/ 
    if col('.') == 1 
     s/^.// 
    endif 
endfunction 

"" Map the 'backspace' character. 
inoremap <BS> <Esc>:call SpecialBackspace()<cr>:startinsert<cr> 
Problemi correlati