o コマンドはカーソル行の直後に、O コマンドはカーソル行の直前に1行を追加して、挿入モードに以降するコマンドである。
1: bool ViEngine::doViCommand(const QChar &qch) 2: { 3: .... 4: switch( ch ) { 5: ..... 6: case 'o': 7: case 'O': 8: m_joinPrevEditBlock = true; 9: m_editor->doOpenLine(/*next=*/ch == 'o'); 10: cur = m_editor->textCursor(); 11: toInsertMode = true; 12: break; 13: } 14: .... 15: }
1: void ViEditView::doOpenLine(bool next) 2: { 3: QTextCursor cur = textCursor(); 4: bool EOFLine = false; 5: if( next ) { 6: if( cur.block() == cur.document()->lastBlock() ) { 7: EOFLine = true; 8: cur.movePosition(QTextCursor::EndOfBlock); 9: } else { 10: cur.movePosition(QTextCursor::NextBlock); 11: cur.movePosition(QTextCursor::StartOfBlock); 12: } 13: } else 14: cur.movePosition(QTextCursor::StartOfBlock); 15: cur.insertText("\n"); 16: if( !EOFLine ) 17: cur.movePosition(QTextCursor::Left); 18: setTextCursor(cur); 19: }