6

In VIM (edit MacVim snapshot 64), I am looking for a way to convert these lines of text

can_check_steps = 1
can_edit_work_type = 1
can_edit_vendor = 1
can_edit_place = 1

to

'can_check_steps': can_check_steps,
'can_edit_work_type': can_edit_work_type,
'can_edit_vendor': can_edit_vendor,
'can_edit_place': can_edit_place,

I know how to add the leading single quote and convert the = into : with multi-line character replacement (something I learned from this question) and basic search and replace, respectively.

But I can't really figure out how to repeat that the variable name per line. I'm also starting to think there should be a way to do this all in one command using like grouped expressions (using ( and ) to "capture" in regular expression).

I know how to do it in Python with lines of code, but I don't really know how to do it in VIM using the s/search_for_this/replace_that/options format.


EDIT:

After reading the answers, why doesn't this work?

^\s*(\w+) = 1\s*$/'\1': \1,/g

For @Jonathan Leffler, :set all in MacVim produces

--- Options ---
  aleph=224           bufhidden=          cscopequickfix=   noerrorbells          fsync               includeexpr=      nomacmeta             omnifunc=           report=2            showmatch           tabline=          nottimeout          nowildignorecase
  antialias           buflisted         nocscoperelative      esckeys           nofullscreen          incsearch           magic               operatorfunc=     norevins              showmode            tabpagemax=10       ttimeoutlen=-1      wildmenu
noarabic              buftype=          nocscopetag           eventignore=      nogdefault            indentexpr=         makeef=           nopaste             norightleft           showtabline=1       tabstop=4           ttybuiltin          wildmode=full
  arabicshape         cdpath=,,           cscopetagorder=0    expandtab           guifont=          noinfercase           makeprg=make        pastetoggle=        ruler               sidescroll=0        tagbsearch        nottyfast             wildoptions=
noallowrevins         cedit=^F          nocscopeverbose     noexrc                guifontwide=      noinsertmode          matchtime=5         patchexpr=          rulerformat=        sidescrolloff=0     taglength=0         ttymouse=           window=83
noaltkeymap           charconvert=      nocursorbind          fileencoding=       guipty              isprint=@,161-255   maxcombine=2        patchmode=          scroll=41           smartcase           tagrelative         ttyscroll=999       winheight=1
  ambiwidth=single  nocindent           nocursorcolumn        fileformat=unix     guitablabel=%M%t    joinspaces          maxfuncdepth=100  nopreserveindent    noscrollbind          smartindent         tags=./tags,tags    undodir=.         nowinfixheight
  autochdir           cinoptions=         cursorline          filetype=           guitabtooltip=      key=                maxmapdepth=1000    previewheight=12    scrolljump=1        smarttab            tagstack          noundofile          nowinfixwidth
  autoindent          cmdheight=1         debug=            nofkmap               helpheight=20       keymap=             maxmem=751782     nopreviewwindow       scrolloff=0         softtabstop=0       term=builtin_gui    undolevels=1000     winminheight=1
noautoread            cmdwinheight=7    nodelcombine          foldclose=          helplang=en         keymodel=           maxmemtot=751782    printdevice=      nosecure            nospell             notermbidi            undoreload=10000    winminwidth=1
noautowrite           colorcolumn=        dictionary=         foldcolumn=0      nohidden              keywordprg=man -s   menuitems=25        printencoding=      selectmode=         spellfile=        noterse               updatecount=200     winwidth=20
noautowriteall        columns=269       nodiff                foldenable          history=1000        langmap=            modeline            printfont=courier   shell=/bin/bash     spelllang=en        textauto            updatetime=4000     wrap
  background=dark   nocompatible          diffexpr=           foldexpr=0        nohkmap               langmenu=none       modelines=5         printmbcharset=     shellcmdflag=-c     spellsuggest=best notextmode            verbose=0           wrapmargin=0
nobackup              concealcursor=      diffopt=filler      foldignore=#      nohkmapp              laststatus=2        modifiable          printmbfont=        shellquote=       nosplitbelow          textwidth=0         verbosefile=        wrapscan
  backupcopy=auto     conceallevel=0    nodigraph             foldlevel=0         hlsearch          nolazyredraw        nomodified            printoptions=       shelltemp         nosplitright          thesaurus=          virtualedit=        write
  backupext=~         completefunc=       display=            foldlevelstart=-1   icon              nolinebreak           more                prompt              shellxquote=        startofline       notildeop           novisualbell        nowriteany
  balloondelay=600  noconfirm             eadirection=both    foldmethod=manual   iconstring=         lines=84            mouse=a             pumheight=0       noshiftround          suffixesadd=        timeout             warn                writebackup
noballooneval       nocopyindent        noedcompatible        foldminlines=1    noignorecase          linespace=0       nomousefocus          quoteescape=\       shiftwidth=4        swapfile            timeoutlen=1000   noweirdinvert         writedelay=0
  balloonexpr=        cpoptions=aABceFs   encoding=utf-8      foldnestmax=20    noimcmdline         nolisp                mousehide         noreadonly          noshortname           swapsync=fsync      title               whichwrap=b,s
nobinary              cryptmethod=zip     endofline           formatexpr=         imdisable         nolist                mousetime=500       redrawtime=2000     showbreak=          switchbuf=          titlelen=85         wildchar=<Tab>
nobomb                cscopepathcomp=0    equalalways         formatoptions=tcq   iminsert=2          listchars=eol:$     number            norelativenumber      showcmd             synmaxcol=3000      titlestring=        wildcharm=0
  browsedir=last      cscopeprg=cscope    equalprg=           formatprg=          imsearch=2          loadplugins         numberwidth=4       remap             noshowfulltag         syntax=             transparency=0      wildignore=
  backspace=indent,eol,start
  backupdir=.,~/tmp,~/
  backupskip=/tmp/*,/var/folders/70/f8c54mjn4vg_wztz9bd17lp40000gn/T/*
  breakat= ^I!@*-+;:,./?
  casemap=internal,keepascii
  cinkeys=0{,0},0),:,0#,!^F,o,O,e
  cinwords=if,else,while,do,for,switch
  clipboard=autoselect
  comments=s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-
  commentstring=/*%s*/
  complete=.,w,b,u,t,i
  completeopt=menu,preview
  define=^\s*#\s*define
  directory=.,~/tmp,/var/tmp,/tmp
  errorfile=errors.err
  errorformat=%*[^"]"%f"%*\D%l: %m,"%f"%*\D%l: %m,%-G%f:%l: (Each undeclared identifier is reported only once,%-G%f:%l: for each function it appears in.),%-GIn file included from %f:%l:%c:,%-GIn file included from %f:%l:%c\,,%-GIn file included from %f:%l:%c,%-GIn file
 included from %f:%l,%-G%*[ ]from %f:%l:%c,%-G%*[ ]from %f:%l:,%-G%*[ ]from %f:%l\,,%-G%*[ ]from %f:%l,%f:%l:%c:%m,%f(%l):%m,%f:%l:%m,"%f"\, line %l%*\D%c%*[^ ] %m,%D%*\a[%*\d]: Entering directory `%f',%X%*\a[%*\d]: Leaving directory `%f',%D%*\a: Entering directory `%f
',%X%*\a: Leaving directory `%f',%DMaking %*\a in %f,%f|%l| %m
  fileencodings=ucs-bom,utf-8,default,latin1
  fileformats=unix,dos
  fillchars=vert:|,fold:-
  foldmarker={{{,}}}
  foldopen=block,hor,mark,percent,quickfix,search,tag,undo
  foldtext=foldtext()
  formatlistpat=^\s*\d\+[\]:.)}\t ]\s*
  fuoptions=maxvert,maxhorz
  grepformat=%f:%l:%m,%f:%l%m,%f  %l%m
  grepprg=grep -n $* /dev/null
  guicursor=n-v-c:block-Cursor/lCursor,ve:ver35-Cursor,o:hor50-Cursor,i-ci:ver25-Cursor/lCursor,r-cr:hor20-Cursor/lCursor,sm:block-Cursor-blinkwait175-blinkoff150-blinkon175
  guioptions=egmrLtT
  helpfile=/Applications/MacVim.app/Contents/Resources/vim/runtime/doc/help.txt
  highlight=8:SpecialKey,@:NonText,d:Directory,e:ErrorMsg,i:IncSearch,l:Search,m:MoreMsg,M:ModeMsg,n:LineNr,r:Question,s:StatusLine,S:StatusLineNC,c:VertSplit,t:Title,v:Visual,V:VisualNOS,w:WarningMsg,W:WildMenu,f:Folded,F:FoldColumn,A:DiffAdd,C:DiffChange,D:DiffDelete
