vimrc texto personalizar para editar desarrollo python vim editing

texto - Movimientos más eficientes de edición de archivos python en vim



vim editor python (4)

Dado un archivo python con lo siguiente repetido interminablemente:

def myFunction(a, b, c): if a: print b elif c: print ''hello''

Me gustaría moverme y editar este archivo usando movimientos vim familiares. Por ejemplo, usar (,), [[,]], {,} o eliminar / tirar / cambiar texto usando comandos como di}.

En otros idiomas (como C ++, Java, C #, etc.), los corchetes abundan, por lo que si usa un movimiento como di, puede encontrar fácilmente un parche rizado y actuar sobre ese bloque. Y, de hecho, si estoy en el carácter ''b'' en el texto anterior y hago un di) en vim, borra con éxito el texto entre los dos parens.

El problema está en la detección de Python de bloques de código, creo. Usar (,), [[,]], {, o} como movimientos, todos hacen más o menos lo mismo, llevándolos al inicio (arriba o en la línea de definición) o al final (después de la última línea de la función) de la función. Y no hay forma, hasta donde yo sé, de decir fácilmente a vim "seleccionar todo para este bloque de sangría". En el ejemplo anterior, me gustaría estar en ''i'' de la línea if, escriba di} y haga que elimine todo el bloque if (al final de esta función en particular).

Estoy seguro de que debería ser posible decirle a vim que opere con una sangría para tales movimientos (bueno, quizás no ese movimiento en particular, sino alguna acción definida por el usuario). ¿Alguna idea sobre cómo lograr esto?


python.vim

Hace que sea mucho más fácil navegar alrededor de bloques de código python.

Atajos:

  • ]t - Salta al comienzo del bloque
  • ]e - Saltar al final del bloque
  • ]v - Bloque Select (Visual Line Mode)
  • ]< - Shift bloque a la izquierda
  • ]> - Shift bloque a la derecha
  • ]# - Selección de comentarios
  • ]u - Selección de desacomodación
  • ]c - Seleccione la clase actual / anterior
  • ]d - Seleccione la función actual / anterior
  • ]<up> - Salta a la línea anterior con la misma sangría / menor
  • ]<down> - Salta a la siguiente línea con la misma sangría / menor

python_match.vim

extiende % :

  • % - cycle through if / elif / else, try / except / catch, for / continue / break
  • g% - mueve el opuesto de %
  • [% - mueve al comienzo del bloque de código actual
  • ]% - mueve al final del bloque de código actual

Todos los movimientos anteriores funcionan con los modos Normal, Visual y Pendiente de operador, por lo que:

  • d]% - eliminar hasta el final del bloque actual
  • v]%d - debería hacer lo mismo, pasar por el modo Visual para que pueda ver lo que se está borrando
  • V]%d - arriba, pero con selección de línea

Correlaciones de corchetes [[ , ]] , [m , ]m similares

$VIMRUNTIME/ftplugin/python.vim ahora (2018) reasigna todas las asignaciones incorporadas documentadas en :h ]] y :h ]m para el lenguaje python. Las asignaciones son:

]] Jump forward to begin of next toplevel [[ Jump backwards to begin of current toplevel (if already there, previous toplevel) ]m Jump forward to begin of next method/scope [m Jump backwords to begin of previous method/scope ][ Jump forward to end of current toplevel [] Jump backward to end of previous of toplevel ]M Jump forward to end of current method/scope [M Jump backward to end of previous method/scope

El siguiente código fuente de ejemplo con comentarios ilustra las diferentes asignaciones

class Mapping: # [[[[ def __init__(self, iterable): pass def update(self, iterable): pass __update = update # [] class Reverse: # [[ or [m[m def __init__(self, data): # [m self.data = data self.index = len(data) # [M def __iter__(self): # <--- CURSOR return self # ]M def __next__(self): # ]m if self.index == 0: raise StopIteration self.index = self.index - 1 return self.data[self.index] # ][ class MappingSubclass(Mapping): # ]] or ]m]m def update(self, keys, values): pass

Las asignaciones se agregaron y mejoraron en los commits abd468ed0 (2016-09-08), 01164a6546b4 (2017-11-02) y 7f2e9d7c9cd (2017-11-11).

Si aún no tiene la nueva versión de este archivo, puede descargarla y colocarla en ~/.vim/ftplugin/python.vim . Esta carpeta tiene prioridad antes de $VIMRUNTIME/ftplugin .

Antes de que estas asignaciones se hayan agregado a $VIMRUNTIME , ha existido el plugin python-mode que proporciona [[ , ]] , [M , y ]M Además python-mode también define los objetos de texto aC , iC , aM e iM :

python-mode

Este complemento vim proporciona movimientos similares a los integrados:

2.4 Vim motion ~ *pymode-motion* Support Vim motion (See |operator|) for python objects (such as functions, class and methods). `C` — means class `M` — means method or function *pymode-motion-keys* ========== ============================ Key Command (modes) ========== ============================ [[ Jump to previous class or function (normal, visual, operator) ]] Jump to next class or function (normal, visual, operator) [M Jump to previous class or method (normal, visual, operator) ]M Jump to next class or method (normal, visual, operator) aC Select a class. Ex: vaC, daC, yaC, caC (normal, operator) iC Select inner class. Ex: viC, diC, yiC, ciC (normal, operator) aM Select a function or method. Ex: vaM, daM, yaM, caM (normal, operator) iM Select inner func. or method. Ex: viM, diM, yiM, ciM (normal, operator) ========== ============================

Para una discusión sobre textobjects para Python, ¿cuál es la forma más rápida de seleccionar una función de Python a través de VIM? .


Es muy fácil mover bloques con sangría cuando ha set foldmethod=indent . Por ejemplo, si está en la línea def main(): en el siguiente fragmento:

def main(): +-- 35 lines: gps.init()----------------------------------------------------- if __name__ == "__main__": main()

entonces dj toma toda la función principal y puede pegarse en otro lugar.


Para abordar su párrafo final, la siguiente secuencia de comandos define un nuevo objeto de texto "sangría" sobre el que puede realizar acciones. Por ejemplo, d i elimina todo sangrado al mismo nivel que la línea donde está el cursor.

Consulte la documentación del complemento para obtener más información: http://www.vim.org/scripts/script.php?script_id=3037