PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /usr/share/emacs/site-lisp/cmake
Viewing File: /usr/share/emacs/site-lisp/cmake/cmake-mode.el
;;; cmake-mode.el --- major-mode for editing CMake sources ;; Package-Requires: ((emacs "24.1")) ; Distributed under the OSI-approved BSD 3-Clause License. See accompanying ; file Copyright.txt or https://cmake.org/licensing for details. ;------------------------------------------------------------------------------ ;;; Commentary: ;; Provides syntax highlighting and indentation for CMakeLists.txt and ;; *.cmake source files. ;; ;; Add this code to your .emacs file to use the mode: ;; ;; (setq load-path (cons (expand-file-name "/dir/with/cmake-mode") load-path)) ;; (require 'cmake-mode) ;------------------------------------------------------------------------------ ;;; Code: ;; ;; cmake executable variable used to run cmake --help-command ;; on commands in cmake-mode ;; ;; cmake-command-help Written by James Bigler ;; (require 'rst) (require 'rx) (defcustom cmake-mode-cmake-executable "cmake" "*The name of the cmake executable. This can be either absolute or looked up in $PATH. You can also set the path with these commands: (setenv \"PATH\" (concat (getenv \"PATH\") \";C:\\\\Program Files\\\\CMake 2.8\\\\bin\")) (setenv \"PATH\" (concat (getenv \"PATH\") \":/usr/local/cmake/bin\"))" :type 'file :group 'cmake) ;; Keywords (defconst cmake-keywords-block-open '("BLOCK" "IF" "MACRO" "FOREACH" "ELSE" "ELSEIF" "WHILE" "FUNCTION")) (defconst cmake-keywords-block-close '("ENDBLOCK" "ENDIF" "ENDFOREACH" "ENDMACRO" "ELSE" "ELSEIF" "ENDWHILE" "ENDFUNCTION")) (defconst cmake-keywords (let ((kwds (append cmake-keywords-block-open cmake-keywords-block-close nil))) (delete-dups kwds))) ;; Regular expressions used by line indentation function. ;; (defconst cmake-regex-blank "^[ \t]*$") (defconst cmake-regex-comment "#.*") (defconst cmake-regex-paren-left "(") (defconst cmake-regex-paren-right ")") (defconst cmake-regex-closing-parens-line (concat "^[[:space:]]*\\(" cmake-regex-paren-right "+\\)[[:space:]]*$")) (defconst cmake-regex-argument-quoted (rx ?\" (* (or (not (any ?\" ?\\)) (and ?\\ anything))) ?\")) (defconst cmake-regex-argument-unquoted (rx (or (not (any space "()#\"\\\n")) (and ?\\ nonl)) (* (or (not (any space "()#\\\n")) (and ?\\ nonl))))) (defconst cmake-regex-token (rx-to-string `(group (or (regexp ,cmake-regex-comment) ?\( ?\) (regexp ,cmake-regex-argument-unquoted) (regexp ,cmake-regex-argument-quoted))))) (defconst cmake-regex-indented (rx-to-string `(and bol (* (group (or (regexp ,cmake-regex-token) (any space ?\n))))))) (defconst cmake-regex-block-open (rx-to-string `(and symbol-start (or ,@(append cmake-keywords-block-open (mapcar 'downcase cmake-keywords-block-open))) symbol-end))) (defconst cmake-regex-block-close (rx-to-string `(and symbol-start (or ,@(append cmake-keywords-block-close (mapcar 'downcase cmake-keywords-block-close))) symbol-end))) (defconst cmake-regex-close (rx-to-string `(and bol (* space) (regexp ,cmake-regex-block-close) (* space) (regexp ,cmake-regex-paren-left)))) (defconst cmake-regex-token-paren-left (concat "^" cmake-regex-paren-left "$")) (defconst cmake-regex-token-paren-right (concat "^" cmake-regex-paren-right "$")) ;------------------------------------------------------------------------------ ;; Line indentation helper functions (defun cmake-line-starts-inside-string () "Determine whether the beginning of the current line is in a string." (save-excursion (beginning-of-line) (let ((parse-end (point))) (goto-char (point-min)) (nth 3 (parse-partial-sexp (point) parse-end)) ) ) ) (defun cmake-find-last-indented-line () "Move to the beginning of the last line that has meaningful indentation." (let ((point-start (point)) region) (forward-line -1) (setq region (buffer-substring-no-properties (point) point-start)) (while (and (not (bobp)) (or (looking-at cmake-regex-blank) (cmake-line-starts-inside-string) (not (and (string-match cmake-regex-indented region) (= (length region) (match-end 0)))))) (forward-line -1) (setq region (buffer-substring-no-properties (point) point-start)) ) ) ) ;------------------------------------------------------------------------------ ;; ;; Indentation increment. ;; (defcustom cmake-tab-width 2 "Number of columns to indent cmake blocks" :type 'integer :group 'cmake) ;; ;; Line indentation function. ;; (defun cmake-indent () "Indent current line as CMake code." (interactive) (unless (cmake-line-starts-inside-string) (if (bobp) (cmake-indent-line-to 0) (let (cur-indent) (save-excursion (beginning-of-line) (let ((point-start (point)) (closing-parens-only (looking-at cmake-regex-closing-parens-line)) (case-fold-search t) ;; case-insensitive token) ;; Search back for the last indented line. (cmake-find-last-indented-line) ;; Start with the indentation on this line. (setq cur-indent (current-indentation)) (if closing-parens-only (let ((open-parens 0)) (while (re-search-forward cmake-regex-token point-start t) (setq token (match-string 0)) (cond ((string-match cmake-regex-token-paren-left token) (setq open-parens (+ open-parens 1))) ((string-match cmake-regex-token-paren-right token) (setq open-parens (- open-parens 1))))) ;; Don't outdent if last indented line has open parens (unless (> open-parens 0) (setq cur-indent (- cur-indent cmake-tab-width)))) ;; Skip detailed analysis if last indented line is a 'closing ;; parens only line' (unless (looking-at cmake-regex-closing-parens-line) ;; Search forward counting tokens that adjust indentation. (while (re-search-forward cmake-regex-token point-start t) (setq token (match-string 0)) (when (or (string-match cmake-regex-token-paren-left token) (and (string-match cmake-regex-block-open token) (looking-at (concat "[ \t]*" cmake-regex-paren-left)))) (setq cur-indent (+ cur-indent cmake-tab-width))) (when (string-match cmake-regex-token-paren-right token) (setq cur-indent (- cur-indent cmake-tab-width))) )) (goto-char point-start) ;; If next token closes the block, decrease indentation (when (looking-at cmake-regex-close) (setq cur-indent (- cur-indent cmake-tab-width)) ) ) ) ) ;; Indent this line by the amount selected. (cmake-indent-line-to (max cur-indent 0)) ) ) ) ) (defun cmake-point-in-indendation () (string-match "^[ \\t]*$" (buffer-substring (point-at-bol) (point)))) (defun cmake-indent-line-to (column) "Indent the current line to COLUMN. If point is within the existing indentation it is moved to the end of the indentation. Otherwise it retains the same position on the line" (if (cmake-point-in-indendation) (indent-line-to column) (save-excursion (indent-line-to column)))) ;------------------------------------------------------------------------------ ;; ;; Helper functions for buffer ;; (defun cmake-unscreamify-buffer () "Convert all CMake commands to lowercase in buffer." (interactive) (save-excursion (goto-char (point-min)) (while (re-search-forward "^\\([ \t]*\\)\\_<\\(\\(?:\\w\\|\\s_\\)+\\)\\_>\\([ \t]*(\\)" nil t) (replace-match (concat (match-string 1) (downcase (match-string 2)) (match-string 3)) t)) ) ) ;------------------------------------------------------------------------------ ;; ;; Navigation / marking by function or macro ;; (defconst cmake--regex-defun-start (rx line-start (zero-or-more space) (or "function" "macro") (zero-or-more space) "(")) (defconst cmake--regex-defun-end (rx line-start (zero-or-more space) "end" (or "function" "macro") (zero-or-more space) "(" (zero-or-more (not-char ")")) ")")) (defun cmake-beginning-of-defun () "Move backward to the beginning of a CMake function or macro. Return t unless search stops due to beginning of buffer." (interactive) (when (not (region-active-p)) (push-mark)) (let ((case-fold-search t)) (when (re-search-backward cmake--regex-defun-start nil 'move) t))) (defun cmake-end-of-defun () "Move forward to the end of a CMake function or macro. Return t unless search stops due to end of buffer." (interactive) (when (not (region-active-p)) (push-mark)) (let ((case-fold-search t)) (when (re-search-forward cmake--regex-defun-end nil 'move) (forward-line) t))) (defun cmake-mark-defun () "Mark the current CMake function or macro. This puts the mark at the end, and point at the beginning." (interactive) (cmake-end-of-defun) (push-mark nil :nomsg :activate) (cmake-beginning-of-defun)) ;------------------------------------------------------------------------------ ;; ;; Keyword highlighting regex-to-face map. ;; (defconst cmake-font-lock-keywords `((,(rx-to-string `(and symbol-start (or ,@cmake-keywords ,@(mapcar #'downcase cmake-keywords)) symbol-end)) . font-lock-keyword-face) (,(rx symbol-start (group (+ (or word (syntax symbol)))) (* blank) ?\() 1 font-lock-function-name-face) (,(rx "${" (group (+(any alnum "-_+/."))) "}") 1 font-lock-variable-name-face t) ) "Highlighting expressions for CMake mode.") ;------------------------------------------------------------------------------ (defun cmake--syntax-propertize-until-bracket-close (syntax) ;; This function assumes that a previous search has matched the ;; beginning of a bracket_comment or bracket_argument and that the ;; second capture group has matched the equal signs between the two ;; opening brackets (let* ((mb (match-beginning 2)) (me (match-end 2)) (cb (format "]%s]" (buffer-substring mb me)))) (save-match-data (if (search-forward cb end 'move) (progn (setq me (match-end 0)) (put-text-property (1- me) me 'syntax-table (string-to-syntax syntax))) (setq me end))) (put-text-property (match-beginning 1) me 'syntax-multiline t))) (defconst cmake--syntax-propertize-function (syntax-propertize-rules ("\\(#\\)\\[\\(=*\\)\\[" (1 (prog1 "!" (cmake--syntax-propertize-until-bracket-close "!")))) ("\\(\\[\\)\\(=*\\)\\[" (1 (prog1 "|" (cmake--syntax-propertize-until-bracket-close "|")))))) ;; Syntax table for this mode. (defvar cmake-mode-syntax-table nil "Syntax table for CMake mode.") (or cmake-mode-syntax-table (setq cmake-mode-syntax-table (let ((table (make-syntax-table))) (modify-syntax-entry ?\( "()" table) (modify-syntax-entry ?\) ")(" table) (modify-syntax-entry ?# "<" table) (modify-syntax-entry ?\n ">" table) (modify-syntax-entry ?$ "'" table) table))) ;; ;; User hook entry point. ;; (defvar cmake-mode-hook nil) ;;------------------------------------------------------------------------------ ;; Mode definition. ;; ;;;###autoload (define-derived-mode cmake-mode prog-mode "CMake" "Major mode for editing CMake source files." ; Setup font-lock mode. (set (make-local-variable 'font-lock-defaults) '(cmake-font-lock-keywords)) ; Setup indentation function. (set (make-local-variable 'indent-line-function) 'cmake-indent) ; Setup comment syntax. (set (make-local-variable 'comment-start) "#") ;; Setup syntax propertization (set (make-local-variable 'syntax-propertize-function) cmake--syntax-propertize-function) (add-hook 'syntax-propertize-extend-region-functions #'syntax-propertize-multiline nil t)) ;; Default cmake-mode key bindings (define-key cmake-mode-map "\e\C-a" #'cmake-beginning-of-defun) (define-key cmake-mode-map "\e\C-e" #'cmake-end-of-defun) (define-key cmake-mode-map "\e\C-h" #'cmake-mark-defun) ; Help mode starts here ;;;###autoload (defun cmake-command-run (type &optional topic buffer) "Runs the command cmake with the arguments specified. The optional argument topic will be appended to the argument list." (interactive "s") (let* ((bufname (if buffer buffer (concat "*CMake" type (if topic "-") topic "*"))) (buffer (if (get-buffer bufname) (get-buffer bufname) (generate-new-buffer bufname))) (command (concat cmake-mode-cmake-executable " " type " " topic)) ;; Turn of resizing of mini-windows for shell-command. (resize-mini-windows nil) ) (shell-command command buffer) (save-selected-window (select-window (display-buffer buffer 'not-this-window)) (cmake-mode) (read-only-mode 1) (view-mode 1)) ) ) ;;;###autoload (defun cmake-command-run-help (type &optional topic buffer) "`cmake-command-run' but rendered in `rst-mode'." (interactive "s") (let* ((bufname (if buffer buffer (concat "*CMake" type (if topic "-") topic "*"))) (buffer (if (get-buffer bufname) (get-buffer bufname) (generate-new-buffer bufname))) (command (concat cmake-mode-cmake-executable " " type " " topic)) ;; Turn of resizing of mini-windows for shell-command. (resize-mini-windows nil) ) (shell-command command buffer) (save-selected-window (select-window (display-buffer buffer 'not-this-window)) (rst-mode) (read-only-mode 1) (view-mode 1)) ) ) ;;;###autoload (defun cmake-help-list-commands () "Prints out a list of the cmake commands." (interactive) (cmake-command-run-help "--help-command-list") ) (defvar cmake-commands '() "List of available topics for --help-command.") (defvar cmake-help-command-history nil "Command read history.") (defvar cmake-modules '() "List of available topics for --help-module.") (defvar cmake-help-module-history nil "Module read history.") (defvar cmake-variables '() "List of available topics for --help-variable.") (defvar cmake-help-variable-history nil "Variable read history.") (defvar cmake-properties '() "List of available topics for --help-property.") (defvar cmake-help-property-history nil "Property read history.") (defvar cmake-help-complete-history nil "Complete help read history.") (defvar cmake-string-to-list-symbol '(("command" cmake-commands cmake-help-command-history) ("module" cmake-modules cmake-help-module-history) ("variable" cmake-variables cmake-help-variable-history) ("property" cmake-properties cmake-help-property-history) )) (defun cmake-get-list (listname) "If the value of LISTVAR is nil, run cmake --help-LISTNAME-list and store the result as a list in LISTVAR." (let ((listvar (car (cdr (assoc listname cmake-string-to-list-symbol))))) (if (not (symbol-value listvar)) (let ((temp-buffer-name "*CMake Temporary*")) (save-window-excursion (cmake-command-run-help (concat "--help-" listname "-list") nil temp-buffer-name) (with-current-buffer temp-buffer-name ; FIXME: Ignore first line if it is "cmake version ..." from CMake < 3.0. (set listvar (split-string (buffer-substring-no-properties (point-min) (point-max)) "\n" t))))) (symbol-value listvar) )) ) (require 'thingatpt) (defun cmake-symbol-at-point () (let ((symbol (symbol-at-point))) (and (not (null symbol)) (symbol-name symbol)))) (defun cmake-help-type (type) (let* ((default-entry (cmake-symbol-at-point)) (history (car (cdr (cdr (assoc type cmake-string-to-list-symbol))))) (input (completing-read (format "CMake %s: " type) ; prompt (cmake-get-list type) ; completions nil ; predicate t ; require-match default-entry ; initial-input history ))) (if (string= input "") (error "No argument given") input)) ) ;;;###autoload (defun cmake-help-command () "Prints out the help message for the command the cursor is on." (interactive) (cmake-command-run-help "--help-command" (cmake-help-type "command") "*CMake Help*")) ;;;###autoload (defun cmake-help-module () "Prints out the help message for the module the cursor is on." (interactive) (cmake-command-run-help "--help-module" (cmake-help-type "module") "*CMake Help*")) ;;;###autoload (defun cmake-help-variable () "Prints out the help message for the variable the cursor is on." (interactive) (cmake-command-run-help "--help-variable" (cmake-help-type "variable") "*CMake Help*")) ;;;###autoload (defun cmake-help-property () "Prints out the help message for the property the cursor is on." (interactive) (cmake-command-run-help "--help-property" (cmake-help-type "property") "*CMake Help*")) ;;;###autoload (defun cmake-help () "Queries for any of the four available help topics and prints out the appropriate page." (interactive) (let* ((default-entry (cmake-symbol-at-point)) (command-list (cmake-get-list "command")) (variable-list (cmake-get-list "variable")) (module-list (cmake-get-list "module")) (property-list (cmake-get-list "property")) (all-words (append command-list variable-list module-list property-list)) (input (completing-read "CMake command/module/variable/property: " ; prompt all-words ; completions nil ; predicate t ; require-match default-entry ; initial-input 'cmake-help-complete-history ))) (if (string= input "") (error "No argument given") (if (member input command-list) (cmake-command-run-help "--help-command" input "*CMake Help*") (if (member input variable-list) (cmake-command-run-help "--help-variable" input "*CMake Help*") (if (member input module-list) (cmake-command-run-help "--help-module" input "*CMake Help*") (if (member input property-list) (cmake-command-run-help "--help-property" input "*CMake Help*") (error "Not a know help topic.") ; this really should not happen )))))) ) ;;;###autoload (progn (add-to-list 'auto-mode-alist '("CMakeLists\\.txt\\'" . cmake-mode)) (add-to-list 'auto-mode-alist '("\\.cmake\\'" . cmake-mode))) ; This file provides cmake-mode. (provide 'cmake-mode) ;;; cmake-mode.el ends here