,T:DiffText,>:SignColumn,-:Conceal,B:SpellBad,P:SpellCap,R:SpellRare,L:SpellLocal,+:Pmenu,=:PmenuSel,x:PmenuSbar,X:PmenuThumb,*:TabLine,#:TabLineSel,_:TabLineFill,!:CursorColumn,.:CursorLine,o:ColorColumn
  include=^\s*#\s*include
  indentkeys=0{,0},:,0#,!^F,o,O,e
  isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=
  isident=@,48-57,_,192-255
  iskeyword=@,48-57,_,192-255
  lispwords=defun,define,defmacro,set!,lambda,if,case,let,flet,let*,letrec,do,do*,define-syntax,let-syntax,letrec-syntax,destructuring-bind,defpackage,defparameter,defstruct,deftype,defvar,do-all-symbols,do-external-symbols,do-symbols,dolist,dotimes,ecase,etypecase,eva
l-when,labels,macrolet,multiple-value-bind,multiple-value-call,multiple-value-prog1,multiple-value-setq,prog1,progv,typecase,unless,unwind-protect,when,with-input-from-string,with-open-file,with-open-stream,with-output-to-string,with-package-iterator,define-condition,h
andler-bind,handler-case,restart-bind,restart-case,with-simple-restart,store-value,use-value,muffle-warning,abort,continue,with-slots,with-slots*,with-accessors,with-accessors*,defclass,defmethod,print-unreadable-object
  matchpairs=(:),{:},[:]
  maxmempattern=1000
  mkspellmem=460000,2000,500
  mousemodel=popup_setpos
  mouseshape=i-r:beam,s:updown,sd:udsizing,vs:leftright,vd:lrsizing,m:no,ml:up-arrow,v:rightup-arrow
  nrformats=octal,hex
  paragraphs=IPLPPPQPP TPHPLIPpLpItpplpipbp
  path=.,/usr/include,,
  printexpr=system('open -a Preview '.v:fname_in) + v:shell_error
  printheader=%<%f%h%m%=Page %N
  rightleftcmd=search
  runtimepath=~/.vim,/Applications/MacVim.app/Contents/Resources/vim/vimfiles,/Applications/MacVim.app/Contents/Resources/vim/runtime,/Applications/MacVim.app/Contents/Resources/vim/vimfiles/after,~/.vim/after
  scrollopt=ver,jump
  sections=SHNHH HUnhsh
  selection=inclusive
  sessionoptions=blank,buffers,curdir,folds,help,options,tabpages,winsize
  shellpipe=2>&1| tee
  shellredir=>%s 2>&1
  shortmess=filnxtToO
  spellcapcheck=[.?!]\_[\])'"^I ]\+
  statusline=%F%m%r%h%w[%L][%{&ff}]%y[%p%%][%04l,%04v]
  suffixes=.bak,~,.o,.h,.info,.swp,.obj
  termencoding=utf-8
  titleold=Thanks for flying Vim
  toolbar=icons,tooltips
  toolbariconsize=small
  ttytype=builtin_gui
  viewdir=~/.vim/view
  viewoptions=folds,options,cursor
  viminfo='100,<50,s10,h  
