Skip to content

Instantly share code, notes, and snippets.

@romainl
Last active October 29, 2022 19:26
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save romainl/5b2cfb2b81f02d44e1d90b74ef555e31 to your computer and use it in GitHub Desktop.
Save romainl/5b2cfb2b81f02d44e1d90b74ef555e31 to your computer and use it in GitHub Desktop.
Make various list-like commands more intuitive
" Background here: https://gist.github.com/romainl/047aca21e338df7ccf771f96858edb86
" with help from https://github.com/teoljungberg
function! CCR()
let cmdline = getcmdline()
let filter_stub = '\v\C^((filt|filte|filter) .+ )*'
command! -bar Z silent set more|delcommand Z
if getcmdtype() !~ ':'
return "\<CR>"
endif
if cmdline =~ filter_stub . '(ls|files|buffers)$'
" like :ls but prompts for a buffer command
return "\<CR>:b"
elseif cmdline =~ '\v\C/(#|nu|num|numb|numbe|number|l|li|lis|list)$'
" like :g//# but prompts for a command
return "\<CR>:"
elseif cmdline =~ filter_stub . '(\%)*(#|nu|num|numb|numbe|number|l|li|lis|list)$'
" like :g//# but prompts for a command
return "\<CR>:"
elseif cmdline =~ '\v\C^(dli|il)'
" like :dlist or :ilist but prompts for a count for :djump or :ijump
return "\<CR>:" . cmdline[0] . "j " . split(cmdline, " ")[1] . "\<S-Left>\<Left>"
elseif cmdline =~ filter_stub . '(cli)'
" like :clist or :llist but prompts for an error/location number
return "\<CR>:sil cc\<Space>"
elseif cmdline =~ filter_stub . '(lli)'
" like :clist or :llist but prompts for an error/location number
return "\<CR>:sil ll\<Space>"
elseif cmdline =~ filter_stub . 'old'
" like :oldfiles but prompts for an old file to edit
set nomore
return "\<CR>:Z|e #<"
elseif cmdline =~ filter_stub . 'changes'
" like :changes but prompts for a change to jump to
set nomore
return "\<CR>:Z|norm! g;\<S-Left>"
elseif cmdline =~ filter_stub . 'ju'
" like :jumps but prompts for a position to jump to
set nomore
return "\<CR>:Z|norm! \<C-o>\<S-Left>"
elseif cmdline =~ filter_stub . 'marks'
" like :marks but prompts for a mark to jump to
return "\<CR>:norm! `"
elseif cmdline =~ '\v\C^undol'
" like :undolist but prompts for a change to undo
return "\<CR>:u "
elseif cmdline =~ '\v\C^tabs'
set nomore
return "\<CR>:Z| tabnext\<S-Left>"
elseif cmdline =~ '^\k\+$'
" handle cabbrevs gracefully
" https://www.reddit.com/r/vim/comments/jgyqhl/nightly_hack_for_vimmers/
return "\<C-]>\<CR>"
else
return "\<CR>"
endif
endfunction
cnoremap <expr> <CR> CCR()
@romainl
Copy link
Author

romainl commented Apr 4, 2022

@craigmac :# is a synonym of :number so it has to be taken into account. As of now, line 14 is triggered by commands like :g/foo/#, which I use quite often.
The pattern could definitely be improved or I could !! a second pattern.

@romainl
Copy link
Author

romainl commented Apr 18, 2022

@craigmac looking at it again, :buffer #<CR> and :edit #<CR> seem to work fine on my end.

  • The pattern on line 14 has a / before the # so it shouldn't match against :<command> #.
  • The pattern on line 17 starts with \v\C^((filt|filte|filter) .+ )* so it shouldn't match either.

Do you use the latest version of this gist?

@craigmac
Copy link

@romainl I re-copied and tried it out, only to realize I had my own version of the command overriding this one (which had a syntax error causing my bug). Apologies, it works fine as is!

@romainl
Copy link
Author

romainl commented Apr 19, 2022

@craigmac No problem!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment