Esta es una solicitud de explicación o indicación de documentación.
Soy usuario de KornShell93 ( ksh
en Mac OS X o ksh93
en cualquier otro lugar). Me gusta el shell por su relativa simplicidad como shell interactivo y por sus capacidades de secuencias de comandos, y lo he estado usando desde que el código se hizo más libre en 2000. Lo uso en vi
modo de edición, con las opciones vi
y viraw
configuradas.
Hay una característica interesante ksh93
que le permite comenzar a escribir un comando en la línea de comando y luego presionar Up-arrowpara obtener la última línea de comando coincidente del historial de la línea de comando. Puedo encontrar la documentación para esto y cómo está vinculado [count][A
en vi
modo de edición, no hay problema.
Sin embargo, si presiono Up-arrowen un mensaje vacío, primero me da el comando ejecutado más recientemente y luego comienza a recorrer cualquier prefijo de comando que haya buscado anteriormente. Esto me molesta muchísimo.
Ejemplo:
Ejecuto estos tres comandos:
$ ls -l
$ ls -ld test
$ ls -ld testdir
Al escribir ls
y luego presionar Up-arrowtres veces, los recorrerá en orden opuesto.
Más tarde, con muchos más comandos emitidos, pero sin búsquedas en el historial ni ls
invocaciones:
$ cc -o testrun mytest.c
$ man strncmp
Si ahora presiono Up-arrowuna vez, obtengo man strncmp
. Si presiono Up-arrownuevamente, obtengo ls -ld testdir
y luego ls -ld test
en lugar del comando cc -o testrun mytest.c
y luego el anterior.
Estoy buscando sugerencias sobre cómo "solucionar" este problema para que, Up-arrowsin escribir nada en la línea de comando de antemano, recorra el historial más reciente sin intentar buscar un prefijo utilizado anteriormente. Sería bueno incluso un indicador de algún lugar donde esté documentado el comportamiento anterior.
EDITAR:
El ksh93
manual dice
[count]k
Obtener el comando anterior. Cada vez quek
se ingresa se accede al comando anterior en el tiempo.
/string
Busque hacia atrás en el historial un comando anterior que contengastring
.String
termina en aRETURN
oNEW LINE
. Sistring
está precedido por^
, la línea coincidente debe comenzar constring
. Sistring
es nulo,string
se utilizará el anterior.
[count][A
Si el cursor está al final de la línea, equivale a/
establecerstring
el contenido de la línea actual. En caso contrario, equivale ak
.
Esto hacenoexplica por qué yoprimeroobtener man strncmp
(como si presionara k) yentoncesobtenga ls -ld testdir
en mi ejemplo anterior. Con el texto del manual en mente, esperaría presionar ls -ld testdir
por primera vez Up-arrow(lo que, por cierto, sería aún más molesto).
Respuesta1
Resulta que es un comportamiento documentado. Desde la página de manual de ksh93:
Buscar comandos de edición Estos comandos acceden a su historial de comandos.
[count]k
Obtener el comando anterior. Cada vez que se ingresa k se accede al comando anterior en el tiempo.
[count]-
Equivalente a k.
[count][A
Si el cursor está al final de la línea es equivalente a/
concadenaestablecido en el contenido de la línea actual. En caso contrario, equivale ak
.
[count]j
Obtener el siguiente comando. Cada vez quej
se ingresa se accede al siguiente comando hacia adelante en el tiempo.
/
cadena Busque hacia atrás en el historial un comando anterior que contengacadena. Cadenatermina con unaRETURN' or
NUEVA LÍNEA'. Sicadenaestá precedido por^
, la línea coincidente debe comenzar concadena. Sicadenaes nulo, se utilizará la cadena anterior.
Nota: Cuando utilice la flecha hacia arriba después de ingresar una cadena, la cadena de búsqueda seráancladoal inicio de la línea, como si ^
estuviera escrito al frente.
Ejemplo:
$ ls[Up-Arrow]
es el equivalente de
$ [ESC]/^ls