Author/s: Ramiro Checa-Garcia
Language: es | Translations:
computing
dotfilestext-editor

Introdución

Mi trabajo no es programador pero trabajo en modelos computacionales de la atmósfera, con lo que la mayor parte del tiempo estoy de-facto programando. Esto implica para mí que la elección del editor de texto es importante, aunque también creo que no hay una solución única para todos. Como ya que llevo años programando he probado ya varias opciones, y he elegido aquellas que considero las más convenientes para mi (o más bien tengo ya una serie de rutinas difíciles de cambiar). Sin embargo, la realidad es que cada vez que cambias de proyecto te puedes tener que enfrentar a un cambio de sistema (ordenador personal, servidores, administradores...), y esto requiere tener cierta flexibilidad en tu entorno de trabajo (incluso más hoy en día con el boom del tele-trabajo en casa).

Respecto a elegir un editor de texto una buena comparación entre varios de los editores más comunes la puedes encontrar en: Andrey-about-text-editors

Hay, en general, dos opciones que están, en mi caso, siempre o casi siempre disponibles: vim y emacs, al ser las opciones instaladas por defecto en entornos linux/unix (kakoune es una alternative interesante pero no suele instalarse por defecto). Sin embargo, a veces puede ser una tarea ardua conseguir un entorno estable entre tu ordenador personal en el trabajo, tu ordenador personal en casa y los distintos servidores.

Dotfiles: toml-bombadil

De aquí viene mi necesidad de usar algún tipo de aplicación para manejar archivos de configuración de manera transportable entre computadores (lo que suele llamarse dotfiles, dotfiles). En mi caso he elegido toml-bombadil que para mis necesidades funciona bien.

Toml-bombadil es una herramienta programada en rust que puede instalarse usando cargo, es posible que en alguna distribucin exista un paquete. En caso contrario, cargo install toml-bombadil debe funcionar. En caso de que tengas una version de rust relativamente antigua, puedes intentar instalar una version de toml-bombadil compatible con tu version de rust.

  1. Lo primero es crear un directorio (lo voy a llamar mis_dotfiles) donde incluir tus archivos de configuración dotfiles, y posiblemente usar un control de versiones en dicho directorio. Lo siguiente es crear un archivo bombadil.toml en este directorio.
  2. Lo siguiente es decir a toml-bombadil que este directorio lo quieres usar: bombadil install mis_dotfiles
  3. Ahora queda editar el archivo bombadil.toml que recordemos esta en mis_dotfiles, con las instrucciones acerca de que dotfiles usar y donde deben estar en tu sistema (incluyo un ejemplo sencillo después del cuarto paso).
  4. Escribiendo bombadil link debe funcionar, y es necesario hacerlo cada vez que se modifiquen los archivos de configuración en mis_dotfiles.

En el caso del archivo bombadil.toml que muestro a continuacion, nuestro directory mis_dotfiles tendrá cuatro subdirectorios: vim, bash, nvim y kitty. En los tres primeros toml-bombadil simplemente hara enlaces simbólicos de archivos, en el caso de kitty, hara enlaces de un directorio completo.

