@ -548,129 +548,166 @@ de los archivos. Los buffers <code class="docutils literal notranslate"><span cl
</div>
<p>Antes de pedir confirmación, <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">recover-file</span></code> muestra un listado de directorios que describe el archivo especificado y el archivo de autoguardado, para que pueda comparar sus tamaños y fechas. Si el archivo de autoguardado es más antiguo, <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">recover-file</span></code> no ofrece leerlo.</p>
<p>Si Emacs o el ordenador se bloquean, puede recuperar todos los archivos que estaba editando desde sus archivos de autoguardado con el comando <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">recover-session</span></code>. Esto le muestra primero una lista de sesiones interrumpidas grabadas. Mueva el puntero hasta la que elija y escriba <codeclass="docutils literal notranslate"><spanclass="pre">C-c</span><spanclass="pre">C-c</span></code>.</p>
<p>A continuación, <codeclass="docutils literal notranslate"><spanclass="pre">recover-session</span></code> pregunta por cada uno de los archivos que se estaban editando durante esa sesión, preguntando si desea recuperar ese archivo. Si la respuesta es <codeclass="docutils literal notranslate"><spanclass="pre">y</span></code> (sí), se llama a <codeclass="docutils literal notranslate"><spanclass="pre">recover-file</span></code>, que funciona de forma normal. Muestra las fechas del archivo original y de su archivo de autoguardado, y vuelve a preguntar si se desea recuperar ese archivo.</p>
<p>A continuación, <codeclass="docutils literal notranslate"><spanclass="pre">recover-session</span></code> pregunta por cada uno de los archivos que se estaban editando durante esa sesión, preguntando si desea recuperar ese archivo. Si la respuesta es <codeclass="docutils literal notranslate"><spanclass="pre">y</span></code> (si), se llama a <codeclass="docutils literal notranslate"><spanclass="pre">recover-file</span></code>, que funciona de forma normal. Muestra las fechas del archivo original y de su archivo de autoguardado, y vuelve a preguntar si se desea recuperar ese archivo.</p>
<p>Cuando <codeclass="docutils literal notranslate"><spanclass="pre">recover-session</span></code> termina, los archivos que haya elegido recuperar están presentes en los búferes de Emacs. A continuación, debe guardarlos. Sólo esto -guardarlos- actualiza los propios archivos.</p>
<p>Emacs registra información sobre sesiones interrumpidas en archivos llamados <codeclass="docutils literal notranslate"><spanclass="pre">.saves-pid-hostname~</span></code> en el directorio <codeclass="docutils literal notranslate"><spanclass="pre">~/.emacs.d/auto-save-list/</span></code>. Este directorio está determinado por la variable <codeclass="docutils literal notranslate"><spanclass="pre">auto-save-list-file-prefix</span></code>. Si establece <codeclass="docutils literal notranslate"><spanclass="pre">auto-save-list-file-prefix</span></code> a <codeclass="docutils literal notranslate"><spanclass="pre">nil</span></code>, las sesiones no se registran para su recuperación.</p>
</section>
</section>
<sectionid="alias-de-nombres-de-archivo">
<h2>19.7 Alias de Nombres de Archivo<aclass="headerlink"href="#alias-de-nombres-de-archivo"title="Link to this heading"></a></h2>
<p>Tanto los enlaces simbólicos como los enlaces duros permiten que varios nombres de archivo se refieran al mismo archivo. Los enlaces duros son nombres alternativos que se refieren directamente al archivo; todos los nombres son igualmente válidos, y no hay ninguno de preferencia. Por el contrario, un enlace simbólico es una especie de alias definido: cuando foo es un enlace simbólico a bar, puede utilizar cualquiera de los dos nombres para referirse al archivo, pero bar es el nombre real, mientras que foo es sólo un alias. Los casos más complejos se dan cuando los enlaces simbólicos apuntan a directorios.</p>
<p>Normalmente, si consulta un archivo que Emacs ya está visitando con un nombre diferente, muestra un mensaje en el área de eco y utiliza el búfer existente visitando ese archivo. Esto puede ocurrir en sistemas que soportan enlaces duros o simbólicos, o si usa un nombre de archivo largo en un sistema que trunca nombres de archivo largos, o en un sistema de archivos que no distingue mayúsculas de minúsculas. Puede suprimir el mensaje asignando a la variable find-file-suppress-same-file-warnings un valor distinto de cero. Puede desactivar completamente esta función estableciendo la variable find-file-existing-other-name a nil: entonces, si visita el mismo archivo con dos nombres diferentes, obtendrá un búfer distinto para cada nombre de archivo.</p>
<p>Si la variable find-file-visit-truename es distinta de nil, entonces el nombre de archivo registrado para un búfer es el nombre verdadero del archivo (obtenido reemplazando todos los enlaces simbólicos por sus nombres de destino), en lugar del nombre que especifique. La configuración de find-file-visit-truename también implica el efecto de find-file-existing-other-name.</p>
<p>A veces, se accede normalmente a un directorio a través de un enlace simbólico, y podría querer que Emacs mostrara preferentemente su nombre enlazado. Para ello, personalice directory-abbrev-alist. Cada elemento de esta lista debe tener la forma (de . a), lo que significa sustituir de por a siempre que aparezca de en un nombre de directorio. La cadena from es una expresión regular (véase Sintaxis de Expresiones Regulares). Se compara con nombres de directorio anclados en el primer carácter, y debe empezar por “`” (para soportar nombres de directorio con nuevas líneas incrustadas, lo que anularía “^”). La cadena to debe ser un nombre de directorio absoluto ordinario que apunte al mismo directorio. No use “~” para representar un directorio personal en la cadena to; Emacs realiza estas sustituciones por separado. Aquí hay un ejemplo, de un sistema en el que /home/fsf se accede normalmente a través de un enlace simbólico llamado /fsf:</p>
<blockquote>
<div><p>((»\`/home/fsf» . «/fsf»))</p>
</div></blockquote>
<p>Tanto los enlaces simbólicos como los enlaces duros permiten que varios nombres de archivo se refieran al mismo archivo. Los enlaces duros son nombres alternativos que se refieren directamente al archivo; todos los nombres son igualmente válidos, y no hay ninguno de preferencia. Por el contrario, un enlace simbólico es una especie de alias definido: cuando <codeclass="docutils literal notranslate"><spanclass="pre">foo</span></code> es un enlace simbólico a <codeclass="docutils literal notranslate"><spanclass="pre">bar</span></code>, puede utilizar cualquiera de los dos nombres para referirse al archivo, pero <codeclass="docutils literal notranslate"><spanclass="pre">bar</span></code> es el nombre real, mientras que <codeclass="docutils literal notranslate"><spanclass="pre">foo</span></code> es sólo un alias. Los casos más complejos se dan cuando los enlaces simbólicos apuntan a directorios.</p>
<p>Normalmente, si consulta un archivo que Emacs ya está visitando con un nombre diferente, muestra un mensaje en el área de eco y utiliza el búfer existente visitando ese archivo. Esto puede ocurrir en sistemas que soportan enlaces duros o simbólicos, o si usa un nombre de archivo largo en un sistema que trunca nombres de archivo largos, o en un sistema de archivos que no distingue mayúsculas de minúsculas. Puede suprimir el mensaje asignando a la variable <codeclass="docutils literal notranslate"><spanclass="pre">find-file-suppress-same-file-warnings</span></code> un valor distinto de cero. Puede desactivar completamente esta función estableciendo la variable <codeclass="docutils literal notranslate"><spanclass="pre">find-file-existing-other-name</span></code> a <codeclass="docutils literal notranslate"><spanclass="pre">nil</span></code>: entonces, si visita el mismo archivo con dos nombres diferentes, obtendrá un búfer distinto para cada nombre de archivo.</p>
<p>Si la variable <codeclass="docutils literal notranslate"><spanclass="pre">find-file-visit-truename</span></code> es distinta de <codeclass="docutils literal notranslate"><spanclass="pre">nil</span></code>, entonces el nombre de archivo registrado para un búfer es el nombre verdadero del archivo (obtenido reemplazando todos los enlaces simbólicos por sus nombres de destino), en lugar del nombre que especifique. La configuración de <codeclass="docutils literal notranslate"><spanclass="pre">find-file-visit-truename</span></code> también implica el efecto de <codeclass="docutils literal notranslate"><spanclass="pre">find-file-existing-other-name</span></code>.</p>
<p>A veces, se accede normalmente a un directorio a través de un enlace simbólico, y podría querer que Emacs mostrara preferentemente su nombre enlazado. Para ello, personalice <codeclass="docutils literal notranslate"><spanclass="pre">directory-abbrev-alist</span></code>. Cada elemento de esta lista debe tener la forma (<code class="docutils literal notranslate"><spanclass="pre">de</span><spanclass="pre">.</span><span class="pre">a</span></code>), lo que significa sustituir <em>de</em> por <em>a</em> siempre que aparezca de en un nombre de directorio. La cadena <em>de</em> es una expresión regular (véase <strong>Sintaxis de Expresiones Regulares</strong>). Se compara con nombres de directorio anclados en el primer carácter, y debe empezar por <codeclass="docutils literal notranslate"><spanclass="pre">\`</span></code> (para soportar nombres de directorio con nuevas líneas incrustadas, lo que anularía <codeclass="docutils literal notranslate"><spanclass="pre">^</span></code>). La cadena <em>a</em> debe ser un nombre de directorio absoluto ordinario que apunte al mismo directorio. No use <codeclass="docutils literal notranslate"><spanclass="pre">~</span></code> para representar un directorio personal en la cadena <em>de</em>; Emacs realiza estas sustituciones por separado. Aquí hay un ejemplo, de un sistema en el que <codeclass="docutils literal notranslate"><spanclass="pre">/home/fsf</span></code> se accede normalmente a través de un enlace simbólico llamado <codeclass="docutils literal notranslate"><spanclass="pre">/fsf</span></code>:</p>
<h2>19.8 Directorios de Archivos<aclass="headerlink"href="#directorios-de-archivos"title="Link to this heading"></a></h2>
<p>El sistema de archivos agrupa los archivos en directorios. Un listado de directorios es una lista de todos los archivos de un directorio. Emacs proporciona comandos para crear y borrar directorios, y para hacer listados de directorios en formato breve (sólo nombres de archivos) y en formato detallado (tamaños, fechas y otros atributos incluidos). Emacs también incluye una característica de navegador de directorios llamada Dired, que puede invocar con C-x d; vea Dired, el Editor de Directorios.</p>
<dlclass="simple">
<dt>C-x C-d dir-or-pattern RET</dt><dd><p>Muestra un breve listado de directorios (list-directory).</p>
</dd>
<dt>C-u C-x C-d dir-or-pattern RET</dt><dd><p>Muestra un listado detallado de directorios.</p>
</dd>
<dt>M-x make-directory RET nombredir RET</dt><dd><p>Crea un nuevo directorio llamado nombredir.</p>
</dd>
<dt>M-x delete-directory RET nombredir RET</dt><dd><p>Borra el directorio llamado nombredir. Si no está vacío, se le preguntará si desea eliminarlo de forma recursiva.</p>
</dd>
</dl>
<p>El comando para mostrar un listado de directorios es C-x C-d (list-directory). Lee utilizando el minibuffer un nombre de archivo que puede ser un directorio a listar o un patrón que contenga comodines para los archivos a listar. Por ejemplo,</p>
<p>El sistema de archivos agrupa los archivos en <em>directorios</em>. Un <em>listado de directorios</em> es una lista de todos los archivos de un directorio. Emacs proporciona comandos para crear y borrar directorios, y para hacer listados de directorios en formato breve (sólo nombres de archivos) y en formato detallado (tamaños, fechas y otros atributos incluidos). Emacs también incluye una característica de navegador de directorios llamada Dired, que puede invocar con <kbdclass="kbd docutils literal notranslate">Ctrl</kbd>-<kbdclass="kbd docutils literal notranslate">x</kbd><kbdclass="kbd docutils literal notranslate">d</kbd> (<codeclass="docutils literal notranslate"><spanclass="pre">C-x</span><spanclass="pre">d</span></code>); vea <strong>Dired, el Editor de Directorios</strong>.</p>
<div><p>Muestra un listado detallado de directorios.</p>
</div></blockquote>
<p>Normalmente, C-x C-d muestra un breve listado de directorios que sólo contiene los nombres de los archivos. Un argumento numérico (independientemente del valor) le indica que haga un listado detallado que incluya tamaños, fechas y propietarios (como “ls -l”).</p>
<p>El texto de un listado de directorios se obtiene principalmente ejecutando ls en un proceso inferior. Dos variables de Emacs controlan las opciones pasadas a ls: list-directory-brief-switches es una cadena que da las opciones a usar en listados breves («-CF» por defecto), y list-directory-verbose-switches es una cadena que da las opciones a usar en un listado detallado («-l» por defecto).</p>
<div><p>Borra el directorio llamado <em>nombredir</em>. Si no está vacío, se le preguntará si desea eliminarlo de forma recursiva.</p>
</div></blockquote>
<p>El comando para mostrar un listado de directorios es <codeclass="docutils literal notranslate"><spanclass="pre">C-x</span><spanclass="pre">C-d</span></code> (<codeclass="docutils literal notranslate"><spanclass="pre">list-directory</span></code>). Lee utilizando el minibuffer un nombre de archivo que puede ser un directorio a listar o un patrón que contenga comodines para los archivos a listar. Por ejemplo,</p>
<p>lista todos los archivos del directorio <codeclass="docutils literal notranslate"><spanclass="pre">/u2/emacs/etc</span></code>. He aquí un ejemplo de especificación de un patrón de nombres de archivo:</p>
<p>Normalmente, <codeclass="docutils literal notranslate"><spanclass="pre">C-x</span><spanclass="pre">C-d</span></code> muestra un breve listado de directorios que sólo contiene los nombres de los archivos. Un argumento numérico (independientemente del valor) le indica que haga un listado detallado que incluya tamaños, fechas y propietarios (como <codeclass="docutils literal notranslate"><spanclass="pre">ls</span><spanclass="pre">-l</span></code>).</p>
<p>El texto de un listado de directorios se obtiene principalmente ejecutando <codeclass="docutils literal notranslate"><spanclass="pre">ls</span></code> en un proceso inferior. Dos variables de Emacs controlan las opciones pasadas a <codeclass="docutils literal notranslate"><spanclass="pre">ls</span></code>: <codeclass="docutils literal notranslate"><spanclass="pre">list-directory-brief-switches</span></code> es una cadena que da las opciones a usar en listados breves (<codeclass="docutils literal notranslate"><spanclass="pre">"-CF"</span></code> por defecto), y <codeclass="docutils literal notranslate"><spanclass="pre">list-directory-verbose-switches</span></code> es una cadena que da las opciones a usar en un listado detallado (<codeclass="docutils literal notranslate"><spanclass="pre">"-l"</span></code> por defecto).</p>
<p>En los listados detallados de directorios, Emacs añade información sobre la cantidad de espacio libre en el disco que contiene el directorio.</p>
<p>El comando M-x delete-directory pregunta por el nombre de un directorio usando el minibuffer, y borra el directorio si está vacío. Si el directorio no está vacío, se le preguntará si desea borrarlo recursivamente. En los sistemas que disponen de la función «Papelera» (o «Papelera de reciclaje»), puede hacer que este comando mueva el directorio especificado a la Papelera en lugar de borrarlo directamente, cambiando la variable delete-by-moving-to-trash a t. Consulte Operaciones varias con archivos, para obtener más información sobre el uso de la Papelera.</p>
<p>El comando <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">delete-directory</span></code> pregunta por el nombre de un directorio usando el minibuffer, y borra el directorio si está vacío. Si el directorio no está vacío, se le preguntará si desea borrarlo recursivamente. En los sistemas que disponen de la función «Papelera» (o «Papelera de reciclaje»), puede hacer que este comando mueva el directorio especificado a la Papelera en lugar de borrarlo directamente, cambiando la variable <codeclass="docutils literal notranslate"><spanclass="pre">delete-by-moving-to-trash</span></code> a <codeclass="docutils literal notranslate"><spanclass="pre">t</span></code>. Consulte <strong>Operaciones Varias con Archivos</strong>, para obtener más información sobre el uso de la Papelera.</p>
</section>
<sectionid="comparacion-de-archivos">
<h2>19.9 Comparación de Archivos<aclass="headerlink"href="#comparacion-de-archivos"title="Link to this heading"></a></h2>
<p>El comando M-x diff pregunta por dos nombres de archivo, usando el minibúfer, y muestra las diferencias entre los dos archivos en un búfer llamado <em>diff</em>. Esto funciona ejecutando el programa diff, usando opciones tomadas de la variable diff-switches. El valor de diff-switches debe ser una cadena; el valor por defecto es «-u» para especificar un diff de contexto unificado. Vea Diff en Comparar y Fusionar Archivos, para más información sobre el programa diff.</p>
<p>La salida del comando diff se muestra usando un modo principal llamado modo Diff. Vea Modo Diff.</p>
<p>Una alternativa (mucho más sofisticada) es M-x ediff (ver Ediff en El Manual de Ediff).</p>
<p>El comando M-x diff-backup compara un archivo especificado con su copia de seguridad más reciente. Si especifica el nombre de un archivo de copia de seguridad, diff-backup lo compara con el archivo fuente del que es una copia de seguridad. En todos los demás aspectos, se comporta como M-x diff.</p>
<p>El comando M-x diff-buffer-with-file compara un búfer especificado con su archivo correspondiente. Esto muestra los cambios que se harían en el archivo si se guarda el búfer.</p>
<p>El comando M-x diff-buffers compara el contenido de dos búferes especificados.</p>
<p>El comando M-x compare-windows compara el texto en la ventana actual con el de la ventana que era la ventana seleccionada antes de que Usted seleccionara la actual. (Para más información sobre ventanas en Emacs, vea Ventanas Múltiples.) La comparación comienza en el punto en cada ventana, después de empujar cada valor inicial del punto en el anillo de marcas (vea El Anillo de Marcas) en su respectivo búfer. Luego se mueve el punto hacia adelante en cada ventana, un carácter a la vez, hasta que llega a los caracteres que no coinciden. A continuación, el comando finaliza.</p>
<p>Si el punto en las dos ventanas está seguido por texto no coincidente cuando se inicia el comando, M-x comparar-ventanas intenta heurísticamente avanzar hasta el texto coincidente en las dos ventanas, y luego sale. Por lo tanto, si utiliza M-x comparar-ventanas repetidamente (véase Repetición de un Comando), cada vez se salta un rango coincidente o encuentra el inicio de otro.</p>
<p>Con un argumento numérico, compare-windows ignora los cambios en los espacios en blanco. Si la variable compare-ignore-case es distinta de nil, la comparación también ignora las diferencias entre mayúsculas y minúsculas. Si la variable compare-ignore-whitespace no es nula, compare-windows ignora por defecto los cambios en los espacios en blanco, pero un argumento prefijo lo desactiva para esa única invocación del comando.</p>
<p>Puede usar M-x smerge-mode para activar el modo Smerge, un modo menor para editar la salida del programa diff3. Esto es típicamente el resultado de una fusión fallida de una actualización del sistema de control de versiones fuera de VC, debido a cambios conflictivos en un archivo. El modo Smerge proporciona comandos para resolver conflictos seleccionando cambios específicos.</p>
<p>Vea Fusionar archivos con Emerge, para la herramienta Emerge, que proporciona una potente interfaz para fusionar archivos.</p>
<p>El comando <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">diff</span></code> pregunta por dos nombres de archivo, usando el minibúfer, y muestra las diferencias entre los dos archivos en un búfer llamado <code class="docutils literal notranslate"><spanclass="pre">*diff*</span></code>. Esto funciona ejecutando el programa <codeclass="docutils literal notranslate"><spanclass="pre">diff</span></code>, usando opciones tomadas de la variable <codeclass="docutils literal notranslate"><spanclass="pre">diff-switches</span></code>. El valor de <codeclass="docutils literal notranslate"><spanclass="pre">diff-switches</span></code> debe ser una cadena; el valor por defecto es <codeclass="docutils literal notranslate"><spanclass="pre">"-u"</span></code> para especificar un <codeclass="docutils literal notranslate"><spanclass="pre">diff</span></code> de contexto unificado. Vea <strong>Diff</strong> en Comparar y Fusionar Archivos, para más información sobre el programa <codeclass="docutils literal notranslate"><spanclass="pre">diff</span></code>.</p>
<p>La salida del comando <codeclass="docutils literal notranslate"><spanclass="pre">diff</span></code> se muestra usando un modo principal llamado modo Diff. Vea <strong>Modo Diff</strong>.</p>
<p>Una alternativa (mucho más sofisticada) es <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">ediff</span></code> (ver <strong>Ediff</strong> en El Manual de Ediff).</p>
<p>El comando <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">diff-backup</span></code> compara un archivo especificado con su copia de seguridad más reciente. Si especifica el nombre de un archivo de copia de seguridad, <codeclass="docutils literal notranslate"><spanclass="pre">diff-backup</span></code> lo compara con el archivo fuente del que es una copia de seguridad. En todos los demás aspectos, se comporta como <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">diff</span></code>.</p>
<p>El comando <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">diff-buffer-with-file</span></code> compara un búfer especificado con su archivo correspondiente. Esto muestra los cambios que se harían en el archivo si se guarda el búfer.</p>
<p>El comando <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">diff-buffers</span></code> compara el contenido de dos búferes especificados.</p>
<p>El comando <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">compare-windows</span></code> compara el texto en la ventana actual con el de la ventana que era la ventana seleccionada antes de que Usted seleccionara la actual. (Para más información sobre ventanas en Emacs, vea <strong>Ventanas Múltiples</strong>.) La comparación comienza en el punto en cada ventana, después de empujar cada valor inicial del punto en el anillo de marcas (vea <strong>El Anillo de Marcas</strong>) en su respectivo búfer. Luego se mueve el punto hacia adelante en cada ventana, un carácter a la vez, hasta que llega a los caracteres que no coinciden. A continuación, el comando finaliza.</p>
<p>Si el punto en las dos ventanas está seguido por texto no coincidente cuando se inicia el comando, <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">compare-windows</span></code> intenta heurísticamente avanzar hasta el texto coincidente en las dos ventanas, y luego sale. Por lo tanto, si utiliza <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">compar-windows</span></code> repetidamente (véase <strong>Repetición de un Comando</strong>), cada vez se salta un rango coincidente o encuentra el inicio de otro.</p>
<p>Con un argumento numérico, <codeclass="docutils literal notranslate"><spanclass="pre">compare-windows</span></code> ignora los cambios en los espacios en blanco. Si la variable <codeclass="docutils literal notranslate"><spanclass="pre">compare-ignore-case</span></code> es distinta de <codeclass="docutils literal notranslate"><spanclass="pre">nil</span></code>, la comparación también ignora las diferencias entre mayúsculas y minúsculas. Si la variable <codeclass="docutils literal notranslate"><spanclass="pre">compare-ignore-whitespace</span></code> no es nula, <codeclass="docutils literal notranslate"><spanclass="pre">compare-windows</span></code> ignora por defecto los cambios en los espacios en blanco, pero un argumento prefijo lo desactiva para esa única invocación del comando.</p>
<p>Puede usar <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">smerge-mode</span></code> para activar el modo Smerge, un modo menor para editar la salida del programa <codeclass="docutils literal notranslate"><spanclass="pre">diff3</span></code>. Esto es típicamente el resultado de una fusión fallida de una actualización del sistema de control de versiones fuera de VC, debido a cambios conflictivos en un archivo. El modo Smerge proporciona comandos para resolver conflictos seleccionando cambios específicos.</p>
<p>Vea <strong>Fusionar Archivos con Emerge</strong>, para la herramienta Emerge, que proporciona una potente interfaz para fusionar archivos.</p>
</section>
<sectionid="modo-diff">
<h2>19.10 Modo Diff<aclass="headerlink"href="#modo-diff"title="Link to this heading"></a></h2>
<p>El modo diff es un modo principal utilizado para la salida de M-x diff y otros comandos similares. Este tipo de salida se llama parche, porque puede pasarse al comando patch para aplicar automáticamente los cambios especificados. Para seleccionar el modo diff manualmente, escriba M-x diff-mode.</p>
<p>Los cambios especificados en un parche se agrupan en «hunks», que son trozos, bloques, segmentos o elementos contiguos de texto que contienen una o más líneas modificadas. Los trozos también suelen incluir líneas sin cambios para proporcionar contexto a los cambios. Cada trozo va precedido de una cabecera de trozo, que especifica los números de línea antiguos y nuevos en los que se producen los cambios del trozo. El modo Diff resalta cada cabecera de trozo, para distinguirla del contenido real del trozo.</p>
<p>El primer trozo de un parche va precedido de una cabecera de archivo, que muestra los nombres de las versiones nueva y antigua del archivo, y sus marcas de tiempo. Si un parche muestra cambios para más de un archivo, cada archivo tiene una cabecera de este tipo antes del primer trozo de los cambios de ese archivo.</p>
<p>Puede editar un búfer en modo Diff como cualquier otro búfer. (Si es de sólo lectura, necesita hacerlo escribible primero; vea Operaciones Varias con Búferes). Siempre que edite un trozo, el modo Diff intenta corregir automáticamente los números de línea en las cabeceras del trozo, para asegurarse de que el parche sigue siendo correcto, y aún podría ser aplicado por parche. Para desactivar la corrección automática del número de línea, cambie la variable diff-update-on-the-fly a nil.</p>
<p>El modo diff hace que los hunks sean tratados como mensajes de error del compilador por M-g M-n y otros comandos que manejan mensajes de error (vea Modo de Compilación). Así, puede usar los comandos del modo de compilación para visitar las ubicaciones de código fuente correspondientes.</p>
<p>El modo diff es un modo principal utilizado para la salida de <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">diff</span></code> y otros comandos similares. Este tipo de salida se llama <em>parche</em>, porque puede pasarse al comando <codeclass="docutils literal notranslate"><spanclass="pre">patch</span></code> para aplicar automáticamente los cambios especificados. Para seleccionar el modo diff manualmente, escriba <kbdclass="kbd docutils literal notranslate">Alt</kbd>-<kbdclass="kbd docutils literal notranslate">x</kbd><codeclass="docutils literal notranslate"><spanclass="pre">diff-mode</span></code> (<codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">diff-mode</span></code>).</p>
<p>Los cambios especificados en un parche se agrupan en <em>hunks</em>, que son trozos, bloques, segmentos o elementos contiguos de texto que contienen una o más líneas modificadas. Los trozos también suelen incluir líneas sin cambios para proporcionar contexto a los cambios. Cada trozo va precedido de una <em>cabecera de bloque</em>, que especifica los números de línea antiguos y nuevos en los que se producen los cambios del mismo. El modo Diff resalta cada cabecera de trozo, para distinguirla del contenido real de este.</p>
<p>El primer bloque de un parche va precedido de una cabecera de archivo, que muestra los nombres de las versiones nueva y antigua del archivo, y sus marcas de tiempo. Si un parche muestra cambios para más de un archivo, cada archivo tiene una cabecera de este tipo antes del primer trozo de los cambios de ese archivo.</p>
<p>Puede editar un búfer en modo Diff como cualquier otro búfer. (Si es de sólo lectura, necesita hacerlo escribible primero; vea <strong>Operaciones Varias con Búferes</strong>). Siempre que edite un trozo, el modo Diff intenta corregir automáticamente los números de línea en las cabeceras del trozo, para asegurarse de que el parche sigue siendo correcto, y aún podría ser aplicado por parche. Para desactivar la corrección automática del número de línea, cambie la variable <codeclass="docutils literal notranslate"><spanclass="pre">diff-update-on-the-fly</span></code> a <codeclass="docutils literal notranslate"><spanclass="pre">nil</span></code>.</p>
<p>El modo diff hace que los hunks sean tratados como mensajes de error del compilador por <codeclass="docutils literal notranslate"><spanclass="pre">M-g</span><spanclass="pre">M-n</span></code> y otros comandos que manejan mensajes de error (vea <strong>Modo de Compilación</strong>). Así, puede usar los comandos del modo de compilación para visitar las ubicaciones de código fuente correspondientes.</p>
<p>Además, el modo Diff proporciona los siguientes comandos para navegar, manipular y aplicar partes de parches:</p>
<p>Avanza al siguiente hunk-start (segmento-inicio) (diff-hunk-next). Con el argumento prefijo n, avanza al enésimo bloque (hunk) siguiente.</p>
<p>Por defecto, el modo Diff refina los elementos (hunks) intermedios a medida que Emacs los muestra, resaltando sus cambios con mejor granularidad. Alternativamente, si establece diff-refine a la navegación por símbolos, el modo Diff sólo refina el bloque (hunk) al que se mueve con este comando o con diff-hunk-prev.</p>
<dl>
<dt>M-n</dt><dd><p>Avanza al siguiente hunk-start (segmento-inicio) (diff-hunk-next). Con el argumento prefijo n, avanza al enésimo bloque (hunk) siguiente.</p>
<div><p>Avanza al siguiente <codeclass="docutils literal notranslate"><spanclass="pre">hunk-start</span></code> (segmento-de-inicio) (<codeclass="docutils literal notranslate"><spanclass="pre">diff-hunk-next</span></code>). Con el argumento prefijo <em>n</em>, avanza al <em>n</em>èsimo bloque (hunk) siguiente.</p>
<p>Por defecto, el modo Diff refina los elementos (hunks) intermedios a medida que Emacs los muestra, resaltando sus cambios con mejor granularidad. Alternativamente, si establece
diff-refine a la navegación por símbolos, el modo Diff sólo refina el bloque (hunk) al que se mueve con este comando o con diff-hunk-prev.</p>
</dd>
<dt>M-p</dt><dd><p>Se mueve al inicio de bloque anterior (diff-hunk-prev). Con el argumento de prefijo n, retrocede al n-ésimo trozo anterior. Al igual que M-n, este comando refina el segmento (hunk) al
que se desplaza si establece diff-refine en el símbolo de navegación.</p>
</dd>
<dt>M-}</dt><dd><p>Avanza al inicio del siguiente archivo, en un parche de varios archivos (diff-file-next). Con el argumento prefijo n, avanza hasta el inicio del enésimo archivo siguiente.</p>
</dd>
<dt>M-{</dt><dd><p>Se desplaza al inicio del archivo anterior, en un parche de varios archivos (diff-file-prev). Con el argumento prefijo n, retrocede al inicio del enésimo archivo anterior.</p>
</dd>
<dt>M-k</dt><dd><p>Mata al trozo (hunk) en el punto (diff-hunk-kill).</p>
</dd>
<dt>M-K</dt><dd><p>En un parche de varios archivos, mata la parte del archivo actual. (diff-file-kill).</p>
</dd>
<dt>C-c C-a</dt><dd><p>Aplica este fragmento (hunk) a su archivo de destino (diff-apply-hunk). Con un argumento prefijo C-u, revierte este trozo, es decir, aplica la inversa del trozo, que cambia la versión
«nueva» por la versión «antigua». Si diff-jump-to-old-file no es nulo, aplica el fragmento a la versión «antigua» del archivo.</p>
</dd>
<dt>C-c C-b</dt><dd><p>Resalta los cambios del trozo (hunk) en el punto con una granularidad más fina (diff-refine-hunk). Esto le permite ver exactamente qué partes de cada línea cambiada fueron realmente
cambiadas.</p>
<p>Por defecto, el modo Diff refina los «hunks» tal y como Emacs los muestra, así que puede que encuentre útil este comando si personaliza diff-refine a un valor no predeterminado.</p>
</dd>
<dt>C-c C-c</dt><dd><p>Va al archivo fuente y a la línea correspondiente a este bloque (hunk) (diff-goto-source). Por defecto, salta a la versión «nueva» del archivo, la que aparece primero en la cabecera
del archivo. Con un argumento prefijo, salta a la versión «antigua» en su lugar. Si diff-jump-to-old-file no es nulo, este comando salta por defecto al archivo «antiguo», y el
significado del argumento prefijo se invierte. Si el argumento prefijo es un número mayor que 8 (por ejemplo, si escribe C-u C-u C-c C-c), este comando también establece
diff-jump-to-old-file para la siguiente invocación. Si el archivo fuente está bajo control de versiones (véase Control de Versiones), esto salta al archivo de trabajo por defecto. Con
un argumento prefijo, salta a la revisión «antigua» del archivo (vea Examinar y Comparar Revisiones Antiguas), cuando el punto está en la línea antigua, o de otro modo salta a la
revisión «nueva».</p>
</dd>
<dt>C-c C-e</dt><dd><p>Inicia una sesión Ediff con el parche (diff-ediff-patch). Consulte Ediff en El manual de Ediff.</p>
</dd>
<dt>C-c C-n</dt><dd><p>Restringe la vista al bloque actual (diff-restrict-view). Véase Limitación. Con un argumento de prefijo, restringe la vista al archivo actual de un parche de varios archivos. Para
volver a ampliar, usar C-x n w ( widen, ampliar).</p>
</dd>
<dt>C-c C-r</dt><dd><p>Invierte la dirección de comparación para todo el búfer (diff-reverse-direction). Con un argumento prefijo, invierte la dirección sólo dentro de la región actual (véase La Marca y la
Región). Invertir la dirección significa cambiar los bloques (hunks) y las cabeceras de inicio de archivo para producir un parche que cambiaría la versión «nueva» por la «antigua».</p>
</dd>
<dt>C-c C-s</dt><dd><p>Divide el bloque (hunk) en el punto (diff-split-hunk) en dos bloques separados. Esto inserta una cabecera de bloque y modifica la cabecera del bloque actual. Este comando es útil para
editar parches manualmente, y sólo funciona con el formato diff unificado producido por las opciones -u o –unified del programa diff. Si necesita dividir un bloque en el formato
context diff producido por las opciones -c o –context de diff, primero convierta el búfer al formato diff unificado con C-c C-u.</p>
</dd>
<dt>C-c C-d</dt><dd><p>Convierte todo el búfer al formato diff de contexto (diff-unified->context). Con un argumento prefijo, convierte sólo los trozos (hunks) dentro de la región.</p>
</dd>
<dt>C-c C-u</dt><dd><p>Convierte todo el búfer a formato diff unificado (diff-context->unified). Con un argumento de prefijo, convierte el formato unificado al formato de contexto. Cuando la marca está
activa, solo convierte los fragmentos dentro de la región.</p>
</dd>
<dt>C-c C-l</dt><dd><p>Vuelve a generar el segmento (hunk) actual (diff-refresh-hunk).</p>
</dd>
<dt>C-c C-w</dt><dd><p>Vuelve a generar el bloque (hunk) actual, sin tener en cuenta los cambios en los espacios en blanco (diff-ignore-whitespace-hunk).</p>
</dd>
<dt>C-x 4 A</dt><dd><p>Genera una entrada ChangeLog, como hace C-x 4 a (ver Registros de Cambios), para cada uno de los bloques (diff-add-change-log-entries-other-window). Esto crea un esqueleto del
registro de cambios que puede rellenar más tarde con las descripciones reales de los cambios. El propio C-x 4 a en modo Diff opera en nombre del archivo del bloque actual, pero
obtiene el nombre de la función del propio parche. Esto es útil para hacer entradas de registro para las funciones que son eliminadas por el parche.</p>
</dd>
</dl>
<p>Los parches a veces incluyen espacios en blanco al final de las líneas modificadas, como un cambio involuntario y no deseado. Hay dos formas de solucionar este problema. En primer lugar, si activa el modo de espacios en blanco en un búfer de Diff (vea Espacios en Blanco Inútiles), automáticamente resaltará los espacios en blanco al final de las líneas modificadas. En segundo lugar, puede usar el comando M-x diff-delete-trailing-whitespace, que busca los espacios en blanco en las líneas modificadas por el parche, y los elimina tanto en el parche como en los archivos fuente parcheados. Este comando no guarda las modificaciones que realiza, por lo que puede decidir si desea guardar los cambios (la lista de archivos modificados se muestra en el área de eco). Con un argumento prefijo, intenta modificar los archivos fuente originales («antiguos») en lugar de los archivos fuente parcheados («nuevos»).</p>
<p>Si diff-font-lock-syntax es distinto de nil, los fragmentos del código fuente en los «hunks» se resaltan según el modo principal apropiado.</p>
<codeclass="docutils literal notranslate"><spanclass="pre">diff-refine</span></code> a la navegación por símbolos, el modo Diff sólo refina el bloque (hunk) al que se mueve con este comando o con <codeclass="docutils literal notranslate"><spanclass="pre">diff-hunk-prev</span></code>.</p>
<div><p>Se mueve al inicio de bloque anterior (<codeclass="docutils literal notranslate"><spanclass="pre">diff-hunk-prev</span></code>). Con el argumento de prefijo <em>n</em>, retrocede al <em>n</em>ésimo trozo anterior. Al igual que <codeclass="docutils literal notranslate"><spanclass="pre">M-n</span></code>, este comando refina el
segmento (hunk) al que se desplaza si establece <codeclass="docutils literal notranslate"><spanclass="pre">diff-refine</span></code> en el símbolo de navegación.</p>
<div><p>Avanza al inicio del siguiente archivo, en un parche de varios archivos (<codeclass="docutils literal notranslate"><spanclass="pre">diff-file-next</span></code>). Con el argumento prefijo <em>n</em>, avanza hasta el inicio del <em>n</em>ésimo archivo siguiente.</p>
<div><p>Se desplaza al inicio del archivo anterior, en un parche de varios archivos (<codeclass="docutils literal notranslate"><spanclass="pre">diff-file-prev</span></code>). Con el argumento prefijo <em>n</em>, retrocede al inicio del <em>n</em>ésimo archivo anterior.</p>
<div><p>En un parche de varios archivos, mata la parte del archivo actual. (<codeclass="docutils literal notranslate"><spanclass="pre">diff-file-kill</span></code>).</p>
<div><p>Aplica este fragmento (hunk) a su archivo de destino (<codeclass="docutils literal notranslate"><spanclass="pre">diff-apply-hunk</span></code>). Con un argumento prefijo <codeclass="docutils literal notranslate"><spanclass="pre">C-u</span></code>, revierte este trozo, es decir, aplica la inversa del trozo, que cambia
la versión «nueva» por la versión «antigua». Si <codeclass="docutils literal notranslate"><spanclass="pre">diff-jump-to-old-file</span></code> no es nulo, aplica el fragmento a la versión «antigua» del archivo.</p>
<div><p>Resalta los cambios del trozo (hunk) en el punto con una granularidad más fina (<codeclass="docutils literal notranslate"><spanclass="pre">diff-refine-hunk</span></code>). Esto le permite ver exactamente qué partes de cada línea cambiada fueron
realmente cambiadas.</p>
<p>Por defecto, el modo Diff refina los «hunks» tal y como Emacs los muestra, así que puede que encuentre útil este comando si personaliza <codeclass="docutils literal notranslate"><spanclass="pre">diff-refine</span></code> a un valor no predeterminado.</p>
<div><p>Va al archivo fuente y a la línea correspondiente a este bloque (hunk) (<codeclass="docutils literal notranslate"><spanclass="pre">diff-goto-source</span></code>). Por defecto, salta a la versión «nueva» del archivo, la que aparece primero en la
cabecera del archivo. Con un argumento prefijo, salta a la versión «antigua» en su lugar. Si <codeclass="docutils literal notranslate"><spanclass="pre">diff-jump-to-old-file</span></code> no es nulo, este comando salta por defecto al archivo
«antiguo», y el significado del argumento prefijo se invierte. Si el argumento prefijo es un número mayor que 8 (por ejemplo, si escribe <kbdclass="kbd docutils literal notranslate">Ctrl</kbd>-<kbdclass="kbd docutils literal notranslate">u</kbd><kbdclass="kbd docutils literal notranslate">Ctrl</kbd>-<kbdclass="kbd docutils literal notranslate">u</kbd>
<kbdclass="kbd docutils literal notranslate">Ctrl</kbd>-<kbdclass="kbd docutils literal notranslate">c</kbd><kbdclass="kbd docutils literal notranslate">Ctrl</kbd>-<kbdclass="kbd docutils literal notranslate">c</kbd> (<codeclass="docutils literal notranslate"><spanclass="pre">C-u</span><spanclass="pre">C-u</span><spanclass="pre">C-c</span><spanclass="pre">C-c</span></code>)), este comando también establece <codeclass="docutils literal notranslate"><spanclass="pre">diff-jump-to-old-file</span></code> para la siguiente invocación. Si el archivo fuente está bajo control de versiones (véase <strong>Control de Versiones</strong>), esto salta al archivo de trabajo por defecto. Con un argumento prefijo, salta a la revisión «antigua» del archivo (vea <strong>Examinar y Comparar Revisiones Antiguas</strong>), cuando el punto está en la línea antigua, o de otro modo salta a la revisión «nueva».</p>
<div><p>Inicia una sesión Ediff con el parche (<codeclass="docutils literal notranslate"><spanclass="pre">diff-ediff-patch</span></code>). Consulte <strong>Ediff</strong> en El manual de Ediff.</p>
<div><p>Restringe la vista al bloque actual (<codeclass="docutils literal notranslate"><spanclass="pre">diff-restrict-view</span></code>). Véase <strong>Estrechamiento</strong>. Con un argumento de prefijo, restringe la vista al archivo actual de un parche de varios
archivos. Para volver a ampliar, usar <codeclass="docutils literal notranslate"><spanclass="pre">C-x</span><spanclass="pre">n</span><spanclass="pre">w</span></code> ( widen, ampliar).</p>
<div><p>Invierte la dirección de comparación para todo el búfer (<codeclass="docutils literal notranslate"><spanclass="pre">diff-reverse-direction</span></code>). Con un argumento prefijo, invierte la dirección sólo dentro de la región actual (véase <strong>La
Marca y la Región</strong>). Invertir la dirección significa cambiar los bloques (hunks) y las cabeceras de inicio de archivo para producir un parche que cambiaría la versión «nueva» por la
<div><p>Divide el bloque (hunk) en el punto (<codeclass="docutils literal notranslate"><spanclass="pre">diff-split-hunk</span></code>) en dos bloques separados. Esto inserta una cabecera de bloque y modifica la cabecera del bloque actual. Este comando es útil
para editar parches manualmente, y sólo funciona con el <em>formato diff unificado</em> producido por las opciones <codeclass="docutils literal notranslate"><spanclass="pre">-u</span></code> o <codeclass="docutils literal notranslate"><spanclass="pre">--unified</span></code> del programa diff. Si necesita dividir un bloque en
el <em>formato de contexto diff</em> producido por las opciones <codeclass="docutils literal notranslate"><spanclass="pre">-c</span></code> o <codeclass="docutils literal notranslate"><spanclass="pre">--context</span></code> de diff, primero convierta el búfer al formato diff unificado con <codeclass="docutils literal notranslate"><spanclass="pre">C-c</span><spanclass="pre">C-u</span></code>.</p>
<div><p>Convierte todo el búfer al <em>formato diff</em> de contexto (<codeclass="docutils literal notranslate"><spanclass="pre">diff-unified->context</span></code>). Con un argumento prefijo, convierte sólo los trozos (hunks) dentro de la región.</p>
<div><p>Convierte todo el búfer a <em>formato diff unificado</em> (<codeclass="docutils literal notranslate"><spanclass="pre">diff-context->unified</span></code>). Con un argumento de prefijo, convierte el formato unificado al formato de contexto. Cuando la marca
está activa, solo convierte los fragmentos dentro de la región.</p>
<div><p>Vuelve a generar el bloque (hunk) actual, sin tener en cuenta los cambios en los espacios en blanco (<codeclass="docutils literal notranslate"><spanclass="pre">diff-ignore-whitespace-hunk</span></code>).</p>
<div><p>Genera una entrada ChangeLog, como hace <codeclass="docutils literal notranslate"><spanclass="pre">C-x</span><spanclass="pre">4</span><spanclass="pre">a</span></code> (ver <strong>Registros de Cambios</strong>), para cada uno de los bloques (<codeclass="docutils literal notranslate"><spanclass="pre">diff-add-change-log-entries-other-window</span></code>). Esto crea un
esqueleto del registro de cambios que puede rellenar más tarde con las descripciones reales de los cambios. El propio <codeclass="docutils literal notranslate"><spanclass="pre">C-x</span><spanclass="pre">4</span><spanclass="pre">a</span></code> en modo Diff opera en nombre del archivo del bloque
actual, pero obtiene el nombre de la función del propio parche. Esto es útil para hacer entradas de registro para las funciones que son eliminadas por el parche.</p>
</div></blockquote>
<p>Los parches a veces incluyen espacios en blanco al final de las líneas modificadas, como un cambio involuntario y no deseado. Hay dos formas de solucionar este problema. En primer lugar, si activa el modo de espacios en blanco en un búfer de Diff (vea <strong>Espacios en Blanco Inútiles</strong>), automáticamente resaltará los espacios en blanco al final de las líneas modificadas. En segundo lugar, puede usar el comando <codeclass="docutils literal notranslate"><spanclass="pre">M-x</span><spanclass="pre">diff-delete-trailing-whitespace</span></code>, que busca los espacios en blanco en las líneas modificadas por el parche, y los elimina tanto en el parche como en los archivos fuente parcheados. Este comando no guarda las modificaciones que realiza, por lo que puede decidir si desea guardar los cambios (la lista de archivos modificados se muestra en el área de eco). Con un argumento prefijo, intenta modificar los archivos fuente originales («antiguos») en lugar de los archivos fuente parcheados («nuevos»).</p>
<p>Si <codeclass="docutils literal notranslate"><spanclass="pre">diff-font-lock-syntax</span></code> es distinto de <codeclass="docutils literal notranslate"><spanclass="pre">nil</span></code>, los fragmentos del código fuente en los «hunks» se resaltan según el modo principal apropiado.</p>
</section>
<sectionid="copiar-nombrar-y-renombrar-archivos">
<h2>19.11 Copiar, Nombrar y Renombrar Archivos<aclass="headerlink"href="#copiar-nombrar-y-renombrar-archivos"title="Link to this heading"></a></h2>