Hold Start or Back on your gamepad for a configurable duration to open a menu directly. A short press opens the button's normal menu.
Gamepad only. Default behaviour is fully preserved.
Inspired by Red Dead Redemption 2's hold-Start-to-open-map mechanic.
- Skyrim Special Edition or Anniversary Edition
- SKSE64
- Address Library for SKSE Plugins
- Optional: SKSE Menu Framework for in-game settings UI
Mod manager (recommended):
- Install the requirements above.
- Install HoldFast via your mod manager.
- Launch Skyrim via SKSE.
Manual:
- Install the requirements above.
- Copy
HoldFast.dllandHoldFast.initoData\SKSE\Plugins\. - Launch Skyrim via SKSE.
Edit Data\SKSE\Plugins\HoldFast.ini:
[General]
; Duration in seconds a button must be held to trigger its long-press action (default: 0.5, max: 5.0)
fHoldDuration=0.5
; Long-press action for the Start (Menu) button. Short press performs the button's normal function.
; Valid values: Map, System, Quests, Stats, Inventory, Magic, Favorites, TweenMenu, Wait, NewSave, QuickSave, Bestiary, CharacterSheet, None (case-insensitive)
sButtonStartAction=Map
; Long-press action for the Back (View) button. Short press performs the button's normal function.
; Valid values: Map, System, Quests, Stats, Inventory, Magic, Favorites, TweenMenu, Wait, NewSave, QuickSave, Bestiary, CharacterSheet, None (case-insensitive)
sButtonBackAction=SystemIn-game settings (optional):
If SKSE Menu Framework v3 is installed, HoldFast adds a HoldFast/Settings page in its mod control panel.
Use Save to config to persist and apply changes, Reload from config to discard staged edits and reload INI values, and Reset to defaults to stage defaults (0.5, Start=Map, Back=System) until saved.
Valid actions:
| Value | What it does |
|---|---|
Map |
Opens the map |
System |
Opens the Journal on the System tab |
Quests |
Opens the Journal on the Quests tab |
Stats |
Opens the Journal on the Stats tab |
Inventory |
Opens the inventory |
Magic |
Opens the magic menu |
Favorites |
Opens the favourites menu |
TweenMenu |
Opens the tween menu (Items/Magic/Map/Skills) |
Wait |
Opens the sleep/wait menu |
NewSave |
Performs a new save |
QuickSave |
Performs a quicksave |
Bestiary |
Opens The Dragonborn's Bestiary (requires mod) |
CharacterSheet |
Opens Character Menu SE (requires mod) |
None |
Button not intercepted |
Logs are written to:
%USERPROFILE%\Documents\My Games\Skyrim Special Edition\SKSE\HoldFast.log
- LLVM/Clang (
clang-cl,lld-link,llvm-lib,llvm-rc,llvm-mt) - xwin — downloads the Windows SDK and MSVC CRT headers/libs
- Ninja
# Arch / CachyOS
sudo pacman -S clang lld llvm ninja
# Install xwin (requires Rust/cargo)
cargo install xwin
# Fetch Windows SDK + MSVC CRT headers to ~/.xwin (one-time, ~700 MB)
xwin splat --output ~/.xwinNote: On first CMake configure,
cmake/toolchains/clang-cl-cross.cmakecreates TitleCase symlinks inside your xwin installation (e.g.Advapi32.lib → advapi32.lib). The originals are untouched. This is required becauselld-linkis case-sensitive but CommonLibSSE-NG references libs with mixed-case names.
- Visual Studio 2022 with Desktop development with C++
git clone --recurse-submodules https://github.com/codepuncher/HoldFast.git
cd HoldFastEdit .env and set SKYRIM_MODS_FOLDER to your mod manager's staging folder:
# Vortex (Linux, Steam):
SKYRIM_MODS_FOLDER="$HOME/.local/share/Steam/steamapps/common/Vortex Mods/skyrimse"
# MO2 (Linux):
# SKYRIM_MODS_FOLDER="$HOME/MO2/mods"./scripts/build.sh
# or directly:
cmake --preset release-linux
cmake --build --preset release-linuxThe DLL lands in build/release-linux/HoldFast.dll.
./scripts/deploy.sh
# or directly (deploy.sh sources .env for you; cmake does not):
source .env && cmake --workflow --preset deployCopies HoldFast.dll, HoldFast.pdb, and HoldFast.ini into $SKYRIM_MODS_FOLDER/HoldFast/SKSE/Plugins/.
cmake --preset release-windows
cmake --build --preset release-windowsThe DLL lands in build/msvc/Release/HoldFast.dll.
Unit tests use Catch2 and run without SKSE or Skyrim installed.
cmake --preset test-windows
cmake --build --preset test-windows
ctest --preset test-windowsPrerequisites:
go install github.com/evilmartians/lefthook@latestclang-formatandclang-tidy(part of LLVM)cmake-format(sudo pacman -S cmake-formaton Arch/CachyOS;pip install cmakelangelsewhere)shellcheck(sudo pacman -S shellcheckon Arch/CachyOS)- dprint
- Vale CLI
lefthook installMarkdown checks in hooks:
dprintformats stagedREADME.mdanddocs/**/*.mdvalelints stagedREADME.mdanddocs/**/*.md(warnings and errors fail the hook)
CMake writes compile_commands.json to the build directory. Symlink it to the project root:
ln -sf build/release-linux/compile_commands.json compile_commands.jsonThe .clangd file sets --target=x86_64-pc-windows-msvc so clangd resolves Windows headers correctly on Linux.
Recommended plugins: nvim-lspconfig with clangd, clangd_extensions.nvim.
This repository uses Markdown tooling:
dprintfor formattingvalefor prose/style linting
Run locally:
dprint fmt "README.md" "docs/**/*.md"
dprint check "README.md" "docs/**/*.md"
vale --glob='*.md' README.md docsgit submodule update --remote lib/commonlibsse-ng
git add lib/commonlibsse-ng
git commit -m "chore: update CommonLibSSE-NG submodule"| Workflow | Trigger | What it does |
|---|---|---|
ci.yml |
PRs to main touching source/cmake/vcpkg |
clang-format (ubuntu) → clang-tidy + build (windows, parallel) |
release.yml |
Push of a v* tag |
Builds release DLL and publishes GitHub Release |
nexus-upload.yml |
Release publish or manual workflow_dispatch |
Uploads the packaged ZIP to Nexus Mods |
lint.yml |
PRs touching scripts, markdown docs, or markdown lint config/workflow files | shellcheck (scripts) + markdown checks (dprint and vale) |
pr-title.yml |
PR opened/edited/synchronised | Validates PR title follows Conventional Commits |
Triggered on release publish, or manually via workflow_dispatch with the version input set (e.g. 1.0.0). One-time setup:
- Upload your first file manually via the Nexus Mods web UI to create the file group.
- Add to your repository:
- Secret
NEXUSMODS_API_KEY— your Nexus Mods API key - Variable
NEXUSMODS_FILE_GROUP_ID— the file group ID
- Secret
Upload behavior is configured as:
archive_existing_file: trueprimary_mod_manager_download: trueallow_mod_manager_download: trueshow_requirements_pop_up: true
- Inspired by the hold-Start-to-open-map mechanic in Red Dead Redemption 2
- SKSE by the SKSE Team
- Address Library for SKSE plugins by meh321
- CommonLibSSE-NG by alandtse and contributors
MIT — see LICENSE.