Shell con mejores capacidades de edición

11

Los shells (al menos lo que sé) tienen capacidades de edición de comandos realmente malas.

Por ejemplo:

  • No puedo apuntar el cursor a ningún punto del comando.
  • No puedo seleccionar y retroceder / eliminar / reemplazar texto en el comando.

Actualmente estos son tan molestos, uso gedit para editar comandos antes de pegarlos en la terminal.

¿Hay alguna solución que sea buena para estos?

ID universalmente único
fuente
3
Estás combinando un terminal con un shell.
JdeBP

Respuestas:

13

Bash es bastante bueno en esto. Solo necesitas aprender sus atajos. Por ejemplo (en el modo predeterminado de emacs):

  • Ctrl+ A: moverse al comienzo de la línea.
  • Ctrl+ E: moverse al final de la línea.
  • Ctrl+ B: mueve un personaje hacia atrás.
  • Ctrl+ F: mueve un personaje hacia adelante.
  • Alt+ B: mueve una palabra hacia atrás.
  • Alt+ F: mueve una palabra hacia adelante.
  • Ctrl+ K: elimina (corta) todo hasta el final de la línea.
  • Alt+ D: borra (corta) la palabra después del cursor.
  • Ctrl+ W: borra (corta) la palabra antes del cursor.
  • Ctrl+ Y: tirar (pegar) lo que está en el búfer (lo que cortas con Ctrl+ Ko Alt+ Dpor ejemplo)

Y hay muchos más. Lea man readlinepara ver qué más hay disponible. Puede asignar diferentes accesos directos colocándolos en ~/.inputrc. Por ejemplo, para hacer que Ctrl+ Leftretroceda una palabra y Ctrl+ Rightavance una palabra, agregue esto a su ~/.inputrc:

"\e[1;5D": backward-word 
"\e[1;5C": forward-word

Para saber qué significan esos códigos extraños, presione Ctrl+ Vy luego presione la tecla que desea usar. Si intentas con Ctrl+ Right, verás ^[[1;5C. Reemplazar ^[con \ein ~/.inputrc.


También es posible que desee buscar otras conchas. Las conchas populares "modernas" y ricas en características incluyen:

terdon
fuente
Con gnome-terminaltienes que usar el ESCbotón en lugar de ALT navegar una palabra hacia adelante y hacia atrás. . .. o cambie a un terminal que no use Alt para su menú de aplicaciones. . . como xterm o sakura
Sergiy Kolodyazhnyy
@Serg no está en mi sistema, gracias. No sé si lo ha configurado de esa manera o si Ubuntu lo ha ajustado por defecto. Sin embargo, Esc se usa a menudo como sinónimo de Alt.
terdon
Sin embargo, no se comparten compartimientos de corte entre terminales.
Craig Hicks
7

Puede editar un comando vacío o parcialmente escrito en el editor de su elección configurando EDITORel editor de su elección y presionando CTRL+ X+ Eo CTRL+ X/ CTRL+ E, que abre la línea que se está editando actualmente EDITOR;

Por ejemplo, establecer EDITORa gedithará que CTRL+ X+ Ey CTRL+ X/ CTRL+ Eabran la línea actual en Gedit.

Para que esto sea una solución permanente, se puede establecer EDITORen ~/.bashrc.

Esto permite utilizar incluso un editor de texto gráfico completamente desplegado para editar el comando; para ejecutar el comando editado, simplemente guarde y cierre el documento.


La misma característica se puede habilitar en Zsh agregando lo siguiente a ~/.zshrc:

autoload -U edit-command-line
zle -N edit-command-line
bindkey '^xe' edit-command-line
bindkey '^x^e' edit-command-line
kos
fuente
2
Esto también se puede invocar con el fccomando si se establece la variable FCEDIT. Buena respuesta !
Sergiy Kolodyazhnyy
1
@Serg Gracias, sin embargo, fcabre el comando anterior (que es aún más ordenado de cierta manera). No sabía sobre eso, gracias!
Kos
6

Los terminales no tienen capacidades de edición de texto en sí mismos. Los terminales proporcionan un área de texto y conectan el teclado a algo. Pero lo que ejecutas dentro de la terminal determina lo que puede hacer.

Los shells como los que bashnormalmente son lo primero que encontrarás para ejecutar dentro de una terminal. Debido a que los shells funcionan basados ​​en comandos, solo puede editar el comando actual. proporciona una excelente edición de comandos en comparación con el shell Bourne csho, kshsin embargo, no es algo con lo que quieras editar ni siquiera una historia corta.

Los editores de texto son uno de los comandos que puede invocar en el shell. Los ejemplos principales son y . vimo emacste dará la posibilidad de editar casi cualquier cosa. Ambos incluyen entornos de programación integrados para ampliar sus habilidades a cualquier problema que enfrente.

Por lo tanto, la solución es comprender mejor lo que estas herramientas están haciendo y su intención y elegir la correcta para el trabajo .

polluelos
fuente
Sé la diferencia, pero ¿se puede hacer algo para mejorar la edición de comandos de bash?
UniversallyUniqueID
1
ponerlo en un guión?
pollitos
0

Por lo general, los terminales permiten la selección de texto con el mouse, pero el shell no se da cuenta de esto. Así que por desgracia no bash, zsh, fishni tampoco espuede apoyar la edición basada en ratón. Creo que para hacerlo, tendrían que tomar un mayor control sobre la terminal.

Sin embargo (y esto es un poco exagerado) si abre Vim o GVim, y luego ingresa comandos de shell usando:

:!...

entonces puede hacer clic con el mouse para saltar a cualquier parte de la línea . (Necesitará :set mouse=aprimero si eso no está habilitado). Las teclas de edición en este modo se pueden ver con:help cmdline-editing

Vim también tiene un modo de historial de comandos bastante poderoso, al que se puede llegar golpeando q:. Desde allí puede tirar, eliminar y pegar usando los comandos de modo normal de Vim. En este modo, puede obtener la selección con el mouse y luego eliminar la función que desee (presionando d).

Una advertencia importante aquí es que Vim en realidad no mantiene una sesión de shell en vivo ejecutándose. Cada comando que ejecute se ejecutará en un proceso secundario. Por lo tanto, cualquier cambio realizado en las variables de entorno u opciones de shell por el proceso secundario se perderá.

Dicho esto, se pueden modificar las variables de entorno desde dentro el proceso de Vim, y utilizar estos de línea de comandos de Vim, y que incluso se pueden exportar a procesos secundarios:

:let $FOO="bar"        " the $ and the quotes are mandatory here

:echo $FOO             " Vim's own echo command
bar

:!echo "$FOO"          " Passing the variable to a shell command
bar

:!bash                 " Opening a child shell
$ echo "$FOO"
bar

Entonces, si estás dispuesto a pretender que Vim es en realidad una especie de caparazón extraño, ¡entonces puedes disfrutar de sus funciones de edición avanzadas! Probablemente el mayor inconveniente es que tendrá que iniciar cada comando escribiendo :!oq:

Ah, y por cierto, si desea obtener la salida del comando de shell en su búfer Vim actual, puede hacerlo así (pero tenga cuidado de que golpeará su línea actual):

:,!ls
joeytwiddle
fuente