<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Ian Cowley - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Ian Cowley - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 24 May 2026 19:37:25 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/ian-cowley/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Explicación de genéricos en Go con ejemplos de código ]]>
                </title>
                <description>
                    <![CDATA[ Se propuso incluir genéricos en el lenguaje de programación Go hace unos años, y finalmente se aceptó la propuesta formal en el 2021. La versión de G0 1.18 en marzo de 2022 fue el que incluyó, por primera vez, soporte para genéricos [https://go.dev/blog/intro-generics]. Pero, ¿cómo se verá afectado Go por ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/explicacion-de-genericos-en-go-con-ejemplos-de-codigo/</link>
                <guid isPermaLink="false">6331a6ab36d7bd096041b691</guid>
                
                    <category>
                        <![CDATA[ go ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ian Cowley ]]>
                </dc:creator>
                <pubDate>Wed, 30 Nov 2022 16:45:30 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/09/6048ce09a7946308b7685b45.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/generics-in-golang/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Generics in Go Explained with Code Examples</a>
      </p><p>Se propuso incluir genéricos en el lenguaje de programación Go hace unos años, y finalmente se aceptó la propuesta formal en el 2021. La versión de G0 1.18 en marzo de 2022 fue el que incluyó, por primera vez, <a href="https://go.dev/blog/intro-generics">soporte para genéricos</a>.</p><p>Pero, ¿cómo se verá afectado Go por los genéricos? ¿Cambiará nuestra manera de escribir el código?</p><p>Para poder responder a estas preguntas, tenemos que analizar detalladamente cómo funciona la programación genérica. Afortunadamente, el equipo de Go nos ha proporcionado un <a href="https://go2goplay.golang.org/">compilador de web</a> donde podemos experimentar con genéricos.</p><h2 id="pero-qu-es-lo-que-realmente-cambia-con-la-introducci-n-de-gen-ricos-en-go"><strong>Pero, ¿qué es lo que realmente cambia con la introducción de genéricos en Go?</strong></h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/04/image-316.png" class="kg-image" alt="image-316" width="600" height="400" loading="lazy"><figcaption>Photo by <a href="https://unsplash.com/@anniespratt?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Annie Spratt</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Unsplash</a></figcaption></figure><p>Los genéricos permiten que nuestras funciones o estructuras de datos acepten varios tipos, que se definen en su forma genérica.</p><p>Para entender bien lo que significa esta frase, veamos un caso muy simple:</p><p>Imaginemos que tienes que hacer una función que tome un fragmento y la imprima. Así, podrías escribir este tipo de función:</p><pre><code class="language-go">func Print(s []string) {
	for _, v := range s {
		fmt.Print(v)
	}
}</code></pre><p>Sencillo, ¿verdad? Y, ¿qué pasaría si quisiéramos que ese fragmento sea un entero? Para esto, tendrías que crear un nuevo método: </p><pre><code>func Print(s []int) {
	for _, v := range s {
		fmt.Print(v)
	}
}</code></pre><p>Estas soluciones podrían parecer redundantes, ya que solo estamos cambiando el parámetro. Sin embargo, así es como lo solucionamos ahora mismo en Go sin tener que recurrir a convertirlo en alguna interfaz.</p><p>Ahora con los genéricos, nos permitirán declarar nuestras funciones de esta manera:</p><pre><code>func Print[T any](s []T) {
	for _, v := range s {
		fmt.Print(v)
	}
}</code></pre><p>En la función de arriba, estamos declarando dos cosas:</p><ol><li>Por un lado, tenemos <code>T</code>, que es el tipo de la palabra clave <code>any</code> (esta palabra clave se define específicamente como parte de un genérico, lo que indica cualquier tipo)</li><li>Y nuestro parámetro, donde tenemos la variable <code>s</code> cuyo tipo es una fragmento de <code>T</code>.</li></ol><p>Ahora podremos hacer una llamada a nuestro método de esta manera:</p><pre><code class="language-go">func main() {
	Print([]string{"Hello, ", "playground\n"})
	Print([]int{1,2,3})
}
</code></pre><p>Un método para cualquier tipo de variable: genial, ¿verdad?</p><p>Esta es solo una de las implementaciones muy básicas que hay para genéricos. Aun así, ya tiene buena pinta.</p><p>Exploremos un poco más y veamos hasta dónde nos pueden llevar los genéricos.</p><h2 id="limitaciones-de-los-gen-ricos"><strong>Limitaciones de los genéricos</strong></h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/04/image-317.png" class="kg-image" alt="image-317" width="600" height="400" loading="lazy"><figcaption>Photo by <a href="https://unsplash.com/@nickeedoo?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Nick Tiemeyer</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Unsplash</a></figcaption></figure><p>Hemos visto lo que se puede hacer con los genéricos. Nos permiten especificar una función que puede aceptar cualquier tipo de parámetro.</p><p>Pero el ejemplo de antes era muy simple. Existen limitaciones al uso de los genéricos. Imprimir, por ejemplo, es bastante sencillo, ya que Go puede imprimir cualquier tipo de variable que se le agregue.</p><p>¿Pero qué pasa si queremos hacer algo más complejo? Vamos a imaginar que hemos definido nuestros propios métodos para una estructura y queremos hacer una llamada:</p><pre><code class="language-go">package main

import (
	"fmt"
)

type worker string

func (w worker) Work(){
	fmt.Printf("%s is working\n", w)
}


func DoWork[T any](things []T) {
    for _, v := range things {
        v.Work()
    }
}

func main() {
	var a,b,c worker
	a = "A"
	b = "B"
	c = "C"
	DoWork([]worker{a,b,c})	
}
</code></pre><p>Y esto devolvería lo siguiente:</p><pre><code>type checking failed for main
prog.go2:25:11: v.Work undefined (type bound for T has no method Work)</code></pre><p>No se ejecuta porque la fragmento procesada dentro de la función es de tipo <code>any</code> y no implementa el método <code>Work</code>, lo que hace que no se ejecute.</p><p>Podríamos hacer que funcionara usando una interfaz:</p><pre><code class="language-go">package main

import (
	"fmt"
)

type Person interface {
    Work()
}

type worker string

func (w worker) Work(){
	fmt.Printf("%s is working\n", w)
}

func DoWork[T Person](things []T) {
    for _, v := range things {
        v.Work()
    }
}

func main() {
	var a,b,c worker
	a = "A"
	b = "B"
	c = "C"
	DoWork([]worker{a,b,c})
}
</code></pre><p>Imprimiría lo siguiente:</p><pre><code>A is working
B is working
C is working</code></pre><p>Funcionaría bien con la interfaz, pero también lo haría con una interfaz sin el genérico:</p><pre><code class="language-go">package main

import (
	"fmt"
)

type Person interface {
    Work()
}

type worker string

func (w worker) Work(){
	fmt.Printf("%s is working\n", w)
}

func DoWorkInterface(things []Person) {
    for _, v := range things {
        v.Work()
    }
}

func main() {
	var d,e,f worker
	d = "D"
	e = "E"
	f = "F"
	DoWorkInterface([]Person{d,e,f})
}
</code></pre><p>Imprimiría lo siguiente:</p><pre><code>D is working
E is working
F is working</code></pre><p>El uso de los genéricos solo añade un extra de lógica a nuestro código. Cuando usar solo la interfaz sea suficiente, no habría ningún motivo para añadir genéricos al código.</p><p>Los genéricos aún se encuentran en sus primeras fases de desarrollo y todavía tienen límites a la hora de realizar procesamientos complejos.</p><h2 id="jugando-con-las-restricciones"><strong>Jugando con las restricciones</strong></h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/04/image-318.png" class="kg-image" alt="image-318" width="600" height="400" loading="lazy"><figcaption>Photo by <a href="https://unsplash.com/@pbrandao?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Paulo Brandao</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Unsplash</a></figcaption></figure><p>Antes, usamos el tipo <code>any</code> para nuestra restricción genérica. Además de ese tipo, hay algunas otras restricciones que podemos usar.</p><p>Una de las restricciones es <code>comparable</code>. Vamos a ver cómo funciona:</p><pre><code class="language-go">func Equal[T comparable](a, b T) bool {
    return a == b
}

func main() {
	Equal("a","a")
}</code></pre><p>Aparte de eso, también podemos intentar crear nuestra propia restricción de la siguiente manera:</p><pre><code class="language-go">package main

import(
	"fmt"
)

type Number interface {
    type int, float64
}

func MultiplyTen[T Number](a T) T{
	return a*10
}

func main() {
	fmt.Println(MultiplyTen(10))
	fmt.Println(MultiplyTen(5.55))
}</code></pre><p>Y me parece bastante bueno: podemos tener una función para una expresión matemática simple. Por lo general, terminaremos haciendo dos funciones para incorporarlo o usaremos la reflexión, por lo que solo escribiremos una función.</p><p>Si bien todo esto es bastante interesante, aún tenemos que experimentar un poco para crear nuestras propias restricciones. Todavía es pronto para conocer todas las limitaciones de los genéricos. Y debemos tener cuidado de no abusar de ellos y usarlos solo si estamos realmente seguros de que sean necesarios.</p><h2 id="otras-formas-de-usar-los-gen-ricos"><strong>Otras formas de usar los genéricos</strong></h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/04/image-319.png" class="kg-image" alt="image-319" width="600" height="400" loading="lazy"><figcaption>Photo by <a href="https://unsplash.com/@jotaemee?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Marcelo Franchi</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Unsplash</a></figcaption></figure><p>Además de usar los genéricos como parte de una función, también puedes declararlos como variables de la siguiente manera:</p><pre><code>type GenericSlice[T any] []T</code></pre><p>Y puedes usar esto como un parámetro en una función o puedes crear un método de ese tipo:</p><pre><code class="language-go">func (g GenericSlice[T]) Print() {
	for _, v := range g {
		fmt.Println(v)
	}
}

