{"schemaVersion":1,"contentVersion":"3.4.0","id":"boundary.2","languages":{"javascript":{"id":"boundary.2","title":"Keep the quotation","moduleName":"Words and quotations","tips":"","concept":"<h3>Before you begin</h3><p>Use <kbd>h</kbd>, <kbd>j</kbd>, <kbd>k</kbd>, <kbd>l</kbd> to move in Normal mode. <kbd>Esc</kbd> ends insertion; <kbd>u</kbd> undoes an edit. <kbd>0</kbd> reaches the line start; <kbd>2G</kbd> reaches line 2. A count repeats a movement, so <kbd>3l</kbd> moves three characters right.</p><p class=\"lead\">Keep the quotation marks. Change what they contain.</p><p>Prerequisite: changing and deleting a word. <kbd>i\"</kbd> selects the contents of the double-quoted pair containing your cursor; spaces and punctuation inside the pair belong to it. Start inside the intended quotation, especially when the line contains several pairs.</p><pre class=\"lesson-example\">const state = \"not ready\";</pre><p>From inside “not ready”, <kbd>ci\"</kbd>, then <kbd>ready now</kbd>, then <kbd>Esc</kbd> replaces the complete message. <kbd>di\"</kbd> empties it. Both preserve the quotes. <kbd>a\"</kbd> includes the quotation marks too; that is a different edit.</p><p>These exercises use ordinary double-quoted text on one line. Escaped quotes, multiline strings and nested bracket objects need their own later lessons.</p>","teaches":["textobject:i\""],"introduces":[],"constraints":[],"drills":[{"task":"Set the message to “Read the final”. Keep its quotes and the surrounding text.","hint":"Identify the quoted pair containing the cursor. Its contents can change while both quotation marks remain.","mode":"jsx","start":"const reminder = \"Keep this line unchanged.\";\nconst message = \"Read the draft\";","startCursor":{"line":1,"ch":20},"paths":[{"keys":["c","i","\"","Read the final","<Esc>"],"tier":"idiomatic","technique":"textobject:i\"","core":["textobject:i\""],"note":"The inner quotation object preserves the pair. Change replaces its contents; delete empties it."}],"target":"const reminder = \"Keep this line unchanged.\";\nconst message = \"Read the final\";","language":"javascript","situation":"boundary-v1:quotes:0","evidence":"guided","canonicalKey":"boundary.2#0","canonicalFingerprint":"q96xm4"},{"task":"Set only the current message to “Ready for review”. Keep the archived quotation.","hint":"Identify the quoted pair containing the cursor. Its contents can change while both quotation marks remain.","mode":"jsx","start":"const reminder = \"Keep this line unchanged.\";\nconst labels = { archive: \"Waiting for review\", current: \"Waiting for review\" };","startCursor":{"line":1,"ch":61},"paths":[{"keys":["c","i","\"","Ready for review","<Esc>"],"tier":"idiomatic","technique":"textobject:i\"","core":["textobject:i\""],"note":"The inner quotation object preserves the pair. Change replaces its contents; delete empties it."}],"target":"const reminder = \"Keep this line unchanged.\";\nconst labels = { archive: \"Waiting for review\", current: \"Ready for review\" };","language":"javascript","situation":"boundary-v1:quotes:1","evidence":"guided","canonicalKey":"boundary.2#1","canonicalFingerprint":"1rzjflx"},{"task":"Clear the optional note, including its punctuation. Keep the empty quotation and the rest of the line.","hint":"Identify the quoted pair containing the cursor. Its contents can change while both quotation marks remain.","mode":"jsx","start":"const reminder = \"Keep this line unchanged.\";\nconst note = \"Temporary: ask first!\";","startCursor":{"line":1,"ch":17},"paths":[{"keys":["d","i","\""],"tier":"idiomatic","technique":"textobject:i\"","core":["textobject:i\""],"note":"The inner quotation object preserves the pair. Change replaces its contents; delete empties it."}],"target":"const reminder = \"Keep this line unchanged.\";\nconst note = \"\";","language":"javascript","situation":"boundary-v1:quotes:2","evidence":"guided","canonicalKey":"boundary.2#2","canonicalFingerprint":"gxpgm"}]},"python":{"id":"boundary.2","title":"Keep the quotation","moduleName":"Words and quotations","tips":"","concept":"<h3>Before you begin</h3><p>Use <kbd>h</kbd>, <kbd>j</kbd>, <kbd>k</kbd>, <kbd>l</kbd> to move in Normal mode. <kbd>Esc</kbd> ends insertion; <kbd>u</kbd> undoes an edit. <kbd>0</kbd> reaches the line start; <kbd>2G</kbd> reaches line 2. A count repeats a movement, so <kbd>3l</kbd> moves three characters right.</p><p class=\"lead\">Keep the quotation marks. Change what they contain.</p><p>Prerequisite: changing and deleting a word. <kbd>i\"</kbd> selects the contents of the double-quoted pair containing your cursor; spaces and punctuation inside the pair belong to it. Start inside the intended quotation, especially when the line contains several pairs.</p><pre class=\"lesson-example\">state = \"not ready\"</pre><p>From inside “not ready”, <kbd>ci\"</kbd>, then <kbd>ready now</kbd>, then <kbd>Esc</kbd> replaces the complete message. <kbd>di\"</kbd> empties it. Both preserve the quotes. <kbd>a\"</kbd> includes the quotation marks too; that is a different edit.</p><p>These exercises use ordinary double-quoted text on one line. Escaped quotes, multiline strings and nested bracket objects need their own later lessons.</p>","teaches":["textobject:i\""],"introduces":[],"constraints":[],"drills":[{"task":"Set the message to “Read the final”. Keep its quotes and the surrounding text.","hint":"Identify the quoted pair containing the cursor. Its contents can change while both quotation marks remain.","mode":"python","start":"reminder = \"Keep this line unchanged.\"\nmessage = \"Read the draft\"","startCursor":{"line":1,"ch":14},"paths":[{"keys":["c","i","\"","Read the final","<Esc>"],"tier":"idiomatic","technique":"textobject:i\"","core":["textobject:i\""],"note":"The inner quotation object preserves the pair. Change replaces its contents; delete empties it."}],"target":"reminder = \"Keep this line unchanged.\"\nmessage = \"Read the final\"","language":"python","situation":"boundary-v1:quotes:0","evidence":"guided","canonicalKey":"boundary.2#0","canonicalFingerprint":"q96xm4"},{"task":"Set only the current message to “Ready for review”. Keep the archived quotation.","hint":"Identify the quoted pair containing the cursor. Its contents can change while both quotation marks remain.","mode":"python","start":"reminder = \"Keep this line unchanged.\"\nlabels = {\"archive\": \"Waiting for review\", \"current\": \"Waiting for review\"}","startCursor":{"line":1,"ch":58},"paths":[{"keys":["c","i","\"","Ready for review","<Esc>"],"tier":"idiomatic","technique":"textobject:i\"","core":["textobject:i\""],"note":"The inner quotation object preserves the pair. Change replaces its contents; delete empties it."}],"target":"reminder = \"Keep this line unchanged.\"\nlabels = {\"archive\": \"Waiting for review\", \"current\": \"Ready for review\"}","language":"python","situation":"boundary-v1:quotes:1","evidence":"guided","canonicalKey":"boundary.2#1","canonicalFingerprint":"1rzjflx"},{"task":"Clear the optional note, including its punctuation. Keep the empty quotation and the rest of the line.","hint":"Identify the quoted pair containing the cursor. Its contents can change while both quotation marks remain.","mode":"python","start":"reminder = \"Keep this line unchanged.\"\nnote = \"Temporary: ask first!\"","startCursor":{"line":1,"ch":11},"paths":[{"keys":["d","i","\""],"tier":"idiomatic","technique":"textobject:i\"","core":["textobject:i\""],"note":"The inner quotation object preserves the pair. Change replaces its contents; delete empties it."}],"target":"reminder = \"Keep this line unchanged.\"\nnote = \"\"","language":"python","situation":"boundary-v1:quotes:2","evidence":"guided","canonicalKey":"boundary.2#2","canonicalFingerprint":"gxpgm"}]},"text":{"id":"boundary.2","title":"Keep the quotation","moduleName":"Words and quotations","tips":"","concept":"<h3>Before you begin</h3><p>Use <kbd>h</kbd>, <kbd>j</kbd>, <kbd>k</kbd>, <kbd>l</kbd> to move in Normal mode. <kbd>Esc</kbd> ends insertion; <kbd>u</kbd> undoes an edit. <kbd>0</kbd> reaches the line start; <kbd>2G</kbd> reaches line 2. A count repeats a movement, so <kbd>3l</kbd> moves three characters right.</p><p class=\"lead\">Keep the quotation marks. Change what they contain.</p><p>Prerequisite: changing and deleting a word. <kbd>i\"</kbd> selects the contents of the double-quoted pair containing your cursor; spaces and punctuation inside the pair belong to it. Start inside the intended quotation, especially when the line contains several pairs.</p><pre class=\"lesson-example\">State: \"not ready\".</pre><p>From inside “not ready”, <kbd>ci\"</kbd>, then <kbd>ready now</kbd>, then <kbd>Esc</kbd> replaces the complete message. <kbd>di\"</kbd> empties it. Both preserve the quotes. <kbd>a\"</kbd> includes the quotation marks too; that is a different edit.</p><p>These exercises use ordinary double-quoted text on one line. Escaped quotes, multiline strings and nested bracket objects need their own later lessons.</p>","teaches":["textobject:i\""],"introduces":[],"constraints":[],"drills":[{"task":"Set the message to “Read the final”. Keep its quotes and the surrounding text.","hint":"Identify the quoted pair containing the cursor. Its contents can change while both quotation marks remain.","mode":"text/plain","start":"Reminder: keep this line unchanged.\nNotice: \"Read the draft\".","startCursor":{"line":1,"ch":12},"paths":[{"keys":["c","i","\"","Read the final","<Esc>"],"tier":"idiomatic","technique":"textobject:i\"","core":["textobject:i\""],"note":"The inner quotation object preserves the pair. Change replaces its contents; delete empties it."}],"target":"Reminder: keep this line unchanged.\nNotice: \"Read the final\".","language":"text","situation":"boundary-v1:quotes:0","evidence":"guided","canonicalKey":"boundary.2#0","canonicalFingerprint":"q96xm4"},{"task":"Set only the current message to “Ready for review”. Keep the archived quotation.","hint":"Identify the quoted pair containing the cursor. Its contents can change while both quotation marks remain.","mode":"text/plain","start":"Reminder: keep this line unchanged.\nArchive: \"Waiting for review\"; current: \"Waiting for review\".","startCursor":{"line":1,"ch":44},"paths":[{"keys":["c","i","\"","Ready for review","<Esc>"],"tier":"idiomatic","technique":"textobject:i\"","core":["textobject:i\""],"note":"The inner quotation object preserves the pair. Change replaces its contents; delete empties it."}],"target":"Reminder: keep this line unchanged.\nArchive: \"Waiting for review\"; current: \"Ready for review\".","language":"text","situation":"boundary-v1:quotes:1","evidence":"guided","canonicalKey":"boundary.2#1","canonicalFingerprint":"1rzjflx"},{"task":"Clear the optional note, including its punctuation. Keep the empty quotation and the rest of the line.","hint":"Identify the quoted pair containing the cursor. Its contents can change while both quotation marks remain.","mode":"text/plain","start":"Reminder: keep this line unchanged.\nOptional note: \"Temporary: ask first!\".","startCursor":{"line":1,"ch":19},"paths":[{"keys":["d","i","\""],"tier":"idiomatic","technique":"textobject:i\"","core":["textobject:i\""],"note":"The inner quotation object preserves the pair. Change replaces its contents; delete empties it."}],"target":"Reminder: keep this line unchanged.\nOptional note: \"\".","language":"text","situation":"boundary-v1:quotes:2","evidence":"guided","canonicalKey":"boundary.2#2","canonicalFingerprint":"gxpgm"}]}}}