siyuan-note/siyuan · error
Conf.Language(375)
Error message
Conf.Language(375)
What it means
MoveLocalShorthands moves shorthand files into the notebook specified by boxID, but first validates the target box via IsShorthandSaveBoxAvailable. If the box is unavailable (missing/closed notebook, encrypted box that cannot accept shorthands, or invalid ID) it aborts with the localized message Conf.Language(375) ("The specified notebook is unavailable").
Source
Thrown at kernel/model/shortcuts.go:58
func MoveLocalShorthands(boxID string) (retIDs []string, err error) {
shorthandsDir := filepath.Join(util.ShortcutsPath, "shorthands")
if !gulu.File.IsDir(shorthandsDir) {
return
}
if !syncLock.TryLock() {
err = errors.New(Conf.Language(222))
return
}
defer syncLock.Unlock()
entries, err := os.ReadDir(shorthandsDir)
if nil != err {
logging.LogErrorf("read dir [%s] failed: %s", shorthandsDir, err)
return
}
if !IsShorthandSaveBoxAvailable(boxID) {
err = errors.New(Conf.Language(375))
return
}
assetsDir := filepath.Join(util.DataDir, "assets")
for _, entry := range entries {
if entry.IsDir() && "assets" == entry.Name() {
assetsEntries, readErr := os.ReadDir(filepath.Join(shorthandsDir, entry.Name()))
if nil != readErr {
logging.LogErrorf("read dir [%s] failed: %s", shorthandsDir, readErr)
continue
}
for _, assetEntry := range assetsEntries {
if assetEntry.IsDir() {
continue
}
p := filepath.Join(shorthandsDir, entry.Name(), assetEntry.Name())
assetWritePath := filepath.Join(assetsDir, assetEntry.Name())View on GitHub (pinned to 8641553a1f)
Solutions
- Pass a boxID of an existing open notebook (list via /api/notebook/lsNotebooks) before calling
- Re-select the shorthand save notebook in Settings - Collect - Shorthand so the configuration points to a valid box
- Create/reopen the missing notebook, then retry MoveLocalShorthands
Example fix
// before
MoveLocalShorthands("20240101120000-abc1234") // notebook deleted
// after
if IsShorthandSaveBoxAvailable(boxID) {
MoveLocalShorthands(boxID)
} else {
boxID = pickFirstOpenNotebook()
MoveLocalShorthands(boxID)
} Defensive patterns
Strategy: validation
Validate before calling
// Go: confirm the box exists and is usable before moving
if !IsShorthandSaveBoxAvailable(boxID) {
return fmt.Errorf("box %s unavailable for shorthands", boxID)
} Type guard
func shorthandBoxOK(boxID string) bool { return IsShorthandSaveBoxAvailable(boxID) } Try / catch
if err := MoveLocalShorthands(boxID); err != nil {
if err.Error() == Conf.Language(375) {
boxID = pickAvailableNotebook() // choose a valid notebook and retry
}
} Prevention
- Validate the configured shorthand save notebook on workspace startup
- Re-point shorthand settings after deleting/recreating notebooks
- List open notebooks and pick from that list instead of hard-coding box IDs
When it happens
Trigger: Calling MoveLocalShorthands(boxID) where boxID does not refer to an open, writable notebook — e.g. the notebook configured as the shorthand save target was deleted, closed, or its ID changed after re-creation.
Common situations: User deleted or closed the notebook that was set as the shorthand save location; workspace moved between machines so box IDs no longer match; calling the API with a hard-coded boxID from an old configuration.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
- Conf.Language(0)
- Query notebook failed
- Create notebook [%s] folder [%s] failed: %s
- Move notebook [%s] file [%s] failed: %s
- Remove notebook [%s] path [%s] failed: %s
AI-assisted analysis of siyuan-note/siyuan@8641553a1f (2026-09-11).
Data as JSON: /api/errors/d607ebf1329c8024.
Report an issue: GitHub.