2012-05-09 6 views
5

Ok, este es un deseo bastante complicado. Se deriva del hecho de que la mayoría de mis líneas FORTRAN contienen una declaración "llamada", y estoy cansado de escribir llamada, llamar, llamar, llamar ...cómo poner un prefijo constante frente a cada línea nueva en vim mientras escribo?

Lo que me gustaría tener es la siguiente:

  • cada vez que presiono enter, la siguiente línea tiene una cadena de "llamada" agregada automáticamente al frente.
  • si presiono pestaña, se añade la pestaña delante de la llamada cadena (de modo que pueda guión)
  • si estoy al principio de la línea, y presiono la tecla de retroceso una vez, se eliminará el "Llamar" a la entrada, pero abandona las pestañas. Del mismo modo, sería bueno si pudiera eliminar automáticamente la entrada si escribo "if", "do", "enddo" y todo lo relacionado

¿Sabes si algo como esto ya existe, es posible, y si tiene sugerencias o scripts similares de los que pueda sacar, sería extremadamente apreciado.

Por ejemplo, en el comentario al estilo C, cada vez que presiono enter, se agrega automáticamente un asterisco al principio de la línea. ¿Dónde está el código que hace eso (supongo que es la funcionalidad del complemento, no está codificada en vim)?

+0

': help eval'': help usr_41.txt' te ayudará. – kev

Respuesta

3

que siguieron su pista acerca de los comentarios de C y se le ocurrió esto:

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

Si una línea comienza con 'llamada', esto debe anteponer automáticamente líneas consecutivas con el mismo texto. Solo funciona si la línea anterior contiene 'call' y 'call' no se elimina en las palabras clave que especificó. Siéntase libre de jugar con esas opciones, tal vez lo personalizará para sus gustos.

para sangrar uso >> en modo normal o Ctrl + T en modo de inserción. Para eliminar 'llamar' al comienzo de la línea use Ctrl + W en lugar de Retroceso.

Como alternativa puede usar abreviaturas para acelerar su escritura:

:iab ,, call 
+0

No quiero usar abreviaturas, porque entonces tiendo a desarrollar memoria muscular que transfiero a otros idiomas. De vez en cuando escribo llamada cuando estoy codificando en python. –

+0

muy agradable, pragmático y completo – sehe

0

En mi opinión, cuando hay necesidad de cambiar el comportamiento de <CR> y <BS>, significa que algo está mal, o será un error antes o más tarde porque hay muchos casos extremos.

Uno de los mayores problemas que encontré es que no puedo adivinar si el cursor estaba en la primera o segunda columna dentro de las funciones, y es un punto principal saber para poder procesar correctamente las pestañas y los espacios invertidos. Pero aquí tienes un comienzo. No lo he probado a fondo porque es un desastre. No lo recomiendo, myki es mucho mejor en mi opinión.

Agregue este código bien comentado al archivo vimrc y pruébelo.

"" 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> 
Cuestiones relacionadas