Community
  • 1
  • 1
hobbes3
  • 28,078
  • 24
  • 87
  • 116

3 Answers3

6

That should do the work:

%s/\v(\w+).*/'\1': \1,

I think your query doesn't work because the + symbols needs the slash \ before it. In my query I used the \v 'very magic' option that allows me to skip some slashes.

see :h /magic

Tassos
  • 3,158
  • 24
  • 29
3
:s/^\([^ ]*\) .*$/'\1': \1,/

The match part starts at the beginning of the line and captures a sequence of non-blanks, followed by an uncaptured blank and anything else. The replace part starts with a quote, what you remembered, a quote, colon, blank, what you remembered again, and a comma.


Divergent behaviours in vim

Weird, backslashing ( and ) doesn't even match anything in my VIM, which is MacVim snapshot 64 (although it still says it's 7.3.390 by Bram Moolenar). Using the \v in @Tassos's answer seems to work.

On Mac OS X 10.7.4, I'm using the vim from /usr/bin which identifies itself as:

VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Jun 24 2011 20:00:09)
Compiled by root@apple.com
Normal version without GUI.  Features included (+) or not (-):
-arabic +autocmd -balloon_eval -browse +builtin_terms +byte_offset +cindent 
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments 
-conceal +cryptv +cscope +cursorbind +cursorshape +dialog_con +diff +digraphs 
-dnd -ebcdic -emacs_tags +eval +ex_extra +extra_search -farsi +file_in_path 
+find_in_path +float +folding -footer +fork() -gettext -hangul_input +iconv 
+insert_expand +jumplist -keymap -langmap +libcall +linebreak +lispindent 
+listcmds +localmap -lua +menu +mksession +modify_fname +mouse -mouseshape 
-mouse_dec -mouse_gpm -mouse_jsbterm -mouse_netterm -mouse_sysmouse 
+mouse_xterm +multi_byte +multi_lang -mzscheme +netbeans_intg -osfiletype 
+path_extra -perl +persistent_undo +postscript +printer -profile -python 
-python3 +quickfix +reltime -rightleft -ruby +scrollbind +signs +smartindent 
-sniff +startuptime +statusline -sun_workshop +syntax +tag_binary 
+tag_old_static -tag_any_white -tcl +terminfo +termresponse +textobjects +title
 -toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo 
+vreplace +wildignore +wildmenu +windows +writebackup -X11 -xfontset -xim -xsmp
 -xterm_clipboard -xterm_save 
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -D_FORTIFY_SOURCE=0 -Iproto -DHAVE_CONFIG_H -arch i386 -arch x86_64 -g -Os -pipe
Linking: gcc -arch i386 -arch x86_64 -o vim -lncurses

I also use vim on Linux machines, and it behaves the same w.r.t regular expressions. One of those versions identifies itself, in part, as:

VIM - Vi IMproved 7.0 (2006 May 7, compiled Nov  5 2008 11:07:46)
Included patches: 1, 3-4, 7-9, 11, 13-17, 19-26, 29-31, 34-44, 47, 50-56, 58-64, 66-73, 75, 77-92, 94-107, 109, 202, 234-235, 237
Modified by <bugzilla@redhat.com>
Compiled by <bugzilla@redhat.com>
Huge version without GUI.

I'm not sure if there's anything worth showing from :set all. This is the output from the Mac version of Vim:

  ambiwidth=single    foldclose=          omnifunc=           syntax=
noautochdir           foldcolumn=0        operatorfunc=       tabline=
  autoindent          foldenable        nopaste               tabpagemax=10
  autoprint           foldexpr=0          pastetoggle=        tabstop=4
