¿La forma más rápida de mover el cursor en una línea de comando de terminal?

157

¿Cuál es la mejor manera de moverse en una línea de comando muy larga en la terminal?

Digamos que usé la tecla de flecha o Ctrl- Rpara obtener esta larga línea de comando:

./cmd --option1 --option2 --option3 --option4 --option5 --option6 --option7 --option8 --option9 --option10 --option11 --option12 --option13 --option14 --option15 --option16 --option17 --option18 --option19 --option20 --option21 --option22 --option23 --option24 --option25 --option26 --option27 --option28 --option29 --option30 --option31 --option32 --option33 --option34 --option35 --option36 --option37 --option38 --option39 --option40 --option41 --option42 --option43 --option44 --option45 --option46 --option47 --option48 --option49 --option50 

Ahora necesito mover (comenzando desde el principio o el final de la línea) el cursor --option25para modificar algo allí.

¿Cuál es la forma más rápida de llegar? Lo que suelo hacer es Ctrl- Apara llegar al principio y luego en repetidas ocasiones Alt- Fpara seguir adelante, palabra por palabra (o Ctrl- Epara ir al final y Alt- Ba continuación, ir hacia atrás). Pero en una línea larga que lleva demasiado tiempo. Debe haber una forma de buscar y saltar directamente a la parte que necesito modificar, por ejemplo option25.

Franco
fuente

Respuestas:

108

Como esto aún no se ha cerrado, aquí hay algunas opciones más.

  • Use Ctrl+ xseguido de Ctrl+ epara abrir la línea actual en el editor especificado por $FCEDITo $EDITORoemacs (probado en ese orden).
  • Si ejecutó el comando anteriormente, presione Ctrl+ rpara realizar una búsqueda inversa en el historial y escriba option25(en este caso). Se mostrará la línea. GolpearTab para comenzar a editar en este punto.
  • Usa la expansión del historial con el s///modificador. Por ejemplo, !-2:s/--option25/--newoption/volvería a ejecutar el penúltimo comando, pero reemplazaría la opción25. Para modificar el último ./cmdcomando, use la !stringsintaxis:!./cmd:s/--option25/--newoption/
    se puede usar cualquier delimitador en lugar de / en la sustitución.
  • Si edita la línea anterior, puede usar la sustitución rápida: ^--option25^--newoption
  • Búsqueda de personajes Esto fue mencionado por Pax, y se puede hacer en modo emacs regular con Ctrl+ ]para búsqueda hacia adelante y Ctrl+ Alt+ ]para búsqueda hacia atrás.

Recomiendo la segunda opción. Ctrl+ res realmente práctico y rápido, no te molestas con los editores, y ves los resultados antes de ejecutar el comando (a diferencia de las expansiones del historial).

Pianosaurus
fuente
203

Para ser claros, no desea una "forma rápida de mover el cursor en una línea de comando de terminal ". Lo que realmente quieres es una forma rápida de navegar por la línea de comando en tu shell programa de .

Bash es un shell muy común, por ejemplo. Utiliza Readline biblioteca para implementar la entrada de línea de comando. Y por así decirlo, es muy conveniente conocer los enlaces de Readline ya que se usa no solo en bash. Por ejemplo, gdb también usa Readline para procesar la entrada.

En la documentación de Readline puede encontrar todos los enlaces relacionados con la navegación (y más): http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

Copie y pegue brevemente si el enlace de arriba se cae:

Desnudos esenciales

  • Ctrl-b Retrocede un personaje.
  • Ctrl-f Avanza un personaje.
  • [DEL] o [Retroceso] Eliminar el carácter a la izquierda del cursor.
  • Ctrl-d Eliminar el carácter debajo del cursor.
  • Ctrl-_ o Cx Cu Deshace el último comando de edición. Puede deshacer todo el camino de regreso a una línea vacía.

Movimiento

  • Ctrl-a Moverse al inicio de la línea.
  • Ctrl-e Moverse al final de la línea.
  • Meta-f Avanza una palabra, donde una palabra se compone de letras y dígitos.
  • Meta-b Retrocede una palabra.
  • Ctrl-l Borrar la pantalla, reimprimiendo la línea actual en la parte superior.

Mata y tira

  • Ctrl-k Mata el texto desde la posición actual del cursor hasta el final de la línea.
  • Md Mata desde el cursor hasta el final de la palabra actual o, si está entre palabras, hasta el final de la siguiente palabra. Los límites de palabras son los mismos que los utilizados por Mf.
  • M- [DEL] Elimina desde el cursor el inicio de la palabra actual o, si está entre palabras, hasta el comienzo de la palabra anterior. Los límites de palabras son los mismos que los utilizados por Mb.
  • Ctrl-w Mata desde el cursor al espacio en blanco anterior. Esto es diferente de M- porque los límites de las palabras difieren.
  • Ctrl-y Yank el texto eliminado más recientemente en el búfer en el cursor.
  • Gira el anillo de la muerte y tira del nuevo techo. Solo puede hacer esto si el comando anterior es Cy o My.

