¿Cómo ejecutar comandos de shell dentro de Vim como lo hace Gary Bernhardt en sus screencasts?

Dec 13 2020

Estoy viendo los screencasts de Destroy All Software de Gary Bernhardt , específicamente Un compilador desde cero . Allí, ejecuta comandos de shell sin salir de Vim. Estoy casi seguro de que es sólo mediante la sintaxis normal de Vim, por ejemplo, sobre la marca de 1 minuto: :!chmod u+x compiler.rb. Si hago eso en mi computadora, la ventana cambiará para ejecutar el comando de shell y luego tengo que presionar Enter para volver al editor. Este es, creo, el comportamiento normal de Vim, y otras personas lo han preguntado antes, pero no creo que ninguna respuesta haga las cosas como las hace Gary.

Miré su .vimrcarchivo, específicamente la última versión antes de que se cargara el screencast, pero no pude averiguar qué podría haber cambiado para obtener el comportamiento que estoy buscando. Lo descargué pero todavía no obtengo el comportamiento correcto, por lo que obviamente me falta algo. Ninguno de sus complementos parece estar relacionado con esto, por lo que en su mayoría los he ignorado.

Estoy casi seguro de que no estoy en busca de una solución que utiliza TMux, o cosas tales como :split, :term, :below terminal, o :silent. Tampoco estoy buscando una respuesta que use algo más que Vim, creo que Gary solo está usando Vim y algunos complementos.

Vi los screencasts de Gary en los que habla específicamente sobre Vim pero no abordó esta pregunta (o no lo entendí), así que si alguien ha descubierto cómo usarlo :! <shell command>sin salir del editor de texto, realmente agradecería que puedes ayudarme a resolver esto. Probé las opciones que mencioné antes tanto en Mac como en Linux, pero nada funcionó como me gustaría, y estaría contento con una solución que funcione en cualquiera de las plataformas.

Respuestas

3 filbranden Dec 13 2020 at 12:02

El video pasa rápidamente, pero lo detuve y parece que lo he visto escribir lo siguiente:

:!chmod u+x %

Que luego produce esta salida:

:!chmod u+x compiler.rb
[No write since last change]
"compiler.rb" 5L, 42C
Press ENTER or type command to continue

Así que, en realidad, Vim hace pronta a "presionar ENTER" después de que el comando se ha completado, pero parece que la apretó con tanta rapidez (tal vez él se lo esperaba ya? O tal vez empezó a pulsar los siguientes comandos?) Que parece que el mensaje era omitido.

Hay dos configuraciones que son relevantes aquí, la primera para evitar cambiar de la pantalla alternativa mientras se ejecuta el comando y la segunda para volver a cargar automáticamente el archivo una vez que el comando externo lo cambia (aunque solo se cambiaron los permisos).

Mirando su repositorio de archivos de puntos de GitHub, podemos ver ambas configuraciones en el vimrc a partir del 2017-06-29 (que es cuando se publicó ese video).

  1. La configuración de Vim para que no cambie de la pantalla alternativa se configura con este fragmento :
" Prevent Vim from clobbering the scrollback buffer. See
" http://www.shallowsky.com/linux/noaltscreen.html
set t_ti= t_te=
  1. Configuración de Vim para recargar automáticamente el archivo después de que se realiza una operación externa con esta configuración :
set autoread

Con estas dos configuraciones activadas, puedo reproducir casi exactamente el mismo efecto, excepto que no recibo el [No write since last change]mensaje. No estoy realmente seguro de dónde viene, ya que, por lo que puedo decir, acababa de escribir el archivo justo antes del chmodcomando. (Como evidencia, la línea de estado no muestra un al [+]lado del nombre del archivo, lo que denotaría un búfer que ha sido modificado).

Quizás sea algo más de su vimrc ... En teoría, debería ser posible obtenerlo de GitHub e intentar lo mismo. Parece que el video usa Vim 7.4, por lo que también podría ser parte de él.

Aún mirando su repositorio de archivos de puntos de GitHub, parece que volvió a permitir que Vim golpeara el búfer de retroceso , por lo que cambió de opinión en esa parte.

Si esa parte aún le interesa, puede echar un vistazo al complemento vim-altscreen , que implementa ese comportamiento, con algunos controles alrededor. Consulte también la discusión sobre la pregunta "Diferencia entre :!{cmd}y con :w !{cmd}respecto a la pantalla alternativa" , en particular la respuesta excepcional de @ user938271 .