noautoread            foldignore=#        patchexpr=          tagbsearch
noautowrite           foldlevel=0         patchmode=          taglength=0
noautowriteall        foldlevelstart=-1 nopreserveindent      tagrelative
  background=light    foldmethod=manual   previewheight=12    tags=./tags,tags
  backspace=2         foldminlines=1    nopreviewwindow       tagstack
nobackup              foldnestmax=20      printdevice=        term=xterm-color
  backupcopy=auto     formatexpr=         printencoding=      termencoding=
  backupext=~         formatoptions=tcq   printfont=courier noterse
nobeautify            formatprg=          printmbcharset=     textauto
nobinary              fsync               printmbfont=      notextmode
nobomb              nogdefault            printoptions=       textwidth=0
  bufhidden=          helpheight=20       prompt              thesaurus=
  buflisted           helplang=en         pumheight=0       notildeop
  buftype=          nohidden              quoteescape=\       timeout
  cedit=^F            history=20        noreadonly            timeoutlen=1000
  charconvert=      nohlsearch            redrawtime=2000   notitle
nocindent           noicon              norelativenumber      titlelen=85
  cinoptions=         iconstring=         remap               titlestring=
  cmdheight=1       noignorecase          report=2          nottimeout
  cmdwinheight=7      iminsert=0        noruler               ttimeoutlen=-1
  colorcolumn=        imsearch=0          rulerformat=        ttybuiltin
  columns=80          includeexpr=        scroll=32           ttyfast
nocompatible        noincsearch         noscrollbind          ttymouse=xterm
  completefunc=       indentexpr=         scrolljump=1        ttyscroll=999
noconfirm           noinfercase           scrolloff=0         undodir=.
nocopyindent        noinsertmode        nosecure            noundofile
  cpoptions=aABceFs   isprint=@,161-255   selectmode=         undolevels=1000
  cryptmethod=zip     joinspaces          shell=/bin/sh       undoreload=10000
  cscopepathcomp=0    key=                shellcmdflag=-c     updatecount=200
  cscopeprg=cscope    keymodel=           shellquote=         updatetime=4000
  cscopequickfix=     keywordprg=man -s   shelltemp           verbose=0
nocscopetag           langmenu=           shellxquote=        verbosefile=
  cscopetagorder=0    laststatus=1      noshiftround          virtualedit=
nocscopeverbose     nolazyredraw          shiftwidth=4      novisualbell
nocursorbind        nolinebreak         noshortname           warn
nocursorcolumn        lines=66            showbreak=        noweirdinvert
nocursorline        nolisp              noshowcmd             whichwrap=b,s
  debug=            nolist              noshowfulltag         wildchar=<Tab>
nodelcombine          listchars=eol:$     showmatch           wildcharm=0
  dictionary=         loadplugins         showmode            wildignore=
nodiff                magic               showtabline=1     nowildmenu
  diffexpr=           makeef=             sidescroll=0        wildmode=full
  diffopt=filler      makeprg=make        sidescrolloff=0     wildoptions=
nodigraph             matchtime=5       nosmartcase           window=0
  directory=/tmp      maxcombine=2      nosmartindent         winheight=1
  display=            maxfuncdepth=100  nosmarttab          nowinfixheight
  eadirection=both    maxmapdepth=1000    softtabstop=0     nowinfixwidth
noedcompatible        maxmem=450298     nospell               winminheight=1
  encoding=utf-8      maxmemtot=450298    spellfile=          winminwidth=1
  endofline           menuitems=25        spelllang=en        winwidth=20
  equalalways         modeline            spellsuggest=best   wrap
  equalprg=           modelines=0       nosplitbelow          wrapmargin=0
noerrorbells          modifiable        nosplitright          wrapscan
  esckeys           nomodified            startofline         write
  eventignore=        more                statusline=       nowriteany
  expandtab           mouse=              suffixesadd=        writebackup