M es la tecla Meta. Para Max OS X Terminal, puede habilitar "Usar opción como meta clave" en Configuración / Teclado para eso. Para Linux es más complicado.

Actualizar

También tenga en cuenta que Readline puede funcionar en dos modos:

  • modo emacs (que es el predeterminado)
  • modo vi

Para cambiar Bash para usar el modo vi:

$ set -o vi

Personalmente, prefiero el modo vi ya que uso vim para editar texto.

Prima

En la aplicación MacOS Terminal (y también en iTerm) puede hacer clic con la tecla Opción para mover el cursor (el cursor se moverá a la posición en la que se hizo clic). Esto incluso funciona por dentro vim.

wonder.mice
fuente
3
Prefiero esta respuesta porque explica la [esencia / raíz / razón detrás] de cómo funciona la entrada del teclado bash (de dónde proviene), es decir, Readline.
eugenevd
66
En el terminal estándar de Ubuntu, Meta (M) es Alt + Shift, a menos que desactive los atajos de teclado de acceso al menú, en cuyo caso es solo Alt.
brianpeiris
2
En Kde en Konsole, el Meta (M) es la tecla alt
Pipo
El problema es que Meta + F no funciona si Meta es ALT, ya que ALT da acceso al menú del programa en ejecución (en este caso, terminal). ¿Hay una alternativa?
Pithikos
1
¿Qué es Mf, entonces no usas el control aquí, entonces qué es?
PositivoGuy
33

Mantenga presionada la tecla Opción y haga clic donde desee que se mueva el cursor, y Terminal apura el cursor en ese punto preciso.

Conectando la vida con Android
fuente
2
Acabas de duplicar mi eficiencia
Lay González
¿En qué entornos funciona esto? ¿Supongo que solo en Mac OS?
Abdull
Funciona en ssh linux remoto, incluso a través de un servidor de salto.
John Jiang
10

Tiendo a preferir el modo de edición vi (ya que esas teclas están incrustadas en mi médula espinal ahora (el cerebro no se usa en absoluto), junto con CTRL-K, CTRL-X de WordStar 3.3 :-). Puede usar la línea de comando set -o vipara activarlo (yset -o emacs revertirlo).

En Vi, sería (ESC-K para obtener la línea primero, por supuesto) " f5;;B" (sin las comillas dobles).

Por supuesto, tienes que entender qué hay en la línea para salirte con la tuya. Básicamente, es

f5 to find the first occurrence of "5" (in --option5).
;  to find the next one (in --option15).
;  to find the next one (in --option25).
B  to back up to the start of the word.

Veamos si los aficionados a emacs pueden encontrar una mejor solución, menos de 5 pulsaciones de teclas (aunque no quiero comenzar una guerra religiosa).

¿Has pensado si tal vez te gustaría poner este comando terriblemente largo en un script? :-)

En realidad, puedo ir uno mejor que eso: " 3f5B" para encontrar la tercera aparición de "5" y luego retroceder hasta el comienzo de la palabra.

paxdiablo
fuente
No necesita un script: simplemente presione "v" en modo vi y abra la línea de comandos en un editor. Puede formatear la línea de comandos, err, "script" más bien con las nuevas líneas, y no se necesita un archivo temporal. :) Entonces, "v / 25" te lleva allí en 4 caracteres.
dannysauer
Pero entonces, necesita más que la tecla <Enter> para ejecutarlo. @dannysauer
CDR
9

Use Meta-b / Meta-f para moverse hacia atrás / adelante por una palabra respectivamente.

En OSX, Meta se traduce como ESC, que apesta.

Pero, alternativamente, puede abrir las preferencias del terminal -> configuración -> perfil -> teclado y marcar "usar opción como meta clave"

Edson Medina
fuente
8

Después de ejecutar el comando una vez, ejecute fc

Se iniciará $EDITORcon el comando anterior, luego puede usar su editor habitual para modificar el comando. Cuando guarde y salga, el archivo se ejecutará.

... pero, como dijo Pax, la línea de comando no es particularmente buena para editar líneas absurdamente largas, ¿por qué no convertir el comando en un script?

dbr
fuente
4

Si desea avanzar un cierto número de palabras, presione M-<n>( M-es para Meta y generalmente es la tecla de escape) y luego presione un número. Esto envía un argumento de repetición a readline, para que pueda repetir cualquier comando que desee: si desea avanzar, presione M-<n> M-fy el cursor avanzará <n>varias palabras.

