├── .gitignore ├── document_keybindings.rb ├── cheatset_keybindings.rb ├── keybindings.html ├── DefaultKeyBinding.dict ├── readme.md └── keybindings.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | todo.taskpaper 3 | keybindings-dash.rb 4 | Keybindings.docset 5 | -------------------------------------------------------------------------------- /document_keybindings.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | # encoding: utf-8 3 | 4 | require 'rubygems' 5 | require 'shellwords' 6 | require 'fileutils' 7 | 8 | def class_exists?(class_name) 9 | klass = Module.const_get(class_name) 10 | return klass.is_a?(Class) 11 | rescue NameError 12 | return false 13 | end 14 | 15 | class ::String 16 | def cap_first 17 | sub(/^\w/) do |m| 18 | m.upcase 19 | end 20 | end 21 | end 22 | 23 | if class_exists? 'Encoding' 24 | Encoding.default_external = Encoding::UTF_8 if Encoding.respond_to?('default_external') 25 | Encoding.default_internal = Encoding::UTF_8 if Encoding.respond_to?('default_internal') 26 | end 27 | 28 | infile = 'DefaultKeyBinding.dict' 29 | begin 30 | input = IO.read(infile).force_encoding('utf-8') 31 | rescue 32 | input = IO.read(infile) 33 | end 34 | 35 | date = Time.now.strftime('%m/%d/%Y') 36 | 37 | output = '' 38 | style =< 49 | 50 | STYLE 51 | 52 | blogintro =<\s*(.*)$} 147 | note << Regexp.last_match(1) 148 | elsif line =~ /^\s*\};\s*$/ 149 | level -= 1 150 | if level == 1 151 | subgroup_command = '' 152 | subgroup_desc = '' 153 | output += "|||||\n" 154 | elsif level.zero? 155 | # output += "[ #{group_desc} ]\n\n" 156 | group_command = '' 157 | group_desc = '' 158 | end 159 | next 160 | elsif line =~ %r{^\s*//\s*(.*)} 161 | desc = Regexp.last_match(1).cap_first 162 | next 163 | elsif line =~ %r{^\s*"([^"]+)"\s*=\s*\{.*?//\s*(.*)} 164 | level += 1 165 | if level == 1 166 | group_command = translate_command(Regexp.last_match(1)) 167 | group_desc = Regexp.last_match(2).cap_first 168 | output += "\n\n|#{group_desc} (#{group_command})||||\n|:----:|:----:|:----:|:----|\n" 169 | elsif level == 2 170 | subgroup_command = translate_command(Regexp.last_match(1)) 171 | subgroup_desc = Regexp.last_match(2).cap_first 172 | output += "|#{subgroup_desc} (#{subgroup_command})||||\n" 173 | else 174 | prefix = Regexp.last_match(1) 175 | end 176 | next 177 | elsif line =~ /^\s*"([^"]+)"\s*=\s*\(/ 178 | command = translate_command(Regexp.last_match(1)) 179 | out_note = note.empty? ? '' : " (#{translate_command(note.join(' '), note: true)})" 180 | if level.zero? 181 | toplevel.push("|#{command}|#{desc}#{out_note}|\n") 182 | else 183 | command = "#{prefix},#{command}" if prefix 184 | output += "|#{group_command} |#{subgroup_command} |#{command} |#{desc}#{out_note}|\n" 185 | end 186 | note = [] 187 | end 188 | } 189 | topoutput = "|General Commands||\n|Key|Function|\n|:----:|:----|\n" 190 | toplevel.each {|line| 191 | topoutput += line 192 | } 193 | # topoutput += "[ General Commands ]\n\n" 194 | 195 | # output = style + topoutput + output 196 | 197 | 198 | output = topoutput + output 199 | htmlout = %x{echo #{e_sh output}|/usr/local/bin/multimarkdown} 200 | 201 | File.open('keybindings.md','w') {|f| 202 | f.puts blogintro 203 | f.puts intro + htmlout + outro 204 | f.puts blogoutro 205 | } 206 | 207 | outfile = File.new('readme.md','w') 208 | outfile.puts intro 209 | outfile.puts htmlout 210 | outfile.puts outro 211 | outfile.close 212 | 213 | if ENV['USER'] == 'ttscoff' 214 | FileUtils.cp('keybindings.md',File.expand_path('~/Sites/dev/bt/source/_projects')) 215 | end 216 | -------------------------------------------------------------------------------- /cheatset_keybindings.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ruby 2 | # encoding: utf-8 3 | 4 | require 'shellwords' 5 | require 'fileutils' 6 | require 'optparse' 7 | 8 | def class_exists?(class_name) 9 | klass = Module.const_get(class_name) 10 | klass.is_a?(Class) 11 | rescue NameError 12 | false 13 | end 14 | 15 | if class_exists? 'Encoding' 16 | Encoding.default_external = Encoding::UTF_8 if Encoding.respond_to?('default_external') 17 | Encoding.default_internal = Encoding::UTF_8 if Encoding.respond_to?('default_internal') 18 | end 19 | 20 | class ::String 21 | def esc 22 | gsub(/'/, '\\\\\'').gsub(/ \(new\)/i, '').gsub(/(#+)/, '`\1`').gsub(/\\(?=[\[!])/, '').strip 23 | end 24 | 25 | def create_command 26 | gsub(/ +/, ' ').esc 27 | end 28 | end 29 | 30 | ## 31 | ## Generate a cheatset input file 32 | ## 33 | class DashGenerator 34 | attr_writer :modifier_format 35 | 36 | def initialize(options) 37 | @options = options 38 | 39 | infile = @options[:bindings_file] 40 | 41 | begin 42 | @input = IO.read(infile).force_encoding('utf-8') 43 | rescue 44 | @input = IO.read(infile) 45 | end 46 | 47 | @bindings = { 48 | id: 'General Commands', 49 | bindings: [], 50 | groups: [] 51 | } 52 | end 53 | 54 | def parse 55 | level = 0 56 | prefix = false 57 | group_command = '' 58 | group_desc = '' 59 | subgroup_command = '' 60 | subgroup_desc = '' 61 | desc = '' 62 | command = '' 63 | note = '' 64 | group = nil 65 | 66 | @input.split("\n").each do |line| 67 | next if line =~ /^\s*$/ || line =~ %r{^\s*//\s*(TODO)} 68 | 69 | case line 70 | when %r{^\s*//\s*>\s*(.*)$} 71 | note += Regexp.last_match(1) 72 | when /^\s*\};\s*$/ 73 | level -= 1 74 | case level 75 | when 1 76 | subgroup_command = '' 77 | subgroup_desc = '' 78 | when 0 79 | group_command = '' 80 | group_desc = '' 81 | end 82 | when %r{^\s*//\s*(.*)} 83 | desc = Regexp.last_match(1) 84 | when %r{^\s*"([^"]+)"\s*=\s*\{.*?//\s*(.*)} 85 | unless group.nil? 86 | @bindings[:groups].push(group) 87 | group = nil 88 | end 89 | 90 | m = Regexp.last_match 91 | level += 1 92 | case level 93 | when 1 94 | group_command = translate_command(m[1]) 95 | group_desc = m[2] 96 | group = { 97 | id: group_desc, 98 | command: group_command, 99 | bindings: [] 100 | } 101 | when 2 102 | subgroup_command = translate_command(m[1]) 103 | subgroup_desc = m[2] 104 | group = { 105 | id: subgroup_desc, 106 | command: subgroup_command, 107 | bindings: [] 108 | } 109 | else 110 | prefix = m[1] 111 | end 112 | when /^\s*"([^"]+)"\s*=\s*\(/ 113 | command = translate_command(Regexp.last_match(1)) 114 | case level 115 | when 0 116 | entry = { 117 | command: "#{subgroup_command} #{command}", 118 | name: desc, 119 | note: note 120 | } 121 | @bindings[:bindings].push(entry) 122 | else 123 | command = "#{prefix} #{command}" if prefix 124 | entry = { 125 | command: "#{group_command} #{subgroup_command} #{command}", 126 | name: desc, 127 | note: note 128 | } 129 | group[:bindings].push(entry) 130 | end 131 | note = '' 132 | end 133 | end 134 | end 135 | 136 | def translate_command(str) 137 | case @options[:format] 138 | when :symbol 139 | translate_command_symbol(str) 140 | else 141 | translate_command_name(str) 142 | end 143 | end 144 | 145 | def translate_command_name(str) 146 | str = str.gsub(/~/, 'OPT+').gsub(/@/, 'CMD+').gsub(/\$/, 'SHIFT+').gsub(/\^/, 'CTRL+') 147 | str = str.gsub('\UF700', 'UP').gsub('\UF701', 'DOWN').gsub('\UF703', 'RIGHT').gsub('\UF702', 'LEFT') 148 | str = str.gsub('\U0009', 'TAB').gsub('\U000D', 'RETURN').gsub('\U001B', 'ESC').gsub('\U000A', 'ENTER') 149 | str = str.gsub('\UF728', 'DEL').gsub('\177', 'BACKSPACE') 150 | str.gsub('\040', 'SPACE').gsub(/(?<=\+)([A-Z])$/, 'SHIFT+\\1').gsub(/([a-z])$/, &:upcase) 151 | end 152 | 153 | def translate_command_symbol(str) 154 | str = str.gsub(/~/, '⌥').gsub(/@/, '⌘').gsub(/\$/, '⇧').gsub(/\^/, '⌃') 155 | str = str.gsub('\UF700', '↑').gsub('\UF701', '↓').gsub('\UF703', '→').gsub('\UF702', '←') 156 | str = str.gsub('\U0009', '⇥').gsub('\U000D', '↩').gsub('\U001B', '⎋').gsub('\U000A', '␍') 157 | str = str.gsub('\UF728', '⌦').gsub('\177', '⌫').gsub('\040', '␣') 158 | str.gsub(/([\[\]|])/, '\\\\\1').gsub(/([A-Z])/, '⇧\\1').downcase 159 | end 160 | 161 | def create_entry(bnd) 162 | out = < 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | General Commands 10 | 11 | 12 | Key 13 | Function 14 | 15 | 16 | 17 | 18 | 19 | ⌃y 20 | replace yank: command with yankAndSelect for use with the kill ring ( defaults write -g NSRepeatCountBinding -string “^u” defaults write -g NSTextKillRingSize -int 6) 21 | 22 | 23 | ⌃⇧u 24 | uppercase word 25 | 26 | 27 | ⌃⌥u 28 | lowercase word 29 | 30 | 31 | ⌃⌥⇧u 32 | uppercase current paragraph 33 | 34 | 35 | ⌃w 36 | delete word before cursor 37 | 38 | 39 | ⌥w 40 | select word 41 | 42 | 43 | ⌥⇧w 44 | select word backward and modify selection 45 | 46 | 47 | ⌥⇧s 48 | select entire line/paragraph 49 | 50 | 51 | ⌥s 52 | select from beginning of paragraph to last character 53 | 54 | 55 | ⌃⌥⇧s 56 | select paragraph excluding leading/trailing whitespace (same as ^$@\UF701) 57 | 58 | 59 | ⌥d 60 | delete line/paragraph 61 | 62 | 63 | ⌥y 64 | copy paragraph 65 | 66 | 67 | ⌥x 68 | cut paragraph 69 | 70 | 71 | ⌥p 72 | paste paragraph below 73 | 74 | 75 | ⌥⇧p 76 | paste paragraph above 77 | 78 | 79 | ⌃⇧a 80 | select to beginning of paragraph and copy 81 | 82 | 83 | ⌃⇧e 84 | select to end of paragraph and copy 85 | 86 | 87 | ⌥q 88 | cut to beginning of paragraph 89 | 90 | 91 | ⌥k 92 | cut to end of paragraph 93 | 94 | 95 | ⌥o 96 | blank line after current 97 | 98 | 99 | ⌥⇧o 100 | blank line before current 101 | 102 | 103 | ⌃⌘↑ 104 | move line up ( same commands but with arrow keys) 105 | 106 | 107 | ⌃⌘↓ 108 | move line down 109 | 110 | 111 | ⌃⌘→ 112 | indent line 113 | 114 | 115 | ⌃⌘← 116 | outdent line (one tab or char) 117 | 118 | 119 | ⌃⇧⌘← 120 | Full outdent - Deletes all leading space of line/paragraph (updated) ( Control-shift-command-left arrow) 121 | 122 | 123 | ⌃⇧⌘→ 124 | Delete trailing space ( Control-shift-command-right arrow) 125 | 126 | 127 | ⌃⌘⇧↑ 128 | Delete leading and trailing whitespace for paragraph ( Control-shift-command-up arrow) 129 | 130 | 131 | ⌃⌘⇧↓ 132 | Select paragraph without leading or trailing whitespace ( Control-shift-command-down arrow) 133 | 134 | 135 | ⌃⌥⇧↑ 136 | modify selection up by paragraph (Control Option Shift Up) ( Control-option-shift-up arrow) 137 | 138 | 139 | ⌃⌥⇧↓ 140 | modify selection down by paragraph (Control Option Shift Down) ( Control-option-shift-down arrow) 141 | 142 | 143 | ⌃⌥⇧← 144 | modify selection left by word ( Control-option-shift-left arrow) 145 | 146 | 147 | ⌃⌥⇧→ 148 | modify selection right by word ( Control-option-shift-right arrow) 149 | 150 | 151 | ⌘⌥⌃← 152 | Move to first Alphanumeric character of line ( Control-option-up arrow) 153 | 154 | 155 | ⌘⌥← 156 | Move to first non-whitespace character of line 157 | 158 | 159 | ⌘⌥⇧← 160 | Select to first word of paragraph modifying selection 161 | 162 | 163 | ⌘⌥⇧→ 164 | Select to end of paragraph modifying selection 165 | 166 | 167 | ⌥⌘→ 168 | Move to last non-whitespace character of paragraph 169 | 170 | 171 | ⌃⌥→ 172 | Move to end of paragraph and delete trailing whitespace 173 | 174 | 175 | ⌘↩ 176 | TextMate Command-Return (Command Return) 177 | 178 | 179 | ⌘⇧↩ 180 | Insert blank line above paragraph (Command Shift Return) 181 | 182 | 183 | ⇧⌥␣ 184 | Insert space and uppercase next character (Shift-Option-Space) 185 | 186 | 187 | ⌃⇧␣ 188 | Uppercase next character (Control-Shift-Space) 189 | 190 | 191 | ⌘⌥_ 192 | hyphenate next space and move to next word ( this will kill non alphanumeric symbols and punctuation, use only on words) 193 | 194 | 195 | ⌥1 196 | bookmark 197 | 198 | 199 | ⌥2 200 | jump to bookmark 201 | 202 | 203 | ⌥⌘↩ 204 | Continue a list item with indentation and include the same delimiter ( Command Option Return) 205 | 206 | 207 | ⇧⇥ 208 | remove one tab (or character) from start of line (outdent) ( Shift Tab) 209 | 210 | 211 | ⌘⌥b 212 | bold selection (Markdown) 213 | 214 | 215 | ⌘⌥i 216 | italicize selection (Markdown) 217 | 218 | 219 | ⌘⌥` 220 | backtick selection (Markdown) 221 | 222 | 223 | ⌃⌘↩ 224 | break line with double space (Markdown) (Control-Command-Return) 225 | 226 | 227 | ⌘⌥= 228 | increase markdown header level 229 | 230 | 231 | ⌘⌥- 232 | decrease markdown header level 233 | 234 | 235 | ⌘⌥> 236 | increase blockquote header level 237 | 238 | 239 | ⌘⌥< 240 | decrease blockquote level 241 | 242 | 243 | ⌃< 244 | Make selected text into paired HTML tag. Allows attributes, only dupes first word into closing tag (caveat: overwrites your pasteboard) 245 | 246 | 247 | ⌥r 248 | repeat character before cursor 249 | 250 | 251 | ⌘⇧⌦ 252 | Forward delete to end of paragraph 253 | 254 | 255 | ⌘⇧⌫ 256 | Delete to beginning of paragraph ( Command-shift-delete) 257 | 258 | 259 | ⌘⌥7 260 | Right mouse click (useless, doesn’t maintain cursor position) 261 | 262 | 263 | ⌘⌥⇧s 264 | Real, honest-to-goodnes Save As… 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 |
Commenting commands (⌃⌘c)
⌃⌘c/comment with “//”
⌃⌘c\comment with “#”
⌃⌘c!HTML commenting
⌃⌘c*Css Commenting
310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 |
Multi-stroke Markdown commands (⌃⌘w)
⌃⌘wforce carriage return in text field
⌃⌘wforce tab in text field
⌃⌘w[insert reference link [selection][[cursor]]
⌃⌘w]insert reference [selection]: [cursor]
⌃⌘w+Unordered list item with +
⌃⌘w-Unordered list item with -
⌃⌘w*Unordered list item with *
⌃⌘w8convert current numbered list item to bullet, handles indentation
⌃⌘w1convert current bullet list item to numbered
Headlines (removes leading whitespace after inserting hashmarks) (h)
⌃⌘wh1#
⌃⌘wh2##
⌃⌘wh3###
⌃⌘wh4####
⌃⌘wh5#####
⌃⌘wh6######
Markdown link (l)
⌃⌘wltcreate a link for selected text, cursor between () [selected text]([cursor]) ( links without selected text first, these can produce a mess using multiple clipboards make a text selection before you run them)
⌃⌘wlccreate a link for selected text, inserting clipboard as url [[cursor]selected text](clipboard contents)
⌃⌘wsSearchLink Basic Link
Link as image (i)
⌃⌘witsame as lt, but with image syntax \!\[selected text]([cursor])
⌃⌘wicsame as lc, but with image syntax \!\[selected text](clipboard)
⌃⌘widsame as lc, but with image syntax and “+” for Droplr links \!\[selected text](clipboard+)
Reference links (:)
⌃⌘w:tcreate a reference from selected text
⌃⌘w:ccreate a reference from selected text, clipboard as url
490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 |
HTML commands (⌃⌘e)
⌃⌘e==“[cursor]”
⌃⌘eeentity &[cursor];
⌃⌘e/http://
⌃⌘etMake previous word into paired HTML tag
HTML Links (a)
⌃⌘eatInsert HTML link for selected text, leave cursor in the href with “http://” selected
⌃⌘eacInsert HTML link with clipboard as href
HTML Image (i)
⌃⌘eitInsert image tag, any selected text is alt text, leave cursor in src attribute
⌃⌘eicInsert image tag, clipboard as src, any selected text as alt, leave cursor at beginning of alt attribute
568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 |
Surround commands (⌃⌘s)
⌃⌘s(wrap () with spaces
⌃⌘s)wrap () no spaces
⌃⌘s[wrap [] with spaces
⌃⌘s]wrap [] no spaces
⌃⌘s{wrap {} with spaces
⌃⌘s}wrap {} no spaces
⌃⌘s<wrap <> with spaces
⌃⌘s>wrap <> no spaces
⌃⌘swrap single quotes
⌃⌘s`wrap backticks
646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 |
Jekyll Shortcuts (⌃⌘j)
⌃⌘jpPullquote Liquid Tag (new)
⌃⌘jrRaw Liquid Tag (new)
⌃⌘j⇧rRaw Tag for entire paragraph (new)
682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 |
TaskPaper Tags (⌃⌘t)
⌃⌘td@done (new)
⌃⌘tp// @priority() (new)
⌃⌘tn@na (new)
⌃⌘tt@today (new)
724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 |
SearchLink commands (⌃⌘g)
⌃⌘ggSearchLink Syntax: Google (new)
⌃⌘g⇧aSearchLink Syntax: Amazon (new)
Apple (a)
⌃⌘gaiSearchLink Syntax: iOS App (new)
⌃⌘gamSearchLink Syntax: Mac App Store (new)
⌃⌘gpSearchLink Syntax: Software (new)
⌃⌘gmSearchLink Syntax: IMDB (new)
⌃⌘gbSearchLink Syntax: BrettTerpstra.com (new)
⌃⌘gpSearchLink Syntax: BrettTerpstra.com Projects (new)
⌃⌘gSearchLink Syntax: Twitter User (new)
802 | -------------------------------------------------------------------------------- /DefaultKeyBinding.dict: -------------------------------------------------------------------------------- 1 | // Set a binding for repeating action (e.g.: opt-r, 5, right arrow) 2 | // $ defaults write -g NSRepeatCountBinding -string "~r" 3 | { 4 | // General 5 | // > defaults write -g NSTextKillRingSize -int 6 6 | // replace yank: command with yankAndSelect for use with the kill ring 7 | "^y" = (yankAndSelect:); 8 | // Regular yank, only insert last register and don't select 9 | "^~y" = (yank:); 10 | // Uppercase word 11 | "^U" = (uppercaseWord:, moveWordForward:, moveWordBackward:); 12 | // Lowercase word 13 | "^~u" = (lowercaseWord:, moveWordForward:, moveWordBackward:); 14 | // Titlecase word 15 | "^~t" = (capitalizeWord:, moveWordForward:, moveWordBackward:); 16 | 17 | // Uppercase current paragraph 18 | "^~U" = (setMark:, selectParagraph:, uppercaseWord:, swapWithMark:); 19 | // Lowercase current paragraph 20 | // "^~u" = (setMark:, selectParagraph:, lowercaseWord:, swapWithMark:); 21 | // titlecase paragraph 22 | "^~T" = (setMark:, selectParagraph:, capitalizeWord:, swapWithMark:); 23 | 24 | // delete word before cursor 25 | "^w" = (deleteWordBackward:); 26 | // select word 27 | "~w" = (selectWord:); 28 | // select word backward and modify selection 29 | "~W" = (setMark:, moveWordBackward:, selectToMark:); 30 | // select entire line/paragraph 31 | "~S" = (selectParagraph:); 32 | // select from beginning of paragraph to last character 33 | "~s" = (moveToBeginningOfParagraph:, moveToEndOfParagraphAndModifySelection:); 34 | // select paragraph excluding leading/trailing whitespace (same as ^$@\UF701) 35 | "^~S" = (moveToEndOfParagraph:, insertText:, " ", selectWord:, moveBackward:, moveToBeginningOfParagraphAndModifySelection:, moveWordForwardAndModifySelection:, moveWordBackwardAndModifySelection:); 36 | // delete line/paragraph 37 | "~d" = (selectParagraph:, delete:, moveToBeginningOfParagraph:); 38 | // delete to beginning of paragraph (if this isn't already defined?) 39 | "^u" = (deleteToBeginningOfParagraph:); 40 | // copy paragraph 41 | "~y" = (setMark:, moveToBeginningOfParagraph:, moveToEndOfParagraphAndModifySelection:, copy:, swapWithMark:); 42 | // cut paragraph 43 | "~x" = (moveToBeginningOfParagraph:, moveToEndOfParagraphAndModifySelection:, cut:); 44 | // paste paragraph below 45 | "~p" = (moveToEndOfParagraph:,moveRight:,insertNewline:,moveLeft:, paste:); 46 | // yank (from kill ring) paragraph below 47 | "^~p" = (moveToEndOfParagraph:,moveRight:,insertNewline:,moveLeft:, yank:); 48 | // paste paragraph above 49 | "~P" = (moveToBeginningOfParagraph:, moveLeft:, paste:); 50 | // yank (from kill ring) paragraph above 51 | "^~P" = (moveToBeginningOfParagraph:, moveLeft:, yank:); 52 | // select to beginning of paragraph and copy 53 | "^A" = (moveToBeginningOfParagraphAndModifySelection:, copy:); 54 | // select to end of paragraph and copy 55 | "^E" = (moveToEndOfParagraphAndModifySelection:, copy:); 56 | // cut to beginning of paragraph 57 | "~q" = (moveToBeginningOfParagraphAndModifySelection:, cut:); 58 | // cut to end of paragraph 59 | "~k" = (moveToEndOfParagraphAndModifySelection:, cut:); 60 | 61 | // blank line after current 62 | "~o" = (moveToEndOfParagraph:, insertNewline:); 63 | // blank line before current 64 | "~O" = (moveToBeginningOfParagraph:, moveLeft:, insertNewline:); 65 | 66 | // move line up 67 | "^@k" = (selectParagraph:, setMark:, deleteToMark:, moveLeft:, moveToBeginningOfParagraph:, yank:, moveLeft:, selectToMark:, moveLeft:); 68 | // move line down 69 | "^@j" = (selectParagraph:, setMark:, deleteToMark:, moveToEndOfParagraph:, moveRight:, setMark:, yank:, moveLeft:, selectToMark:); 70 | // indent line 71 | "^@l" = (setMark:, moveToBeginningOfParagraph:, insertText:, "\t", swapWithMark:, moveRight:); 72 | // outdent line (one tab or char) 73 | "^@h" = (setMark:, moveToBeginningOfParagraph:, moveRight:, deleteBackward:, swapWithMark:, moveLeft:); 74 | 75 | // > same commands but with arrow keys 76 | // move line up 77 | "^@\UF700" = (selectParagraph:, setMark:, deleteToMark:, moveLeft:, moveToBeginningOfParagraph:, yank:, moveLeft:, selectToMark:, moveLeft:); 78 | // move line down 79 | "^@\UF701" = (selectParagraph:, setMark:, deleteToMark:, moveToEndOfParagraph:, moveRight:, setMark:, yank:, moveLeft:, selectToMark:); 80 | // indent line 81 | "^@\UF703" = (setMark:, moveToBeginningOfParagraph:, insertText:, "\t", swapWithMark:, moveRight:); 82 | // outdent line (one tab or char) 83 | "^@\UF702" = (setMark:, moveToBeginningOfParagraph:, moveRight:, deleteBackward:, swapWithMark:, moveLeft:); 84 | 85 | // > Control-shift-command-left arrow 86 | // Full outdent - Deletes all leading space of line/paragraph (updated) 87 | "^$@\UF702" = (setMark:, moveToBeginningOfParagraph:, insertText:, " ", moveLeft:, selectWord:, delete:, swapWithMark:); 88 | // > Control-shift-command-right arrow 89 | // Delete trailing space 90 | "^$@\UF703" = (setMark:,moveToEndOfParagraph:, insertText:, " ", selectWord:, deleteBackward:, swapWithMark:); 91 | // > Control-shift-command-up arrow 92 | // Delete leading and trailing whitespace for paragraph 93 | "^@$\UF700" = (setMark:, moveToEndOfParagraph:, insertText:, " ", selectWord:, deleteBackward:, moveToBeginningOfParagraph:, insertText:, " ", moveLeft:, selectWord:, delete:, swapWithMark:); 94 | // > Control-shift-command-down arrow 95 | // Select paragraph without leading or trailing whitespace 96 | "^@$\UF701" = (moveToEndOfParagraph:, insertText:, " ", selectWord:, moveBackward:, moveToBeginningOfParagraphAndModifySelection:, moveWordForwardAndModifySelection:, moveWordBackwardAndModifySelection:); 97 | // > Control-option-shift-up arrow 98 | // modify selection up by paragraph (Control Option Shift Up) 99 | "^~$\UF700" = (selectParagraph:, moveParagraphBackwardAndModifySelection:); 100 | // > Control-option-shift-down arrow 101 | // modify selection down by paragraph (Control Option Shift Down) 102 | "^~$\UF701" = (selectParagraph:, moveParagraphForwardAndModifySelection:); 103 | // > Control-option-shift-left arrow 104 | // modify selection left by word 105 | "^~$\UF702" = (selectWord:, moveWordLeftAndModifySelection:); 106 | // > Control-option-shift-right arrow 107 | // modify selection right by word 108 | "^~$\UF703" = (selectWord:, moveWordRightAndModifySelection:); 109 | // > Control-option-up arrow 110 | // expand the selection left and right by word (stupid experiment) 111 | // "^~\UF700" = (selectWord:, moveWordBackwardAndModifySelection:, setMark:, swapWithMark:, moveWordForwardAndModifySelection:); 112 | 113 | // > Control-option-command-left arrow 114 | // Move to first Alphanumeric character of line 115 | "@~^\UF702" = (moveToBeginningOfParagraph:,moveWordRight:, moveWordLeft:); 116 | // > Control-options-left arrow 117 | // Move to first non-whitespace character of line 118 | "@~\UF702" = (moveToBeginningOfParagraph:, insertText:, " ", moveLeft:, selectWord:, moveRight:, setMark:, moveToBeginningOfParagraph:, deleteForward:, swapWithMark:, moveLeft:); 119 | // > Options-shift-command-left arrow 120 | // Select to first word of paragraph modifying selection 121 | "@~$\UF702" = (setMark:,moveToBeginningOfParagraph:,moveWordRight:, moveWordLeft:, selectToMark:); 122 | // > Option-shift-command-right arrow 123 | // Select to end of paragraph modifying selection 124 | "@~$\UF703" = (setMark:,moveToEndOfParagraph:,selectToMark:); 125 | // > Option-command-right arrow 126 | // Move to last non-whitespace character of paragraph 127 | "~@\UF703" = (moveToEndOfParagraph:, insertText:, " ", selectWord:, moveLeft:, setMark:, moveToEndOfParagraph:, deleteBackward:, swapWithMark:); 128 | // > Control-option-right arrow 129 | // Move to end of paragraph and delete trailing whitespace 130 | "^~\UF703" = (moveToEndOfParagraph:, insertText:, " ", selectWord:, deleteBackward:); 131 | 132 | // TextMate Command-Return (Command Return) 133 | "@\U000D" = (moveToEndOfParagraph:, insertNewline:); 134 | // Insert blank line above paragraph (Command Shift Return) 135 | "@$\U000D" = (moveToBeginningOfParagraph:, moveLeft:, insertNewline:); 136 | // Insert space and uppercase next character (Shift-Option-Space) 137 | "$~\040" = (insertText:, " ", moveForward:, insertText:, " ", moveWordBackward:, capitalizeWord:, moveForward:, deleteForward:, moveBackward:); 138 | // Uppercase next character (Control-Shift-Space) 139 | "^$\040" = (insertText:, " ", moveForward:, insertText:, " ", moveWordBackward:, capitalizeWord:, moveForward:, deleteForward:, moveBackward:, deleteBackward:, moveForward:); 140 | // Move cursor forward with spacebar (shift-space) 141 | "^~\040" = (moveForward:); 142 | 143 | "^~c" = { // multi-stroke casing commands 144 | // snake_case to camelCase (delete forward and capitalize) 145 | "c" = (deleteForward:, insertText:, " ", moveForward:, insertText:, " ", moveWordBackward:, capitalizeWord:, moveForward:, deleteForward:, moveBackward:, deleteBackward:, moveForward:); 146 | // snake_case word break 147 | "s" = (insertText:, "_ " , moveForward:, insertText:, " ", moveWordBackward:, lowercaseWord:, moveForward:, deleteForward:, moveBackward:, deleteBackward:); 148 | }; 149 | 150 | // > this will kill non alphanumeric symbols and punctuation, use only on *words* 151 | // hyphenate next space and move to next word 152 | "@~_" = (selectWord:,moveRight:,setMark:,moveWordRight:,moveWordLeft:,moveLeft:,selectWord:,insertText:,"-",moveWordRight:); 153 | 154 | // bookmark 155 | "~1" = (setMark:); 156 | // jump to bookmark 157 | "~2" = (swapWithMark:,centerSelectionInVisibleArea:); 158 | 159 | // > Command Option Return 160 | // Continue a list item with indentation and include the same delimiter 161 | "~@\U000D" = ( breakUndoCoalescing, moveToEndOfParagraph:, insertText:, "x", moveToBeginningOfParagraph:, selectWord:, moveRightAndModifySelection:, moveWordForwardAndModifySelection:, moveWordBackwardAndModifySelection:, moveLeftAndModifySelection:, setMark:, deleteToMark:, yank:, moveToEndOfParagraph:, deleteBackward:, insertNewlineIgnoringFieldEditor:, deleteToBeginningOfParagraph:, yank:, insertText:, " ", selectWord:, insertText:, " "); 162 | // > Shift Tab 163 | // remove one tab (or character) from start of line (outdent) 164 | "$\U0009" = (setMark:, moveToBeginningOfParagraph:, moveRight:, deleteBackward:, swapWithMark:, moveLeft:); 165 | 166 | "^@c" = { // Commenting commands 167 | // comment with "//" 168 | "/" = (moveToBeginningOfParagraph:, insertText:, "// ", moveToEndOfParagraph:, moveForward:); 169 | // comment with "#" 170 | "\\" = (moveToBeginningOfParagraph:, insertText:, "# ", moveToEndOfParagraph:, moveForward:); 171 | // HTML commenting 172 | "!" = (setMark:, swapWithMark:, delete:, insertText:, "", swapWithMark:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:); 173 | // Css Commenting 174 | "*" = (setMark:, swapWithMark:, delete:, insertText:, "/* ", yank:, insertText:, " */", swapWithMark:, moveRight:, moveRight:, moveRight:); 175 | }; 176 | 177 | // bold selection (Markdown) 178 | "@~b" = (selectWord:, setMark:, swapWithMark:, deleteToMark:, insertText:, "**", yank:, insertText:, " ", moveLeft:, insertText:, "**", moveRight:, deleteBackward:); 179 | // italicize selection (Markdown) 180 | "@~i" = (selectWord:, setMark:, swapWithMark:, deleteToMark:, insertText:, "_", yank:, insertText:, " ", moveLeft:, insertText:, "_", moveRight:, deleteBackward:); 181 | // backtick selection (Markdown) 182 | "@~`" = (selectWord:, setMark:, swapWithMark:, deleteToMark:, insertText:, "`", yank:, insertText:, " ", moveLeft:, insertText:, "`", moveRight:, deleteBackward:); 183 | // > Control-Command-Return 184 | // break line with double space (Markdown) 185 | "^@\U000D" = (insertText:, " ", insertNewline:); 186 | 187 | // increase markdown header level 188 | "@~=" = (setMark:, moveToBeginningOfParagraph:, insertText:, "# ", selectWord:, delete:, swapWithMark:, moveRight:); 189 | // decrease markdown header level 190 | "@~-" = (setMark:, moveToBeginningOfParagraph:, deleteForward:, swapWithMark:, moveLeft:); 191 | 192 | // increase blockquote header level 193 | "@~>" = (setMark:, moveToBeginningOfParagraph:, insertText:, "> ", swapWithMark:, moveRight:, moveRight:); 194 | // decrease blockquote level 195 | "@~<" = (setMark:, moveToBeginningOfParagraph:, deleteForward:, deleteForward:, swapWithMark:, moveLeft:, moveLeft:); 196 | 197 | // Add hard break for current line and insert newline below 198 | // "^~\U000D" = (moveToEndOfParagraph:, insertText:, " ", selectWord:, deleteBackward:, insertText:, " ", insertNewline:); 199 | // Break line at cursor and add Markdown hard line break 200 | // "^~@\U000D" = (insertText:, " ", insertNewline:); 201 | 202 | "^@w" = { // Multi-stroke Markdown commands 203 | // force carriage return in text field 204 | "\U000A" = (insertNewlineIgnoringFieldEditor:); 205 | // force tab in text field 206 | "\U0009" = (insertText:, "\t"); 207 | // insert reference link `[selection][[cursor]]` 208 | "[" = (setMark:, swapWithMark:, deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, insertText:, " ", moveLeft:, insertText:, "][]", moveRight:, deleteBackward:, moveLeft:); 209 | // insert reference `[selection]: [cursor]` 210 | "]" = (setMark:, swapWithMark:, deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, insertText:, " ", moveLeft:, insertText:, "]: ", moveRight:, deleteBackward:); 211 | // Fence code (new) 212 | // > Requires text selection 213 | "`" = (setMark:, swapWithMark:, deleteToMark:, insertText:, "```\n", yank:, insertText:, "\n```", swapWithMark:); 214 | // Insert inline footnote marker or inline footnote (new) 215 | "f" = (insertText:, "[^]", moveLeft:, setMark:, insertText:, "footnote id or inline text", selectToMark:); 216 | // Unordered list item with + 217 | "+" = (setMark:, moveToBeginningOfParagraph:, moveWordRight:, moveWordLeft:, insertText:, "+ ", swapWithMark:, moveRight:, moveRight:); 218 | // Unordered list item with - 219 | "-" = (setMark:, moveToBeginningOfParagraph:, moveWordRight:, moveWordLeft:, insertText:, "- ", swapWithMark:, moveRight:, moveRight:); 220 | // Unordered list item with * 221 | "*" = (setMark:, moveToBeginningOfParagraph:, moveWordRight:, moveWordLeft:, insertText:, "* ", swapWithMark:, moveRight:, moveRight:); 222 | // Numeric list item (new) 223 | "." = (setMark:, moveToBeginningOfParagraph:, moveWordRight:, moveWordLeft:, insertText:, "1. ", swapWithMark:, moveRight:, moveRight:, moveRight:); 224 | // convert current numbered list item to bullet, handles indentation 225 | "8" = (breakUndoCoalescing, setMark:, moveToEndOfParagraph:, insertText:, "x", moveToBeginningOfParagraph:, moveWordForward:, moveRight:, moveWordForward:, moveWordBackward:, moveWordBackwardAndModifySelection:, insertText:, "* ", moveToEndOfParagraph:, deleteBackward:, swapWithMark:, moveLeft:); 226 | // convert current bullet list item to numbered 227 | "1" = (breakUndoCoalescing, setMark:, moveToEndOfParagraph:, insertText:, "x", moveToBeginningOfParagraph:, moveWordForward:, moveWordBackward:, moveLeftAndModifySelection:, moveLeftAndModifySelection:, insertText:, "1. ", moveToEndOfParagraph:, deleteBackward:, swapWithMark:, moveRight:); 228 | 229 | "h" = { // Headlines (removes leading whitespace after inserting hashmarks) 230 | // # 231 | "1" = (setMark:, moveToBeginningOfParagraph:, insertText:, "# ", selectWord:, insertText:, " ",swapWithMark:,moveRight:,moveRight:); 232 | // ## 233 | "2" = (setMark:, moveToBeginningOfParagraph:, insertText:, "## ", selectWord:, insertText:, " ", swapWithMark:,moveRight:,moveRight:,moveRight:); 234 | // ### 235 | "3" = (setMark:, moveToBeginningOfParagraph:, insertText:, "### ", selectWord:, insertText:, " ", swapWithMark:,moveRight:,moveRight:,moveRight:,moveRight:); 236 | // #### 237 | "4" = (setMark:, moveToBeginningOfParagraph:, insertText:, "#### ", selectWord:, insertText:, " ", swapWithMark:,moveRight:,moveRight:,moveRight:,moveRight:,moveRight:); 238 | // ##### 239 | "5" = (setMark:, moveToBeginningOfParagraph:, insertText:, "##### ", selectWord:, insertText:, " ", swapWithMark:,moveRight:,moveRight:,moveRight:,moveRight:,moveRight:,moveRight:); 240 | // ###### 241 | "6" = (setMark:, moveToBeginningOfParagraph:, insertText:, "###### ", selectWord:, insertText:, " ", swapWithMark:,moveRight:,moveRight:,moveRight:,moveRight:,moveRight:,moveRight:,moveRight:); 242 | }; 243 | // > links 244 | // > without selected text first, these can produce a mess using multiple clipboards 245 | // > make a text selection before you run them 246 | "l" = { // Markdown link 247 | // create a link for selected text, cursor between () `[selected text]([cursor])` 248 | "t" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "]()", moveRight:, deleteBackward:, moveLeft:, setMark:, insertText:, "https://", selectToMark:); // link text 249 | // create a link for selected text, inserting clipboard as url `[[cursor]selected text](clipboard contents)` 250 | "c" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "](", setMark:, pasteAsPlainText:, insertText:, ")", moveRight:, deleteBackward:, moveLeft:, selectToMark:); // link with clipboard 251 | }; 252 | // SearchLink Basic Link 253 | "s" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "](!)", moveRight:, deleteBackward:, moveLeft:, setMark:, insertText:, "g", selectToMark:); // link text 254 | "i" = { // Link as image 255 | // TODO: Apply the fix from l,t/c above to avoid inserting the kill buffer when there's no selection 256 | // same as lt, but with image syntax `\!\[selected text]([cursor])` 257 | "t" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " ![", moveLeft:, moveLeft:, deleteBackward:, moveRight:, moveRight:, yank:, moveLeft:, insertText:, "]()", moveRight:, deleteBackward:, moveLeft:, setMark:, insertText:, "https://", selectToMark:); // image link for text 258 | // same as lc, but with image syntax `\!\[selected text](clipboard)` 259 | "c" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " ![", moveLeft:, moveLeft:, deleteBackward:, moveRight:, moveRight:, yank:, moveLeft:, insertText:, "](", setMark:, pasteAsPlainText:, insertText:, ")", moveRight:, deleteBackward:, moveLeft:, selectToMark:); 260 | // same as lc, but with image syntax and "+" for Droplr links `![selected text](clipboard+)` 261 | "d" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " ![", moveLeft:, moveLeft:, deleteBackward:, moveRight:, moveRight:, yank:, moveLeft:, insertText:, "](", setMark:, pasteAsPlainText:, insertText:, "+)", moveRight:, deleteBackward:, moveLeft:, selectToMark:); 262 | }; 263 | 264 | ":" = { // Reference links 265 | // create a reference from selected text 266 | "t" = (setMark:, swapWithMark:, deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, insertText:, " ", moveLeft:, insertText:, "]: ", moveRight:, deleteBackward:); 267 | // create a reference from selected text, clipboard as url 268 | "c" = (setMark:, swapWithMark:, deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, insertText:, " ", moveLeft:, insertText:, "]: ", pasteAsPlainText:, moveRight:, deleteBackward:, swapWithMark:); 269 | }; 270 | }; 271 | 272 | "^@e" = { // HTML commands 273 | // ="[cursor]" 274 | "=" = (insertText:, "=\"\"", moveLeft:); 275 | // entity &[cursor]; 276 | "e" = (insertText:, "&;", moveLeft:); 277 | // https:// 278 | "/" = (insertText:, "https://"); 279 | // Make previous word into paired HTML tag 280 | "t" = ( "setMark:", "moveWordBackward:", "deleteToMark:", "insertText:", "<", "yank:", "insertText:", ">", "setMark:", "insertText:", "", "swapWithMark:"); 281 | "a" = { // HTML Links 282 | // Insert HTML link for selected text, leave cursor in the href with "https://" selected 283 | "t" = ( setMark:, swapWithMark:, deleteToMark:, insertText:, "", yank:, insertText:, "", swapWithMark:, setMark:, insertText:, "https://", selectToMark: ); 284 | // Insert HTML link with clipboard as href 285 | "c" = ( setMark:, swapWithMark:, deleteToMark:, insertText:, "", yank:, insertText:, "" ); 286 | }; 287 | "i" = { // HTML Image 288 | // Insert image tag, any selected text is alt text, leave cursor in src attribute 289 | "t" = ( setMark:, swapWithMark:, deleteToMark:, insertText:, "\"",", swapWithMark: ); 290 | // Insert image tag, clipboard as src, any selected text as alt, leave cursor at beginning of alt attribute 291 | "c" = ( setMark:, swapWithMark:, deleteToMark:, insertText:, "\"",", swapWithMark: ); 292 | }; 293 | }; 294 | // Make selected text into paired HTML tag. Allows attributes, only dupes first word into closing tag (caveat: overwrites your pasteboard) 295 | "^<" = (setMark:, deleteToMark:, insertText:, "<", setMark:, yank:, swapWithMark:, moveWordForwardAndModifySelection:, copy:, swapWithMark:, "insertText:", ">", "setMark:", "insertText:", "", "swapWithMark:"); 296 | "^@s" = { // Surround commands 297 | // wrap () no spaces 298 | "(" = (delete:, insertText:, "( ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, ")", deleteForward:); 299 | // wrap () with spaces 300 | ")" = (delete:, insertText:, "( ", yank:, insertText:, " ", moveLeft:, insertText:, " )", deleteForward:); 301 | // wrap [] no spaces 302 | "[" = (delete:, insertText:, "[ ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, "]", deleteForward:); 303 | // wrap [] with spaces 304 | "]" = (delete:, insertText:, "[ ", yank:, insertText:, " ", moveLeft:, insertText:, " ]", deleteForward:); 305 | // wrap {} no spaces 306 | "{" = (delete:, insertText:, "{ ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, "}", deleteForward:); 307 | // wrap {} with spaces 308 | "}" = (delete:, insertText:, "{ ", yank:, insertText:, " ", moveLeft:, insertText:, " }", deleteForward:); 309 | // wrap <> no spaces 310 | "<" = (delete:, insertText:, "< ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, ">", deleteForward:); 311 | // wrap <> with spaces 312 | ">" = (delete:, insertText:, "< ", yank:, insertText:, " ", moveLeft:, insertText:, " >", deleteForward:); 313 | // wrap single quotes 314 | "'" = (delete:, insertText:, "' ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, "'", deleteForward:); 315 | // wrap backticks 316 | "`" = (delete:, insertText:, "` ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, "`", deleteForward:); 317 | // wrap double quote 318 | "\"" = (delete:, insertText:, "\" ", deleteBackward:, yank:, insertText:, " ", moveLeft:, insertText:, "\"", deleteForward:); 319 | }; 320 | 321 | // "$\U002B" = { // Vim Example commands (A little vim, just as an example) 322 | // // paste after 323 | // "p" = (moveToEndOfParagraph:,moveRight:,insertNewline:,moveLeft:, yank:); 324 | // // paste before 325 | // "P" = (moveToBeginningOfParagraph:, moveLeft:, yank:); 326 | // // yank 327 | // "y" = (yank:); 328 | // 329 | // "d" = { // Delete 330 | // // 'dd' delete line/paragraph 331 | // "d" = (setMark:, selectParagraph:, delete:, delete:, swapWithMark:); 332 | // // 'd$' delete from cursor to end of graf 333 | // "$" = (moveToEndOfParagraphAndModifySelection:, delete:); 334 | // // 'd0' delete to beginning of paragraph 335 | // "0" = (moveToBeginningOfParagraphAndModifySelection:, delete:); 336 | // // 'd^' delete to beginning of paragraph 337 | // "^" = (moveToBeginningOfParagraphAndModifySelection:, delete:); 338 | // }; 339 | // 340 | // "5" = { // Repeat 5 times 341 | // "d" = { // Delete 342 | // // 'dd' delete line/paragraph 343 | // "d" = ( selectParagraph:, delete:, delete:, moveRight:, selectParagraph:, delete:, delete:, moveRight:, selectParagraph:, delete:, delete:, moveRight:, selectParagraph:, delete:, delete:, moveRight:, selectParagraph:, delete:, delete:, moveRight:); 344 | // }; 345 | // // paste after 346 | // "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:); 347 | // // paste before 348 | // "P" = ( moveToBeginningOfParagraph:, moveLeft:, yank:, moveToBeginningOfParagraph:, moveLeft:, yank:, moveToBeginningOfParagraph:, moveLeft:, yank:, moveToBeginningOfParagraph:, moveLeft:, yank:, moveToBeginningOfParagraph:, moveLeft:, yank:); 349 | // // yank 350 | // "y" = ( yank:, yank:, yank:, yank:, yank:); 351 | // }; 352 | // }; 353 | // 354 | "^@j" = { // Jekyll Shortcuts 355 | // Pullquote Liquid Tag (new) 356 | "p" = (setMark:, swapWithMark:, deleteToMark:, insertText:, " {\"", moveLeft:, moveLeft:, deleteBackward:, moveRight:, moveRight:, yank:, insertText:, " ", moveLeft:, insertText:, "\"}", moveRight:, moveRight:, deleteBackward:, moveToBeginningOfParagraph:, insertText:, "{% pullquote %}\n", moveToEndOfParagraph:, insertText:, "\n{% endpullquote %}"); 357 | // Raw Liquid Tag (new) 358 | "r" = (setMark:, swapWithMark:, deleteToMark:, insertText:, " {% raw %}", moveLeft:, moveLeft:, moveLeft:, moveLeft:, moveLeft:, moveLeft:, moveLeft:, moveLeft:, moveLeft:, moveLeft:, deleteBackward:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:, yank:, insertText:, " ", moveLeft:, insertText:, "{% endraw %} ", moveRight:, deleteBackward:, deleteBackward:); 359 | // Raw Tag for entire paragraph (new) 360 | "R" = (setMark:, moveToBeginningOfParagraph:, insertText:, "{% raw %}\n", moveToEndOfParagraph:, insertText:, "\n{% endraw %}", swapWithMark:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:, moveRight:); 361 | }; 362 | 363 | "^@t" = { // TaskPaper Tags 364 | // @done (new) 365 | "d" = (setMark:, moveToEndOfParagraph:, insertText:, " ", selectWord:, deleteBackward:, insertText:, " @done", swapWithMark:); 366 | // // @priority() (new) 367 | "p" = (moveToEndOfParagraph:, insertText:, " ", selectWord:, deleteBackward:, insertText:, " @priority()", moveLeft:); 368 | // @na (new) 369 | "n" = (setMark:, moveToEndOfParagraph:, insertText:, " ", selectWord:, deleteBackward:, insertText:, " @na", swapWithMark:); 370 | // @today (new) 371 | "t" = (setMark:, moveToEndOfParagraph:, insertText:, " ", selectWord:, deleteBackward:, insertText:, " @today", swapWithMark:); 372 | }; 373 | 374 | "^@g" = { // SearchLink commands 375 | // SearchLink Syntax: Google (new) 376 | "g" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "](!g)", moveRight:, deleteBackward:, moveLeft:); 377 | // SearchLink Syntax: Amazon (new) 378 | "A" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "](!a)", moveRight:, deleteBackward:, moveLeft:); 379 | "a" = { // Apple 380 | // SearchLink Syntax: iOS App (new) 381 | "i" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "](!itu)", moveRight:, deleteBackward:, moveLeft:); 382 | // SearchLink Syntax: Mac App Store (new) 383 | "m" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "](!mas)", moveRight:, deleteBackward:, moveLeft:); 384 | // SearchLink Syntax: Apple Music 385 | // "m" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "](!g)", moveRight:, deleteBackward:, moveLeft:); 386 | }; 387 | // SearchLink Syntax: Software (new) 388 | "s" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "](!s)", moveRight:, deleteBackward:, moveLeft:); 389 | // SearchLink Syntax: IMDB (new) 390 | "m" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "](!imdb)", moveRight:, deleteBackward:, moveLeft:); 391 | // SearchLink Syntax: BrettTerpstra.com (new) 392 | "b" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "](!bt)", moveRight:, deleteBackward:, moveLeft:); 393 | // SearchLink Syntax: BrettTerpstra.com Projects (new) 394 | "p" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "](!btp)", moveRight:, deleteBackward:, moveLeft:); 395 | // SearchLink Syntax: Twitter User (new) 396 | "t" = (setMark:, moveRight:, insertText:, " ", deleteToMark:, insertText:, " [", moveLeft:, deleteBackward:, moveRight:, yank:, moveLeft:, insertText:, "](!@t)", moveRight:, deleteBackward:, moveLeft:); 397 | }; 398 | 399 | // repeat character before cursor 400 | "~R" = (moveLeftAndModifySelection:, copy:, moveRight:, paste:); 401 | // Forward delete to end of paragraph 402 | "@$\UF728" = (deleteToEndOfParagraph:); 403 | // > Command-shift-delete 404 | // Delete to beginning of paragraph 405 | "@$\177" = (deleteToBeginningOfParagraph:); 406 | // Right mouse click (useless, doesn't maintain cursor position) 407 | "@~7" = (setMark:, rightMouseDown:, swapWithMark:); 408 | 409 | // Hyper up arrow: move cursor to preceeding paragraph 410 | // "^~$@\UF700" = (moveToBeginningOfParagraph:,moveLeft:,moveLeft:,moveToBeginningOfParagraph:); 411 | // Hyper left arrow: move cursor to next paragraph 412 | // "^~$@\UF701" = (moveToEndOfParagraph:,moveRight:,moveRight:,moveToBeginningOfParagraph:); 413 | // Hyper right arrow: move cursor right twice as fast 414 | // "^~$@\UF703" = (moveRight:,moveRight:); 415 | // Hyper left arrow: move cursor left twice as fast 416 | // "^~$@\UF702" = (moveLeft:,moveLeft:); 417 | // Hyper left arrow: extend selection left by word 418 | // "^~$@\UF702" = (selectWord:, moveWordLeftAndModifySelection:); 419 | // Hyper right arrow: extend selection right by word 420 | // "^~$@\UF703" = (selectWord:, moveWordRightAndModifySelection:); 421 | 422 | // Real, honest-to-goodnes Save As... 423 | "@~S" = (saveAs:); 424 | } 425 | 426 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | DefaultKeyBinding.dict file (`~/Library/KeyBindings/DefaultKeyBinding.dict`) for Mac OS X, created by 2 | [Brett Terpstra](https://brettterpstra.com) and based heavily on work done by Lri. Please note that these 3 | bindings won't work in all applications: TextWrangler and TextMate, for example, override these with their 4 | own settings. 5 | 6 | **Installation**: Copy the DefaultKeyBinding.dict file to the `~/Library/KeyBindings/` directory (create `KeyBindings` 7 | if it doesn't already exist). Any open applications will need to be re-started before the key bindings will take 8 | effect --- or log out and log back in. 9 | 10 | The repository includes a script to generate a Dash docset from your customized version of the file. 11 | [See here for details.](https://brettterpstra.com/2022/02/18/keybindings-cheat-sheet-for-dash/) 12 | 13 | **Documentation** _(last updated 12/21/2023.)_ 14 | 15 | *Grouped items begin with the groups shortcut (if exists), followed by a subgroup (if exists) followed by the keys specified.* 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 |
General Commands
KeyFunction
⌃yReplace yank: command with yankAndSelect for use with the kill ring (defaults write -g NSTextKillRingSize -int 6)
⌃⌥yRegular yank, only insert last register and don’t select
⌃⇧uUppercase word
⌃⌥uLowercase word
⌃⌥tTitlecase word
⌃⌥⇧uUppercase current paragraph
⌃⌥⇧tTitlecase paragraph
⌃wDelete word before cursor
⌥wSelect word
⌥⇧wSelect word backward and modify selection
⌥⇧sSelect entire line/paragraph
⌥sSelect from beginning of paragraph to last character
⌃⌥⇧sSelect paragraph excluding leading/trailing whitespace (same as ^$@\UF701)
⌥dDelete line/paragraph
⌃uDelete to beginning of paragraph (if this isn’t already defined?)
⌥yCopy paragraph
⌥xCut paragraph
⌥pPaste paragraph below
⌃⌥pYank (from kill ring) paragraph below
⌥⇧pPaste paragraph above
⌃⌥⇧pYank (from kill ring) paragraph above
⌃⇧aSelect to beginning of paragraph and copy
⌃⇧eSelect to end of paragraph and copy
⌥qCut to beginning of paragraph
⌥kCut to end of paragraph
⌥oBlank line after current
⌥⇧oBlank line before current
⌃⌘kMove line up
⌃⌘jMove line down
⌃⌘lIndent line
⌃⌘hOutdent line (one tab or char)
⌃⌘↑Move line up (same commands but with arrow keys)
⌃⌘↓Move line down
⌃⌘→Indent line
⌃⌘←Outdent line (one tab or char)
⌃⇧⌘←Full outdent - Deletes all leading space of line/paragraph (updated) (Control-shift-command-left arrow)
⌃⇧⌘→Delete trailing space (Control-shift-command-right arrow)
⌃⌘⇧↑Delete leading and trailing whitespace for paragraph (Control-shift-command-up arrow)
⌃⌘⇧↓Select paragraph without leading or trailing whitespace (Control-shift-command-down arrow)
⌃⌥⇧↑Modify selection up by paragraph (Control Option Shift Up) (Control-option-shift-up arrow)
⌃⌥⇧↓Modify selection down by paragraph (Control Option Shift Down) (Control-option-shift-down arrow)
⌃⌥⇧←Modify selection left by word (Control-option-shift-left arrow)
⌃⌥⇧→Modify selection right by word (Control-option-shift-right arrow)
⌘⌥⌃←Move to first Alphanumeric character of line (Control-option-up arrow Control-option-command-left arrow)
⌘⌥←Move to first non-whitespace character of line (Control-options-left arrow)
⌘⌥⇧←Select to first word of paragraph modifying selection (Options-shift-command-left arrow)
⌘⌥⇧→Select to end of paragraph modifying selection (Option-shift-command-right arrow)
⌥⌘→Move to last non-whitespace character of paragraph (Option-command-right arrow)
⌃⌥→Move to end of paragraph and delete trailing whitespace (Control-option-right arrow)
⌘↩TextMate Command-Return (Command Return)
⌘⇧↩Insert blank line above paragraph (Command Shift Return)
⇧⌥␣Insert space and uppercase next character (Shift-Option-Space)
⌃⇧␣Uppercase next character (Control-Shift-Space)
⌃⌥␣Move cursor forward with spacebar (shift-space)
⌘⌥_Hyphenate next space and move to next word (this will kill non alphanumeric symbols and punctuation, use only on words)
⌥1Bookmark
⌥2Jump to bookmark
⌥⌘↩Continue a list item with indentation and include the same delimiter (Command Option Return)
⇧⇥Remove one tab (or character) from start of line (outdent) (Shift Tab)
⌘⌥bBold selection (Markdown)
⌘⌥iItalicize selection (Markdown)
⌘⌥`Backtick selection (Markdown)
⌃⌘↩Break line with double space (Markdown) (Control-Command-Return)
⌘⌥=Increase markdown header level
⌘⌥-Decrease markdown header level
⌘⌥>Increase blockquote header level
⌘⌥<Decrease blockquote level
⌃<Make selected text into paired HTML tag. Allows attributes, only dupes first word into closing tag (caveat: overwrites your pasteboard)
⌥⇧rRepeat character before cursor
⌘⇧⌦Forward delete to end of paragraph
⌘⇧⌫Delete to beginning of paragraph (Command-shift-delete)
⌘⌥7Right mouse click (useless, doesn’t maintain cursor position)
⌘⌥⇧sReal, honest-to-goodnes Save As…
328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 |
Multi–stroke casing commands (⌃⌥c)
⌃⌥c c Snake_case to camelCase (delete forward and capitalize)
⌃⌥c s Snake_case word break
358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 |
Commenting commands (⌃⌘c)
⌃⌘c / Comment with “//”
⌃⌘c  Comment with “#”
⌃⌘c ! HTML commenting
⌃⌘c * Css Commenting
400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 |
Multi–stroke Markdown commands (⌃⌘w)
⌃⌘w Force carriage return in text field
⌃⌘w Force tab in text field
⌃⌘w [ Insert reference link [selection][[cursor]]
⌃⌘w ] Insert reference [selection]: [cursor]
⌃⌘w ` Fence code (new) (Requires text selection)
⌃⌘w f Insert inline footnote marker or inline footnote (new)
⌃⌘w + Unordered list item with +
⌃⌘w - Unordered list item with -
⌃⌘w * Unordered list item with *
⌃⌘w . Numeric list item (new)
⌃⌘w 8 Convert current numbered list item to bullet, handles indentation
⌃⌘w 1 Convert current bullet list item to numbered
Headlines (removes leading whitespace after inserting hashmarks) (h)
⌃⌘w h 1 #
⌃⌘w h 2 ##
⌃⌘w h 3 ###
⌃⌘w h 4 ####
⌃⌘w h 5 #####
⌃⌘w h 6 ######
Markdown link (l)
⌃⌘w l t Create a link for selected text, cursor between () [selected text]([cursor]) (links without selected text first, these can produce a mess using multiple clipboards make a text selection before you run them)
⌃⌘w l c Create a link for selected text, inserting clipboard as url [[cursor]selected text](clipboard contents)
⌃⌘w s SearchLink Basic Link
Link as image (i)
⌃⌘w i t Same as lt, but with image syntax \!\[selected text]([cursor])
⌃⌘w i c Same as lc, but with image syntax \!\[selected text](clipboard)
⌃⌘w i d Same as lc, but with image syntax and “+” for Droplr links ![selected text](clipboard+)
Reference links (:)
⌃⌘w : t Create a reference from selected text
⌃⌘w : c Create a reference from selected text, clipboard as url
594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 |
HTML commands (⌃⌘e)
⌃⌘e = =“[cursor]”
⌃⌘e e Entity &[cursor];
⌃⌘e / Https://
⌃⌘e t Make previous word into paired HTML tag
HTML Links (a)
⌃⌘e a t Insert HTML link for selected text, leave cursor in the href with “https://” selected
⌃⌘e a c Insert HTML link with clipboard as href
HTML Image (i)
⌃⌘e i t Insert image tag, any selected text is alt text, leave cursor in src attribute
⌃⌘e i c Insert image tag, clipboard as src, any selected text as alt, leave cursor at beginning of alt attribute
670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 |
Surround commands (⌃⌘s)
⌃⌘s ( Wrap () no spaces
⌃⌘s ) Wrap () with spaces
⌃⌘s [ Wrap [] no spaces
⌃⌘s ] Wrap [] with spaces
⌃⌘s { Wrap {} no spaces
⌃⌘s } Wrap {} with spaces
⌃⌘s < Wrap <> no spaces
⌃⌘s > Wrap <> with spaces
⌃⌘s ' Wrap single quotes
⌃⌘s ` Wrap backticks
748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 |
Jekyll Shortcuts (⌃⌘j)
⌃⌘j p Pullquote Liquid Tag (new)
⌃⌘j r Raw Liquid Tag (new)
⌃⌘j ⇧r Raw Tag for entire paragraph (new)
784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 |
TaskPaper Tags (⌃⌘t)
⌃⌘t d @done (new)
⌃⌘t p // @priority() (new)
⌃⌘t n @na (new)
⌃⌘t t @today (new)
826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 |
SearchLink commands (⌃⌘g)
⌃⌘g g SearchLink Syntax: Google (new)
⌃⌘g ⇧a SearchLink Syntax: Amazon (new)
Apple (a)
⌃⌘g a i SearchLink Syntax: iOS App (new)
⌃⌘g a m SearchLink Syntax: Mac App Store (new)
⌃⌘g s SearchLink Syntax: Software (new)
⌃⌘g m SearchLink Syntax: IMDB (new)
⌃⌘g b SearchLink Syntax: BrettTerpstra.com (new)
⌃⌘g p SearchLink Syntax: BrettTerpstra.com Projects (new)
⌃⌘g t SearchLink Syntax: Twitter User (new)
903 | 904 | This documentation is generated automatically from the comments and commands in the DefaultKeyBinding.dict file. The script `document_keybindings.rb` is free for use, but it's specifically designed for use with my formatting in the bindings plist (i.e. it's a little finicky). 905 | 906 | -------------------------------------------------------------------------------- /keybindings.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: KeyBindings 4 | project_tag: keybindings 5 | icon: /images/projecticons/keybindings.png 6 | info: My OS X KeyBindings experiments. 7 | ranking: 5 8 | updated: 2023-12-21 9 | tags: 10 | - mac 11 | - utilities 12 | - text 13 | --- 14 | [support]: https://github.com/ttscoff/KeyBindings/issues 15 | [gh]: http://github.com/ttscoff/KeyBindings 16 | 17 | * [Support][] 18 | * [Brett's KeyBindings on GitHub][gh] 19 | {:.linkblock} 20 | 21 | DefaultKeyBinding.dict file (`~/Library/KeyBindings/DefaultKeyBinding.dict`) for Mac OS X, created by 22 | [Brett Terpstra](https://brettterpstra.com) and based heavily on work done by Lri. Please note that these 23 | bindings won't work in all applications: TextWrangler and TextMate, for example, override these with their 24 | own settings. 25 | 26 | **Installation**: Copy the DefaultKeyBinding.dict file to the `~/Library/KeyBindings/` directory (create `KeyBindings` 27 | if it doesn't already exist). Any open applications will need to be re-started before the key bindings will take 28 | effect --- or log out and log back in. 29 | 30 | The repository includes a script to generate a Dash docset from your customized version of the file. 31 | [See here for details.](https://brettterpstra.com/2022/02/18/keybindings-cheat-sheet-for-dash/) 32 | 33 | **Documentation** _(last updated 12/21/2023.)_ 34 | 35 | *Grouped items begin with the groups shortcut (if exists), followed by a subgroup (if exists) followed by the keys specified.* 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 |
General Commands
KeyFunction
⌃yReplace yank: command with yankAndSelect for use with the kill ring (defaults write -g NSTextKillRingSize -int 6)
⌃⌥yRegular yank, only insert last register and don’t select
⌃⇧uUppercase word
⌃⌥uLowercase word
⌃⌥tTitlecase word
⌃⌥⇧uUppercase current paragraph
⌃⌥⇧tTitlecase paragraph
⌃wDelete word before cursor
⌥wSelect word
⌥⇧wSelect word backward and modify selection
⌥⇧sSelect entire line/paragraph
⌥sSelect from beginning of paragraph to last character
⌃⌥⇧sSelect paragraph excluding leading/trailing whitespace (same as ^$@\UF701)
⌥dDelete line/paragraph
⌃uDelete to beginning of paragraph (if this isn’t already defined?)
⌥yCopy paragraph
⌥xCut paragraph
⌥pPaste paragraph below
⌃⌥pYank (from kill ring) paragraph below
⌥⇧pPaste paragraph above
⌃⌥⇧pYank (from kill ring) paragraph above
⌃⇧aSelect to beginning of paragraph and copy
⌃⇧eSelect to end of paragraph and copy
⌥qCut to beginning of paragraph
⌥kCut to end of paragraph
⌥oBlank line after current
⌥⇧oBlank line before current
⌃⌘kMove line up
⌃⌘jMove line down
⌃⌘lIndent line
⌃⌘hOutdent line (one tab or char)
⌃⌘↑Move line up (same commands but with arrow keys)
⌃⌘↓Move line down
⌃⌘→Indent line
⌃⌘←Outdent line (one tab or char)
⌃⇧⌘←Full outdent - Deletes all leading space of line/paragraph (updated) (Control-shift-command-left arrow)
⌃⇧⌘→Delete trailing space (Control-shift-command-right arrow)
⌃⌘⇧↑Delete leading and trailing whitespace for paragraph (Control-shift-command-up arrow)
⌃⌘⇧↓Select paragraph without leading or trailing whitespace (Control-shift-command-down arrow)
⌃⌥⇧↑Modify selection up by paragraph (Control Option Shift Up) (Control-option-shift-up arrow)
⌃⌥⇧↓Modify selection down by paragraph (Control Option Shift Down) (Control-option-shift-down arrow)
⌃⌥⇧←Modify selection left by word (Control-option-shift-left arrow)
⌃⌥⇧→Modify selection right by word (Control-option-shift-right arrow)
⌘⌥⌃←Move to first Alphanumeric character of line (Control-option-up arrow Control-option-command-left arrow)
⌘⌥←Move to first non-whitespace character of line (Control-options-left arrow)
⌘⌥⇧←Select to first word of paragraph modifying selection (Options-shift-command-left arrow)
⌘⌥⇧→Select to end of paragraph modifying selection (Option-shift-command-right arrow)
⌥⌘→Move to last non-whitespace character of paragraph (Option-command-right arrow)
⌃⌥→Move to end of paragraph and delete trailing whitespace (Control-option-right arrow)
⌘↩TextMate Command-Return (Command Return)
⌘⇧↩Insert blank line above paragraph (Command Shift Return)
⇧⌥␣Insert space and uppercase next character (Shift-Option-Space)
⌃⇧␣Uppercase next character (Control-Shift-Space)
⌃⌥␣Move cursor forward with spacebar (shift-space)
⌘⌥_Hyphenate next space and move to next word (this will kill non alphanumeric symbols and punctuation, use only on words)
⌥1Bookmark
⌥2Jump to bookmark
⌥⌘↩Continue a list item with indentation and include the same delimiter (Command Option Return)
⇧⇥Remove one tab (or character) from start of line (outdent) (Shift Tab)
⌘⌥bBold selection (Markdown)
⌘⌥iItalicize selection (Markdown)
⌘⌥`Backtick selection (Markdown)
⌃⌘↩Break line with double space (Markdown) (Control-Command-Return)
⌘⌥=Increase markdown header level
⌘⌥-Decrease markdown header level
⌘⌥>Increase blockquote header level
⌘⌥<Decrease blockquote level
⌃<Make selected text into paired HTML tag. Allows attributes, only dupes first word into closing tag (caveat: overwrites your pasteboard)
⌥⇧rRepeat character before cursor
⌘⇧⌦Forward delete to end of paragraph
⌘⇧⌫Delete to beginning of paragraph (Command-shift-delete)
⌘⌥7Right mouse click (useless, doesn’t maintain cursor position)
⌘⌥⇧sReal, honest-to-goodnes Save As…
348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 |
Multi–stroke casing commands (⌃⌥c)
⌃⌥c c Snake_case to camelCase (delete forward and capitalize)
⌃⌥c s Snake_case word break
378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 |
Commenting commands (⌃⌘c)
⌃⌘c / Comment with “//”
⌃⌘c  Comment with “#”
⌃⌘c ! HTML commenting
⌃⌘c * Css Commenting
420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 |
Multi–stroke Markdown commands (⌃⌘w)
⌃⌘w Force carriage return in text field
⌃⌘w Force tab in text field
⌃⌘w [ Insert reference link [selection][[cursor]]
⌃⌘w ] Insert reference [selection]: [cursor]
⌃⌘w ` Fence code (new) (Requires text selection)
⌃⌘w f Insert inline footnote marker or inline footnote (new)
⌃⌘w + Unordered list item with +
⌃⌘w - Unordered list item with -
⌃⌘w * Unordered list item with *
⌃⌘w . Numeric list item (new)
⌃⌘w 8 Convert current numbered list item to bullet, handles indentation
⌃⌘w 1 Convert current bullet list item to numbered
Headlines (removes leading whitespace after inserting hashmarks) (h)
⌃⌘w h 1 #
⌃⌘w h 2 ##
⌃⌘w h 3 ###
⌃⌘w h 4 ####
⌃⌘w h 5 #####
⌃⌘w h 6 ######
Markdown link (l)
⌃⌘w l t Create a link for selected text, cursor between () [selected text]([cursor]) (links without selected text first, these can produce a mess using multiple clipboards make a text selection before you run them)
⌃⌘w l c Create a link for selected text, inserting clipboard as url [[cursor]selected text](clipboard contents)
⌃⌘w s SearchLink Basic Link
Link as image (i)
⌃⌘w i t Same as lt, but with image syntax \!\[selected text]([cursor])
⌃⌘w i c Same as lc, but with image syntax \!\[selected text](clipboard)
⌃⌘w i d Same as lc, but with image syntax and “+” for Droplr links ![selected text](clipboard+)
Reference links (:)
⌃⌘w : t Create a reference from selected text
⌃⌘w : c Create a reference from selected text, clipboard as url
614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 |
HTML commands (⌃⌘e)
⌃⌘e = =“[cursor]”
⌃⌘e e Entity &[cursor];
⌃⌘e / Https://
⌃⌘e t Make previous word into paired HTML tag
HTML Links (a)
⌃⌘e a t Insert HTML link for selected text, leave cursor in the href with “https://” selected
⌃⌘e a c Insert HTML link with clipboard as href
HTML Image (i)
⌃⌘e i t Insert image tag, any selected text is alt text, leave cursor in src attribute
⌃⌘e i c Insert image tag, clipboard as src, any selected text as alt, leave cursor at beginning of alt attribute
690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 |
Surround commands (⌃⌘s)
⌃⌘s ( Wrap () no spaces
⌃⌘s ) Wrap () with spaces
⌃⌘s [ Wrap [] no spaces
⌃⌘s ] Wrap [] with spaces
⌃⌘s { Wrap {} no spaces
⌃⌘s } Wrap {} with spaces
⌃⌘s < Wrap <> no spaces
⌃⌘s > Wrap <> with spaces
⌃⌘s ' Wrap single quotes
⌃⌘s ` Wrap backticks
768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 |
Jekyll Shortcuts (⌃⌘j)
⌃⌘j p Pullquote Liquid Tag (new)
⌃⌘j r Raw Liquid Tag (new)
⌃⌘j ⇧r Raw Tag for entire paragraph (new)
804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 |
TaskPaper Tags (⌃⌘t)
⌃⌘t d @done (new)
⌃⌘t p // @priority() (new)
⌃⌘t n @na (new)
⌃⌘t t @today (new)
846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 |
SearchLink commands (⌃⌘g)
⌃⌘g g SearchLink Syntax: Google (new)
⌃⌘g ⇧a SearchLink Syntax: Amazon (new)
Apple (a)
⌃⌘g a i SearchLink Syntax: iOS App (new)
⌃⌘g a m SearchLink Syntax: Mac App Store (new)
⌃⌘g s SearchLink Syntax: Software (new)
⌃⌘g m SearchLink Syntax: IMDB (new)
⌃⌘g b SearchLink Syntax: BrettTerpstra.com (new)
⌃⌘g p SearchLink Syntax: BrettTerpstra.com Projects (new)
⌃⌘g t SearchLink Syntax: Twitter User (new)
923 | 924 | This documentation is generated automatically from the comments and commands in the DefaultKeyBinding.dict file. The script `document_keybindings.rb` is free for use, but it's specifically designed for use with my formatting in the bindings plist (i.e. it's a little finicky). 925 | 926 | 927 | {% donate "You're bound to want to help out" %} 928 | 929 | * [Support][] 930 | * [Brett's KeyBindings on GitHub][gh] 931 | {:.linkblock} 932 | 933 | --------------------------------------------------------------------------------