noexrc                mousemodel=extend   swapfile            writedelay=0
  fileencoding=       mousetime=500       swapsync=fsync
  fileformat=unix     number              switchbuf=
  filetype=           numberwidth=4       synmaxcol=3000

The behaviour you're describing sounds as if there are PCRE (Perl-Compatible Regular Expressions) in use. Maybe the -perl in the configuration is relevant there. I don't see anything in the settings shown that could alter the regex patterns. Maybe you can run your MacVim and show the output of macvim --version and then the output from : set all. Oh, drat, you don't have enough privileges to edit them into this message. I found an 80-column window sensible for the :set all information and pasting to SO; I normally use 120 column windows.

Please find my email in my profile and send me the data. I am curious to know what's different about the MacVim settings (if only so I can set them back to 'normal' if I ever get around to using it).

Jonathan Leffler
  • 730,956
  • 141
  • 904
  • 1,278
  • That changes the line to `'': ,` – hobbes3 May 16 '12 at 06:08
  • Which version of `vim` are you using? Or what setting have you got that makes its regular expressions behave differently? That's the classic 'vi' mode of regular expression, and it works fine in all the versions of `vim` I use. – Jonathan Leffler May 16 '12 at 06:11
  • The first `*` needs to be before closing the matching group. – Michael Foukarakis May 16 '12 at 06:35
  • Why do you have to escape `(` and `)`? – hobbes3 May 16 '12 at 07:34
  • 1
    Because that's the way the `vim` regexes work for me. Why don't you have to escape them? What setting have you got in place that makes them work without the backslashes? AFAIK, the `vim` regexes are one of the intermediate complexity set, more powerful than POSIX ERE but less powerful than Perl RE. And in the standard `vim` regexes, many of the special characters (metacharacter meanings for `()<>{}` specifically) are triggered by a preceding backslash. Thus: `\(...\)` is for capturing; `\{3,7\}` is for controlling repeat counts; `\` looks to the word 'abc'. – Jonathan Leffler May 16 '12 at 12:41
  • Weird, backslashing `(` and `)` doesn't even match anything in my VIM, which is MacVim snapshot 64 (although it still says it's 7.3.390 by Bram Moolenar). Using the `\v` in @Tassos's answer seems to work. – hobbes3 May 16 '12 at 20:03
  • @hobbes3: please see my update and compare the configuration shown with what you see in MacVim. If there's any significant differences, then please send the information so that I can include it in the answer to illustrate the differences. – Jonathan Leffler May 16 '12 at 20:26
  • I'm running MacVim and I couldn't do `mvim --version`, but from the menubar it's Snapshot 64 (latest version). I copied the `:set all` output to my answer. I hope that helps. Thanks! – hobbes3 May 16 '12 at 23:50
  • Weirder and weirder. I downloaded MacVim Snapshot 64 and the regex I wrote worked fine for me in it. But then, the regex written by Tassos also worked. So, it appears MacVim (or maybe even Vim) intuits which system of regexes you are using. I've not explicitly configured anything in MacVim. Don't worry about it; everyone can be happy. – Jonathan Leffler May 17 '12 at 00:23
  • Oh it does work. I don't know what I did wrong the first time. Sorry. I'll accept your answer, although I really like the `\v` option. – hobbes3 May 17 '12 at 00:36
2

From vimregex.com:

You can group parts of the pattern expression enclosing them with "(" and ")" and refer to them inside the replacement pattern by their special number \1, \2 ... \9. Typical example is swapping first two words of the line:

s:(\w+)(\s+)(\w+):\3\2\1:

where \1 holds the first word, \2 - any number of spaces or tabs in between and \3 - the second word. How to decide what number holds what pair of () ? - count opening "(" from the left.

Michael Frederick
  • 16,664
  • 3
  • 43
  • 58