{ // uppercase word "^U" = (uppercaseWord:); // lowercase word "^u" = (lowercaseWord:); // titlecase word "^T" = (capitalizeWord:); // uppercase current paragraph "^~U" = (setMark:, selectParagraph:, uppercaseWord:, swapWithMark:); // lowercase current paragraph "^~u" = (setMark:, selectParagraph:, lowercaseWord:, swapWithMark:); // titlecase paragraph "^~t" = (setMark:, selectParagraph:, capitalizeWord:, swapWithMark:); // delete word before cursor "^w" = (deleteWordBackward:); // select word "~w" = (selectWord:); // select entire line/paragraph "~S" = (moveToBeginningOfParagraph:, moveToEndOfParagraphAndModifySelection:, moveRightAndModifySelection:); // select from beginning of paragrah to last character "~s" = (moveToBeginningOfParagraph:, moveToEndOfParagraphAndModifySelection:); // delete line/paragraph "~d" = (selectParagraph:, delete:, moveToBeginningOfParagraph:); // copy paragraph "~y" = (setMark:, moveToBeginningOfParagraph:, moveToEndOfParagraphAndModifySelection:, copy:, swapWithMark:); // cut paragraph "~x" = (moveToBeginningOfParagraph:, moveToEndOfParagraphAndModifySelection:, cut:); // paste paragraph below "~p" = (moveToEndOfParagraph:,moveRight:,insertNewline:,moveLeft:, paste:); // paste paragraph above "~P" = (moveToBeginningOfParagraph:, moveLeft:, paste:); // select to beginning of paragraph and copy "^A" = (moveToBeginningOfParagraphAndModifySelection:, copy:); // select to end of paragraph and copy "^E" = (moveToEndOfParagraphAndModifySelection:, copy:); // cut to beginning of paragraph "~q" = (moveToBeginningOfParagraphAndModifySelection:, cut:); // cut to end of paragraph "~k" = (moveToEndOfParagraphAndModifySelection:, cut:); // blank line after current "~o" = (moveToEndOfParagraph:, insertNewline:); // blank line before current "~O" = (moveToBeginningOfParagraph:, moveLeft:, insertNewline:); "^@c" = { // commenting // comment with "//" "/" = (setMark:, moveToBeginningOfParagraph:, insertText:, "// ", swapWithMark:, moveRight:, moveRight:, moveRight:); // comment with "#" "\\" = (setMark:, moveToBeginningOfParagraph:, insertText:, "# ", swapWithMark:, moveRight:, moveRight:); // HTML Comment "!" = (setMark:, moveToBeginningOfParagraph:, insertText:, "", swapWithMark:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:); // CSS Comment "*" = (setMark:, moveToBeginningOfParagraph:, insertText:, "/* ", moveToEndOfParagraph:, insertText:, " */", swapWithMark:, moveRight:, moveRight:, moveRight:); }; // bold selection (Markdown) "@~b" = (selectWord:, setMark:, swapWithMark:, deleteToMark:, insertText:, "**", yank:, insertText:, " ", moveLeft:, insertText:, "**", moveRight:, deleteBackward:); // italicize selection (Markdown) "@~i" = (selectWord:, setMark:, swapWithMark:, deleteToMark:, insertText:, "*", yank:, insertText:, " ", moveLeft:, insertText:, "*", moveRight:, deleteBackward:); // increase markdown header level "@~=" = (setMark:, moveToBeginningOfParagraph:, insertText:, "# ", selectWord:, delete:, swapWithMark:, moveRight:); // decrease markdown header level "@~-" = (setMark:, moveToBeginningOfParagraph:, deleteForward:, swapWithMark:, moveLeft:); "^@w" = { // Other Markdown commands // force carriage return in text field "\U000D" = (insertNewlineIgnoringFieldEditor:); // force tab in text field "\U0009" = (insertText:, "\t"); "h" = { // Markdown Headlines // 1st level Headline "1" = (setMark:, moveToBeginningOfParagraph:, insertText:, "# ", selectWord:, insertText:, " ",swapWithMark:, moveToEndOfParagraph:); // 2nd level Headline "2" = (setMark:, moveToBeginningOfParagraph:, insertText:, "## ", selectWord:, insertText:, " ", swapWithMark:, moveToEndOfParagraph:); // 3rd level Headline "3" = (setMark:, moveToBeginningOfParagraph:, insertText:, "### ", selectWord:, insertText:, " ", swapWithMark:, moveToEndOfParagraph:); // 4th level Headline "4" = (setMark:, moveToBeginningOfParagraph:, insertText:, "#### ", selectWord:, insertText:, " ", swapWithMark:, moveToEndOfParagraph:); // 5th level Headline "5" = (setMark:, moveToBeginningOfParagraph:, insertText:, "##### ", selectWord:, insertText:, " ", swapWithMark:, moveToEndOfParagraph:); // 6th level Headline "6" = (setMark:, moveToBeginningOfParagraph:, insertText:, "###### ", selectWord:, insertText:, " ", swapWithMark:, moveToEndOfParagraph:); }; "l" = { // markdown linking // create a link for selected text, cursor between () "[selected text]()" "t" = (setMark:, swapWithMark:, deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, insertText:, " ", moveLeft:, insertText:, "]()", moveRight:, deleteBackward:, moveLeft:, setMark:, insertText:, "http://", selectToMark:); // create a link for selected text, inserting clipboard as url "[cursorselected text](clipboard contents)" "c" = (setMark:, swapWithMark:, deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, setMark:, insertText:, " ", moveLeft:, insertText:, "](", pasteAsPlainText:, insertText:, ")", moveRight:, deleteBackward:, swapWithMark:); }; "i" = { // link as image // same as lt, but with image syntax "![selected text](cursor)" "t" = (setMark:, swapWithMark:, deleteToMark:, insertText:, "![", yank:, insertText:, " ", moveLeft:, insertText:, "]()", moveRight:, deleteBackward:, moveLeft:); // same as lc, but with image syntax "![selected text](cursor)" "c" = (setMark:, swapWithMark:, deleteToMark:, insertText:, "![", yank:, setMark:, insertText:, " ", moveLeft:, insertText:, "](", pasteAsPlainText:, insertText:, ")", moveRight:, deleteBackward:, swapWithMark:); }; ":" = { // references // create a reference from selected text "t" = (setMark:, swapWithMark:, deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, insertText:, " ", moveLeft:, insertText:, "]: ", moveRight:, deleteBackward:); // create a reference from selected text, clipboard as url "c" = (setMark:, swapWithMark:, deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, insertText:, " ", moveLeft:, insertText:, "]: ", pasteAsPlainText:, moveRight:, deleteBackward:, swapWithMark:); }; // insert reference link "[" = (setMark:, swapWithMark:, deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, insertText:, " ", moveLeft:, insertText:, "][]", moveRight:, deleteBackward:, moveLeft:); // + bulleted list "+" = (setMark:, moveToBeginningOfParagraph:, insertText:, "+ ", swapWithMark:, moveRight:, moveRight:); // - bulleted list "-" = (setMark:, moveToBeginningOfParagraph:, insertText:, "- ", swapWithMark:, moveRight:, moveRight:); // * bulleted list "*" = (setMark:, moveToBeginningOfParagraph:, insertText:, "* ", swapWithMark:, moveRight:, moveRight:); // convert current numbered list item to bullet, handles indentation "8" = (setMark:, moveToEndOfParagraph:,insertText:, "x", moveToBeginningOfParagraph:, moveWordForward:, moveRight:, moveWordForward:, moveWordBackward:, moveWordBackwardAndModifySelection:, insertText:, "* ", moveToEndOfParagraph:,deleteBackward:, swapWithMark:, moveLeft:); // convert current bullet list item to numbered "1" = (setMark:, moveToEndOfParagraph:,insertText:, "x", moveToBeginningOfParagraph:, moveWordForward:, moveWordBackward:, moveLeftAndModifySelection:, moveLeftAndModifySelection:, insertText:, "1. ", moveToEndOfParagraph:,deleteBackward:, swapWithMark:, moveRight:); }; "^@e" = { // HTML // ="cursor" "=" = (insertText:, "=\"\"", moveLeft:); // entity &cursor; "e" = (insertText:, "&;", moveLeft:); // http:// "/" = (insertText:, "http://"); // Make previous word into paired HTML tag "t" = ( "setMark:", "moveWordBackward:", "deleteToMark:", "insertText:", "<", "yank:", "insertText:", ">", "setMark:", "insertText:", "", "swapWithMark:"); "a" = { // HTML Links // Insert HTML link for selected text, leave cursor in the href with "http://" selected "t" = ( setMark:, swapWithMark:, deleteToMark:, insertText:, "", yank:, insertText:, "", swapWithMark:, setMark:, insertText:, "http://", selectToMark: ); // Insert HTML link with clipboard as href "c" = ( setMark:, swapWithMark:, deleteToMark:, insertText:, "", yank:, insertText:, "" ); }; "i" = { // HTML Image // Insert image tag, any selected text is alt text, leave cursor in src attribute "t" = ( setMark:, swapWithMark:, deleteToMark:, insertText:, "\"",", swapWithMark: ); // Insert image tag, clipboard as src, any selected text as alt, leave cursor at beginning of alt attribute "c" = ( setMark:, swapWithMark:, deleteToMark:, insertText:, "\"",", swapWithMark: ); }; }; // Command Option Enter to continue a list item with indentation and include the same delimiter "~@\U000D" = ( breakUndoCoalescing, moveToEndOfParagraph:, insertText:, "x", moveToBeginningOfParagraph:, selectWord:, moveRightAndModifySelection:, moveWordForwardAndModifySelection:, moveWordBackwardAndModifySelection:, moveLeftAndModifySelection:, setMark:, deleteToMark:, yank:, moveToEndOfParagraph:, deleteBackward:, insertNewlineIgnoringFieldEditor:, deleteToBeginningOfParagraph:, yank:, insertText:, " ", selectWord:, insertText:, " "); // Shift Tab remove one tab (or character) from start of line (outdent) "$\U0009" = (setMark:, moveToBeginningOfParagraph:, moveRight:, deleteBackward:, swapWithMark:, moveLeft:); "^@s" = { // surround commands // wrap () with spaces "(" = (delete:, insertText:, "( ", yank:, insertText:, " ", moveLeft:, insertText:, " )", deleteForward:); // wrap () no spaces ")" = (delete:, insertText:, "( ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, ")", deleteForward:); // wrap [] with spaces "[" = (delete:, insertText:, "[ ", yank:, insertText:, " ", moveLeft:, insertText:, " ]", deleteForward:); // wrap [] no spaces "]" = (delete:, insertText:, "[ ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, "]", deleteForward:); // wrap {} with spaces "{" = (delete:, insertText:, "{ ", yank:, insertText:, " ", moveLeft:, insertText:, " }", deleteForward:); // wrap {} no spaces "}" = (delete:, insertText:, "{ ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, "}", deleteForward:); // wrap <> with spaces "<" = (delete:, insertText:, "< ", yank:, insertText:, " ", moveLeft:, insertText:, " >", deleteForward:); // wrap <> no spaces ">" = (delete:, insertText:, "< ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, ">", deleteForward:); // wrap single quotes "'" = (delete:, insertText:, "' ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, "'", deleteForward:); // wrap backticks "`" = (delete:, insertText:, "` ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, "`", deleteForward:); // wrap double quote "\"" = (delete:, insertText:, "\" ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, "\"", deleteForward:); }; // move line up "^@k" = (selectParagraph:, setMark:, deleteToMark:, moveLeft:, moveToBeginningOfParagraph:, yank:, moveLeft:, selectToMark:, moveLeft:); // move line down "^@j" = (selectParagraph:, setMark:, deleteToMark:, moveToEndOfParagraph:, moveRight:, setMark:, yank:, moveLeft:, selectToMark:); // indent line "^@l" = (setMark:, moveToBeginningOfParagraph:, insertText:, "\t", swapWithMark:, moveRight:); // outdent line (one tab or char) "^@h" = (setMark:, moveToBeginningOfParagraph:, moveRight:, deleteBackward:, swapWithMark:, moveLeft:); // move line up with arrow keys "^@\Uf700" = (selectParagraph:, setMark:, deleteToMark:, moveLeft:, moveToBeginningOfParagraph:, yank:, moveLeft:, selectToMark:, moveLeft:); // move line down with arrow keys "^@\Uf701" = (selectParagraph:, setMark:, deleteToMark:, moveToEndOfParagraph:, moveRight:, setMark:, yank:, moveLeft:, selectToMark:); // move line left with arrow keys "^@\UF703" = (setMark:, moveToBeginningOfParagraph:, insertText:, "\t", swapWithMark:, moveRight:); // move line right with arrow keys "^@\UF702" = (setMark:, moveToBeginningOfParagraph:, moveRight:, deleteBackward:, swapWithMark:, moveLeft:); // Control-shift-command-left arrow : Full outdent - Deletes all leading space (or first word) of line/paragraph "^$@\UF702" = (setMark:, moveToBeginningOfParagraph:, selectWord:, delete:, swapWithMark:, moveLeft:); // modify selection up by paragraph (Command Option Shift Up) "@~$\Uf700" = (selectParagraph:, moveParagraphBackwardAndModifySelection:); // modify selection down by paragraph (Command Option Shift Down) "@~$\Uf701" = (selectParagraph:, moveParagraphForwardAndModifySelection:); // modify selection left by word "^~$\UF702" = (selectWord:, moveWordLeftAndModifySelection:); // modify selection right by word "^~$\UF703" = (selectWord:, moveWordRightAndModifySelection:); // TextMate Command-Return (Command Enter) "@\U000D" = (moveToEndOfParagraph:, insertNewline:); // Insert blank line above paragraph (Command Shift Enter) "@$\U000D" = (moveToBeginningOfParagraph:, moveLeft:, insertNewline:); // hyphenate next space and move to next word "~_" = (selectWord:,moveRight:,setMark:,moveWordRight:,moveWordLeft:,moveLeft:,selectWord:,insertText:,"-",moveWordRight:); // bookmark "~1" = (setMark:); // jump to bookmark "~2" = (swapWithMark:,centerSelectionInVisibleArea:); "$\U001B" = { // Vim commands, experimental "d" = { // delete commands // 'dd' delete line/paragraph "d" = (setMark:, selectParagraph:, delete:, delete:, swapWithMark:); // 'd$' delete from cursor to end of graf "$" = (moveToEndOfParagraphAndModifySelection:, delete:); // 'd0' delete to beginning of paragraph "0" = (moveToBeginningOfParagraphAndModifySelection:, delete:); // 'd^' delete to beginning of paragraph "^" = (moveToBeginningOfParagraphAndModifySelection:, delete:); }; // paste after "p" = (moveToEndOfParagraph:,moveRight:,insertNewline:,moveLeft:, yank:); // paste before "P" = (moveToBeginningOfParagraph:, moveLeft:, yank:); // Yank "y" = (yank:); "5" = { // commands times 5 "d" = { // 'dd' delete line/paragraph "d" = ( selectParagraph:, delete:, delete:, moveRight:, selectParagraph:, delete:, delete:, moveRight:, selectParagraph:, delete:, delete:, moveRight:, selectParagraph:, delete:, delete:, moveRight:, selectParagraph:, delete:, delete:, moveRight:); }; // paste 5 times after "p" = ( moveToEndOfParagraph:, moveRight:, insertNewline:, moveLeft:, yank:, moveToEndOfParagraph:, moveRight:, insertNewline:, moveLeft:, yank:, moveToEndOfParagraph:, moveRight:, insertNewline:, moveLeft:, yank:, moveToEndOfParagraph:, moveRight:, insertNewline:, moveLeft:, yank:, moveToEndOfParagraph:, moveRight:, insertNewline:, moveLeft:, yank:); // paste 5 times before "P" = ( moveToBeginningOfParagraph:, moveLeft:, yank:, moveToBeginningOfParagraph:, moveLeft:, yank:, moveToBeginningOfParagraph:, moveLeft:, yank:, moveToBeginningOfParagraph:, moveLeft:, yank:, moveToBeginningOfParagraph:, moveLeft:, yank:); // paste 5 times in a row "y" = ( yank:, yank:, yank:, yank:, yank:); }; }; // repeat character before cursor "~r" = (moveLeftAndModifySelection:, copy:, moveRight:, paste:); // Forward delete to end of paragraph "@\Uf728" = (deleteToEndOfParagraph:); }