Using a vimscript to run through a list of substitutions with dictionary pairs

I wanted to modify a test suite to call a method using ruby 2's keyword arguments. There were several calls to the same initialization function that followed a pattern that made it a good candidate for a series of `%s` calls using key-value pairs in a dictionary.

Interesting how vimscript uses a leading slash as line continuation instead of a trailing slash at the end of the continued line.

Also, it took me a while to figure out that interpolating a variable in an Ex command required "execute" and string concatenation with periods.

let fields = { 'public_key' : 'public_pem_key',
              \'private_key' : 'private_pem_key',
              \'username' : 'username',
              \'password' : 'password',
              \'url' : 'url',
              \'ssl_verify_host' : 'ssl_verify_host'
            \}
 
for key in keys(fields)
  execute '%s//\1' . key . ': \2/'
endfor

powerline vim, NameError, invalid expression error on the latest update.

I have vim with pathogen and on the latest update of the powerline.vim, everything broke.

It turns out that my old default config files are incompatible with the new version of powerline. See GitHub issue.

When I ran vim with --cmd 'let g:powerline_config_overrides={"common":{"log_file":"/tmp/powerline.log"}}' as suggested, a bunch of config mapping errors showed up:

2014-09-03 15:36:33,992:ERROR:vim:matcher_generator:Failed to import attr ctrlp from module powerline.matchers.plugin.ctrlp: No module named plugin.ctrlp
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/__init__.py", line 311, in get_module_attr
    return getattr(__import__(module, fromlist=(attr,)), attr)
ImportError: No module named plugin.ctrlp
2014-09-03 15:36:33,993:ERROR:vim:matcher_generator:Failed to import attr gundo_preview from module powerline.matchers.plugin.gundo: No module named plugin.gundo
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/__init__.py", line 311, in get_module_attr
    return getattr(__import__(module, fromlist=(attr,)), attr)
ImportError: No module named plugin.gundo
2014-09-03 15:36:33,995:ERROR:vim:matcher_generator:Failed to import attr nerdtree from module powerline.matchers.plugin.nerdtree: No module named plugin.nerdtree
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/__init__.py", line 311, in get_module_attr
    return getattr(__import__(module, fromlist=(attr,)), attr)
ImportError: No module named plugin.nerdtree
2014-09-03 15:36:33,998:ERROR:vim:matcher_generator:Failed to import attr gundo from module powerline.matchers.plugin.gundo: No module named plugin.gundo
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/__init__.py", line 311, in get_module_attr
    return getattr(__import__(module, fromlist=(attr,)), attr)
