EJECUTAR CUALQUIER CÓDIGO EN NEOVIM | CORRER CÓDIGO EN NEOVIM

 EJECUTAR CUALQUIER CÓDIGO EN NEOVIM | CORRER CÓDIGO EN NEOVIM

EJECUTAR CUALQUIER CÓDIGO EN NEOVIM | CORRER CÓDIGO EN NEOVIM

Hoy les quiero compartir un plugin que ayuda a la ejecución de código en Neovim, el cual puede compilar y ejecutar cualquier lenguaje de programación siempre y cuando lo soporte, además les daré una configuración para que lo puedan usar mucho más fácil con atajos del teclado sin necesidad de escribir comandos.

Puedes ver este mismo contenido en video dando click aquí.

Este plugin puede ser usado en NvChad, LunarVim, AstroVim, Neovim, SpaceVim, pero la forma en la que se coloca en el archivo de configuración puede cambiar según sea el Framework de Neovim, para saber la forma en que se debe de colocar el plugin puedes ver desde la página oficial de cada uno en el siguiente listado.

  1. NvChad
  2. LunarVim
  3. AstroVim
  4. SpaceVim
El plugin Code Runner desde su repositorio de GitHub nos da la siguiente forma de agregarlo usando packer.nvim.
use { 'CRAG666/code_runner.nvim', requires = 'nvim-lua/plenary.nvim' }
 Pero en el caso de la sintaxis para agregar plugins a LunarVim es de la siguiente manera:
 { 

    "CRAG666/code_runner.nvim", 
    requires = {"/nvim-lua/plenary.nvim"}, 

  },
   
Cuando tengamos la forma correcta de usar el plugin de acuerdo al framework de Neovim, vamos al documento plugins.lua y lo agregamos al listado de plugins, cada uno de estos frameworks tiene ese documento dentro de su estructura, como ejemplo vamos a seguir con LunarVim, el documento plugins.lua quedaría de la siguiente manera: el plugin se agregó en la linea 296.

