{"schemaVersion":1,"contentVersion":"3.4.0","id":"intermediate.8","languages":{"javascript":{"id":"intermediate.8","title":"Use paragraph boundaries","moduleName":"Boundaries and reusable text","tips":"","concept":"<p class=\"lead\">Distinguish blank-line paragraphs from parsed code blocks.</p><p><strong>Before this lesson:</strong> Words and operators.</p><p>A paragraph is separated by blank lines. ip names its text; ap also takes a neighbouring blank line. } moves toward the next paragraph boundary. Code braces and indentation do not define these paragraphs; use this on prose or comment sections when those blank-line boundaries fit the task.</p><h3>Example</h3><p>In two notes separated by a blank line, dip removes the current note while leaving the separator. dap removes a neighbouring separator as well. Compare the complete target.</p><p>Use Reset to try again.</p>","teaches":["motion:}","textobject:ap","textobject:ip"],"introduces":["}","{","textobject"],"constraints":[],"drills":[{"task":"Move to the boundary after the current paragraph without editing it. Finish at line 3, column 1.","hint":"Keep the text unchanged; inspect both the destination and any required outward visit.","mode":"jsx","start":"// Current review\n// Check the dates.\n\n// Archive\n// Keep this note.","startCursor":{"line":0,"ch":0},"paths":[{"keys":["}"],"tier":"idiomatic","technique":"motion:}","core":["motion:}"],"note":"These are paragraphs defined by blank lines. They are not parsed functions or code blocks."}],"kind":"navigate","land":{"line":2,"ch":0},"language":"javascript","evidence":"guided","canonicalKey":"intermediate.8#0","canonicalFingerprint":"ilnxx5"},{"task":"Remove the current paragraph and one neighbouring blank separator. Preserve the archive.","hint":"Compare the complete target, including spaces, delimiters and protected lines. Undo is available.","mode":"jsx","start":"// Current review\n// Check the dates.\n\n// Archive\n// Keep this note.","startCursor":{"line":0,"ch":0},"paths":[{"keys":["d","a","p"],"tier":"idiomatic","technique":"textobject:ap","core":["textobject:ap"],"note":"These are paragraphs defined by blank lines. They are not parsed functions or code blocks."}],"target":"// Archive\n// Keep this note.","language":"javascript","evidence":"guided","canonicalKey":"intermediate.8#1","canonicalFingerprint":"6990bu"},{"task":"Remove only the current paragraph text. Keep its blank separator and the archive.","hint":"Compare the complete target, including spaces, delimiters and protected lines. Undo is available.","mode":"jsx","start":"// Current review\n// Check the dates.\n\n// Archive\n// Keep this note.","startCursor":{"line":0,"ch":0},"paths":[{"keys":["d","i","p"],"tier":"idiomatic","technique":"textobject:ip","core":["textobject:ip"],"note":"These are paragraphs defined by blank lines. They are not parsed functions or code blocks."}],"target":"\n// Archive\n// Keep this note.","language":"javascript","evidence":"guided","canonicalKey":"intermediate.8#2","canonicalFingerprint":"12zw1a8"}]},"python":{"id":"intermediate.8","title":"Use paragraph boundaries","moduleName":"Boundaries and reusable text","tips":"","concept":"<p class=\"lead\">Distinguish blank-line paragraphs from parsed code blocks.</p><p><strong>Before this lesson:</strong> Words and operators.</p><p>A paragraph is separated by blank lines. ip names its text; ap also takes a neighbouring blank line. } moves toward the next paragraph boundary. Code braces and indentation do not define these paragraphs; use this on prose or comment sections when those blank-line boundaries fit the task.</p><h3>Example</h3><p>In two notes separated by a blank line, dip removes the current note while leaving the separator. dap removes a neighbouring separator as well. Compare the complete target.</p><p>Use Reset to try again.</p>","teaches":["motion:}","textobject:ap","textobject:ip"],"introduces":["}","{","textobject"],"constraints":[],"drills":[{"task":"Move to the boundary after the current paragraph without editing it. Finish at line 3, column 1.","hint":"Keep the text unchanged; inspect both the destination and any required outward visit.","mode":"python","start":"# Current review\n# Check the dates.\n\n# Archive\n# Keep this note.","startCursor":{"line":0,"ch":0},"paths":[{"keys":["}"],"tier":"idiomatic","technique":"motion:}","core":["motion:}"],"note":"These are paragraphs defined by blank lines. They are not parsed functions or code blocks."}],"kind":"navigate","land":{"line":2,"ch":0},"language":"python","evidence":"guided","canonicalKey":"intermediate.8#0","canonicalFingerprint":"ilnxx5"},{"task":"Remove the current paragraph and one neighbouring blank separator. Preserve the archive.","hint":"Compare the complete target, including spaces, delimiters and protected lines. Undo is available.","mode":"python","start":"# Current review\n# Check the dates.\n\n# Archive\n# Keep this note.","startCursor":{"line":0,"ch":0},"paths":[{"keys":["d","a","p"],"tier":"idiomatic","technique":"textobject:ap","core":["textobject:ap"],"note":"These are paragraphs defined by blank lines. They are not parsed functions or code blocks."}],"target":"# Archive\n# Keep this note.","language":"python","evidence":"guided","canonicalKey":"intermediate.8#1","canonicalFingerprint":"6990bu"},{"task":"Remove only the current paragraph text. Keep its blank separator and the archive.","hint":"Compare the complete target, including spaces, delimiters and protected lines. Undo is available.","mode":"python","start":"# Current review\n# Check the dates.\n\n# Archive\n# Keep this note.","startCursor":{"line":0,"ch":0},"paths":[{"keys":["d","i","p"],"tier":"idiomatic","technique":"textobject:ip","core":["textobject:ip"],"note":"These are paragraphs defined by blank lines. They are not parsed functions or code blocks."}],"target":"\n# Archive\n# Keep this note.","language":"python","evidence":"guided","canonicalKey":"intermediate.8#2","canonicalFingerprint":"12zw1a8"}]},"text":{"id":"intermediate.8","title":"Use paragraph boundaries","moduleName":"Boundaries and reusable text","tips":"","concept":"<p class=\"lead\">Distinguish blank-line paragraphs from parsed code blocks.</p><p><strong>Before this lesson:</strong> Words and operators.</p><p>A paragraph is separated by blank lines. ip names its text; ap also takes a neighbouring blank line. } moves toward the next paragraph boundary. Code braces and indentation do not define these paragraphs; use this on prose or comment sections when those blank-line boundaries fit the task.</p><h3>Example</h3><p>In two notes separated by a blank line, dip removes the current note while leaving the separator. dap removes a neighbouring separator as well. Compare the complete target.</p><p>Use Reset to try again.</p>","teaches":["motion:}","textobject:ap","textobject:ip"],"introduces":["}","{","textobject"],"constraints":[],"drills":[{"task":"Move to the boundary after the current paragraph without editing it. Finish at line 3, column 1.","hint":"Keep the text unchanged; inspect both the destination and any required outward visit.","mode":"text/plain","start":"Current review\nCheck the dates.\n\nArchive\nKeep this note.","startCursor":{"line":0,"ch":0},"paths":[{"keys":["}"],"tier":"idiomatic","technique":"motion:}","core":["motion:}"],"note":"These are paragraphs defined by blank lines. They are not parsed functions or code blocks."}],"kind":"navigate","land":{"line":2,"ch":0},"language":"text","evidence":"guided","canonicalKey":"intermediate.8#0","canonicalFingerprint":"ilnxx5"},{"task":"Remove the current paragraph and one neighbouring blank separator. Preserve the archive.","hint":"Compare the complete target, including spaces, delimiters and protected lines. Undo is available.","mode":"text/plain","start":"Current review\nCheck the dates.\n\nArchive\nKeep this note.","startCursor":{"line":0,"ch":0},"paths":[{"keys":["d","a","p"],"tier":"idiomatic","technique":"textobject:ap","core":["textobject:ap"],"note":"These are paragraphs defined by blank lines. They are not parsed functions or code blocks."}],"target":"Archive\nKeep this note.","language":"text","evidence":"guided","canonicalKey":"intermediate.8#1","canonicalFingerprint":"6990bu"},{"task":"Remove only the current paragraph text. Keep its blank separator and the archive.","hint":"Compare the complete target, including spaces, delimiters and protected lines. Undo is available.","mode":"text/plain","start":"Current review\nCheck the dates.\n\nArchive\nKeep this note.","startCursor":{"line":0,"ch":0},"paths":[{"keys":["d","i","p"],"tier":"idiomatic","technique":"textobject:ip","core":["textobject:ip"],"note":"These are paragraphs defined by blank lines. They are not parsed functions or code blocks."}],"target":"\nArchive\nKeep this note.","language":"text","evidence":"guided","canonicalKey":"intermediate.8#2","canonicalFingerprint":"12zw1a8"}]}}}