Ir al contenido

Modo VI


Introducción

Logo de Vim

El modo VI de Kate es un proyecto para proporcionar edición modal al estilo de Vim al editor de texto Kate y, por extensión, a cualquier programa de KDE que comparta el mismo componente de edición. El proyecto empezó en 2008 como proyecto de Google Summer of Code (donde se escribió toda la funcionalidad básica). He continuado el mantenimiento y el desarrollo posterior de este código y el número de funciones ausentes de Vim va decreciendo poco a poco. La mayoría de los usuarios de Vim ya serán productivos en el modo VI de Kate. Al final de esta página hay una lista con lo que todavía falta por implementar.

Esta página pretende ser una descripción general actualizada de este trabajo.

Para activar el modo de entrada VI, vaya a
Preferencias → Configurar Kate… → Edición → Modo de entrada VI.
También se puede conmutar con el ajuste «Modo de entrada VI» que hay en el menú «Editar». (El atajo de teclado predeterminado es Meta+Ctrl+V, donde Meta suele ser la tecla Windows).

Objetivos

El propósito del modo VI no es el de ser un sustituto completo de Vim ni permitir todas las funcionalidades de Vim. Solo pretende que pueda usar el «modo Vim» para editar texto (y los hábitos de Vim aprendidos) en los programas que usan el editor de texto Kate de forma interna. Estos programas incluyen:

  1. El editor de texto Kate
  2. KWrite: El editor de texto sencillo de KDE
  3. KDevelop: Un IDE avanzado para muchos lenguajes de programación
  4. Kile: Un editor LaTeX

El modo VI pretende integrarse bien con los programas y se desvía del comportamiento de Vim cuando tiene sentido. Por ejemplo, :w abrirá un diálogo para guardar en el modo VI de Kate.

Incompatibilidades con Vim

Solo hay unas cuantas funcionalidades del modo VI de Kate que son incompatibles con Vim (sin contar lo que todavía falta). Se muestran a continuación junto a sus respectivos motivos.

  1. Kate: U y Ctrl+r es rehacer
    Vim: Ctrl+r es el rehacer normal, mientras que U se usa para deshacer todos los últimos cambios en una línea
    El motivo para que U actúe como rehacer en el modo VI de Kate es que el atajo de teclado Ctrl+r se usa de forma predeterminada en Kate para la función de sustitución (buscar y sustituir). Por omisión, el modo VI no tendrá preferencia sobre los atajos de teclado de Kate (esto se puede configurar en Preferencias → Configurar Kate... → Edición → Modo de entrada Vi), por lo que también hace falta tener una acción para rehacer como combinación de teclas «normal». Además, el comportamiento de la orden U en Vim no se corresponde bien con el sistema de deshacer interno de Kate, por lo que sería complicado proporcionarlo.
  2. Kate: :print muestra el diálogo para «imprimir»
    Vim: :print imprime las líneas del intervalo indicado como su antecesor ed. Las órdenes como :print están disponibles no solo en el modo VI, sino también para los usuarios del Kate «normal» (de ahí que haya decidido hacer que la orden :print abra el diálogo de impresión), siguiendo el principio de no provocar sorpresas en lugar de imitar el comportamiento de Vim.
  3. Kate: Y copia hasta el final de la línea.
    Vim: Y copia toda la línea, como yy. El comportamiento de VI para la orden Y es, en la práctica, un fallo: para las órdenes de modificar y borrar, cc/dd realizarán su acción en la línea actual, mientras que C/D lo harán desde la columna del cursor hasta el final de la línea. No obstante, tanto yy como Y copian la línea actual. En el modo VI de Kate, Y copiará hasta el final de la línea. Esto se describe como «más lógico» en la documentación de Vim.
  4. Kate: :map altera las líneas del documento seleccionadas usando la expresión de JavaScrip proporcionada.
    Vim: :map añade el mapeo proporcionado a los modos «Normal» y «Visual». La orden «map» ya estaba reservada en Kate: en la versión 4.12 o posteriores, se puede usar una combinación de :nmap y :vmap para sustituirla.

Órdenes permitidas

Órdenes de modo normal/visual permitidas

