6 changed files with 202 additions and 3 deletions
@ -0,0 +1,56 @@ |
|||||||
|
# Cheat40: a cheat sheet for Vim |
||||||
|
|
||||||
|
Cheat40 is a foldable extensible 40-column cheat sheet that you may open in Vim |
||||||
|
by pressing `<leader>?` (the mapping is customizable, of course). Mappings and |
||||||
|
commands are organized like the menus of a GUI app: there is a File section, an |
||||||
|
Edit section, a View section, and so on. For each item the description comes |
||||||
|
first, because one typically wants to find how to execute a task, not what the |
||||||
|
meaning of a key sequence is (there is Vim's help for that). Syntax coloring and |
||||||
|
the use of `conceal` keep the cheat sheet clutter-free and easy to read. |
||||||
|
|
||||||
|
|
||||||
|
## Installation |
||||||
|
|
||||||
|
If your Vim supports packages (`echo has('packages')` prints `1`), I strongly |
||||||
|
recommend that you use them. Just clone this repo inside `pack/*/start`, e.g., |
||||||
|
|
||||||
|
cd ~/.vim |
||||||
|
git clone https://github.com/lifepillar/vim-cheat40.git pack/bundle/start/cheat40 |
||||||
|
|
||||||
|
Otherwise, use your preferred installation method. |
||||||
|
|
||||||
|
|
||||||
|
## Extending the cheat sheet |
||||||
|
|
||||||
|
You may extend the cheat sheet by putting one or more files called `cheat40.txt` |
||||||
|
anywhere in your `runtimepath` (e.g., in `~/.vim`). Cheat40 searches |
||||||
|
`runtimepath` for such files and concatenates their content. This allows plugin |
||||||
|
developers to provide a cheat sheet for their plugins by putting a `cheat40.txt` |
||||||
|
file in the top folder of their plugins. |
||||||
|
|
||||||
|
If you do not want to use the default cheat sheet that comes with this plugin, |
||||||
|
set the following variable in your `.vimrc`: |
||||||
|
|
||||||
|
let g:cheat40_use_default = 0 |
||||||
|
|
||||||
|
In this case, I recommend that you copy `cheat40.txt` into your `.vim` folder |
||||||
|
and modify it to suit your needs. |
||||||
|
|
||||||
|
The syntax of a cheat sheet is very simple: |
||||||
|
|
||||||
|
- foldable sections use Vim's default markers (`{{{` and `}}}`) (see `:h |
||||||
|
fold-marker`); |
||||||
|
- sections of the form `About … {{{ … }}}` are interpreted as block comments; |
||||||
|
- lines starting with a `#` are interpreted as line comments; |
||||||
|
- each line, except for comments and section markers, should be 40 columns wide |
||||||
|
(comments and section markers may be shorter than that); |
||||||
|
- each item consists of a description, a key sequence, and a label; |
||||||
|
- the description must fit in columns 1–25 (long descriptions may be split into |
||||||
|
several lines); |
||||||
|
- the key sequence and the label must fit in columns 26–40 (long key sequences |
||||||
|
should be split into several lines); |
||||||
|
- the label is a right-justified sequence of one or more characters (e.g., `N` |
||||||
|
for Normal mode, `I` for Insert mode, and so on). |
||||||
|
|
||||||
|
See the cheat sheet inside the plugin for the details. |
||||||
|
|
@ -0,0 +1,45 @@ |
|||||||
|
" Author: Lifepillar |
||||||
|
" Maintainer: Lifepillar |
||||||
|
" License: Distributed under the same terms as Vim itself. See :help license. |
||||||
|
|
||||||
|
let s:cheat40_dir = fnamemodify(resolve(expand('<sfile>:p')), ':h:h') |
||||||
|
|
||||||
|
" Courtesy of Pathogen |
||||||
|
function! s:slash() abort |
||||||
|
return !exists("+shellslash") || &shellslash ? '/' : '\' |
||||||
|
endfunction |
||||||
|
|
||||||
|
|
||||||
|
" Split a path into a list. Code from Pathogen. |
||||||
|
function! s:split(path) abort |
||||||
|
if type(a:path) == type([]) | return a:path | endif |
||||||
|
if empty(a:path) | return [] | endif |
||||||
|
let split = split(a:path,'\\\@<!\%(\\\\\)*\zs,') |
||||||
|
return map(split,'substitute(v:val,''\\\([\\,]\)'',''\1'',"g")') |
||||||
|
endfunction |
||||||
|
|
||||||
|
fun! cheat40#open(newtab) |
||||||
|
if a:newtab |
||||||
|
tabnew +setlocal\ buftype=nofile\ bufhidden=hide\ nobuflisted\ noswapfile\ winfixwidth |
||||||
|
else |
||||||
|
botright 40vnew +setlocal\ buftype=nofile\ bufhidden=hide\ nobuflisted\ noswapfile\ winfixwidth |
||||||
|
endif |
||||||
|
if get(g:, 'cheat40_use_default', 1) |
||||||
|
execute '$read' s:cheat40_dir.s:slash().'cheat40.txt' |
||||||
|
endif |
||||||
|
for glob in reverse(s:split(&runtimepath)) |
||||||
|
for cs in filter(map(filter(split(glob(glob), "\n"), 'v:val !~ "cheat40"'), 'v:val.s:slash()."cheat40.txt"'), 'filereadable(v:val)') |
||||||
|
execute "$read" cs |
||||||
|
endfor |
||||||
|
endfor |
||||||
|
norm ggd_ |
||||||
|
setlocal foldmethod=marker foldtext=substitute(getline(v:foldstart),'\\s\\+{{{.*$','','') |
||||||
|
execute 'setlocal foldlevel='.get(g:, 'cheat40_foldlevel', 1) |
||||||
|
setlocal concealcursor=nc conceallevel=3 |
||||||
|
setlocal expandtab nonumber norelativenumber nospell nowrap textwidth=40 |
||||||
|
setlocal fileencoding=utf-8 filetype=cheat40 nomodifiable |
||||||
|
setlocal iskeyword=@,48-57,-,/,.,192-255 |
||||||
|
execute "setlocal" "tags=".s:cheat40_dir.s:slash()."tags" |
||||||
|
nnoremap <silent> <buffer> <tab> <c-w><c-p> |
||||||
|
nnoremap <silent> <buffer> q <c-w><c-p>@=winnr("#")<cr><c-w>c |
||||||
|
endf |
@ -0,0 +1,17 @@ |
|||||||
|
" Author: Lifepillar |
||||||
|
" Maintainer: Lifepillar |
||||||
|
" License: Distributed under the same terms as Vim itself. See :help license. |
||||||
|
|
||||||
|
if exists("g:loaded_cheatsheet") || &cp || v:version < 700 |
||||||
|
finish |
||||||
|
endif |
||||||
|
let g:loaded_cheatsheet = 1 |
||||||
|
|
||||||
|
command -bar -nargs=0 -bang Cheat40 call cheat40#open("<bang>" ==# '!') |
||||||
|
|
||||||
|
"if mapcheck("<leader>?", "n") == "" |
||||||
|
"nmap <unique> <leader>? :<c-u>Cheat40<cr> |
||||||
|
"endif |
||||||
|
|
||||||
|
nmap <leader>? :<c-u>Cheat40<cr> |
||||||
|
|
@ -0,0 +1,45 @@ |
|||||||
|
" Author: Lifepillar |
||||||
|
" Maintainer: Lifepillar |
||||||
|
" License: Distributed under the same terms as Vim itself. See :help license. |
||||||
|
|
||||||
|
if exists("b:current_syntax") |
||||||
|
finish |
||||||
|
endif |
||||||
|
|
||||||
|
syntax case ignore |
||||||
|
syntax sync fromstart |
||||||
|
|
||||||
|
syn match Cheat40Descr /\%1v.*\%<26v./ |
||||||
|
syn match Cheat40Command /\%26v.*\%<41v./ contains=Cheat40Mode,Cheat40Angle,Cheat40DblAngle |
||||||
|
syn match Cheat40Header /^.*{{{\d*$/ contains=Cheat40BeginSection |
||||||
|
syn region Cheat40About start=/^About.*{{{\d*$/ end=/^}}}$/ keepend contains=Cheat40BeginSection,Cheat40EndSection,Cheat40Tag,Cheat40Angle,Cheat40DblAngle |
||||||
|
syn match Cheat40FirstLine /\%1l.*/ |
||||||
|
syn match Cheat40BeginSection /{{{\d*/ contained conceal |
||||||
|
syn match Cheat40EndSection /^}}}$/ conceal |
||||||
|
syn match Cheat40Tag /`[^` \t]\+`/hs=s+1,he=e-1 contained contains=Cheat40Backtick,Cheat40Runtime |
||||||
|
syn match Cheat40Backtick /`/ contained conceal |
||||||
|
syn match Cheat40Mode /[NICVTOM*]\+\%>40v/ |
||||||
|
syn match Cheat40Angle /‹[^› \t]\+›/ contained |
||||||
|
syn match Cheat40DblAngle /«[^» \t]\+»/ contained |
||||||
|
syn match Cheat40Comment /^#.*$/ contains=Cheat40Hash |
||||||
|
syn match Cheat40Hash /^#\s*/ contained conceal |
||||||
|
syn match Cheat40Runtime /\$VIMRUNTIME\/doc\// contained conceal |
||||||
|
|
||||||
|
hi def link Cheat40Descr Normal |
||||||
|
hi def link Cheat40Command Constant |
||||||
|
hi def link Cheat40Header Title |
||||||
|
hi def link Cheat40About Comment |
||||||
|
hi def link Cheat40FirstLine Statement |
||||||
|
hi def link Cheat40BeginSection Ignore |
||||||
|
hi def link Cheat40EndSection Ignore |
||||||
|
hi def link Cheat40Tag Tag |
||||||
|
hi def link Cheat40Backtick Ignore |
||||||
|
hi def link Cheat40Mode Type |
||||||
|
hi def link Cheat40Angle Identifier |
||||||
|
hi def link Cheat40DblAngle Label |
||||||
|
hi def link Cheat40Comment Comment |
||||||
|
hi def link Cheat40Hash Ignore |
||||||
|
hi def link Cheat40Runtime Ignore |
||||||
|
|
||||||
|
let b:current_syntax = "cheat40" |
||||||
|
|
@ -0,0 +1,33 @@ |
|||||||
|
Press q to dismiss, <Tab> to lose focus |
||||||
|
|
||||||
|
Перемещение {{{1 |
||||||
|
|
||||||
|
В начало экрана H N |
||||||
|
В центр экрана M N |
||||||
|
В конец экрана L N |
||||||
|
|
||||||
|
Вперёд на один экран ^F N |
||||||
|
Назад на один экран ^B N |
||||||
|
Вперёд на полэкрана ^D N |
||||||
|
Назад на полэкрана ^U N |
||||||
|
|
||||||
|
Строку наверх экрана z<ENTER> N |
||||||
|
Строку в центр экрана z. N |
||||||
|
Строку вниз экрана z- N |
||||||
|
|
||||||
|
ex {{{1 |
||||||
|
|
||||||
|
Замена в найденных стр. :g/../s/a/b/g C |
||||||
|
Замена с подтверждением :s/a/b/gc C |
||||||
|
Повтор последней замены :%&g C |
||||||
|
|
||||||
|
Регистры {{{1 |
||||||
|
|
||||||
|
Содержимое регистров :registers N |
||||||
|
Копировать строку в `a` "ayy N |
||||||
|
Добавить строку в `a` "Ayy N |
||||||
|
|
||||||
|
Разное {{{1 |
||||||
|
|
||||||
|
Открыть ссылку gx N |
||||||
|
|
Loading…
Reference in new issue