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.
- 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 archivobombadil.toml
en este directorio. - Lo siguiente es decir a toml-bombadil que este directorio lo quieres usar:
bombadil install mis_dotfiles
- Ahora queda editar el archivo
bombadil.toml
que recordemos esta enmis_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). - Escribiendo
bombadil link
debe funcionar, y es necesario hacerlo cada vez que se modifiquen los archivos de configuración enmis_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"
},
})