TeclaDescripción
aEntrar en el modo de inserción y añadir
AEntrar en el modo de inserción y añadir al final de línea
iEntrar en el modo de inserción
IInsertar delante del primer carácter no blanco de la línea
vEntrar en el modo visual
VEntrar en el modo de línea visual
<c-v>Entrar en el modo de bloque visual
gvVolver a seleccionar visual
oAbrir nueva línea debajo
OAbrir nueva línea encima
JUnir líneas
cCambiar
CCambiar al final de línea
ccCambiar línea
sSustituir carácter
SSustituir línea
ddBorrar línea
dBorrar
DBorrar
xBorrar carácter
XBorrar carácter hacia atrás
guConvertir a minúsculas
guuConvertir línea a minúsculas
gUConvertir a mayúsculas
gUUConvertir línea a mayúsculas
yCopiar
yyCopiar línea
YCopiar hasta fin de línea
pPegar
PPegar delante
r.Sustituir carácter
REntrar en el modo de sustitución
:Cambiar a la línea de órdenes
/Buscar
uDeshacer
<c-r>Rehacer
URehacer
m.Definir marcador
>>Sangrar línea
<<Desangrar línea
>Sangrar líneas
<Desangrar líneas
<c-f>Desplazar una página hacia abajo
<AvPág>Desplazar una página hacia abajo
<c-b>Desplazar una página hacia arriba
<RePág>Desplazar una página hacia arriba
<c-u>Desplazar media página hacia arriba
<c-d>Desplazar media página hacia abajo
zzCentrar la vista en el cursor
gaMostrar el código del carácter
.Repetir el último cambio
==Alinear línea
=Alinear líneas
~Cambiar de mayúsculas a minúsculas o viceversa
<c-a>Añadir a número
<c-x>Restar de número
<c-o>Ir al salto anterior
<c-i>Ir al salto siguiente
<c-w>hCambiar a la vista de la izquierda
<c-w><c-h>Cambiar a la vista de la izquierda
<c-w><izquierda>Cambiar a la vista de la izquierda
<c-w>jCambiar a la vista inferior
<c-w><c-j>Cambiar a la vista inferior
<c-w><abajo>Cambiar a la vista inferior
<c-w>kCambiar a la vista superior
<c-w><c-k>Cambiar a la vista superior
<c-w><arriba>Cambiar a la vista superior
<c-w>lCambiar a la vista de la derecha
<c-w><c-l>Cambiar a la vista de la derecha
<c-w><derecha>Cambiar a la vista de la derecha
<c-w>wCambiar a la siguiente vista
<c-w><c-w>Cambiar a la siguiente vista
<c-w>sDividir horizontalmente
<c-w>SDividir horizontalmente
<c-w><c-s>Dividir horizontalmente
<c-w>vDividir verticalmente
<c-w><c-v>Dividir verticalmente
gtCambiar al siguiente tabulador
gTCambiar al anterior tabulador
gqqFormatear línea
gqFormatear líneas
q. / qEmpezar/terminar grabación de macro usando el registro de macro nombrado.

Movimientos permitidos

