{ // General
// > defaults write -g NSTextKillRingSize -string 6
// replace yank: command with yankAndSelect for use with the kill ring
"^y" = (yankAndSelect:);
// uppercase word
"^U" = (uppercaseWord:, moveWordForward:, moveWordBackward:);
// lowercase word
"^~u" = (lowercaseWord:, moveWordForward:, moveWordBackward:);
// titlecase word
"^T" = (capitalizeWord:, moveWordForward:, moveWordBackward:);
// 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:);
// delete word after cursor
"~d" = (deleteWordForward:);
// select word
"~w" = (selectWord:);
// select word backward and modify selection
"~W" = (moveWordBackwardAndModifySelection:);
// select entire line/paragraph
"~S" = (moveToBeginningOfParagraph:, moveToEndOfParagraphAndModifySelection:, moveRightAndModifySelection:);
// select from beginning of paragrah to last character
"~s" = (moveToBeginningOfParagraph:, moveToEndOfParagraphAndModifySelection:);
// select paragraph excluding leading/trailing whitespace (same as ^$@\UF701)
"^~S" = (moveToEndOfParagraph:, insertText:, " ", selectWord:, moveBackward:, moveToBeginningOfParagraphAndModifySelection:, moveWordForwardAndModifySelection:, moveWordBackwardAndModifySelection:);
// 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 end of paragraph
"~k" = (moveToEndOfParagraphAndModifySelection:, cut:);
// blank line after current
"~o" = (moveToEndOfParagraph:, insertNewline:);
// blank line before current
"~O" = (moveToBeginningOfParagraph:, moveLeft:, insertNewline:);
// Insert blank line after paragraph
"^~o" = (moveToEndOfParagraph:, insertNewline:);
// Insert blank line above paragraph
"^~O" = (moveToBeginningOfParagraph:, moveLeft:, insertNewline:);
// 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:, moveWordRight:, moveWordLeft:, deleteBackward:, swapWithMark:, moveLeft:);
// > same commands but with arrow keys
// move line up
"^@\UF700" = (selectParagraph:, setMark:, deleteToMark:, moveLeft:, moveToBeginningOfParagraph:, yank:, moveLeft:, selectToMark:, moveLeft:);
// move line down
"^@\UF701" = (selectParagraph:, setMark:, deleteToMark:, moveToEndOfParagraph:, moveRight:, setMark:, yank:, moveLeft:, selectToMark:);
// indent line
"^@\UF703" = (setMark:, moveToBeginningOfParagraph:, insertText:, "\t", swapWithMark:, moveRight:);
// outdent line (one tab or char)
"^@\UF702" = (setMark:, moveToBeginningOfParagraph:, moveWordRight:, moveWordLeft:, deleteBackward:, swapWithMark:, moveLeft:);
// > Control-shift-command-left arrow
// Full outdent - Deletes all leading space of line/paragraph (updated)
"^$@\UF702" = (setMark:, moveToBeginningOfParagraph:, insertText:, " ", moveLeft:, selectWord:, delete:, swapWithMark:);
// Delete trailing space
"^$@\UF703" = (setMark:,moveToEndOfParagraph:, insertText:, " ", selectWord:, deleteBackward:, swapWithMark:);
// Delete leading and trailing whitespace for paragraph
"^@$\UF700" = (setMark:, moveToEndOfParagraph:, insertText:, " ", selectWord:, deleteBackward:, moveToBeginningOfParagraph:, insertText:, " ", moveLeft:, selectWord:, delete:, swapWithMark:);
// Select paragraph without leading or trailing whitespace
"^@$\UF701" = (moveToEndOfParagraph:, insertText:, " ", selectWord:, moveBackward:, moveToBeginningOfParagraphAndModifySelection:, moveWordForwardAndModifySelection:, moveWordBackwardAndModifySelection:);
// modify selection up by paragraph (Control Option Shift Up)
"^~$\UF700" = (selectParagraph:, moveParagraphBackwardAndModifySelection:);
// modify selection down by paragraph (Control Option Shift Down)
"^~$\UF701" = (selectParagraph:, moveParagraphForwardAndModifySelection:);
// modify selection left by word
"^~$\UF702" = (selectWord:, moveWordLeftAndModifySelection:);
// modify selection right by word
"^~$\UF703" = (selectWord:, moveWordRightAndModifySelection:);
// Move to first Alphanumeric character of line (new)
"@~^\UF702" = (moveToBeginningOfParagraph:,moveWordRight:, moveWordLeft:);
// Move to first non-whitespace character of line (new)
"@~\UF702" = (moveToBeginningOfParagraph:, insertText:, " ", moveLeft:, selectWord:, moveRight:, setMark:, moveToBeginningOfParagraph:, deleteForward:, swapWithMark:, moveLeft:);
// Select to first character of line with leading space (new)
"@~$\UF702" = (setMark:,moveToBeginningOfParagraph:,selectWord:, moveRight:, selectToMark:);
// Move to last non-whitespace character of paragraph (new)
"~@\UF703" = (moveToEndOfParagraph:, insertText:, " ", selectWord:, moveLeft:, setMark:, moveToEndOfParagraph:, deleteBackward:, swapWithMark:);
// Move to end of paragraph and delete trailing whitespace (new)
"^~\UF703" = (moveToEndOfParagraph:, insertText:, " ", selectWord:, deleteBackward:);
// > this will kill non alphanumeric symbols and punctuation, use only on *words*
// hyphenate next space and move to next word
"@~_" = (selectWord:,moveRight:,setMark:,moveWordRight:,moveWordLeft:,moveLeft:,selectWord:,insertText:,"-",moveWordRight:);
// bookmark
"^!" = (setMark:);
// jump to bookmark
"^@" = (swapWithMark:,centerSelectionInVisibleArea:);
// > Command Option Enter
// 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:);
"^@c" = { // Commenting commands
// comment with "//"
"/" = (moveToBeginningOfParagraph:, insertText:, "// ", moveToEndOfParagraph:, moveForward:);
// comment with "#"
"\\" = (moveToBeginningOfParagraph:, insertText:, "# ", moveToEndOfParagraph:, moveForward:);
// HTML commenting
"!" = (setMark:, swapWithMark:, delete:, insertText:, "", swapWithMark:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:);
// Css Commenting
"*" = (setMark:, swapWithMark:, delete:, insertText:, "/* ", yank:, insertText:, " */", swapWithMark:, moveRight:, moveRight:, moveRight:);
};
// bold selection (Markdown)
"@~b" = (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:);
// increase blockquote header level
"@~>" = (setMark:, moveToBeginningOfParagraph:, insertText:, "> ", swapWithMark:, moveRight:, moveRight:);
// decrease blockquote level
"@~<" = (setMark:, moveToBeginningOfParagraph:, deleteForward:, deleteForward:, swapWithMark:, moveLeft:);
// Add hard break for current line and insert newline below (new)
// "^~\U000D" = (moveToEndOfParagraph:, insertText:, " ", selectWord:, deleteBackward:, insertText:, " ", insertNewline:);
// Break line at cursor and add Markdown hard line break (new)
// "^~@\U000D" = (insertText:, " ", insertNewline:);
"^@w" = { // Multi-stroke Markdown commands
// force carriage return in text field
"\U000A" = (insertNewlineIgnoringFieldEditor:);
// force tab in text field
"\U0009" = (insertText:, "\t");
// insert reference link `[selection][[cursor]]`
"[" = (setMark:, swapWithMark:, deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, insertText:, " ", moveLeft:, insertText:, "][]", moveRight:, deleteBackward:, moveLeft:);
// insert reference `[selection]: [cursor]`
"]" = (setMark:, swapWithMark:, deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, insertText:, " ", moveLeft:, insertText:, "]: ", moveRight:, deleteBackward:);
// Unordered list item with
"+" = (setMark:, moveToBeginningOfParagraph:, insertText:, "+ ", swapWithMark:, moveRight:, moveRight:);
// Unordered list item with -
"-" = (setMark:, moveToBeginningOfParagraph:, insertText:, "- ", swapWithMark:, moveRight:, moveRight:);
// Unordered list item with *
"*" = (setMark:, moveToBeginningOfParagraph:, insertText:, "* ", swapWithMark:, moveRight:, moveRight:);
// convert current numbered list item to bullet, handles indentation
"8" = (breakUndoCoalescing, setMark:, moveToEndOfParagraph:, insertText:, "x", moveToBeginningOfParagraph:, moveWordForward:, moveRight:, moveWordForward:, moveWordBackward:, moveWordBackwardAndModifySelection:, insertText:, "* ", moveToEndOfParagraph:, deleteBackward:, swapWithMark:, moveLeft:);
// convert current bullet list item to numbered
"1" = (breakUndoCoalescing, setMark:, moveToEndOfParagraph:, insertText:, "x", moveToBeginningOfParagraph:, moveWordForward:, moveWordBackward:, moveLeftAndModifySelection:, moveLeftAndModifySelection:, insertText:, "1. ", moveToEndOfParagraph:, deleteBackward:, swapWithMark:, moveRight:);
"h" = { // Headlines (removes leading whitespace after inserting hashmarks)
// #
"1" = (setMark:, breakUndoCoalescing:, moveToBeginningOfParagraph:, insertText:, "# ", selectWord:, insertText:, " ",swapWithMark:,moveRight:,moveRight:);
// ##
"2" = (setMark:, breakUndoCoalescing:, moveToBeginningOfParagraph:, insertText:, "## ", selectWord:, insertText:, " ", swapWithMark:,moveRight:,moveRight:,moveRight:);
// ###
"3" = (setMark:, breakUndoCoalescing:, moveToBeginningOfParagraph:, insertText:, "### ", selectWord:, insertText:, " ", swapWithMark:,moveRight:,moveRight:,moveRight:,moveRight:);
// ####
"4" = (setMark:, breakUndoCoalescing:, moveToBeginningOfParagraph:, insertText:, "#### ", selectWord:, insertText:, " ", swapWithMark:,moveRight:,moveRight:,moveRight:,moveRight:,moveRight:);
// #####
"5" = (setMark:, breakUndoCoalescing:, moveToBeginningOfParagraph:, insertText:, "##### ", selectWord:, insertText:, " ", swapWithMark:,moveRight:,moveRight:,moveRight:,moveRight:,moveRight:,moveRight:);
// ######
"6" = (setMark:, breakUndoCoalescing:, moveToBeginningOfParagraph:, insertText:, "###### ", selectWord:, insertText:, " ", swapWithMark:,moveRight:,moveRight:,moveRight:,moveRight:,moveRight:,moveRight:,moveRight:);
};
// > links
// > without selected text first, these can produce a mess using multiple clipboards
// > make a text selection before you run them
"l" = { // Markdown link
// create a link for selected text, cursor between () `[selected text]([cursor])`
"t" = (setMark:, breakUndoCoalescing:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "]()", moveRight:, deleteBackward:, moveLeft:, setMark:, insertText:, "http://", selectToMark:); // link text
// create a link for selected text, inserting clipboard as url `[[cursor]selected text](clipboard contents)`
"c" = (setMark:, breakUndoCoalescing:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "](", setMark:, pasteAsPlainText:, insertText:, ")", moveRight:, deleteBackward:, moveLeft:, selectToMark:); // link with clipboard
};
"i" = { // Link as image
// TODO: Apply the fix from l,t/c above to avoid inserting the kill buffer when there's no selection
// same as lt, but with image syntax ``
"t" = (setMark:, swapWithMark:, deleteToMark:, insertText:, "![", yank:, insertText:, " ", moveLeft:, insertText:, "]()", moveRight:, deleteBackward:, moveLeft:); // image link for text
// same as lc, but with image syntax ``
"c" = (setMark:, swapWithMark:, deleteToMark:, insertText:, "", moveRight:, deleteBackward:, swapWithMark:);
};
":" = { // Reference links
// 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:);
};
};
"^@e" = { // HTML commands
// ="[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:", "", "yank:", "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: );
};
};
// Make selected text into paired HTML tag. Allows attributes, only dupes first word into closing tag (caveat: overwrites your pasteboard)
"^<" = ( setMark:, deleteToMark:, insertText:, "<", setMark:, yank:, swapWithMark:, moveWordForwardAndModifySelection:, copy:, swapWithMark:, "insertText:", ">", "setMark:", "insertText:", "", "paste:", "insertText:", ">", "swapWithMark:");
"^@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:);
};
// "$\U002B" = { // Vim Example commands (A little vim, just as an example)
// // paste after
// "p" = (moveToEndOfParagraph:,moveRight:,insertNewline:,moveLeft:, yank:);
// // paste before
// "P" = (moveToBeginningOfParagraph:, moveLeft:, yank:);
// // yank
// "y" = (yank:);
//
// "d" = { // Delete
// // '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:);
// };
//
// "5" = { // Repeat 5 times
// "d" = { // Delete
// // '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 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 before
// "P" = ( moveToBeginningOfParagraph:, moveLeft:, yank:, moveToBeginningOfParagraph:, moveLeft:, yank:, moveToBeginningOfParagraph:, moveLeft:, yank:, moveToBeginningOfParagraph:, moveLeft:, yank:, moveToBeginningOfParagraph:, moveLeft:, yank:);
// // yank
// "y" = ( yank:, yank:, yank:, yank:, yank:);
// };
// };
// repeat character before cursor
"~r" = (moveLeftAndModifySelection:, copy:, moveRight:, paste:);
// Forward delete to end of paragraph
"@$\UF728" = (deleteToEndOfParagraph:);
// Delete to beginning of paragraph
"@$\177" = (deleteToBeginningOfParagraph:);
// Right mouse click (useless, doesn't maintain cursor position)
"@~7" = (setMark:, rightMouseDown:, swapWithMark:);
// Hyper up arrow: move cursor to preceeding paragraph
// "^~$@\UF700" = (moveToBeginningOfParagraph:,moveLeft:,moveLeft:,moveToBeginningOfParagraph:);
// Hyper left arrow: move cursor to next paragraph
// "^~$@\UF701" = (moveToEndOfParagraph:,moveRight:,moveRight:,moveToBeginningOfParagraph:);
// Hyper right arrow: move cursor right twice as fast
// "^~$@\UF703" = (moveRight:,moveRight:);
// Hyper left arrow: move cursor left twice as fast
// "^~$@\UF702" = (moveLeft:,moveLeft:);
// Hyper left arrow: extend selection left by word
// "^~$@\UF702" = (selectWord:, moveWordLeftAndModifySelection:);
// Hyper right arrow: extend selection right by word
// "^~$@\UF703" = (selectWord:, moveWordRightAndModifySelection:);
// Real, honest-to-goodnes Save As...
"@~S" = (saveAs:);
"^s" = "ays_incrementalSearchForward:";
"^r" = "ays_incrementalSearchBackward:";
}