Vim is an amazing text editor and over the years has allowed me to be far more efficient when writing code or editing text in general. Although the initial learning curve is a bit steep, it’s well worth the time to learn to navigate and edit files without your mouse. But what makes Vim even more powerful is that it’s hackable - if you find yourself executing a sequence of keystrokes over and over for certain tasks, you can create your own function that can be used throughout Vim.
Sometimes I get Excel spreadsheets from clients who want me to look at data related to a list of numbers they provided me in an Excel column. If I were to paste those numbers in Vim, I’d get something that looks like the following:
If I were to use that list of numbers as a SQL list in the WHERE clause of a SQL query, I’d need to surround all of the numbers by quotes and put a comma at the end of each number. Finally, I’d need to collapse all the rows into one line and surround that line with parentheses. Essentially, I need to take those numbers and create a tuple. So I want something that looks like this:
Doing that by hand would take quite a bit of time, especially if given a list of hundreds of numbers. This is where Vim shines - we can create a function in our vimrc file that will handle these steps for us.
" convert rows of numbers or text (as if pasted from excel column) to a tuplefunction! ToTupleFunction() rangesilentexecutea:firstline . "," . a:lastline . "s/^/'/"silentexecutea:firstline . "," . a:lastline . "s/$/',/"silentexecutea:firstline . "," . a:lastline . "join"silentexecute "normal I("silentexecute "normal $xa)"silentexecute "normal ggVGYY"endfunctioncommand! -rangeToTuple <line1>,<line2> callToTupleFunction()
This function will not only format your text, but also copy the result to your clipboard so you can paste it in whatever SQL query editor you use.
Let’s break down each line of the body of the function.
Now we add an open parenthesis at the beginning of the line:
silentexecute "normal I("
And then insert the closing one:
silentexecute "normal $xa)"
The last line of the function selects the entire text and copies it to the clipboard (I have a custom mapping for copying to the clipboard: vnoremap YY "*y).
At last, here’s the function in action:
If you’d like to have a similar function that creates an array instead, you need only make a small change to the ToTupleFunction and give the function a new name.
" convert rows of numbers or text (as if pasted from excel column) to an arrayfunction! ToArrayFunction() rangesilentexecutea:firstline . "," . a:lastline . "s/^/'/"silentexecutea:firstline . "," . a:lastline . "s/$/',/"silentexecutea:firstline . "," . a:lastline . "join"
" these two lines below are different by only one character!silentexecute "normal I["silentexecute "normal $xa]"endfunctioncommand! -rangeToArray <line1>,<line2> callToArrayFunction()