TeclaDescripción
hIzquierda
<izquierda>Izquierda
<retroceso>Izquierda
jAbajo
<abajo>Abajo
<intro>Abajo hasta el primer no blanco
kArriba
<arriba>Arriba
Arriba hasta el primer no blanco
lDerecha
<derecha>Derecha
<espacio>Derecha
$Hasta el fin de línea
<fin>Hasta el fin de línea
A la columna 0
<inicio>A la columna 0
^Al primer carácter de la línea
f.Encontrar carácter
F.Encontrar carácter hacia atrás
t.Al carácter
T.Al carácter hacia atrás
;Repetir la última orden t. o f.
,Repetir la última orden t. o f.
nEncontrar siguiente
NEncontrar anterior
ggA la primera línea
GA la última línea
wPalabra hacia adelante
WPALABRA hacia adelante
bPalabra hacia atrás
BPALABRA hacia atrás
eAl final de la palabra
EAl final de la PALABRA
geAl final de la palabra anterior
gEAl final de la PALABRA anterior
%Al elemento coincidente
`[a-zA-Z><]Ir a marcador
'[a-zA-Z><]Ir a línea marcada
[[Al anterior inicio de bloque de paréntesis
]]Al siguiente inicio de bloque de paréntesis
[]Al anterior final de bloque de paréntesis
][Al siguiente final de bloque de paréntesis
*A la siguiente coincidencia de la palabra bajo el cursor
#A la anterior coincidencia de la palabra bajo el cursor
HA la primera línea de la ventana
MA la línea central de la ventana
LA la última línea de la ventana
gjA la siguiente línea visual
gkA la anterior línea visual

Objetos de texto permitidos

TeclaDescripción
iwPalabra interior
awUna palabra
iWPALABRA interior
aWUna PALABRA
i"Comilla doble interior
a"Una comilla doble
i’Comilla simple interior
a’Una comilla simple
i`Comilla simple grave interior
a`Una comilla simple grave
ibParéntesis interior
i)Paréntesis interior
i(Paréntesis interior
abUn paréntesis
a)Un paréntesis
a(Un paréntesis
iBLlave interior
o}Llave interior
i{Llave interior
aBUna llave
a}Una llave
a{Una llave
i<Signo de desigualdad interior
i>Signo de desigualdad interior
a<Un signo de desigualdad
a>Un signo de desigualdad
i[Corchete interior
I]Corchete interior
a[Un corchete
a]Un corchete
i,Coma interior
a,Una coma

Órdenes del modo inserción permitidas

TeclaDescripción
<c-d>Desangrar
<c-t>Sangrar
<c-e>Insertar desde abajo
<c-y>Insertar desde arriba
<c-w>Borrar palabra
<c-r>.Insertar contenido del registro
<c-o>Cambiar al modo normal para una orden
<c-a>Aumentar el número bajo el cursor
<c-x>Disminuir el número bajo el cursor

El objeto de texto coma

Esto es algo que he echado de menos en Vim. El objeto de texto coma facilita la modificación de listas de parámetros en lenguajes de tipo C y en otras listas separadas por comas. Básicamente, es el área entre dos comas o entre una coma y un paréntesis. En la línea que se muestra en la ilustración de la derecha se resaltan en rojo los tres intervalos que este objeto puede abarcar.

Objeto de texto «coma»

Intervalos del objeto de texto coma. Si el cursor está encima (por ejemplo, de «arg2»), al pulsar c i , («cambiar la coma interior») se borraría «double arg2» y se situaría el cursor entre las dos comas en modo de inserción. Un modo muy conveniente de cambiar los parámetros de una función.

Barra de órdenes emuladas de Vim

Kate 4.11 introdujo una opción de configuración oculta que hace que /, ? y : muestren una nueva orden search/ en lugar de la típica barra de Kate para buscar, sustituir o mostrar la línea de órdenes. La barra está diseñada para replicar muchas de las funciones de la barra de órdenes de Vim, así como para corregir muchos de los problemas de interacción del modo Vim de Kate con la barra de buscar/sustituir de Kate (la sustitución interactiva no funciona, la búsqueda incremental no posiciona el cursor correctamente, no se puede usar en asignaciones/macros, etc.).

Se proporcionan los siguientes atajos en la barra de órdenes emuladas (como con Vim, se pueden reasignar con cmap, cnoremap, etc.):

TeclaDescripción
<c-r>.insertar el contenido del registro.
<c-r><c-w>Insertar la palabra de debajo del cursor (del documento).
<c-p>Invocar la terminación específica del contenido (consulte más adelante)
mover atrás (hacia arriba) en la lista de terminación.
<c-p>Mover hacia adelante (hacia abajo) en la lista de terminación.
<c-espacio>Extensión Vim de Kate.
Completar automáticamente la palabra del documento.
<c-d>Extensión Vim de Kate.
En una expresión de sustitución al estilo de sed (es decir, s/buscar/sustituir/[g][c][i]),
borra el término «buscar» y sitúa el cursor allí.
<c-f>Extensión Vim de Kate.
En una expresión de sustitución al estilo de sed (es decir, s/buscar/sustituir/[g][c][i]),
borra el término «sustituir» y sitúa el cursor allí.
<c-g>.Extensión Vim de Kate.
Como con ., inserta el contenido del registro indicado,
pero en una secuencia de escape para que al usarlo en una búsqueda,
se busque el contenido literal del registro,
no el contenido del registro interpretado como una expresión regular.

La «terminación específica del contexto» se decide de este modo:

  • En una barra de búsqueda (/ o ?), se completa automáticamente usando el historial de búsquedas (lo que incluye las búsquedas que se han iniciado con * y + #, las búsquedas realizadas en las expresiones de sustitución de «sed», etc.).
  • En una barra de órdenes vacía (:), se completa automáticamente usando el historial de órdenes (NB: la terminación automática de nombres de órdenes se invoca automáticamente al empezar a escribir).
  • En una barra de órdenes que contiene una expresión de sustitución de «sed» (por ejemplo, :s/buscar/sustituir/gc), si el cursor está situado sobre «buscar», se completa automáticamente usando el historial de «búsqueda»; si está sobre «sustituir», se completa automáticamente usando los términos del historial de «sustitución».

Cuando se ejecuta una expresión de sustitución de «sed» en la barra de órdenes con el indicador «c» (por ejemplo, s/buscar/sustituir/gc), se iniciará una expresión de búsqueda/sustitución interactiva al estilo de Vim.

Algunos ejemplos de uso de la barra de órdenes emulada, con animaciones en formato GIF, es muestran en este blog. En 4.11, la barra de órdenes emulada se puede activar definiendo la opción de configuración oculta «Vi Input Mode Emulate Command Bar» a true en el archivo katerc/kwriterc/kdeveloprc.

Funcionalidades ausentes

Como se dijo anteriormente, el objetivo del modo VI de Kate no es admitir el 100 % de las funciones de Vim. No obstante, hay algunas funciones que se echan mucho de menos:

  • El modo de bloque visual (especialmente la posibilidad de anteponer/añadir texto a la selección de bloque visual).
  • Tener órdenes «ex» disponibles en otros programas, además de la aplicación Kate.
  • El código de búsqueda necesita mejoras y las órdenes * y # deberían ser solo búsquedas normales.

Si echa en falta otras funcionalidades o quiere ayudar con las anteriores, no dude en ponerse en contacto conmigo o en enviarme parches.

Registro de cambios

  • 2010-05-16:
    Versión inicial. Se recopiló la información existente en entradas de blog y archivos README para crear una única fuente de información.
  • 2010-05-17:
    Se añadieron Ctrl+A y Ctrl+X (aumentar/disminuir el número que haya bajo el cursor).
  • 2010-08-30:
    Se movió la página web a kate-editor.org.
  • 2010-09-10:
    Se corrigió el texto del objeto de texto de coma y se realizaron algunas correcciones de formato.
  • 2021-02-03:
    Conversión de tablas de asignaciones de teclas a markdown para hugo.