ImportError: No module named plugin.gundo
2014-09-03 15:36:34,010:ERROR:vim:segment_generator:Failed to generate segment from {u'name': u'mode', u'exclude_modes': [u'nc']}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,010:ERROR:vim:segment_generator:Failed to generate segment from {u'priority': 10, u'name': u'visual_range', u'exclude_modes': [u'nc']}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,011:ERROR:vim:segment_generator:Failed to generate segment from {u'priority': 10, u'name': u'paste_indicator', u'exclude_modes': [u'nc']}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,011:ERROR:vim:segment_generator:Failed to generate segment from {u'priority': 30, u'name': u'branch', u'exclude_modes': [u'nc']}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,011:ERROR:vim:segment_generator:Failed to generate segment from {u'after': u' ', u'name': u'readonly_indicator', u'draw_soft_divider': False}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,011:ERROR:vim:segment_generator:Failed to generate segment from {u'priority': 40, u'name': u'file_directory', u'draw_soft_divider': False}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,011:ERROR:vim:segment_generator:Failed to generate segment from {u'name': u'file_name', u'draw_soft_divider': False}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,011:ERROR:vim:segment_generator:Failed to generate segment from {u'name': u'file_vcs_status', u'draw_soft_divider': False, u'before': u' '}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,011:ERROR:vim:segment_generator:Failed to generate segment from {u'name': u'modified_indicator', u'before': u' '}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,011:ERROR:vim:segment_generator:Failed to generate segment from {u'priority': 50, u'module': u'powerline.segments.plugin.syntastic', u'exclude_modes': [u'nc'], u'name': u'syntastic'}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,011:ERROR:vim:segment_generator:Failed to generate segment from {u'draw_soft_divider': False, u'priority': 50, u'module': u'powerline.segments.plugin.tagbar', u'exclude_modes': [u'nc'], u'name': u'current_tag'}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,012:ERROR:vim:segment_generator:Failed to generate segment from {u'priority': 60, u'name': u'file_format', u'draw_soft_divider': False, u'exclude_modes': [u'nc']}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,012:ERROR:vim:segment_generator:Failed to generate segment from {u'priority': 60, u'name': u'file_encoding', u'exclude_modes': [u'nc']}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,012:ERROR:vim:segment_generator:Failed to generate segment from {u'priority': 60, u'name': u'file_type', u'exclude_modes': [u'nc']}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,012:ERROR:vim:segment_generator:Failed to generate segment from {u'priority': 50, u'width': 4, u'align': u'r', u'name': u'line_percent'}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,012:ERROR:vim:segment_generator:Failed to generate segment from {u'width': 3, u'align': u'r', u'name': u'line_current', u'draw_soft_divider': False}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'
2014-09-03 15:36:34,012:ERROR:vim:segment_generator:Failed to generate segment from {u'name': u'virtcol_current', u'align': u'l', u'priority': 20, u'width': 3, u'draw_soft_divider': False, u'before': u':'}: u'function'
Traceback (most recent call last):
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 240, in get
    contents, _contents_func, module, function_name, name = get_segment_info(data, segment)
  File "/Users/tpowell/.vim/bundle/powerline/powerline/segment.py", line 62, in get_function
    function_name = segment['function']
KeyError: u'function'

The quickest solution is to take the new default config files and dump them in your ~/.config/powerline directory.

Moving back to the last cursor position in line in vim

Ever have a stray keystroke in vim that jumped to somewhere you didn't intend to go?

Two backticks `` will jump to the exact position of where you were.
Two single quotes '' will jump to the first non-blank character where you were.

This also works for moving to the beginning of a line/cursor position set by a mark (

m{a-zA-z}

)

More explanation can be found at :help mark-motions.

Using vim-rails to help navigate the rails project.

In the interest of being able to quickly navigate my Rails projects, I decided to dive a little deeper into the vim-rails plugin.

This helpfile describes the commands in detail, but some of the quick commands are :Econtroller, :Emodel, :Eview, which pretty reliably jump between corresponding controller, model, and view.

:Espec needs a little more help, in that you have to specify the underlying model/view/controller under test to find the correct spec file. Jumping back to the corresponding file under test is a little more reliable.

If you want to go to the new file in a split, vsplit, or new tab, you can use substitute S/V/T for E (e.g., :Sspec, :Vmodel).

This plugin may seem a bit like overkill if you already have the CtrlP working the way you want it to, but I find that I like having the more focused search functionality of a per-model/controller search and the automatic jumping from model to controller in many instances where the model and controller directories have a lot of similarly named files.

Getting Fast File Finder Functionality Out of Vim

Problem:

All of these other editors have handy functionality to quickly find a file

Solution:

ctrlp.vim is a plugin that allows you to do that.

The plugin's page has full instructions, but the most important detail after work done in yesterday's post to declutter my vim windows:

After pressing Ctrl-P, use <c-t> or <c-v>, <c-x> to open the selected entry in a new tab or in a new split.

Otherwise, you'll end up replacing your file in the currently open window with the file you're opening.

Avoiding Scattered Vim Windows in MacVim

Problem:

I open too many windows in vim, which get buried in the clutter on my Mac OS X desktop.

Solution:

Open files in MacVim in an existing window using a tab

