Autocompletar para los comandos de línea de comando que se usan con frecuencia?


15

Para algunos proyectos, a menudo escribo un par de comandos, como por ejemplo:

cd an/extremely/long/path/in/which/I/have/some/kinda/project

y

./runmyproject --with some --command line --options set

Al ver que soy bastante vago, trato de evitar escribir esos comandos una y otra vez. Así que, por supuesto, puedo usar la tecla arriba para encontrar esos comandos, pero a menudo, tengo tantos comandos intermedios, que buscarlos lleva aún más tiempo que simplemente escribirlos.

Ahora me pregunto si hay algún tipo de utilidad que pueda sugerir un comando completo que utilizo mucho, cuando aún no lo he escrito todo. Para que pueda, por ejemplo, escribir 'cd an /' y que ya sugiera el resto del camino porque lo he usado mucho el mes pasado.

Encontré algo llamado Bash Smart Complete. Pero eso es un poco "tonto", ya que no mira los comandos que usé antes. También encontré esta respuesta SO , que sugiere poner los comandos que uso mucho en un archivo. Sin embargo, eso no responde lo suficiente, ya que necesitaría crear un nuevo archivo cada vez que inicio nuevos proyectos o cambie carpetas o argumentos de programa.

¿Alguien sabe alguna otra utilidad u otra forma de lograr esto? O, ¿alguien sabría cómo podría alterar el Bash Smart Complete para que pueda ver los comandos que utilicé en el último mes y completar el comando que más se ajusta y se ha utilizado en el último mes?

[EDITAR] A continuación hay algunas respuestas realmente geniales. Todavía no he marcado ninguna como respuesta definitiva. No porque no me gusten las respuestas, sí, sino porque ninguna de ellas es un ganador absoluto. Creo que el Finalterm es un gran proyecto. Lamentablemente, todavía es bastante irregular en los bordes. Por ejemplo; Todavía no admite copiar y pegar. Sin embargo, estaría atento a ese proyecto, porque cuando madure, creo que será una gran aplicación de terminal. En cuanto a las otras respuestas; sugirieron crear un alias, que no es lo que quiero hacer porque crea trabajo adicional en lugar de quitar el trabajo, o usar Ctrl + R, lo cual es genial (¡no lo sabía!). Un par de personas sugirió usar Ctrl + R, por lo que realmente no puedo resaltar una respuesta sobre la otra.

Así que por ahora definitivamente estoy usando Ctrl + R, y en el futuro podría usar Finalterm.

Gracias por todas las excelentes respuestas chicos!


2
Realmente deberías intentarlo zsh. Ofrece todo lo que está pidiendo y mucho más. Pasar de bash a zsh
Basharat Sialvi

Según la página de manual de BASH, la función también está presente en BASH como "historial completo dinámico". Por defecto, está vinculado a Alt + Tab, lo que lo hace inútil, pero uno puede cambiar el enlace con "bind".
Boris Bukh

1
@BasharatSial, ¿qué hace específicamente zsh para ayudar con esto?
Poolie

Respuestas:


16

Si los comandos se usan con frecuencia, se registran en las pistas de bash del historial de comandos .bash_history.

Ahora el truco: puede realizar una búsqueda inversa en este historial para volver a ejecutar comandos presionando CTRL-r .

En el modo de búsqueda de historial inverso, bash muestra, en vivo, mientras escribe , el comando más reciente en el historial que comienza con su entrada dada. Luego presione Intro para aceptar y ejecutar el comando propuesto. Siga presionando CTRL-R para pasar a los comandos más antiguos con el mismo prefijo.

Esto está integrado en bash, no es necesario personalizar scripts o instalar software :) Es una de las características más útiles de bash, en mi humilde opinión.


3
Use [ CTRL-g ] para escapar del modo de búsqueda del historial, si no está ejecutando un comando (como si no encontrara el que necesitaba).
MountainX-for-Monica

8

Pegue (Ctrl-Shift-V) lo siguiente en una pantalla de terminal:

echo '"\e[A": history-search-backward' > ~/.inputrc
echo '"\e[B": history-search-forward' >> ~/.inputrc
echo 'set show-all-if-ambiguous on' >> ~/.inputrc
echo 'set completion-ignore-case on' >> ~/.inputrc

Salga (Ctrl-D) de la pantalla de terminal, luego abra Terminal nuevamente.

Ahora puede escribir el primer par de caracteres, luego presionar Arriba o Abajo para desplazarse por la lista filtrada


3
¡Esta es la respuesta más simple que hace el trabajo!
cxrodgers

8

Término final

Existe esta muy prometedora aplicación de terminal denominada Término final . Entre sus muchas características, también tiene un historial de recordar comandos, para que luego pueda seleccionarlo. Aquí hay algunas características más:

Término final

Puedes leer más sobre esto en este artículo .

Aquí está el sitio web de los creadores. http://finalterm.org/

Para instalarlo

sudo add-apt-repository ppa:versable/finalterm-daily
sudo apt-get update
sudo apt-get install finalterm

Advertencia

