Algo que he encontrado útil en otros editores es la capacidad de:
- tomar el texto seleccionado
- ejecutar un comando externo y pasar la selección a su
stdin
- tome los comandos externos
stdout
y reemplace la selección actual con él.
De esta forma, puede escribir herramientas de texto útiles que operan en la selección utilizando cualquier idioma que pueda hacer io básico.
¿Cómo se puede hacer esto con vim usando la selección? ... un solo carácter, palabra, párrafo ... etc.
(¿Directamente en la línea de comando o mediante un enlace de teclas?)
Nota
Comandos como !sort
trabajar en el nivel de línea, la razón por la que hago esta pregunta es porque me gustaría operar en la selección. (es decir, el texto que se eliminaría si x
se presionara).
fuente
sort
comando.:sort
?Escribí un complemento llamado express.vim que puede ayudar con esto. El complemento define un operador
g=
que le permite evaluar una expresión de VimScript sobre un movimiento (o selección visual). Solicita una expresión, en la que puede usarv:val
como marcador de posición para el texto cubierto por el movimiento (o, de nuevo, la selección Visual).En este caso, una expresión útil usaría la
system()
función, que ejecuta un comando externo.(Aquí utilicé
tr
como ejemplo un comando externo simple).La forma de usar express.vim para este problema sería seleccionar el texto con el modo Visual, luego escribir
g=
seguido de esa expresión, luego presionarEnter
:Lo admito, no es fácil de usar. (De hecho, ¡rara vez uso este complemento yo mismo!) Estoy considerando agregar un acceso directo para invocar un comando externo, como comenzar la expresión con
!
. Publicaré una actualización aquí si termino haciendo eso.EDITAR
Modifiqué express.vim para tratar expresiones que comienzan
!
como comandos externos. Entonces, siguiendo eltr
ejemplo, lo anterior se vuelve mucho más simple. Después de una selección visual, escriba lo siguiente:Explicación:
g=
!tr a-z A-Z
como la expresiónEnter
fuente
Está buscando los comandos de filtro en Vim. Ver
:help filter
. Aquí está la documentación relevante:Por lo tanto, al escribir
5!!sort
se ordenarán las siguientes 5 líneas a partir del cursor.fuente
tr [:lower:] [:upper]
, entonces vim mostrará no solo esta palabra sino toda la línea.Tenga en cuenta que se puede hacer con:
s^R=system('tr a-z A-Z', @")[:-2]^M
(con^R
CTRL + R y ^ M siendo ENTER)También podría funcionar con cualquier cosa que haga selección + reemplazar como
ci"^R=...
.fuente
v
y mover el cursor) me sale el errorE16: Invalid range\nE16: Invalid range\nE476: Invalid command
(en Linuxtr
y existen otros comandos básicos).s
que entra en modo de inserción o:s
el comando?s
desde el modo visual, o golpea:
primero? No hay nada:
involucrado en la secuencia de teclas que he escrito. Un mapeo sería:vnoremap µ s<c-r>=system('tr a-z A-Z', @")[:-2]<cr>
.