hunk.code_window:   // If the current selection has marks, and the new selection doesn't change
     // them in some way, they are old and should be removed.
     if (selection.marks && properties.marks == selection.marks) {
       properties.marks = null
     }
     // Create a dictionary of the previous values for all of the properties that
     // are being changed, for the inverse operation.
     for (const k in properties) {
  
hunk.labels: keep replace replace replace replace replace replace replace keep keep
hunk.after_edit:   // Remove any properties that are already equal to the current selection. And
     // create a dictionary of the previous values for all of the properties that
  
hunk.file_path: src/transforms/operations.js
hunk.type: replace
file: 
  import assert from 'assert'
  
  export default function (state) {
    const { document, selection } = state
    const texts = document.getTexts()
    const first = texts.first()
    const second = texts.last()
    const range = selection.merge({
      anchorKey: first.key,
      anchorOffset: 2,
      focusKey: second.key,
      focusOffset: 2
    })
  
    const next = state
      .transform()
      .moveTo(range)
      .unwrapInline('hashtag')
      .apply()
  
    assert.deepEqual(
      next.selection.toJS(),
      range.toJS()
    )
  
    return next
  }
  