-- local require = require("lvim.utils.require").require
local core_plugins = {
  -- Packer can manage itself as an optional plugin
  { "wbthomason/packer.nvim" },
  { "neovim/nvim-lspconfig" },
  { "tamago324/nlsp-settings.nvim" },
  {
    "jose-elias-alvarez/null-ls.nvim",
  },
  { "williamboman/mason-lspconfig.nvim" },
  {
    "williamboman/mason.nvim",
    config = function()
      require("lvim.core.mason").setup()
    end,
  },
  {
    "folke/tokyonight.nvim",
  },
  {
    "lunarvim/lunar.nvim",
  },
  { "Tastyep/structlog.nvim" },

  { "nvim-lua/popup.nvim" },
  { "nvim-lua/plenary.nvim" },
  -- Telescope
  {
    "nvim-telescope/telescope.nvim",
    branch = "0.1.x",
    config = function()
      require("lvim.core.telescope").setup()
    end,
    disable = not lvim.builtin.telescope.active,
  },
  {
    "nvim-telescope/telescope-fzf-native.nvim",
    requires = { "nvim-telescope/telescope.nvim" },
    run = "make",
    disable = not lvim.builtin.telescope.active,
  },
  -- Install nvim-cmp, and buffer source as a dependency
  {
    "hrsh7th/nvim-cmp",
    config = function()
      if lvim.builtin.cmp then
        require("lvim.core.cmp").setup()
      end
    end,
    requires = {
      -- "L3MON4D3/LuaSnip",
    },
  },
  {
    "rafamadriz/friendly-snippets",
    disable = not lvim.builtin.luasnip.sources.friendly_snippets,
  },
  {
    "L3MON4D3/LuaSnip",
    config = function()
      local utils = require "lvim.utils"
      local paths = {}
      if lvim.builtin.luasnip.sources.friendly_snippets then
        paths[#paths + 1] = utils.join_paths(get_runtime_dir(), "site", "pack", "packer", "start", "friendly-snippets")
      end
      local user_snippets = utils.join_paths(get_config_dir(), "snippets")
      if utils.is_directory(user_snippets) then
        paths[#paths + 1] = user_snippets
      end
      require("luasnip.loaders.from_lua").lazy_load()
      require("luasnip.loaders.from_vscode").lazy_load {
        paths = paths,
      }
      require("luasnip.loaders.from_snipmate").lazy_load()
    end,
  },
  {
    "hrsh7th/cmp-nvim-lsp",
  },
  {
    "saadparwaiz1/cmp_luasnip",
  },
  {
    "hrsh7th/cmp-buffer",
  },
  {
    "hrsh7th/cmp-path",
  },
  {
    "folke/neodev.nvim",
    module = "neodev",
  },



  -- Autopairs
  {
    "windwp/nvim-autopairs",
    -- event = "InsertEnter",
    config = function()
      require("lvim.core.autopairs").setup()
    end,
    disable = not lvim.builtin.autopairs.active,
  },

  -- Treesitter
  {
    "nvim-treesitter/nvim-treesitter",
    -- run = ":TSUpdate",
    config = function()
      require("lvim.core.treesitter").setup()
    end,
  },
  {
    "JoosepAlviste/nvim-ts-context-commentstring",
    event = "BufReadPost",
  },

  -- NvimTree
  {
    "kyazdani42/nvim-tree.lua",
    -- event = "BufWinOpen",
    -- cmd = "NvimTreeToggle",
    config = function()
      require("lvim.core.nvimtree").setup()
    end,
    disable = not lvim.builtin.nvimtree.active,
  },
  -- Lir
  {
    "christianchiarulli/lir.nvim",
    config = function()
      require("lvim.core.lir").setup()
    end,
    requires = { "kyazdani42/nvim-web-devicons" },
    disable = not lvim.builtin.lir.active,
  },
  {
    "lewis6991/gitsigns.nvim",

    config = function()
      require("lvim.core.gitsigns").setup()
    end,
    event = "BufRead",
    disable = not lvim.builtin.gitsigns.active,
  },

  -- Whichkey
  {
    "folke/which-key.nvim",
    config = function()
      require("lvim.core.which-key").setup()
    end,
    event = "BufWinEnter",
    disable = not lvim.builtin.which_key.active,
  },

  -- Comments
  {
    "numToStr/Comment.nvim",
    event = "BufRead",
    config = function()
      require("lvim.core.comment").setup()
    end,
    disable = not lvim.builtin.comment.active,
  },

  -- project.nvim
  {
    "ahmedkhalf/project.nvim",
    config = function()
      require("lvim.core.project").setup()
    end,
    disable = not lvim.builtin.project.active,
  },

  -- Icons
  {
    "kyazdani42/nvim-web-devicons",
    disable = not lvim.use_icons,
  },

  -- Status Line and Bufferline
  {
    -- "hoob3rt/lualine.nvim",
    "nvim-lualine/lualine.nvim",
    -- "Lunarvim/lualine.nvim",
    config = function()
      require("lvim.core.lualine").setup()
    end,
    disable = not lvim.builtin.lualine.active,
  },

  -- breadcrumbs
  {
    "SmiteshP/nvim-navic",
    config = function()
      require("lvim.core.breadcrumbs").setup()
    end,
    disable = not lvim.builtin.breadcrumbs.active,
  },

  {
    "akinsho/bufferline.nvim",
    config = function()
      require("lvim.core.bufferline").setup()
    end,
    branch = "main",
    event = "BufWinEnter",
    disable = not lvim.builtin.bufferline.active,
  },

  -- Debugging
  {
    "mfussenegger/nvim-dap",
    -- event = "BufWinEnter",
    config = function()
      require("lvim.core.dap").setup()
    end,
    disable = not lvim.builtin.dap.active,
  },

  -- Debugger user interface
  {
    "rcarriga/nvim-dap-ui",
    config = function()
      require("lvim.core.dap").setup_ui()
    end,
    disable = not lvim.builtin.dap.active,
  },

  -- alpha
  {
    "goolord/alpha-nvim",
    config = function()
      require("lvim.core.alpha").setup()
    end,
    disable = not lvim.builtin.alpha.active,
  },

  -- Terminal
  {
    "akinsho/toggleterm.nvim",
    event = "BufWinEnter",
    branch = "main",
    config = function()
      require("lvim.core.terminal").setup()
    end,
    disable = not lvim.builtin.terminal.active,
  },

  -- SchemaStore
  {
    "b0o/schemastore.nvim",
  },

  {
    "RRethy/vim-illuminate",
    config = function()
      require("lvim.core.illuminate").setup()
    end,
    disable = not lvim.builtin.illuminate.active,
  },

  {
    "lukas-reineke/indent-blankline.nvim",
    config = function()
      require("lvim.core.indentlines").setup()
    end,
    disable = not lvim.builtin.indentlines.active,
  },

  {
    "lunarvim/onedarker.nvim",
    branch = "freeze",
    config = function()
      pcall(function()
        if lvim and lvim.colorscheme == "onedarker" then
          require("onedarker").setup()
          lvim.builtin.lualine.options.theme = "onedarker"
        end
      end)
    end,
    disable = lvim.colorscheme ~= "onedarker",
  },
  --transparencia del fondo

  {
    "tribela/vim-transparent",
  },
  --tema neon
  {
    "rafamadriz/neon",
  },

  --code_runner aquí agregamos el plugin 
  { "CRAG666/code_runner.nvim",
    requires = {"nvim-lua/plenary.nvim"},

  },

{
  "folke/lsp-colors.nvim",
  event = "BufRead",
},

 }

local default_snapshot_path = join_paths(get_lvim_base_dir(), "snapshots", "default.json")
local content = vim.fn.readfile(default_snapshot_path)
local default_sha1 = vim.fn.json_decode(content)

local get_default_sha1 = function(spec)
  local short_name, _ = require("packer.util").get_plugin_short_name(spec)

  return default_sha1[short_name] and default_sha1[short_name].commit
end

if not vim.env.LVIM_DEV_MODE then
  for _, spec in ipairs(core_plugins) do
    -- Manually lock the commit hash since Packer's snapshots are unreliable in headless mode
    spec["commit"] = get_default_sha1(spec)
  end
end

return core_plugins
  
Una vez tengamos agregado nuestro plugin en el listado, presionamos ESC y escribimos :wq para guardar y salir del documento, ahora buscamos el documento llamado config.lua y entramos en él, una vez ahí, nos podemos en modo comando y colocamos :w con esto inicia la instalación del plugin, si no funciona o no inicia la instalación, entonces escriben :PackerSync para que agregue el plugin.

Cuando ya tengamos el plugin instalado, en el mismo documento de config.lua vamos a agregar un mapping o atajo de teclado para usarlo sin necesidad de escribir un comando, esto puede cambiar según sea el framework, en el caso de LunarVim es así.

lvim.keys.normal_mode["<C-r>"] = ":RunCode<cr>"
El comando anterior está generando un atajo de teclado con Ctrl + r para ejecutar el codigo del lenguaje de programación que sea.

Lo siguiente que tendríamos que hacer es ir al documento init.lua y agregar lo siguiente.

  

require('code_runner').setup({
  -- put here the commands by filetype
  filetype = {
		java = "cd $dir && javac $fileName && java $fileNameWithoutExt",
  	        python = "python3 -u",
                cpp = "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir/$fileNameWithoutExt",
		typescript = "deno run",
		rust = "cd $dir && rustc $fileName && $dir/$fileNameWithoutExt"
	},
 })


   
Esto lo que hace es llamar al plugin para que pueda reconocer el tipo de documento o formato que se está usando para usar el comando necesario, si agregamos esto al init.lua se podría ver de la siguiente manera.
local base_dir = vim.env.LUNARVIM_BASE_DIR
  or (function()
    local init_path = debug.getinfo(1, "S").source
    return init_path:sub(2):match("(.*[/\\])"):sub(1, -2)
  end)()

if not vim.tbl_contains(vim.opt.rtp:get(), base_dir) then
  vim.opt.rtp:append(base_dir)
end

require("lvim.bootstrap"):init(base_dir)

require("lvim.config"):load()

local plugins = require "lvim.plugins"

require("lvim.plugin-loader").load { plugins, lvim.plugins }

require("lvim.core.theme").setup()

local Log = require "lvim.core.log"
Log:debug "Starting LunarVim"

local commands = require "lvim.core.commands"
commands.load(commands.defaults)

require("lvim.lsp").setup()


require('code_runner').setup({
  -- put here the commands by filetype
  filetype = {
		java = "cd $dir && javac $fileName && java $fileNameWithoutExt",
  	python = "python3 -u",
    cpp = "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir/$fileNameWithoutExt",
		typescript = "deno run",
		rust = "cd $dir && rustc $fileName && $dir/$fileNameWithoutExt"
	},
 })

Cuando ya tengamos todo esto, ya podemos guardar y salir, para iniciar a usar el plugin tenemos que ubicarnos dentro de un archivo de programación tal como .java, .py, o .cpp, y presionamos Ctrl + r en modo comando.
code runner


Artículo Anterior Artículo Siguiente

Formulario de contacto