dotfiles_dir = "mis_dotfiles"
[settings]
[settings.dots]
vim   = {source = "vim/vimrc",     target = ".vimrc" }
bash  = {source = "bash/bashrc",   target = ".bashrc" }
nvim  = {source = "nvim/init.vim", target = ".config/nvim/init.vim }
kitty = {source = "kitty",         target = ".config/kitty"}

Entornos Mac y Linux

En este momento tengo Linux en casa y he tenido un Mac en el trabajo (que usaba para acceder a servidores Linux), y comparto una carpeta en que tengo dos archivos de configuración para bombadil: bombadil_mac.toml y bombadil_linux.toml en el caso del Mac directamente tengo una función shell en mi .bashrc (en Linux no se necesita la primera linea de la función-shell y bombadil link funciona directamente).

function mybombadil {
   cp from_my_shared_folder/bombadil_mac.toml /Users/username/Library/Application\ Support/bombadil.toml
   bombadil link
   doom sync
}

Y el archivo bombadil_mac.toml:

[settings.dots]

# A dot entry representing a symlink, `source` is relative to `dotfiles_dir`
# and `target` shall be relative to $HOME directory or absolute.
bombadil_mac = { source = "bombadil_mac.toml" ,  target = ".config/bombadil.toml"}
bash_mac     = { source = "bash_mac/bashrc"   ,  target = ".bashrc"}
matplotlib   = { source = "matplotlib"        ,  target = ".config/matplotlib"}
kitty_mac    = { source = "kitty"             ,  target = ".config/kitty"}      
nvim_mac     = { source = "nvim_mac/init.vim" ,  target = ".config/nvim/init.vim" }
doom_mac     = { source = "doom_mac"          ,  target = ".doom.d" }

En el caso de entornos Linux el archivo contiene entradas adicionales (xmonad, sway, ...). Muchos de los archivos son comunes y solo algunos tienen diferencias según la plataforma.

Dotfiles: Stow

Update: Julio-2024

Aunque en general estoy contento con toml-bombadil, estoy haciendo una transición a Stow porque la instalación de toml-bombadil es un poco tediosa (dependencia de otros paquetes no disponibles en la mayoria de las distribuciones linux, necesidad de usar cargo fuera del sistema de paquetes de mi distribución linux debido a los requisitos una versión muy reciente de rust).

Emacs

Para emacs, tras intentar varias configuraciones considero que los dos mejores opciones son: - doom-emacs: La razón comodidad y versatilidad, el único problema es que exige una version de emacs tan reciente que muchos servidores que usan distribuciones Linux estables por largo tiempo (LTS) no disponen (en el momento de escribir este articulo) de Emacs 27.1. Así que combino emacs (evil) con vim (o neovim cuando puedo). Emacs-evil me permite tener una misma memoria muscular en ambos casos. Moverme completamente a vim/neovim para mi no es una opcion ya que utilizo org-mode continuamente. Ademas combinado con ivy-bibtex más la posibilidad de visualizar ecuaciones escritas en LaTeX o diagramas con ditaa, es muy útil para tomar notas en mi trabajo. La idea de usar org-babel como herramienta también es genial. - config.org: un archivo propio llamado config.org, es decir, gestionar por mi mismo los paquetes de emacs y no usar una distribución como doom-emacs.

Neovim

Para vim/neovim tengo un archivo de configuración propio (SpaceVim no esta mal, pero algo más sencillo y directo me viene mejor. También he intentado NVChad que me gusto algo más). Vim lo utilizo cunado tengo que programar online y tampoco necesito un entorno con muchos plugins, realmente si conoces bien vim (lo mismo para emacs) esto ya te da mucha versatilidad. Para una configuración básica de neovim, tenemos dos opciones:

~./config/nvim/init.vim

Este archivo puede venir de un vimrc reciclado, y tener algo muy similar en vim y neovim. En ambos casos veo Plug.vim una de las mejores opciones para manejar plugins.

~./config/nvim/init.lua

Este archivo es código en Lua, y tiene una syntaxis algo diferente. En este caso, uso para los plugins Lazy.nvim y os comento como organizo la instalación: tengo un archivo base llamando init.lua que puede llamar a diferentes archivos con partes de la configuración. Por brevedad os dejo un caso mínimo:

.config/nvim
├── init.lua
├── lazy-lock.json
└─── lua
    ├── colorscheme.lua
    ├── lazy_install.lua
    └── lazy_packages.lua

init.lua

-- -----------------------------------
-- Neovim basic configuration
-- Date 2023-07-05 
-- -----------------------------------


-- [1] --- LAZY package manager ------

require("lazy_install")
require("lazy_packages")


-- [2] --- COLOR SCHEME --------------

require("colorscheme")content/blog/coding/make_notebook.md


-- [3] --- COMMANDS at startup -------

vim.cmd("colorscheme kanagawa")
require("colorizer").setup()


-- [4] --- OPTIONS -------------------

vim.opt.termguicolors = true
vim.opt.number = true
vim.opt.showtabline = 2
vim.opt.relativenumber = true

lua/lazy_install.lua

-- Installation of Lazy.nvim ----------

local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
  vim.fn.system({
    "git",
    "clone",
    "--filter=blob:none",
    "https://github.com/folke/lazy.nvim.git",
    "--branch=stable", -- latest stable release
    lazypath,
  })
end
vim.opt.rtp:prepend(lazypath)

lua/lazy_packages.lua

-- Example using a list of specs with the default options

vim.g.mapleader = " "

-- Make sure to set `mapleader` before lazy so your mappings are correct


require("lazy").setup({

    -- {  "m4xshen/hardtime.nvim",
    --   dependencies = { 'MunifTanjim/nui.nvim' },
    --  opts = {}},

    { "norcalli/nvim-colorizer.lua",
       lazy=false},

    { "https://git.sr.ht/~vigoux/complementree.nvim",
      dependencies = {"L3MON4D3/LuaSnip", 
                     "nvim-treesitter/nvim-treesitter"}},

    { "rebelot/kanagawa.nvim" },

    { "nvim-treesitter/nvim-treesitter",
       lazy=false, build = ":TSUpdate"},

    { "segeljakt/vim-stealth",
      lazy=false},content/blog/coding/make_notebook.md

    { "junegunn/vim-easy-align", 
      lazy=false},

    { "NeogitOrg/neogit",
      dependencies = { "nvim-lua/plenary.nvim"         -- required
                      , "sindrets/diffview.nvim"},     -- optional
      config = true },
})

lua/colorscheme.lua

-- Default options:
require('kanagawa').setup({
    compile        = false,             -- enable compiling the colorscheme
    undercurl      = true,              -- enable undercurls
    commentStyle   = { italic = true },
    functionStyle  = {},
    keywordStyle   = { italic = true},
    statementStyle = { bold = true },
    typeStyle      = {},
    transparent    = false,      -- do not set background color
    dimInactive    = false,      -- dim inactive window `:h hl-NormalNC`
    terminalColors = true,       -- define vim.g.terminal_color_{0,17}
    colors = {                   -- add/modify theme and palette colors
        palette = {},
        theme = { wave = {}, lotus = {}, dragon = {}, all = {} },
    },
    overrides = function(colors) -- add/modify highlights
        return {}
    end,
    theme = "wave",              -- Load "wave" theme when 'background' option is not set
    background = {               -- map the value of 'background' option to a theme
        dark = "wave",           -- try "dragon" !
        light = "lotus"
    },
})