Modo VI
Introducción
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.
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:
- El editor de texto Kate
- KWrite: El editor de texto sencillo de KDE
- KDevelop: Un IDE avanzado para muchos lenguajes de programación
- 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.
- Kate:
U
yCtrl+r
es rehacer
Vim:Ctrl+r
es el rehacer normal, mientras queU
se usa para deshacer todos los últimos cambios en una línea
El motivo para queU
actúe como rehacer en el modo VI de Kate es que el atajo de tecladoCtrl+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. - 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. - Kate:
Y
copia hasta el final de la línea.
Vim:Y
copia toda la línea, comoyy
. El comportamiento de VI para la ordenY
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 queC
/D
lo harán desde la columna del cursor hasta el final de la línea. No obstante, tantoyy
comoY
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. - 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
Tecla | Descripción |
---|---|
a | Entrar en el modo de inserción y añadir |
A | Entrar en el modo de inserción y añadir al final de línea |
i | Entrar en el modo de inserción |
I | Insertar delante del primer carácter no blanco de la línea |
v | Entrar en el modo visual |
V | Entrar en el modo de línea visual |
<c-v> | Entrar en el modo de bloque visual |
gv | Volver a seleccionar visual |
o | Abrir nueva línea debajo |
O | Abrir nueva línea encima |
J | Unir líneas |
c | Cambiar |
C | Cambiar al final de línea |
cc | Cambiar línea |
s | Sustituir carácter |
S | Sustituir línea |
dd | Borrar línea |
d | Borrar |
D | Borrar |
x | Borrar carácter |
X | Borrar carácter hacia atrás |
gu | Convertir a minúsculas |
guu | Convertir línea a minúsculas |
gU | Convertir a mayúsculas |
gUU | Convertir línea a mayúsculas |
y | Copiar |
yy | Copiar línea |
Y | Copiar hasta fin de línea |
p | Pegar |
P | Pegar delante |
r. | Sustituir carácter |
R | Entrar en el modo de sustitución |
: | Cambiar a la línea de órdenes |
/ | Buscar |
u | Deshacer |
<c-r> | Rehacer |
U | Rehacer |
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 |
zz | Centrar la vista en el cursor |
ga | Mostrar 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>h | Cambiar 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>j | Cambiar a la vista inferior |
<c-w><c-j> | Cambiar a la vista inferior |
<c-w><abajo> | Cambiar a la vista inferior |
<c-w>k | Cambiar a la vista superior |
<c-w><c-k> | Cambiar a la vista superior |
<c-w><arriba> | Cambiar a la vista superior |
<c-w>l | Cambiar 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>w | Cambiar a la siguiente vista |
<c-w><c-w> | Cambiar a la siguiente vista |
<c-w>s | Dividir horizontalmente |
<c-w>S | Dividir horizontalmente |
<c-w><c-s> | Dividir horizontalmente |
<c-w>v | Dividir verticalmente |
<c-w><c-v> | Dividir verticalmente |
gt | Cambiar al siguiente tabulador |
gT | Cambiar al anterior tabulador |
gqq | Formatear línea |
gq | Formatear líneas |
q. / q | Empezar/terminar grabación de macro usando el registro de macro nombrado. |
Movimientos permitidos
Tecla | Descripción |
---|---|
h | Izquierda |
<izquierda> | Izquierda |
<retroceso> | Izquierda |
j | Abajo |
<abajo> | Abajo |
<intro> | Abajo hasta el primer no blanco |
k | Arriba |
<arriba> | Arriba |
– | Arriba hasta el primer no blanco |
l | Derecha |
<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. |
n | Encontrar siguiente |
N | Encontrar anterior |
gg | A la primera línea |
G | A la última línea |
w | Palabra hacia adelante |
W | PALABRA hacia adelante |
b | Palabra hacia atrás |
B | PALABRA hacia atrás |
e | Al final de la palabra |
E | Al final de la PALABRA |
ge | Al final de la palabra anterior |
gE | Al 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 |
H | A la primera línea de la ventana |
M | A la línea central de la ventana |
L | A la última línea de la ventana |
gj | A la siguiente línea visual |
gk | A la anterior línea visual |
Objetos de texto permitidos
Tecla | Descripción |
---|---|
iw | Palabra interior |
aw | Una palabra |
iW | PALABRA interior |
aW | Una 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 |
ib | Paréntesis interior |
i) | Paréntesis interior |
i( | Paréntesis interior |
ab | Un paréntesis |
a) | Un paréntesis |
a( | Un paréntesis |
iB | Llave interior |
o} | Llave interior |
i{ | Llave interior |
aB | Una 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
Tecla | Descripció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.
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.):
Tecla | Descripció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ñadieronCtrl+A
yCtrl+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.