¿Cómo decirle a Ido que se salga del camino cuando ya puedo pegar el nombre del archivo?

14

Estoy tratando de usar el modo Ido. Algunas veces es agradable, pero otras veces es extremadamente estúpido. Aquí está mi mayor decepción.

Leo un registro con los nombres completos de los archivos, luego copio un nombre, intento abrir ese archivo.

La forma de hacer esto sin Ido: C-aC-yC-kRET

Con Ido hay dos problemas principales:

  1. Si tengo el nombre completo del archivo, no hay forma de ingresarlo (debo eliminar la primera barra inclinada, de lo contrario, incluso presionar //no ayudará.

  2. No puedo editar partes intermedias del nombre del archivo, dejando el resto sin modificar.

O puedo?

wvxvw
fuente
2
Usted puede caer de nuevo a Stock find-filecon C-x C-fy pegar normalmente. Pero entonces, eso es más pulsaciones de teclas. O puede usar Helm si desea una función rica find-filey aún así satisfacer su caso de uso.
Tu Do
1
Ah, gracias, no, no hago esto tan a menudo que me quejo de dos pulsaciones de teclas adicionales. Esto realmente respondería a mis necesidades por ahora. ¡Gracias!
wvxvw
@Tu Do Deberías poner eso como respuesta a continuación. ¡He encontrado la C-x C-falternativa útil muchas veces!
Kaushal Modi

Respuestas:

17

Mientras un idocomando está activo ( ido-find-fileen este caso), puede volver a la versión no ido del mismo comando ( find-fileen este caso) utilizando el enlace ido-predeterminado C-x C-fpara ido-fallback-command.

Para responder tu pregunta,

  • El primero C-x C-flo llamará ido-find-file.
  • El segundo C-x C-fvolverá a find-file.
  • Luego puede hacer C-a C-y C-k RETlo que suele hacer para tirar de una ruta de archivo copiada al minibúfer.

Nota: En ido, C-x C-f C-x C-fhará lo mismo que C-x C-f C-f, es decir, retrocederá a find-file.

Acerca C-fdeido A ido-mode, C-festá obligado a ido-magic-forward-char. De ido.el,

(defun ido-magic-forward-char (arg)
  "Avanzar en la entrada del usuario o realizar una acción mágica.
Si no hay ninguna entrada del usuario, o al final de la entrada, realice acciones mágicas:
Cx Cb ... Cf cambia a 'ido-find-file'.
Cx Cf ... Cf recurre a 'find-file' que no es Ido.
Cx Cd ... Cf recurrir a no-Ido breve 'dired'.
Cx d ... Cf recurrir a 'Dired' no Ido ".
Tu Do
fuente
2
Para mí es solo C-fpara volver find-file, no C-x C-f. No veo que lo haya personalizado (y yo, como otros aquí, confío mucho en el respaldo. idoEs casi tanto problema como vale, después de usarlo durante un tiempo).
harpo
1
@harpo Acabo de actualizar la respuesta anterior explicando por qué C-x C-f C-ftambién funciona.
Kaushal Modi
Gracias a @kaushalmodi por la mayor parte del trabajo. Mi respuesta es inicialmente simple como el comentario. Debería ser su respuesta :) Solo una nota de credibilidad.
Tu Do
Esto salvó mi cordura, ya que ido no juega muy bien con los vagabundos cuando se usan caminos absolutos. Gracias.
Jérémie
6

Dado que está tratando con nombres de ruta completos, otros métodos pueden funcionar:

  • use M-x ffap( find-file-at-point): leerá automáticamente el nombre de la ruta y abrirá el archivo
  • active M-x compilation-shell-minor-modelo que cambiará la fuente de los caminos y los hará "clicables" (con la boca o RET). Al hacer clic en él, se accede a ese archivo y a la línea específica, y puede usar next-errory previous-errornavegar. A menudo lo uso, como en modo shell .
Ehvince
fuente
5

Como siempre hay más de una forma de hacerlo, aquí hay una variación de la idea de @ abo-abo que mantiene activa la finalización de id en lugar de recurrir al comando de búsqueda normal.

(defun ido-yank ()
  (interactive)
  (let ((path (current-kill 0)))
    (if (file-exists-p path)
        (progn
          (let ((dir (file-name-directory path)))
            (if dir (ido-set-current-directory dir)))
          (setq ido-exit 'refresh)
          (setq ido-text-init (if (file-directory-p path) nil (file-name-nondirectory path)))
          (setq ido-rotate-temp t)
          (exit-minibuffer))
      (yank))))

(define-key ido-file-dir-completion-map (kbd "C-y") 'ido-yank)

Con este enlace:

  • Si la eliminación actual es una ruta de directorio válida, puede comenzar ido-find-file, presionar C-ypara saltar al directorio eliminado, y luego continuar usando ido para elegir un archivo.

  • Si la eliminación actual es una ruta de archivo válida, puede iniciar ido-find-file, pulsar C-ypara saltar al directorio eliminado y ofrecer el nombre del archivo eliminado como finalización, y pulsar RET para abrir ese archivo.

  • Si la muerte actual es otra cosa, se tira normalmente.

glucas
fuente
¿No sería mejor letvincular las diversas ido-...variables en lugar de setqellas? En este momento, parece que está estableciendo valores de forma permanente en lugar de hacerlo durante la vida útil de la función.
Dan
@ Dan, estoy siguiendo el patrón de los comandos de ido como ido-next-work-directory. Creo que las variables se configuran para que sobrevivan a través de la llamada del minibúfer de salida y la actualización posterior. ¡Pero todavía no entiendo completamente a los idólatras internos!
glucas
Sí, me preguntaba si se actualizarían posteriormente de todos modos. Solo quería poner un aviso.
Dan
4

Tal vez así:

(define-key ido-file-dir-completion-map (kbd "C-y") 'ido-yank)
(defun ido-yank ()
  (interactive)
  (if (file-exists-p (current-kill 0))
      (ido-fallback-command)
    (yank)))

Si el kill actual es un archivo que existe, C-y C-y probablemente debería darte lo que quieres.

abo-abo
fuente