func Print [T any](g GenericSlice[T]) {
	for _, v := range g {
		fmt.Println(v)
	}
}

func main() {
	g := GenericSlice[int]{1,2,3}
	
	g.Print() //1 2 3
	Print(g) //1 2 3
}</code></pre><p>El uso cambiaría según tus necesidades. Diría que todavía tenemos que experimentar más con genéricos para ver qué casos de uso funcionan mejor.</p><h2 id="mi-opini-n-sobre-los-gen-ricos">Mi opinión sobre los genéricos</h2><p>Los genéricos están todavía en sus fases iniciales, pero estoy bastante impresionado con la forma en la que se gestionan. No hace falta saber muchos términos complicados ni muchas librerías para implementar genéricos, y esta simplicidad es lo que hace que sean geniales.</p><p>Hay varios casos de uso en los que ya puedo intuir que usar genéricos será mejor, como por ejemplo en el caso con el método de multiplicación. Una cosa que a lo mejor confunde a la gente es que los genéricos podrían ser un sustituto para el uso de interfaces (tanto el tipo de interfaz{} como la implementación de la interfaz).</p><p>Mi consejo es no pensar en los genéricos como un sustituto de nada. Los genéricos son simplemente una herramienta más al alcance de los desarrolladores. Por otro lado, aunque los genéricos te parezcan elegantes y geniales, y quieras usarlos en cada bloque de tu código, te aconsejo que no los uses en exceso; úsalos cuando realmente los necesites y no los metas en todos los sitios en donde puedan encajar.</p><p>Eso es todo. Gracias por leer mi artículo, y espero sinceramente que los genéricos te puedan resultar útiles.</p><p>¡Qué disfrutéis de los genéricos!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como configurar tu terminal de macOS con Zsh como un profesional ]]>
                </title>
                <description>
                    <![CDATA[ A veces, usar el terminal que viene por defecto en Mac es un rollo. Si lo que te apetece es salirte de lo ordinario y darle vida a tu terminal aburrido mejorando, a la vez, tu productividad, te presento Z shell [https://es.wikipedia.org/wiki/Zsh] (Zsh). Zsh es un intérprete de comandos (o ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-configurar-tu-terminal-de-macos-con-zsh/</link>
                <guid isPermaLink="false">62ff65307b4ec209a402474d</guid>
                
                    <category>
                        <![CDATA[ terminal ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ian Cowley ]]>
                </dc:creator>
                <pubDate>Fri, 23 Sep 2022 01:24:51 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/08/1_REqZX2_JqQjbH9Ly3QsgLg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>A veces, usar el terminal que viene por defecto en Mac es un rollo. Si lo que te apetece es salirte de lo ordinario y darle vida a tu terminal aburrido mejorando, a la vez, tu productividad, te presento <a href="https://es.wikipedia.org/wiki/Zsh">Z shell</a> (Zsh).</p><p>Zsh es un intérprete de comandos (o <em>shell</em>) de Unix que está montado por encima de Bash (la shell predeterminado de macOS) y contiene muchas mejoras.</p><p>En este tutorial, vamos a configurar iTerm2 con Zsh y sus dependencias. Es una decisión muy acertada y después de hacerlo vas a pensar, "¿por qué no descubrí Zsh antes?" Bueno, ya que estás aquí, vamos a empezar.</p><h3 id="puntos-claves"><strong>Puntos claves</strong></h3><ul><li>Instalación de Homebrew</li><li>Instalación de iTerm2</li><li>Instalación de Zsh y Oh My Zsh</li><li>Configurar las dependencias para crear un terminal bonito</li></ul><h3 id="paso-1-instalar-homebrew"><strong>Paso 1: instalar Homebrew</strong></h3><p><a href="https://brew.sh/index_es">Homebrew</a> es un gestor de paquetes de software de código abierto y gratuito que simplifica la instalación de software en dispositivos Apple que usan macOS.</p><p>Antes de instalar Homebrew, tenemos que instalar las herramientas de CLI para Xcode. Abre tu terminal y ejecuta el comando:</p><pre><code class="language-bash">xcode-select —-install</code></pre><p>Si te sale un error, ejecuta <code>xcode-select -r</code> para hacer reset de <code>xcode-select</code>.</p><p>Después, instala Homebrew.</p><pre><code class="language-bash">/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
</code></pre><h3 id="paso-2-instalar-iterm2"><strong>Paso 2: instalar iTerm2</strong></h3><p>iTerm2 es un reemplazo para el terminal y es el sucesor de iTerm. La mayoría de los desarrolladores de software prefieren <a href="https://iterm2.com/">iTerm2</a> al terminal predeterminado de macOS gracias a sus numerosas prestaciones adicionales. Puedes integrar Zsh en iTerm2 para mejorar tu productividad.</p><p>Para instalar iTerm2, ejecuta el comando:</p><pre><code class="language-bash">brew cask install iterm2</code></pre><h3 id="paso-3-instalar-zsh"><strong>Paso 3: instalar Zsh</strong></h3><blockquote>Zsh se diseñó para poder usarse de manera interactiva<em><em>,</em> aunque también<em> </em></em>es un potente lenguaje de secuencias de comandos.</blockquote><p>MacOS viene por defecto con Zsh en el directorio <code>/bin/zsh</code>.</p><p>Vamos a instalar Zsh usando <code>brew</code> y hacer que iTerm2 lo use.</p><pre><code class="language-bash">brew install zsh</code></pre><h3 id="paso-4-instalar-oh-my-zsh"><strong>Paso 4: instalar Oh My Zsh</strong></h3><blockquote>“Oh My Zsh es un framework de código abierto impulsado por la comunidad, para gestionar tu configuración de Zsh. No te convertirá en un desarrollador 10x... pero puede que te sientas como uno después de instalarlo.”</blockquote><blockquote>— Robby Russell</blockquote><p>Se ejecuta en Zsh para proporcionar unas prestaciones configurables dentro del archivo de configuración <code>~/.zhrc</code>. Instala <a href="https://github.com/robbyrussell/oh-my-zsh">Oh My Zsh</a> ejecutando el comando:</p><pre><code>sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"</code></pre><p>Comprueba la versión instalada:</p><pre><code class="language-bash">zsh --version</code></pre><p>Puedes actualizarlo también para obtener las últimas prestaciones que ofrece.</p><pre><code class="language-bash">upgrade_oh_my_zsh</code></pre><p>Reinicia iTerm2 para empezar con la experiencia de Zsh. ¡Bienvenido al mundo de "Oh My Zsh"!</p><p>Y eso no es todo. Ahora, vamos a instalar las dependencias para sacar lo mejor de Zsh.</p><p><strong>Paso 5: cambiar el tema predeterminado</strong></p><p>Por defecto, Oh My Zsh viene con un montón de temas. El predeterminado es el de robbyrussell, pero lo puedes cambiar a cualquier tema que elijas. En este ejemplo, lo he cambiado a agnoster, un tema que viene preinstalado.</p><p>Tienes que seleccionar este tema en <code>~/.zshrc</code>. Para abrir el fichero de configuración (<code>.zshrc</code>), ejecuta:</p><pre><code class="language-bash">nano ~/.zshrc</code></pre><p>O abre el fichero con un editor de textos usando:</p><pre><code class="language-bash">open ~/.zshrc</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/umcC5b7qtng38UbZngNRwMXq6NzwmR8SqIes" class="kg-image" alt="umcC5b7qtng38UbZngNRwMXq6NzwmR8SqIes" width="600" height="400" loading="lazy"></figure><p>Configura el tema de Zsh y actualiza los cambios:</p><pre><code class="language-bash">source ~/.zhrc</code></pre><p><strong>Usar un tema personalizado</strong></p><p>Para instalar un tema no preinstalado, clona el repositorio al directorio <code>custom/themes</code>. En este ejemplo vamos a instalar <a href="https://github.com/bhilburn/powerlevel9k/wiki/Install-Instructions#option-2-install-for-oh-my-zsh" rel="noopener">powerlevel9k</a>:</p><pre><code class="language-bash">$ git clone https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k</code></pre><p>Luego, selecciona este tema en tu <code>~/.zshrc</code>:</p><pre><code class="language-bash">ZSH_THEME="powerlevel9k/powerlevel9k"</code></pre><p>Actualiza los cambios ejecutando el comando <code>source ~/.zshrc</code></p><p>Navega a <code>iTerm2 &gt; Preferences &gt; Profiles &gt; Colors</code> si quieres cambiar el color del terminal.</p><p>El tema que hemos seleccionado en este ejemplo requiere la fuente <a href="https://github.com/powerline/fonts">powerline</a> así que vamos a instalarla.</p><p><strong>Paso 6: instalar fuente</strong></p><p>Voy a usar <a href="https://github.com/powerline/fonts/tree/master/Inconsolata">Inconsolata</a>. Puedes buscar tu fuente favorita en <a href="https://github.com/powerline/fonts">Powerline fonts</a> y luego instalarla.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/l-nkEZ87vggoFrm5xPNGvyNMv9hyxZc2tE1U" class="kg-image" alt="l-nkEZ87vggoFrm5xPNGvyNMv9hyxZc2tE1U" width="600" height="400" loading="lazy"></figure><p>O también puedes descargar la fuente entera.</p><pre><code class="language-bash">git clone https://github.com/powerline/fonts.git

cd fonts

./install.sh</code></pre><p>Para cambiar la fuente, navega a <code>iTerm2 &gt; Preferences &gt; Profiles &gt; Text &gt; Change Font</code>.</p><p>Ahora puedes ver que Inconsolata aparece en el listado de fuentes. Selecciona tu fuente preferida. Para fuentes que tienen soporte para ligaduras como <a href="https://github.com/tonsky/FiraCode" rel="noopener">FiraCode</a>, chequea la opción "Use ligatures" para ver las flechas o otros operadores de forma elegante, como por ejemplo ( <strong><strong>→ </strong></strong>).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/flJ1CL1uDv0QoX-TK0MBgn7CVuyG0wOG388V" class="kg-image" alt="flJ1CL1uDv0QoX-TK0MBgn7CVuyG0wOG388V" width="600" height="400" loading="lazy"><figcaption>Seleccionar una fuente "Powerline"</figcaption></figure><h3 id="paso-7-instalar-un-esquema-de-colores"><strong>Paso 7: instalar un esquema de colores</strong></h3><p>Vamos a cambiar el esquema de colores para tener un terminal más bonito. Navega a <a href="https://github.com/mbadolato/iTerm2-Color-Schemes" rel="noopener">iTerm2-Color-Schemes</a> y descárgate el directorio ZIP. Luego, extrae el directorio porque lo que necesitamos está en la carpeta de esquemas (schemes).</p><p>Navega a <code>iTerm2 &gt; Preferences &gt; Profile &gt; Colors &gt; Color Presets &gt; Import</code></p><ul><li>Navega a la carpeta de esquemas y selecciona tus colores favoritos para así importarlos.</li><li>Haz clic en un color específico para activarlo. En este ejemplo he activado "Batman" porque es mi esquema de colores favorito.</li></ul><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/0NGtEWFgLWeyM4tzGVtQ4xTNNqBdnHMdZMGw" class="kg-image" alt="0NGtEWFgLWeyM4tzGVtQ4xTNNqBdnHMdZMGw" width="600" height="400" loading="lazy"></figure><p>¡Ya hemos terminado con los ajustes básicos ? ? !</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/tFnT1hiSKgWYMYYTNIzUfjD1Z5vIe2QnjSlI" class="kg-image" alt="tFnT1hiSKgWYMYYTNIzUfjD1Z5vIe2QnjSlI" width="600" height="400" loading="lazy"><figcaption>Esquema de colores "Batman"</figcaption></figure><h3 id="paso-8-instalar-plugins"><strong>Paso 8: instalar plugins</strong></h3><p>Oh My Zsh viene con un plugin de Git preinstalado. Para añadir otros plugins, como por ejemplo Docker, sugerencia automática, resaltado de sintaxis y más:</p><ul><li>Clona el repositorio Git del plugin que quieres. Por ejemplo:</li></ul><pre><code class="language-bash">git clone https://github.com/zsh-users/zsh-docker.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-docker</code></pre><ul><li>Navega al directorio <code>.oh-my-zsh &gt; custom &gt; plugins</code> para ver el directorio clonado. Para accederlo ejecuta <code>open ~/.oh-my-zsh</code></li><li>Añade el plugin a la sección de plugins del archivo de configuración <code>~/.zshrc</code>, tal como se ve en la captura abajo</li><li>Actualiza tus cambios ejecutando <code>source ~/.zshrc</code></li></ul><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/oK1lzMvgGrsycWUoueagV0a99eq00akzwiEW" class="kg-image" alt="oK1lzMvgGrsycWUoueagV0a99eq00akzwiEW" width="600" height="400" loading="lazy"></figure><h3 id="step-9-a-adir-aliases"><strong>Step 9: añadir aliases</strong></h3><p>Los alias son unos atajos que se usan para reducir el tiempo que pasas tecleando comandos. Puedes añadir aliases a comandos que ejecutas igual que en el ejemplo que tienes abajo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/08/VmmW4SCRGXW2cQ74o4nODyLOlNgZYeJEgOyR-1.png" class="kg-image" alt="VmmW4SCRGXW2cQ74o4nODyLOlNgZYeJEgOyR-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/08/VmmW4SCRGXW2cQ74o4nODyLOlNgZYeJEgOyR-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/08/VmmW4SCRGXW2cQ74o4nODyLOlNgZYeJEgOyR-1.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Si tecleas <code>dckimgs</code> se ejecuta el comando de Docker images</figcaption></figure><p>Si conoces otras maneras de mejorar la productividad con Zsh, puedes comentarlas abajo. Encantado de leer tus sugerencias.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