P.ej

 $|echo "two three four five six seven"
 $ M-4
 (arg: 4) echo "two three four five six seven"
 $ M-f
 $ echo "two three four| five six seven"

Entonces, para su ejemplo desde el cursor al comienzo de la línea, golpearía, M-26 M-fy su cursor estaría en --option25|-o- desde el final de la línea M-26 M-bcolocaría su cursor en--|option25


fuente
2

Búsqueda incremental de historia

en terminal ingrese:

gedit  ~/.inputrc

luego copie y pegue

"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char

todo lo que necesitas hacer para encontrar un comando anterior es ingresar, por ejemplo, las primeras 2 o 3 letras y la flecha hacia arriba te llevará allí rápidamente, decir que quiero:

for f in *.mid ; do timidity "$f"; done

todo lo que necesito hacer es entrar

fo

y presione el comando de flecha hacia arriba pronto aparecerá

Alexandr
fuente
1

Una opción es usar M-x shellen emacs. Eso proporciona todas las funciones de edición y pulsaciones de teclas que emacstiene, por lo que C-sse puede utilizar para buscar el texto option25, por ejemplo.

(Pero aún así preferiría estar en el terminal real de la terminal si alguien me puede indicar buenas instalaciones de búsqueda y edición).

Franco
fuente
0

Use el ratón

A veces, la forma más fácil de editar una línea de comandos es usar un mouse. Algunas respuestas anteriores dan un comando para abrir su línea actual en su $ EDITOR. Para mí (zhs con configuración grml) esa combinación es Alt+e. Si habilita el mouse en su editor, puede usarlo.

Para habilitar el mouse en Vim, agregue esto a su ~ / .vimrc

set mouse=a
set ttymouse=xterm2

Si luego desea hacer una selección de texto en la terminal (en lugar de pasar el mouseclick a vim), mantenga presionada la tecla Mayús cuando haga clic; esto es específico de la terminal, por supuesto.

Los administradores de sistemas no deben temerle al mouse.

user7610
fuente
0

En Cygwin, puede activar dicha función haciendo clic derecho en la ventana. En la ventana emergente, seleccione Opciones ... -> Ratón -> activar Clics colocar cursor de línea de comando -> Aplicar.

De ahora en adelante, simplemente haciendo clic con el botón izquierdo del mouse en alguna posición dentro de la línea de comando colocará el cursor allí.

Abdull
fuente
0

primero: export EDITOR = 'nano -m'

entonces: CTRL + X CTRL + E en secuencia.

Su línea actual se abrirá en nano editor con el mouse habilitado. Puede hacer clic en cualquier parte del texto y editar

luego CTRL + X para salir e y para confirmar el guardado.

Sunfloro
fuente
0

Hice un script para hacer que el cursor de la línea de comando se moviera al hacer clic con el mouse :

  1. Habilitar informes de seguimiento de mouse xterm
  2. Establezca enlaces de línea de lectura para consumir la secuencia de escape generada por los clics

Se puede encontrar en github

Más información en otra publicación

Funcionará si echo -e "\e[?1000;1006;1015h" # Enable trackingimprime secuencias de escape en la terminal al hacer clic con el mouse

Tinmarino
fuente
0

Puede que no sea el más rápido, pero esto debe estar aquí, leer algo sobre los movimientos del cursor ANSI

Las secuencias de escape ANSI le permiten mover el cursor por la pantalla a voluntad. Esto es más útil para las interfaces de usuario de pantalla completa generadas por los scripts de shell, pero también se puede usar en las indicaciones . Las secuencias de escape de movimiento son las siguientes:

- Position the Cursor:
  \033[<L>;<C>H
     Or
  \033[<L>;<C>f
  puts the cursor at line L and column C.
- Move the cursor up N lines:
  \033[<N>A
- Move the cursor down N lines:
  \033[<N>B
- Move the cursor forward N columns:
  \033[<N>C
- Move the cursor backward N columns:
  \033[<N>D

- Clear the screen, move to (0,0):
  \033[2J  or \033c
- Erase to end of line:
  \033[K

- Save cursor position:
  \033[s
- Restore cursor position:
  \033[u

(...)

Intente poner la siguiente línea de código en el indicador (es un poco más claro lo que hace si el indicador se encuentra varias líneas hacia abajo en el terminal cuando coloca esto): echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"Esto debería mover el cursor siete líneas hacia arriba en la pantalla, imprimir la palabra "BASH ", y luego regrese a donde comenzó a producir un mensaje normal.


Ejemplos :

Mueva el cursor hacia atrás 7 líneas:

echo -e "\033[7A"

Mueva el cursor a la línea 10, columna 5:

echo -e "\033[10;5H"

Haga eco rápidamente de los códigos de colores para colorear un programa:

echo -e "\033[35;42m" ; ifconfig
NVRM
fuente