mvim --remote-tab new_file_to_open.rb

Open files in MacVim in an existing window using a split

mvim --remote-send ":split `pwd`/new_file_to_open.rb<CR>"

I packaged this in a zsh script called spvim. It will only handle relative paths for now, which in 99% of what I'm trying to open, anyway.

for i in $*
do
  mvim --remote-send ":split `pwd`/$i<CR>"
done

Open files in MacVim in an existing windows using a vertical split:

mvim --remote-send ":vsplit `pwd`/new_file_to_open.rb<CR>"

I packaged this in a zsh script called vspvim:

for i in $*
do
  mvim --remote-send ":vsplit `pwd`/$i<CR>"
done

Sources/Learning More:

(I believe most of these options are available in vim as well... I actually have gvim aliased to mvim because I'm still in the habit of calling gvim).

usage: vim [arguments] [file ..]       edit specified file(s)
   or: vim [arguments] -               read text from stdin
   or: vim [arguments] -t tag          edit file where tag is defined
   or: vim [arguments] -q [errorfile]  edit file with first error

Arguments:
   --           Only file names after this
   -g           Run using GUI (like "gvim")
   -f  or  --nofork Foreground: Don&#039;t fork when starting GUI
   -v           Vi mode (like "vi")
   -e           Ex mode (like "ex")
   -E           Improved Ex mode
   -s           Silent (batch) mode (only for "ex")
   -d           Diff mode (like "vimdiff")
   -y           Easy mode (like "evim", modeless)
   -R           Readonly mode (like "view")
   -Z           Restricted mode (like "rvim")
   -m           Modifications (writing files) not allowed
   -M           Modifications in text not allowed
   -b           Binary mode
   -l           Lisp mode
   -C           Compatible with Vi: &#039;compatible&#039;
   -N           Not fully Vi compatible: &#039;nocompatible&#039;
   -V[N][fname]     Be verbose [level N] [log messages to fname]
   -D           Debugging mode
   -n           No swap file, use memory only
   -r           List swap files and exit
   -r (with file name)  Recover crashed session
   -L           Same as -r
   -A           start in Arabic mode
   -H           Start in Hebrew mode
   -F           Start in Farsi mode
   -T <terminal>    Set terminal type to <terminal>
   -u <vimrc>       Use <vimrc> instead of any .vimrc
   -U <gvimrc>      Use <gvimrc> instead of any .gvimrc
   --noplugin       Don&#039;t load plugin scripts
   -p[N]        Open N tab pages (default: one for each file)
   -o[N]        Open N windows (default: one for each file)
   -O[N]        Like -o but split vertically
   +            Start at end of file
   +<lnum>      Start at line <lnum>
   --cmd <command>  Execute <command> before loading any vimrc file
   -c <command>     Execute <command> after loading the first file
   -S <session>     Source file <session> after loading the first file
   -s <scriptin>    Read Normal mode commands from file <scriptin>
   -w <scriptout>   Append all typed commands to file <scriptout>
   -W <scriptout>   Write all typed commands to file <scriptout>
   -x           Edit encrypted files
   --remote <files> Edit <files> in a Vim server if possible
   --remote-silent <files>  Same, don&#039;t complain if there is no server
   --remote-wait <files>  As --remote but wait for files to have been edited
   --remote-wait-silent <files>  Same, don&#039;t complain if there is no server
   --remote-tab[-wait][-silent] <files>  As --remote but use tab page per file
   --remote-send <keys> Send <keys> to a Vim server and exit
   --remote-expr <expr> Evaluate <expr> in a Vim server and print result
   --serverlist     List available Vim server names and exit
   --servername <name>  Send to/become the Vim server <name>
   --startuptime <file> Write startup timing messages to <file>
   -i <viminfo>     Use <viminfo> instead of .viminfo
   -h  or  --help   Print Help (this message) and exit
   --version        Print version information and exit