He dicho que es prometedor. El único problema es que está en la versión 0.1. Así que algunas cosas como vimy nanotodavía no funcionan bien. También he notado que todavía no admite Arrastrar y soltar, y copiar y pegar. Pero tiene la función que solicita. A medida que el software madure, se convertirá en uno de los mejores terminales para el escritorio.

Captura de pantalla

Aquí está la función en acción:

 función en acción

Espero que esto ayude.

* Estoy en Saucy, por eso tengo experiencia en Salamander :)


¡Gracias por el consejo! Revisé finalterm y se ve bien. Desafortunadamente, todavía no parece admitir copiar y pegar. Intenté Ctrl + V, Ctrl + Shift + V y haciendo clic derecho, pero ninguno parece funcionar. ¡Así que tendré esto en mente para el futuro!
kramer65

Ese es el mayor inconveniente que vi. Sin embargo, el proyecto es joven, por lo que espero que se agregue pronto. Puedo ver una aplicación de terminal sin soporte para copiar y pegar.
Max Tither

7

Use un aliaspara todo su comando, o agregue el directorio en su $PATH. Además, no tiene que cambiar los directorios a donde debe ejecutar su ejecutable (o script, o lo que sea), por lo que es bastante simple. Ambos métodos requieren que reinicie el terminal que está utilizando antes de que los cambios surtan efecto.

Aquí se explica cómo crear un bash aliaspara su ejemplo (agregue la siguiente línea a su ~/.bashrcarchivo):

alias runmyproject='an/extremely/long/path/in/which/I/have/some/kinda/project/runmyproject --with some --command line --options set'

De esta manera, todo lo que necesita hacer es ingresar runmyproject al terminal donde sea que se encuentre, sin tener que especificar opciones / argumentos.

Alternativamente, puede agregar su ruta de proyecto en su $PATHvariable de entorno. Para hacerlo, agregue las siguientes líneas en su ~/.bashrcarchivo:

PATH=an/extremely/long/path/in/which/I/have/some/kinda/project:$PATH
export PATH

En este caso, aún deberá especificar sus opciones / argumentos para su ejecutable cuando lo ejecute.


1
La cuestión es que me gustaría que el terminal responda a mi uso. Con esto tengo que cambiar el alias cada vez que empiezo a trabajar en nuevos proyectos o cuando cambio la estructura de directorios de mi proyecto. La parte principal de mi pregunta es que quiero que aprenda de lo que uso, en lugar de que yo le diga qué hacer.
kramer65

Ah, ya veo. Entonces, la respuesta mejor calificada actualmente debería hacer el truco. O al menos de cerca.
oaskamay

4

Cuando me encuentro con frecuencia teniendo que cambiar a un directorio como este:

cd an/extremely/long/path/in/which/I/have/some/kinda/project

Solo haría esto una vez:

ln -s an/extremely/long/path/in/which/I/have/some/kinda/project ~/project

Y a partir de entonces, use:

cd ~/pr[tab]

Cuando se trata de:

./runmyproject --with some --command line --options set

Usaría la búsqueda del historial de bash. En el símbolo del sistema, simplemente presione Ctrl-R y escriba 'runmy'. Voila, todo el comando con todas las opciones tal como se ingresó por última vez está ahí para volver a ingresarlo. Si no me gustaran las opciones que utilicé la última vez y quisiera ver los comandos anteriores, seguiría presionando Ctrl-R para recorrer todos los comandos anteriores que contenían "runmy".

La búsqueda del historial Ctrl-R también podría ayudar con el comando 'cd', si no le gusta la idea del enlace simbólico. [Ctrl-R] ​​/ proj es muy probable que recupere el último comando que usó para cd a ese directorio.

En lugar de agregar un alias o cambiar a un shell especial, siempre prefiero aprender a usar las funciones de bash diseñadas para ayudar con este tipo de cosas. De esa manera puedo usar las mismas funciones en máquinas remotas o si tengo que sentarme en la terminal de un colega.


Gracias por tu sugerencia. La cuestión es que no quiero establecer otra cosa de la que me haya ocupado cuando, por ejemplo, la carpeta del proyecto cambie o comience un nuevo proyecto. La cuestión es que me gustaría que el terminal responda a mi uso. La parte principal de mi pregunta es que quiero que aprenda de lo que uso, en lugar de que yo le diga qué hacer. Aunque realmente me gusta la función Ctrl-R. Gracias por eso!
kramer65


2

Pruebe esto ... Esto funciona para todos los comandos en su archivo de historial ... es lo mismo que Ctrl+ R, pero creo que es más intuitivo :)

  1. editar /etc/inputrc

    sudo vim /etc/inputrc
  2. descomentar o agregar estas dos líneas

    "\e[5~": history-search-backward
    
    "\e[6~": history-search-forward
  3. cerrar sesión / iniciar sesión


luego intente escribir algún comando listado en el historial ...

me gusta...

ls -lah

escribir

ls

y presione

Page Upo Page Dnpara navegar a través de su archivo de historial en busca de comandos que comienzan con "ls"

Si hiciste todo bien, debería completar automáticamente tu comando ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.