{"record":{"id":"d9998614c462df10","repo":"helix-editor/helix","slug":"register-name-does-not-support-pushing","errorCode":null,"errorMessage":"Register {name} does not support pushing","messagePattern":"Register (.+?) does not support pushing","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"helix-view/src/register.rs","lineNumber":108,"sourceCode":"                        _ => unreachable!(),\n                    },\n                )?;\n                values.reverse();\n                self.inner.insert(name, values);\n                Ok(())\n            }\n            _ => {\n                values.reverse();\n                self.inner.insert(name, values);\n                Ok(())\n            }\n        }\n    }\n\n    pub fn push(&mut self, name: char, mut value: String) -> Result<()> {\n        match name {\n            '_' => Ok(()),\n            '#' | '.' | '%' => Err(anyhow::anyhow!(\"Register {name} does not support pushing\")),\n            '*' | '+' => {\n                let clipboard_type = match name {\n                    '+' => ClipboardType::Clipboard,\n                    '*' => ClipboardType::Selection,\n                    _ => unreachable!(),\n                };\n                let contents = self\n                    .clipboard_provider\n                    .load()\n                    .get_contents(&clipboard_type)?;\n                let saved_values = self.inner.entry(name).or_default();\n\n                if !contents_are_saved(saved_values, &contents) {\n                    anyhow::bail!(\"Failed to push to register {name}: clipboard does not match register contents\");\n                }\n\n                saved_values.push(value.clone());\n                if !contents.is_empty() {","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/helix-editor/helix/blob/079a789e8cb08ead67f19e1971a1b7438b37354b/helix-view/src/register.rs#L90-L126","documentation":"Registers::push appends to a register and has the same read-only guard as write: pushing to '#', '.', or '%' fails with \"Register {name} does not support pushing\". The black-hole '_' accepts pushes and ignores them.","triggerScenarios":"An append-style yank (capital register usage or an append command) targeting '%', '.', or '#'; calling registers.push('.', s) from code.","commonSituations":"Accumulating multiple yanks into the last-inserted-text or filename register by mistake; muscle memory from appending to letter registers applied to a special register.","solutions":["Append to a named register (e.g. 'a' via its append form) or to the clipboard registers '*'/'+'.","If you meant to accumulate clipboard content, use '+' with push — but note the clipboard-consistency check that push applies.","Treat '#', '.', '%' as read-only displays of editor state."],"exampleFix":"# before\n :set-register . \"text\"  / append to '.'\n\n# after\n accumulate into a named register, e.g. append to \"a\"","handlingStrategy":"validation","validationCode":"const READ_ONLY_REGISTERS: [char; 3] = ['#', '.', '%'];\n\nfn can_push_register(name: char) -> bool {\n    !READ_ONLY_REGISTERS.contains(&name)\n}\n\nif !can_push_register(name) {\n    return Err(anyhow!(\"register '{name}' is read-only; append to a named register instead\"));\n}","typeGuard":"fn pushable_register(name: char) -> Option<char> {\n    (!matches!(name, '#' | '.' | '%')).then_some(name)\n}","tryCatchPattern":"match registers.push(name, value) {\n    Err(err) if err.to_string().contains(\"does not support pushing\") => {\n        registers.push('a', value)?; // fall back to a named accumulator\n    }\n    other => other?,\n}","preventionTips":["Intercept append operations aimed at '#', '.', '%'.","Accumulate into named registers by default; treat special registers as read-only views."],"tags":["registers","clipboard","helix","rust"],"backgroundTag":null,"analyzedSha":"079a789e8cb08ead67f19e1971a1b7438b37354b","analyzedAt":"2026-08-16T09:09:59.668Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}