Skip to content

keymaps

Ronald Record edited this page Jul 17, 2023 · 6 revisions

Keymaps Generation Script

The information.sh script used to auto-generate Neovim configuration info documents invokes the keymaps.sh script to generate tables of keymaps for each configuration. These are added to the configuration info documents.

The keymaps tables are styled with the following CSS:

table {
  border-collapse: collapse;
  width: 100%;
  color: #333;
  font-family: Arial, sans-serif;
  font-size: 14px;
  text-align: left;
  border-radius: 10px;
  overflow: hidden;
  box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
  margin: auto;
  margin-top: 50px;
  margin-bottom: 50px;
}

table th {
  background-color: #ff9800;
  color: #fff;
  font-weight: bold;
  padding: 10px;
  text-transform: uppercase;
  letter-spacing: 1px;
  border-top: 1px solid #fff;
  border-bottom: 1px solid #ccc;
}

table tr:nth-child(even) td {
  background-color: #f2f2f2;
}

table tr:hover td {
  background-color: #ffedcc;
}

table td {
  background-color: #fff;
  padding: 10px;
  border-bottom: 1px solid #ccc;
  font-weight: bold;
}

View the supported configurations info docs.

The source code for the keymaps.sh script:

#!/usr/bin/env bash
#
# Mapping modes:
# n	Normal
# v	Visual and Select
# s	Select
# x	Visual
# o	Operator-pending
# i	Insert
# l	":lmap" mappings for Insert, Command-line and Lang-Arg
# c	Command-line
# t	Terminal-Job

debug=
[ "$1" == "-d" ] && {
  debug=1
  shift
}
CFNAME="$1"
OUT="$2"

if [ -d "${HOME}/.config/nvim-${CFNAME}" ]
then
  export NVIM_APPNAME="nvim-${CFNAME}"
else
  if [ -d "${HOME}/.config/${CFNAME}" ]
  then
    export NVIM_APPNAME="${CFNAME}"
  else
    exit 1
  fi
fi
KEYTMP="${HOME}/.config/nvim-Lazyman/tmp"
OUTDIR=$(dirname "${OUT}")

[ -d "${KEYTMP}" ] || mkdir -p "${KEYTMP}"
[ -d "${OUTDIR}" ] || mkdir -p "${OUTDIR}"

echo "local normal_mode = " > "${KEYTMP}"/${CFNAME}.lua
echo "" >> "${KEYTMP}"/${CFNAME}.lua
nvim --headless '+lua vim.print(vim.api.nvim_get_keymap("n"))' +qa >> "${KEYTMP}"/${CFNAME}.lua 2>&1
printf "\n\nlocal visual_mode = " >> "${KEYTMP}"/${CFNAME}.lua
echo "" >> "${KEYTMP}"/${CFNAME}.lua
nvim --headless '+lua vim.print(vim.api.nvim_get_keymap("x"))' +qa >> "${KEYTMP}"/${CFNAME}.lua 2>&1
printf "\n\nlocal operator_mode = " >> "${KEYTMP}"/${CFNAME}.lua
echo "" >> "${KEYTMP}"/${CFNAME}.lua
nvim --headless '+lua vim.print(vim.api.nvim_get_keymap("o"))' +qa >> "${KEYTMP}"/${CFNAME}.lua 2>&1

have_dtox=$(type -p dtox)
if [ "${have_dtox}" ]
then
  dtox "${KEYTMP}"/${CFNAME}.lua
else
  have_dos=$(type -p dos2unix)
  if [ "${have_dos}" ]
  then
    dos2unix "${KEYTMP}"/${CFNAME}.lua
  else
    echo "Unable to perform DOS to UNIX conversion"
  fi
fi

echo "" >> "${OUT}"
echo "### ${CFNAME} Keymaps" >> "${OUT}"

grep -v callback "${KEYTMP}"/${CFNAME}.lua | grep -v "^\[" | grep -v ^Error | \
  grep -v ^Fail | grep -v ^Some | grep -v ^\& | grep -v ^sh | \
  grep -v ^Tele | grep -v ^Lua | grep -v ^Two | grep -i -v ^vim | \
  grep -v ^stack | grep -v "[[:space:]]/home/" | grep -v ^mkdir | \
  grep -v "[[:space:]]\[C\]" | grep -v ^down | grep -v ^cwd | \
  grep -v "^\.\.\." | grep -v "[[:space:]]\.\.\." | grep -v "^\# stack" | \
  grep -v -- "[[:space:]]- " | grep -v ^Install | grep -v ^Welcome | \
  grep -v "[[:space:]]vim/" | grep -v ^run | \
  grep -v -- ^- > /tmp/${CFNAME}$$.lua
for mode in "normal" "visual" "operator"
do
  cp /tmp/${CFNAME}$$.lua "${KEYTMP}"/${CFNAME}.lua
  echo "" >> "${KEYTMP}"/${CFNAME}.lua
  echo "for k,v in pairs(${mode}_mode) do" >> "${KEYTMP}"/${CFNAME}.lua
  echo "  if v.desc ~= nil then" >> "${KEYTMP}"/${CFNAME}.lua
  echo "    io.write('| ' .. v.desc)" >> "${KEYTMP}"/${CFNAME}.lua
  echo "  else" >> "${KEYTMP}"/${CFNAME}.lua
  echo "    io.write('| ')" >> "${KEYTMP}"/${CFNAME}.lua
  echo "  end" >> "${KEYTMP}"/${CFNAME}.lua
  echo "  if v.lhs ~= nil then" >> "${KEYTMP}"/${CFNAME}.lua
  echo "    io.write(' | ' .. v.lhs)" >> "${KEYTMP}"/${CFNAME}.lua
  echo "  else" >> "${KEYTMP}"/${CFNAME}.lua
  echo "    io.write(' | ')" >> "${KEYTMP}"/${CFNAME}.lua
  echo "  end" >> "${KEYTMP}"/${CFNAME}.lua
  echo "  if v.rhs ~= nil then" >> "${KEYTMP}"/${CFNAME}.lua
  echo '    io.write(" | " .. v.rhs .. " |\n")' >> "${KEYTMP}"/${CFNAME}.lua
  echo "  else" >> "${KEYTMP}"/${CFNAME}.lua
  echo '    io.write(" |  |\n")' >> "${KEYTMP}"/${CFNAME}.lua
  echo "  end" >> "${KEYTMP}"/${CFNAME}.lua
  echo "end" >> "${KEYTMP}"/${CFNAME}.lua

  echo "" >> "${OUT}"
  echo "#### ${mode} mode keymaps" >> "${OUT}"
  echo "" >> "${OUT}"
  echo "| Description | LHS | RHS |" >> "${OUT}"
  echo "| ----------- | --- | --- |" >> "${OUT}"
  lua "${KEYTMP}"/${CFNAME}.lua >> "${OUT}"
  [ "${debug}" ] && cp "${KEYTMP}"/${CFNAME}.lua "${KEYTMP}"/${CFNAME}-debug.lua
done

rm -f "${KEYTMP}"/${CFNAME}.lua
rm -f /tmp/${CFNAME}$$.lua

Clone this wiki locally