5

在 VIM(编辑MacVim 快照 64)中,我正在寻找一种方法来转换这些文本行

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

'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,

我知道如何分别添加前导单引号并将其转换=:多行字符替换(我从这个问题中学到的东西)和基本搜索和替换。

但我真的不知道如何重复每行的变量名。我也开始认为应该有一种方法可以在一个命令中使用类似的分组表达式(使用()在正则表达式中“捕获”)来完成这一切。

我知道如何在 Python 中使用代码行来执行此操作,但我真的不知道如何在 VIM 中使用该s/search_for_this/replace_that/options格式来执行此操作。


编辑:

阅读答案后,为什么这不起作用?

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

对于@Jonathan Leffler,:set all in MacVim 产生

--- 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  
4

3 回答 3

6

那应该做的工作:

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

我认为您的查询不起作用,因为+符号之前需要斜杠\。在我的查询中,我使用了\v允许我跳过一些斜杠的“非常神奇”选项。

:h /magic

于 2012-05-16T08:05:50.810 回答
3
:s/^\([^ ]*\) .*$/'\1': \1,/

匹配部分从行首开始,捕获一系列非空白,然后是未捕获的空白和其他任何内容。替换部分以引号、您记住的内容、引号、冒号、空格、您再次记住的内容和逗号开头。


不同的行为vim

奇怪,反斜杠(甚至)不匹配我的 VIM 中的任何内容,即 MacVim 快照 64(尽管它仍然说它是 Bram Moolenar 的 7.3.390)。使用\v@Tassos 的答案似乎有效。

在 Mac OS X 10.7.4 上,我使用vimfrom /usr/binwhich 将自己标识为:

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

我也在vimLinux 机器上使用,它的行为与 wrt 正则表达式相同。其中一个版本将其自身标识为:

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.

我不确定是否有任何值得展示的东西:set all。这是 Mac 版 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

您描述的行为听起来好像正在使用 PCRE(Perl 兼容的正则表达式)。也许-perl配置中的相关在那里。我在显示的设置中看不到任何可能改变正则表达式模式的东西。也许你可以运行你的 MacVim 并macvim --version显示: set all. 哦,drat,您没有足够的权限将它们编辑到此消息中。我找到了一个 80 列的窗口,可用于显示:set all信息并粘贴到 SO;我通常使用 120 列窗口。

请在我的个人资料中找到我的电子邮件并将数据发送给我。我很想知道 MacVim 设置有什么不同(如果我有时间使用它,我可以将它们设置回“正常”)。

于 2012-05-16T05:23:04.950 回答
2

来自 vimregex.com:

您可以将模式表达式的一部分用“(”和“)”括起来,并在替换模式中通过它们的特殊编号 \1、\2 ... \9 来引用它们。典型示例是交换该行的前两个单词:

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

其中 \1 保存第一个单词,\2 - 中间的任意数量的空格或制表符,\3 - 第二个单词。如何决定哪个数字持有哪对 () ?- 从左边开始计数“(”。

于 2012-05-16T05:16:06.813 回答