Created DDG::Goodie::VimCheatSheet +tests
parent
42a81dab94
commit
b2b2c56cda
3
dist.ini
3
dist.ini
|
@ -56,6 +56,9 @@ Lingua::EN::Words2Nums = 0
|
||||||
Locale::Currency::Format = 1.30
|
Locale::Currency::Format = 1.30
|
||||||
Net::IP = 0
|
Net::IP = 0
|
||||||
Math::BaseConvert = 0
|
Math::BaseConvert = 0
|
||||||
|
Text::Xslate = 3.1.0
|
||||||
|
JSON = 2.90
|
||||||
|
Web::Scraper = 0.37
|
||||||
|
|
||||||
[Prereqs / TestRequires]
|
[Prereqs / TestRequires]
|
||||||
Test::More = 0.98
|
Test::More = 0.98
|
||||||
|
|
|
@ -0,0 +1,125 @@
|
||||||
|
package DDG::Goodie::VimCheatSheet;
|
||||||
|
# ABSTRACT: Provide a cheatsheet for common vim syntax
|
||||||
|
|
||||||
|
use HTML::Entities;
|
||||||
|
use DDG::Goodie;
|
||||||
|
use Text::Xslate;
|
||||||
|
use JSON;
|
||||||
|
|
||||||
|
zci answer_type => "vim_cheat";
|
||||||
|
|
||||||
|
name "VimCheatSheet";
|
||||||
|
description "Vim cheat sheet";
|
||||||
|
source "http://rtorruellas.com/vim-cheat-sheet/";
|
||||||
|
code_url "https://github.com/duckduckgo/zeroclickinfo-spice/blob/master/lib/DDG/Goodie/VimCheatSheet.pm";
|
||||||
|
category "cheat_sheets";
|
||||||
|
topics "computing", "geek", "programming", "sysadmin";
|
||||||
|
|
||||||
|
primary_example_queries 'vim help';
|
||||||
|
secondary_example_queries 'vi quick reference';
|
||||||
|
|
||||||
|
triggers startend =>
|
||||||
|
'vi cheat sheet',
|
||||||
|
'vi cheatsheet',
|
||||||
|
'vi commands',
|
||||||
|
'vi guide',
|
||||||
|
'vi help',
|
||||||
|
'vi quick reference',
|
||||||
|
'vi reference',
|
||||||
|
'vim cheat sheet',
|
||||||
|
'vim cheatsheet',
|
||||||
|
'vim commands',
|
||||||
|
'vim guide',
|
||||||
|
'vim help',
|
||||||
|
'vim quick reference',
|
||||||
|
'vim reference',
|
||||||
|
;
|
||||||
|
|
||||||
|
attribution github => ["kablamo", "Eric Johnson"],
|
||||||
|
twitter => ["kablamo_", "Eric Johnson"],
|
||||||
|
web => ["http://kablamo.org", "Eric Johnson"];
|
||||||
|
|
||||||
|
handle remainder => sub {
|
||||||
|
|
||||||
|
# retrieve data from a file
|
||||||
|
my $json = share("vimcheat.json")->slurp(iomode => '<:encoding(UTF-8)');
|
||||||
|
my $columns = JSON->new->utf8->decode($json);
|
||||||
|
|
||||||
|
return
|
||||||
|
heading => 'Vim Cheat Sheet',
|
||||||
|
html => html($columns),
|
||||||
|
answer => answer($columns);
|
||||||
|
};
|
||||||
|
|
||||||
|
# Generate an html answer from $columns. Returns a string.
|
||||||
|
sub html {
|
||||||
|
my $columns = shift;
|
||||||
|
|
||||||
|
my $css = share("style.css")->slurp;
|
||||||
|
my $html = "<style type='text/css'>$css</style>\n";
|
||||||
|
|
||||||
|
my $template = template();
|
||||||
|
my $vars = { columns => $columns };
|
||||||
|
$html .= Text::Xslate->new()->render_string($template, $vars);
|
||||||
|
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub template {
|
||||||
|
return <<'EOF';
|
||||||
|
<div id="vim-container">
|
||||||
|
|
||||||
|
: for $columns -> $tables {
|
||||||
|
<div class="vim-column">
|
||||||
|
|
||||||
|
: for $tables -> $table {
|
||||||
|
<b><: $table.name :></b>
|
||||||
|
<table class="vim-table">
|
||||||
|
|
||||||
|
: for $table.rows -> $row {
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
: for $row.cmds -> $cmd {
|
||||||
|
<code><: $cmd :></code><br>
|
||||||
|
: }
|
||||||
|
</td>
|
||||||
|
<td><: $row.help :></td>
|
||||||
|
</tr>
|
||||||
|
: }
|
||||||
|
|
||||||
|
</table>
|
||||||
|
: }
|
||||||
|
|
||||||
|
</div>
|
||||||
|
: }
|
||||||
|
|
||||||
|
</div>
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# Generate a plain text answer from $columns. Returns a string.
|
||||||
|
sub answer {
|
||||||
|
my $columns = shift;
|
||||||
|
my $answer = '';
|
||||||
|
|
||||||
|
foreach my $tables (@$columns) {
|
||||||
|
foreach my $table (@$tables) {
|
||||||
|
$answer .= $table->{name} . "\n\n";
|
||||||
|
foreach my $row (@{ $table->{rows} }) {
|
||||||
|
my $cmds = $row->{cmds};
|
||||||
|
my $left = join ' or ', @$cmds;
|
||||||
|
|
||||||
|
$answer .= sprintf('%-35s ', $left);
|
||||||
|
$answer .= $row->{help};
|
||||||
|
$answer .= "\n";
|
||||||
|
}
|
||||||
|
$answer .= "\n";
|
||||||
|
}
|
||||||
|
$answer .= "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $answer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
|
@ -0,0 +1,14 @@
|
||||||
|
INTRODUCTION
|
||||||
|
|
||||||
|
parser.pl generates vimcheat.json which is used by Goodie::VimCheatSheet.
|
||||||
|
|
||||||
|
The data comes from:
|
||||||
|
https://github.com/rtorr/vim-cheat-sheet
|
||||||
|
|
||||||
|
|
||||||
|
INSTRUCTIONS
|
||||||
|
|
||||||
|
fetch.sh
|
||||||
|
parser.pl
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/bash
|
||||||
|
mkdir -p download
|
||||||
|
wget "http://raw2.github.com/rtorr/vim-cheat-sheet/develop/app/index.html" -O download/vimcheat.html
|
|
@ -0,0 +1,111 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use Web::Scraper;
|
||||||
|
use Path::Class;
|
||||||
|
use JSON;
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
my $data = parse_html();
|
||||||
|
my $tables = $data->{tables};
|
||||||
|
my $names = $data->{names};
|
||||||
|
|
||||||
|
cleanup_tables_data( $tables );
|
||||||
|
merge_names_and_tables( $names, $tables );
|
||||||
|
my $columns = split_into_two_columns( $tables );
|
||||||
|
my $json = JSON->new->pretty->utf8->encode( $columns );
|
||||||
|
|
||||||
|
file('vimcheat.json')->spew( iomode => '>:encoding(UTF-8)', $json );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Returns a data structure which looks like:
|
||||||
|
#
|
||||||
|
# { names => ['Cursor movement', 'Insert Mode', ...],
|
||||||
|
# tables => [
|
||||||
|
# {rows => [ {help => 'h - move left'}, {help => 'j - move down'}, ... ]},
|
||||||
|
# {rows => [ {help => 'i - start insert mode'}, ... ]},
|
||||||
|
# ...
|
||||||
|
# ],
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
sub parse_html {
|
||||||
|
my $scraper = scraper {
|
||||||
|
process "h2", "names[]" => 'TEXT';
|
||||||
|
process "ul", "tables[]" => scraper {
|
||||||
|
process "li", "rows[]" => scraper {
|
||||||
|
process "li", "help" => 'TEXT';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
my $string = scalar file('download/vimcheat.html')
|
||||||
|
->slurp(iomode => '<:encoding(UTF-8)');
|
||||||
|
|
||||||
|
return $scraper->scrape($string);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Alters each $table->{rows} so it looks like this:
|
||||||
|
#
|
||||||
|
# [ {cmds => ['h'], help => 'move left'},
|
||||||
|
# {cmds => ['j'], help => 'move down'},
|
||||||
|
# ...
|
||||||
|
# ]
|
||||||
|
#
|
||||||
|
sub cleanup_tables_data {
|
||||||
|
my $tables = shift;
|
||||||
|
|
||||||
|
foreach my $table (@$tables) {
|
||||||
|
foreach my $row (@{ $table->{rows} }) {
|
||||||
|
|
||||||
|
# $row->{help} looks like: "gt or :tabnext or :tabn - move to next tab"
|
||||||
|
|
||||||
|
# The code below puts everything to the right of the ' - ' into
|
||||||
|
# $row->{help} and everything to the left goes into $row->{cmds}
|
||||||
|
|
||||||
|
my ($left, $right) = split / - /, $row->{help};
|
||||||
|
my @cmds = split / or /, $left;
|
||||||
|
|
||||||
|
$row->{cmds} = \@cmds;
|
||||||
|
$row->{help} = $right;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Alters $tables so it looks like this:
|
||||||
|
#
|
||||||
|
# [
|
||||||
|
# {name => 'Cursor movement', rows => [...]},
|
||||||
|
# {name => 'Insert Mode', rows => [...]},
|
||||||
|
# ...
|
||||||
|
# ]
|
||||||
|
#
|
||||||
|
sub merge_names_and_tables {
|
||||||
|
my ($names, $tables) = @_;
|
||||||
|
|
||||||
|
foreach my $table (@$tables) {
|
||||||
|
$table->{name} = shift @$names;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Returns a data structure which looks like:
|
||||||
|
#
|
||||||
|
# [ $tables[0], $tables[1], ... ],
|
||||||
|
# [ $tables[x/2], $tables[x/2 + 1], ... ],
|
||||||
|
#
|
||||||
|
# Where x is the size of the array @tables
|
||||||
|
#
|
||||||
|
sub split_into_two_columns {
|
||||||
|
my $tables = shift;
|
||||||
|
my $length = scalar @$tables;
|
||||||
|
my $half = int( $length / 2 );
|
||||||
|
my @column1 = @$tables[0..$half];
|
||||||
|
my @column2 = @$tables[$half .. $length - 1];
|
||||||
|
return [ \@column1, \@column2 ];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
#zero_click_plus_wrapper {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#zero_click_wrapper #zero_click #zero_click_abstract {
|
||||||
|
padding-left: 0px !important;
|
||||||
|
margin-left: 0px !important;
|
||||||
|
margin-right: 0px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#zero_click_abstract #vim-container {
|
||||||
|
max-height: 45ex;
|
||||||
|
overflow-y: scroll;
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
#zero_click_abstract .vim-column {
|
||||||
|
width: 48%;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
#zero_click_abstract table.vim-table {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
#zero_click_abstract table.vim-table td {
|
||||||
|
padding-right: 1ex;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
#zero_click_abstract table.vim-table td code {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 380px) {
|
||||||
|
#zero_click_abstract .vim-column {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,682 @@
|
||||||
|
[
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name" : "Cursor movement",
|
||||||
|
"rows" : [
|
||||||
|
{
|
||||||
|
"help" : "move left",
|
||||||
|
"cmds" : [
|
||||||
|
"h"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"j"
|
||||||
|
],
|
||||||
|
"help" : "move down"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "move up",
|
||||||
|
"cmds" : [
|
||||||
|
"k"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"l"
|
||||||
|
],
|
||||||
|
"help" : "move right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"w"
|
||||||
|
],
|
||||||
|
"help" : "jump by start of words (punctuation considered words)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"W"
|
||||||
|
],
|
||||||
|
"help" : "jump by words (spaces separate words)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"e"
|
||||||
|
],
|
||||||
|
"help" : "jump to end of words (punctuation considered words)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"E"
|
||||||
|
],
|
||||||
|
"help" : "jump to end of words (no punctuation)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"b"
|
||||||
|
],
|
||||||
|
"help" : "jump backward by words (punctuation considered words)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"B"
|
||||||
|
],
|
||||||
|
"help" : "jump backward by words (no punctuation)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"0"
|
||||||
|
],
|
||||||
|
"help" : "(zero) start of line"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"^"
|
||||||
|
],
|
||||||
|
"help" : "first non-blank character of line"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "end of line",
|
||||||
|
"cmds" : [
|
||||||
|
"$"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"G"
|
||||||
|
],
|
||||||
|
"help" : "Go To command (prefix with number"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name" : "Insert Mode - Inserting/Appending text",
|
||||||
|
"rows" : [
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"i"
|
||||||
|
],
|
||||||
|
"help" : "start insert mode at cursor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"I"
|
||||||
|
],
|
||||||
|
"help" : "insert at the beginning of the line"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"a"
|
||||||
|
],
|
||||||
|
"help" : "append after the cursor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "append at the end of the line",
|
||||||
|
"cmds" : [
|
||||||
|
"A"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "open (append) blank line below current line (no need to press return)",
|
||||||
|
"cmds" : [
|
||||||
|
"o"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"O"
|
||||||
|
],
|
||||||
|
"help" : "open blank line above current line"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "append at end of word",
|
||||||
|
"cmds" : [
|
||||||
|
"ea"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "exit insert mode",
|
||||||
|
"cmds" : [
|
||||||
|
"Esc"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name" : "Editing",
|
||||||
|
"rows" : [
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"r"
|
||||||
|
],
|
||||||
|
"help" : "replace a single character (does not use insert mode)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"J"
|
||||||
|
],
|
||||||
|
"help" : "join line below to the current one"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"cc"
|
||||||
|
],
|
||||||
|
"help" : "change (replace) an entire line"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "change (replace) to the end of word",
|
||||||
|
"cmds" : [
|
||||||
|
"cw"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"c$"
|
||||||
|
],
|
||||||
|
"help" : "change (replace) to the end of line"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "delete character at cursor and substitute text",
|
||||||
|
"cmds" : [
|
||||||
|
"s"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "delete line at cursor and substitute text (same as cc)",
|
||||||
|
"cmds" : [
|
||||||
|
"S"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "transpose two letter (delete and paste, technically)",
|
||||||
|
"cmds" : [
|
||||||
|
"xp"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "undo",
|
||||||
|
"cmds" : [
|
||||||
|
"u"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "redo",
|
||||||
|
"cmds" : [
|
||||||
|
"Ctrl + r"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "repeat last command",
|
||||||
|
"cmds" : [
|
||||||
|
"."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rows" : [
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"v"
|
||||||
|
],
|
||||||
|
"help" : "start visual mode, mark lines, then do command (such as y-yank)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "start Linewise visual mode",
|
||||||
|
"cmds" : [
|
||||||
|
"V"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "move to other end of marked area",
|
||||||
|
"cmds" : [
|
||||||
|
"o"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"Ctrl + v"
|
||||||
|
],
|
||||||
|
"help" : "start visual block mode"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "move to Other corner of block",
|
||||||
|
"cmds" : [
|
||||||
|
"O"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "mark a word",
|
||||||
|
"cmds" : [
|
||||||
|
"aw"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "a () block (with braces)",
|
||||||
|
"cmds" : [
|
||||||
|
"ab"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "a {} block (with brackets)",
|
||||||
|
"cmds" : [
|
||||||
|
"aB"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"ib"
|
||||||
|
],
|
||||||
|
"help" : "inner () block"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"iB"
|
||||||
|
],
|
||||||
|
"help" : "inner {} block"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "exit visual mode",
|
||||||
|
"cmds" : [
|
||||||
|
"Esc"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name" : "Marking text (visual mode)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rows" : [
|
||||||
|
{
|
||||||
|
"help" : "shift right",
|
||||||
|
"cmds" : [
|
||||||
|
">"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"<"
|
||||||
|
],
|
||||||
|
"help" : "shift left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "yank (copy) marked text",
|
||||||
|
"cmds" : [
|
||||||
|
"y"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"d"
|
||||||
|
],
|
||||||
|
"help" : "delete marked text"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "switch case",
|
||||||
|
"cmds" : [
|
||||||
|
"~"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name" : "Visual commands"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rows" : [
|
||||||
|
{
|
||||||
|
"help" : "yank (copy) a line",
|
||||||
|
"cmds" : [
|
||||||
|
"yy"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"2yy"
|
||||||
|
],
|
||||||
|
"help" : "yank 2 lines"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "yank word",
|
||||||
|
"cmds" : [
|
||||||
|
"yw"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"y$"
|
||||||
|
],
|
||||||
|
"help" : "yank to end of line"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "put (paste) the clipboard after cursor",
|
||||||
|
"cmds" : [
|
||||||
|
"p"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"P"
|
||||||
|
],
|
||||||
|
"help" : "put (paste) before cursor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "delete (cut) a line",
|
||||||
|
"cmds" : [
|
||||||
|
"dd"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "delete (cut) 2 lines",
|
||||||
|
"cmds" : [
|
||||||
|
"2dd"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "delete (cut) the current word",
|
||||||
|
"cmds" : [
|
||||||
|
"dw"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"D"
|
||||||
|
],
|
||||||
|
"help" : "delete (cut) to the end of line"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "delete (cut) to the end of the line",
|
||||||
|
"cmds" : [
|
||||||
|
"d$"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"x"
|
||||||
|
],
|
||||||
|
"help" : "delete (cut) current character"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name" : "Cut and Paste"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"rows" : [
|
||||||
|
{
|
||||||
|
"help" : "yank (copy) a line",
|
||||||
|
"cmds" : [
|
||||||
|
"yy"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"2yy"
|
||||||
|
],
|
||||||
|
"help" : "yank 2 lines"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "yank word",
|
||||||
|
"cmds" : [
|
||||||
|
"yw"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"y$"
|
||||||
|
],
|
||||||
|
"help" : "yank to end of line"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "put (paste) the clipboard after cursor",
|
||||||
|
"cmds" : [
|
||||||
|
"p"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"P"
|
||||||
|
],
|
||||||
|
"help" : "put (paste) before cursor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "delete (cut) a line",
|
||||||
|
"cmds" : [
|
||||||
|
"dd"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "delete (cut) 2 lines",
|
||||||
|
"cmds" : [
|
||||||
|
"2dd"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "delete (cut) the current word",
|
||||||
|
"cmds" : [
|
||||||
|
"dw"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"D"
|
||||||
|
],
|
||||||
|
"help" : "delete (cut) to the end of line"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "delete (cut) to the end of the line",
|
||||||
|
"cmds" : [
|
||||||
|
"d$"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"x"
|
||||||
|
],
|
||||||
|
"help" : "delete (cut) current character"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name" : "Cut and Paste"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rows" : [
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
":w"
|
||||||
|
],
|
||||||
|
"help" : "write (save) the file, but don't exit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
":wq"
|
||||||
|
],
|
||||||
|
"help" : "write (save) and quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
":x"
|
||||||
|
],
|
||||||
|
"help" : "write (save) and quit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
":q"
|
||||||
|
],
|
||||||
|
"help" : "quit (fails if anything has changed)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
":q!"
|
||||||
|
],
|
||||||
|
"help" : "quit and throw away changes"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name" : "Exiting"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name" : "Search/Replace",
|
||||||
|
"rows" : [
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"/pattern"
|
||||||
|
],
|
||||||
|
"help" : "search for pattern"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "search backward for pattern",
|
||||||
|
"cmds" : [
|
||||||
|
"?pattern"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "repeat search in same direction",
|
||||||
|
"cmds" : [
|
||||||
|
"n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "repeat search in opposite direction",
|
||||||
|
"cmds" : [
|
||||||
|
"N"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "replace all old with new throughout file",
|
||||||
|
"cmds" : [
|
||||||
|
":%s/old/new/g"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "replace all old with new throughout file with confirmations",
|
||||||
|
"cmds" : [
|
||||||
|
":%s/old/new/gc"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name" : "Working with multiple files",
|
||||||
|
"rows" : [
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
":e filename"
|
||||||
|
],
|
||||||
|
"help" : "Edit a file in a new buffer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
":bnext",
|
||||||
|
":bn"
|
||||||
|
],
|
||||||
|
"help" : "go to next buffer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
":bprev",
|
||||||
|
":bp"
|
||||||
|
],
|
||||||
|
"help" : "go to previous buffer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
":bd"
|
||||||
|
],
|
||||||
|
"help" : "delete a buffer (close a file)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "Open a file in a new buffer and split window",
|
||||||
|
"cmds" : [
|
||||||
|
":sp filename"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "Open a file in a new buffer and vertically split window ",
|
||||||
|
"cmds" : [
|
||||||
|
":vsp filename"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "Split windows",
|
||||||
|
"cmds" : [
|
||||||
|
"Ctrl + ws"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"Ctrl + ww"
|
||||||
|
],
|
||||||
|
"help" : "switch windows"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"Ctrl + wq"
|
||||||
|
],
|
||||||
|
"help" : "Quit a window"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"Ctrl + wv"
|
||||||
|
],
|
||||||
|
"help" : "split windows vertically"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rows" : [
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
":tabnew filename",
|
||||||
|
":tabn filename"
|
||||||
|
],
|
||||||
|
"help" : "open file in a new tab"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "move current split window into its own tab",
|
||||||
|
"cmds" : [
|
||||||
|
"Ctrl+W T"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"gt",
|
||||||
|
":tabnext",
|
||||||
|
":tabn"
|
||||||
|
],
|
||||||
|
"help" : "move to next tab"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"gT",
|
||||||
|
":tabprev",
|
||||||
|
":tabp"
|
||||||
|
],
|
||||||
|
"help" : "move to previous tab"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
"#gt"
|
||||||
|
],
|
||||||
|
"help" : "move to tab number #"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
":tabmove #"
|
||||||
|
],
|
||||||
|
"help" : "move current tab to the #th position (indexed from 0)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmds" : [
|
||||||
|
":tabclose",
|
||||||
|
":tabc"
|
||||||
|
],
|
||||||
|
"help" : "close the current tab and all its windows"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"help" : "close all other tabs except for the current one",
|
||||||
|
"cmds" : [
|
||||||
|
":tabonly",
|
||||||
|
":tabo"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name" : "Tabs"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
|
@ -0,0 +1,21 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
use Test::More;
|
||||||
|
use DDG::Test::Goodie;
|
||||||
|
use Carp::Always;
|
||||||
|
|
||||||
|
zci answer_type => 'vim_cheat';
|
||||||
|
|
||||||
|
ddg_goodie_test(
|
||||||
|
[ 'DDG::Goodie::VimCheatSheet' ],
|
||||||
|
'vim cheat sheet' => test_zci(
|
||||||
|
qr/^Cursor movement.*Insert Mode.*Editing.*Marking text.*/s,
|
||||||
|
heading => 'Vim Cheat Sheet',
|
||||||
|
html => qr#<div(.*<table.*<tr.*<td.*</table.*)+</div>$#s,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
done_testing;
|
Loading…
Reference in New Issue